octclip-2.0.3/000755 001750 001750 00000000000 14332204130 013145 5ustar00topotopo000000 000000 octclip-2.0.3/src/000755 001750 001750 00000000000 14332202130 013732 5ustar00topotopo000000 000000 octclip-2.0.3/src/segmento.c000755 001750 001750 00000046523 12463476350 015760 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file segmento.c \brief Definición de funciones para la realización de cálculos con segmentos. \author José Luis García Pallero, jgpallero@gmail.com \date 22 de abril de 2011 \copyright Copyright (c) 2011-2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/segmento.h" /******************************************************************************/ /******************************************************************************/ int TresPuntosColineales2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC) { //utilizamos la macro de posición de punto con respecto a una recta, aunque //no es una macro robusta //son colineales si el resultado es 0.0 //calculamos y salimos de la función return (POS_PTO_RECTA_2D(xA,yA,xB,yB,xC,yC)==0.0); } /******************************************************************************/ /******************************************************************************/ int PuntoEntreDosPuntos2DColin(const double x, const double y, const double xA, const double yA, const double xB, const double yB) { //código de salida int cod=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //distinguimos entre segmento vertical y no vertical if(xA!=xB) { //segmento no vertical, utilizamos las coordenadas X cod = ((xAx)&&(x>xB)); } else { //segmento vertical, utilizamos las coordenadas Y cod = ((yAy)&&(y>yB)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int PtoComunSegmParalelos2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, double* x, double* y) { //variable de salida int cod=GEOC_SEG_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los puntos son colineales if(!TresPuntosColineales2D(xA,yA,xB,yB,xC,yC)) { //los segmentos son paralelos, pero no se cortan return GEOC_SEG_NO_INTERSEC; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los segmentos son el mismo if(((xA==xC)&&(yA==yC)&&(xB==xD)&&(yB==yD))|| ((xA==xD)&&(yA==yD)&&(xB==xC)&&(yB==yC))) { //coordenadas de salida *x = xA; *y = yA; //los segmentos son el mismo return GEOC_SEG_INTERSEC_MISMO_SEG; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si algún punto está entre medias del otro segmento if(PuntoEntreDosPuntos2DColin(xA,yA,xC,yC,xD,yD)) { //el punto A está en el segmento CD *x = xA; *y = yA; //salimos return GEOC_SEG_INTERSEC_COLIN; } else if(PuntoEntreDosPuntos2DColin(xC,yC,xA,yA,xB,yB)) { //el punto C está en el segmento AB *x = xC; *y = yC; //salimos return GEOC_SEG_INTERSEC_COLIN; } else if(PuntoEntreDosPuntos2DColin(xB,yB,xC,yC,xD,yD)) { //el punto B está en el segmento CD *x = xB; *y = yB; //salimos return GEOC_SEG_INTERSEC_COLIN; } else if(PuntoEntreDosPuntos2DColin(xD,yD,xA,yA,xB,yB)) { //el punto D está en el segmento AB *x = xD; *y = yD; //salimos return GEOC_SEG_INTERSEC_COLIN; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si sólo comparten el extremo A if(((xA==xC)&&(yA==yC))||((xA==xD)&&(yA==yD))) { //coordenadas de salida *x = xA; *y = yA; //los segmentos comparten un extremo return GEOC_SEG_INTERSEC_EXTREMOS_COLIN; } //comprobamos si sólo comparten el extremo B if(((xB==xC)&&(yB==yC))||((xB==xD)&&(yB==yD))) { //coordenadas de salida *x = xB; *y = yB; //los segmentos comparten un extremo return GEOC_SEG_INTERSEC_EXTREMOS_COLIN; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecSegmentos2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, double* x, double* y) { //centroide del conjunto de puntos implicados double xc=0.0,yc=0.0; //coordenadas reducidas al centroide double xAc=0.0,yAc=0.0,xBc=0.0,yBc=0.0,xCc=0.0,yCc=0.0,xDc=0.0,yDc=0.0; //parámetros de las ecuaciones double s=0.0,t=0.0,num=0.0,den=0.0; //variable de salida int cod=GEOC_SEG_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si los rectángulos son disjuntos, los segmentos no se tocan if(GEOC_RECT_DISJUNTOS(GEOC_MIN(xA,xB),GEOC_MAX(xA,xB),GEOC_MIN(yA,yB), GEOC_MAX(yA,yB),GEOC_MIN(xC,xD),GEOC_MAX(xC,xD), GEOC_MIN(yC,yD),GEOC_MAX(yC,yD))) { //código de salida cod = GEOC_SEG_NO_INTERSEC; //salimos de la función return cod; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el centroide del conjunto de puntos de trabajo xc = (xA+xB+xC+xD)/4.0; yc = (yA+yB+yC+yD)/4.0; //reducimos las coordenadas de trabajo al centroide, para que los números //sean más pequeños y evitar posibles errores de desbordamiento xAc = xA-xc; xBc = xB-xc; xCc = xC-xc; xDc = xD-xc; yAc = yA-yc; yBc = yB-yc; yCc = yC-yc; yDc = yD-yc; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //a partir de aquí, trabajamos con las coordenadas reducidas al centroide //calculamos el denominador den = xAc*(yDc-yCc)+xBc*(yCc-yDc)+xDc*(yBc-yAc)+xCc*(yAc-yBc); //si el denominador es 0.0, los segmentos son paralelos if(den==0.0) { //calculamos el punto común cod = PtoComunSegmParalelos2D(xAc,yAc,xBc,yBc,xCc,yCc,xDc,yDc,x,y); //deshacemos el cambio del centroide *x += xc; *y += yc; //salimos de la función return cod; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el numerador num = xAc*(yDc-yCc)+xCc*(yAc-yDc)+xDc*(yCc-yAc); //un extremo de un segmento puede estar encima del otro segmento, pero los //segmentos no son colineales if((num==0.0)||(num==den)) { //comprobamos si se tocan en un extremo if(((xAc==xCc)&&(yAc==yCc))||((xAc==xDc)&&(yAc==yDc))|| ((xBc==xCc)&&(yBc==yCc))||((xBc==xDc)&&(yBc==yDc))) { //asignamos la variable de salida cod = GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN; } else { //asignamos la variable de salida cod = GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN; } } //calculamos el parámetro s s = num/den; //calculamos de nuevo el numerador num = -(xAc*(yCc-yBc)+xBc*(yAc-yCc)+xCc*(yBc-yAc)); //un extremo de un segmento puede estar encima del otro segmento, pero los //segmentos no son colineales if((num==0.0)||(num==den)) { //comprobamos si se tocan en un extremo if(((xAc==xCc)&&(yAc==yCc))||((xAc==xDc)&&(yAc==yDc))|| ((xBc==xCc)&&(yBc==yCc))||((xBc==xDc)&&(yBc==yDc))) { //asignamos la variable de salida cod = GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN; } else { //asignamos la variable de salida cod = GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN; } } //calculamos el parámetro t t = num/den; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si estamos ante una intersección pura y dura o los segmentos //no se cortan if((s>0.0)&&(s<1.0)&&(t>0.0)&&(t<1.0)) { //asignamos la variable de salida cod = GEOC_SEG_INTERSEC; } else if((s<0.0)||(s>1.0)||(t<0.0)||(t>1.0)) { //asignamos la variable de salida cod = GEOC_SEG_NO_INTERSEC; } //calculamos las coordenadas del punto intersección y deshacemos el cambio //del centroide *x = xc+xAc+s*(xBc-xAc); *y = yc+yAc+s*(yBc-yAc); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecSegmentos2DSimple(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD) { //centroide del conjunto de puntos implicados double xc=0.0,yc=0.0; //coordenadas reducidas al centroide double xAc=0.0,yAc=0.0,xBc=0.0,yBc=0.0,xCc=0.0,yCc=0.0,xDc=0.0,yDc=0.0; //identificadores de posición double posA=0.0,posB=0.0,posC=0.0,posD=0.0; //identificadores de punto enmedio de un segmento int enmA=0,enmB=0,enmC=0,enmD=0; //variable de salida (por defecto, no hay intersección) int cod=GEOC_SEG_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si los rectángulos son disjuntos, los segmentos no se tocan if(GEOC_RECT_DISJUNTOS(GEOC_MIN(xA,xB),GEOC_MAX(xA,xB),GEOC_MIN(yA,yB), GEOC_MAX(yA,yB),GEOC_MIN(xC,xD),GEOC_MAX(xC,xD), GEOC_MIN(yC,yD),GEOC_MAX(yC,yD))) { //salimos de la función (usamos el valor por defecto de no intersección return cod; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el centroide del conjunto de puntos de trabajo xc = (xA+xB+xC+xD)/4.0; yc = (yA+yB+yC+yD)/4.0; //reducimos las coordenadas de trabajo al centroide, para que los números //sean más pequeños y evitar posibles errores de desbordamiento xAc = xA-xc; xBc = xB-xc; xCc = xC-xc; xDc = xD-xc; yAc = yA-yc; yBc = yB-yc; yCc = yC-yc; yDc = yD-yc; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos las posiciones de los puntos con respecto a las rectas posA = POS_PTO_RECTA_2D(xAc,yAc,xCc,yCc,xDc,yDc); posB = POS_PTO_RECTA_2D(xBc,yBc,xCc,yCc,xDc,yDc); posC = POS_PTO_RECTA_2D(xCc,yCc,xAc,yAc,xBc,yBc); posD = POS_PTO_RECTA_2D(xDc,yDc,xAc,yAc,xBc,yBc); //comprobamos si hay tres puntos alineados, que dan lugar a casos especiales if((posA==0.0)||(posB==0.0)||(posC==0.0)||(posD==0.0)) { //comprobamos si alguno de los extremos son coincidentes if(((xA==xC)&&(yA==yC))||((xA==xD)&&(yA==yD))|| ((xB==xC)&&(yB==yC))||((xB==xD)&&(yB==yD))) { //código de salida cod = GEOC_SEG_INTERSEC; } else { //comprobamos si A está en el segmento CD, pero no es un extremo if(posA==0.0) { enmA = PuntoEntreDosPuntos2DColin(xAc,yAc,xCc,yCc,xDc,yDc); } //comprobamos si B está en el segmento CD, pero no es un extremo if(posB==0.0) { enmB = PuntoEntreDosPuntos2DColin(xBc,yBc,xCc,yCc,xDc,yDc); } //comprobamos si C está en el segmento AB, pero no es un extremo if(posC==0.0) { enmC = PuntoEntreDosPuntos2DColin(xCc,yCc,xAc,yAc,xBc,yBc); } //comprobamos si C está en el segmento AB, pero no es un extremo if(posD==0.0) { enmD = PuntoEntreDosPuntos2DColin(xDc,yDc,xAc,yAc,xBc,yBc); } //si hay algún punto enmedio de algún segmento, existe intersección if(enmA||enmB||enmC||enmD) { //código de salida cod = GEOC_SEG_INTERSEC; } } } else { //para que ocurra intersección pura, las rectas han de dividirse //mutuamente en dos, es decir, los puntos de cada una han de estar uno a //cada lado de la otra if((((posA<0.0)&&(posB>0.0))||((posA>0.0)&&(posB<0.0)))&& (((posC<0.0)&&(posD>0.0))||((posC>0.0)&&(posD<0.0)))) { //código de salida cod = GEOC_SEG_INTERSEC; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int CodIntSeg2DCodIntSeg2DSimple(const int cod2D) { //variable de salida int sal=GEOC_SEG_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos los posibles valores de entrada switch(cod2D) { case GEOC_SEG_NO_INTERSEC: //no hay intersección sal = GEOC_SEG_NO_INTERSEC; break; case GEOC_SEG_INTERSEC: //intersección pura sal = GEOC_SEG_INTERSEC; break; case GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN: //el vértice de un segmento se apoya en el otro segmento, aunque no //en alguno de sus vértices sal = GEOC_SEG_INTERSEC; break; case GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN: //los segmentos comparten un vértice, pero no son colineales sal = GEOC_SEG_INTERSEC; break; case GEOC_SEG_INTERSEC_EXTREMOS_COLIN: //los segmentos comparten un vértice y son colineales sal = GEOC_SEG_INTERSEC; break; case GEOC_SEG_INTERSEC_MISMO_SEG: //ambos son el mismo segmento sal = GEOC_SEG_INTERSEC; break; case GEOC_SEG_INTERSEC_COLIN: //los segmentos se solapan sal = GEOC_SEG_INTERSEC; break; default: sal = GEOC_SEG_NO_INTERSEC; break; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/arco.c000644 001750 001750 00000111104 12463476223 015043 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file arco.c \brief Definición de funciones para la realización de cálculos con arcos de circunferencia. \author José Luis García Pallero, jgpallero@gmail.com \date 08 de agosto de 2013 \copyright Copyright (c) 2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/arco.h" /******************************************************************************/ /******************************************************************************/ int ArcosCircMaxDisjuntos(const double tol, const double lonMin1, const double lonMax1, const double lonMin2, const double lonMax2) { //comprobamos los casos de trabajo if(((lonMax1-lonMin1)>(GEOC_CONST_PI-tol))|| ((lonMax2-lonMin2)>(GEOC_CONST_PI-tol))) { //indicamos que no son disjuntos, aunque en puridad no lo podemos decir, //pero estos casos son difíciles de determinar porque el arco cruza el //meridiano origen o su antimeridiano return 0; } else { //consideramos únicamente solapamientos en longitud return (!((lonMin1<(lonMax2+tol))&&(lonMax1>(lonMin2-tol)))); } } /******************************************************************************/ /******************************************************************************/ double AcimutArcoCircMaxEsf(const double tol, const double latA, const double lonA, const double latB, const double lonB, double mRot[][3]) { //variables auxiliares double sLat=0.0,cLat=0.0,sLon=0.0,cLon=0.0; double x=0.0,y=0.0,z=0.0,yR=0.0,zR=0.0; //variable de salida double aci=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos las razones trigonométricas de las coordenadas del vértice A sLat = sin(latA); cLat = cos(latA); sLon = sin(lonA); cLon = cos(lonA); //construimos la matriz de rotación para llevar el punto A a (lat=0,lon=0) //primero se rota en torno a Z el valor de la longitud, y luego en torno a Y //el valor -latitud //tal y como aquí se aplican, las rotaciones giran el sistema de coordenadas //en lugar del radio vector del punto de trabajo // | cos(lon) sin(lon) 0| //Rz = |-sin(lon) cos(lon) 0| // | 0 0 1| // // |cos(-lat) 0 -sin(-lat)| | cos(lat) 0 sin(lat)| //Ry = | 0 1 0| = | 0 1 1| // |sin(-lat) 0 cos(-lat)| |-sin(lat) 0 cos(lat)| // //la matriz de rotación es, entonces R = Ry*Rz, donde este orden de //multiplicación de las matrices indica que primero se rota en torno a Z y //luego en torno a Y mRot[0][0] = cLat*cLon; mRot[0][1] = cLat*sLon; mRot[0][2] = sLat; mRot[1][0] = -sLon; mRot[1][1] = cLon; mRot[1][2] = 0.0; mRot[2][0] = -sLat*cLon; mRot[2][1] = -sLat*sLon; mRot[2][2] = cLat; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los puntos son coincidentes //aunque esta comprobación se podría haber hecho al principio, se hace aquí //para poder construir previamente la matriz de rotación que lleve al punto //A a (lat=0,lon=0) if(GEOC_ES_CERO(latA-latB,tol)&&GEOC_ES_CERO(lonA-lonB,tol)) { //imponemos un acimut igual a 0.0 aci = 0.0; //salimos de la función return aci; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //transformamos las coordenadas del extremo B a cartesianas cLat = cos(latB); x = cLat*cos(lonB); y = cLat*sin(lonB); z = sin(latB); //transformamos al nuevo sistema las coordenadas Y y Z de B AplicaMatrizRotacionCoorCart(1,x,y,z,mRot,NULL,&yR,&zR); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //esta variable es como si fuera una especie de longitud de B en un sistema //en el cual el eje de rotación fuese el X del nuevo sistema //si es >= 0.0, es ya directamente el acimut buscado aci = atan2(yR,zR); //metemos la variable auxiliar en el dominio [0,2*pi), si ha lugar if(aci<0.0) { aci += 2.0*GEOC_CONST_PI; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return aci; } /******************************************************************************/ /******************************************************************************/ void RotaArco00Ecuador(const double tol, const double latA, const double lonA, const double latB, const double lonB, double mRot[][3], double* lonBR) { //coordenadas cartesianas double x=0.0,y=0.0,z=0.0,xR=0.0,yR=0.0; //matriz de rotación auxiliar double mRotAux[3][3]; //acimut del arco AB double aci=0.0; //variables auxiliares double alfa=0.0,cLat=0.0,sAlfa=0.0,cAlfa=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //roto el sistema para llevar el punto A al punto (lat=0,lon=0) aci = AcimutArcoCircMaxEsf(tol,latA,lonA,latB,lonB,mRotAux); //el ángulo a rotar sobre el eje X será 90-aci alfa = GEOC_CONST_PI/2.0-aci; //calculo la matriz de rotación //tal y como aquí se aplica, las rotación gira el sistema de coordenadas en //lugar del radio vector del punto de trabajo // |1 0 0| //Rx = |0 cos(alfa) sin(alfa)| // |0 -sin(alfa) con(alfa)| //la matriz de rotación es, entonces R = Rx*mRotAux, donde este orden de //multiplicación de las matrices indica que primero se rota en torno a los //ejes que indique mRorAux y luego en torno a X sAlfa = sin(alfa); cAlfa = cos(alfa); mRot[0][0] = mRotAux[0][0]; mRot[0][1] = mRotAux[0][1]; mRot[0][2] = mRotAux[0][2]; mRot[1][0] = cAlfa*mRotAux[1][0]+sAlfa*mRotAux[2][0]; mRot[1][1] = cAlfa*mRotAux[1][1]+sAlfa*mRotAux[2][1]; mRot[1][2] = sAlfa*mRotAux[2][2]; //+cAlfa*mRotAux[1][2], mRotAux[1][2]==0.0 mRot[2][0] = -sAlfa*mRotAux[1][0]+cAlfa*mRotAux[2][0]; mRot[2][1] = -sAlfa*mRotAux[1][1]+cAlfa*mRotAux[2][1]; mRot[2][2] = cAlfa*mRotAux[2][2]; //-sAlfa*mRotAux[1][2], mRotAux[1][2]==0.0 //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular la longitud de B en el nuevo sistema if(lonBR!=NULL) { //transformamos las coordenadas del extremo B a cartesianas cLat = cos(latB); x = cLat*cos(lonB); y = cLat*sin(lonB); z = sin(latB); //calculamos las coordenadas X e Y de B en el nuevo sistema AplicaMatrizRotacionCoorCart(1,x,y,z,mRot,&xR,&yR,NULL); //calculamos la longitud de B en el nuevo sistema *lonBR = atan2(yR,xR); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void AplicaMatrizRotacionCoorCart(const int sentido, const double x, const double y, const double z, double mRot[][3], double* xR, double* yR, double* zR) { //comprobamos el sentido de la rotación if(sentido>=0) { //transformamos las coordenadas que se hayan pedido if(xR!=NULL) { *xR = mRot[0][0]*x+mRot[0][1]*y+mRot[0][2]*z; } if(yR!=NULL) { *yR = mRot[1][0]*x+mRot[1][1]*y+mRot[1][2]*z; } if(zR!=NULL) { *zR = mRot[2][0]*x+mRot[2][1]*y+mRot[2][2]*z; } } else { //transformamos las coordenadas que se hayan pedido if(xR!=NULL) { *xR = mRot[0][0]*x+mRot[1][0]*y+mRot[2][0]*z; } if(yR!=NULL) { *yR = mRot[0][1]*x+mRot[1][1]*y+mRot[2][1]*z; } if(zR!=NULL) { *zR = mRot[0][2]*x+mRot[1][2]*y+mRot[2][2]*z; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void AplicaMatrizRotacionCoorGeod(const int sentido, const double lat, const double lon, double mRot[][3], double* latR, double* lonR) { //variables auxiliares double x=0.0,y=0.0,z=0.0,xR=0.0,yR=0.0,zR=0.0,cLat=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que hacer cálculos if((latR!=NULL)||(lonR!=NULL)) { //razones trigonométricas auxiliares cLat = cos(lat); //trasformamos las coordenadas de entrada a cartesianas x = cLat*cos(lon); y = cLat*sin(lon); z = sin(lat); //aplicamos la rotación AplicaMatrizRotacionCoorCart(sentido,x,y,z,mRot,&xR,&yR,&zR); //convertimos de nuevo a geodésicas, si ha lugar if(latR!=NULL) { *latR = asin(zR); } if(lonR!=NULL) { *lonR = atan2(yR,xR); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int IntersecCircMaxEsfAux(const double tol, const double xC, const double yC, const double zC, const double xD, const double yD, const double zD, double* xP, double* yP, double* zP) { //vectores normales double NABx=0.0,NABy=0.0,NABz=0.0,NCDx=0.0,NCDy=0.0,NCDz=0.0; double dx=0.0,dy=0.0,dz=0.0; //variable auxiliar double t=0.0; //variable de salida int cod=GEOC_ARC_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //vector normal al plano del ecuador AOB NABx = 0.0; NABy = 0.0; NABz = 1.0; //vector normal al plano COD ProductoVectorial(xC,yC,zC,xD,yD,zD,&NCDx,&NCDy,&NCDz); //vector director de la línea intersección de los dos planos ProductoVectorial(NABx,NABy,NABz,NCDx,NCDy,NCDz,&dx,&dy,&dz); //sólo seguimos si no hay casos especiales if((!GEOC_ES_CERO(dx,tol))|| (!GEOC_ES_CERO(dy,tol))|| (!GEOC_ES_CERO(dz,tol))) { //hay intersección cod = GEOC_ARC_INTERSEC; //comprobamos si hay que devolver coordenadas if((xP!=NULL)&&(yP!=NULL)&&(zP!=NULL)) { //calculamos el inverso del módulo del vector (dx,dy,dz) t = 1.0/sqrt(dx*dx+dy*dy+dz*dz); //coordenadas del punto de intersección en la esfera de radio unidad *xP = dx*t; *yP = dy*t; *zP = dz*t; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecArcCirMaxEsferaVertComunAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP) { //identificadores de igualdad entre puntos int AiC=0,AiD=0,BiC=0,BiD=0; //variables auxiliares double latA=0.0,lonA=0.0,latB=0.0; double lonAAux=0.0,lonCAux=0.0,lonDAux=0.0; //variable de salida int cod=GEOC_ARC_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //por defecto, las coordenadas de salida son 0.0 if((latP!=NULL)&&(lonP!=NULL)) { *latP = 0.0; *lonP = 0.0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //chequeamos la posible igualdad entre los vértices de los arcos AiC = (GEOC_ES_CERO(latA-latC,tol))&&(GEOC_ES_CERO(lonA-lonC,tol)); AiD = (GEOC_ES_CERO(latA-latD,tol))&&(GEOC_ES_CERO(lonA-lonD,tol)); BiC = (GEOC_ES_CERO(latB-latC,tol))&&(GEOC_ES_CERO(lonB-lonC,tol)); BiD = (GEOC_ES_CERO(latB-latD,tol))&&(GEOC_ES_CERO(lonB-lonD,tol)); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos los posibles casos en que los arcos tengan algún extremo común if((AiC&&BiD)||(AiD&&BiC)) { //los vértices coinciden, dos a dos: los arcos son el mismo cod = GEOC_ARC_INTERSEC_MISMO_ARC; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latA; *lonP = lonA; } } else if(AiC) { //compruebo si D está en el ecuador if(GEOC_ES_CERO(latD,tol)) { //comprobamos el tipo de colinelidad if((lonB*lonD)<=0.0) { //si el producto de las longitudes es negativo quiere decir que //los extremos B y D están cada uno a un lado del meridiano //origen, luego los arcos se tocan en un punto y son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_COLIN; } else { //los arcos se tocan en un punto y se solapan parcialmente cod = GEOC_ARC_INTERSEC_COLIN; } } else { //los arcos se tocan en un punto, pero no son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN; } //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latA; *lonP = lonA; } } else if(AiD) { //compruebo si C está en el ecuador if(GEOC_ES_CERO(latC,tol)) { //comprobamos el tipo de colinelidad if((lonB*lonC)<=0.0) { //si el producto de las longitudes es negativo quiere decir que //los extremos B y C están cada uno a un lado del meridiano //origen, luego los arcos se tocan en un punto y son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_COLIN; } else { //los arcos se tocan en un punto y se solapan parcialmente cod = GEOC_ARC_INTERSEC_COLIN; } } else { //los arcos se tocan en un punto, pero no son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN; } //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latA; *lonP = lonA; } } else if(BiC) { //compruebo si D está en el ecuador if(GEOC_ES_CERO(latD,tol)) { //ponemos el origen de longitudes en B lonAAux = -lonB; lonDAux = lonD-lonB; //comprobamos el tipo de colinelidad if((lonAAux*lonDAux)<=0.0) { //si el producto de las longitudes es negativo quiere decir que //los extremos A y D están cada uno a un lado de B, luego los //arcos se tocan en un punto y son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_COLIN; } else { //los arcos se tocan en un punto y se solapan parcialmente cod = GEOC_ARC_INTERSEC_COLIN; } } else { //los arcos se tocan en un punto, pero no son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN; } //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice B *latP = latB; *lonP = lonB; } } else if(BiD) { //compruebo si C está en el ecuador if(GEOC_ES_CERO(latC,tol)) { //ponemos el origen de longitudes en B lonAAux = -lonB; lonCAux = lonC-lonB; //comprobamos el tipo de colinelidad if((lonAAux*lonCAux)<=0.0) { //si el producto de las longitudes es negativo quiere decir que //los extremos A y C están cada uno a un lado de B, luego los //arcos se tocan en un punto y son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_COLIN; } else { //los arcos se tocan en un punto y se solapan parcialmente cod = GEOC_ARC_INTERSEC_COLIN; } } else { //los arcos se tocan en un punto, pero no son colineales cod = GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN; } //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latB; *lonP = lonB; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecArcCirMaxEsferaVertApoyadoAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP) { //coordenadas de trabajo double xC=0.0,yC=0.0,zC=0.0,xD=0.0,yD=0.0,zD=0.0,xP=0.0,yP=0.0,zP=0.0; double latA=0.0,lonA=0.0,latB=0.0,lonP1=0.0,lonP2=0.0; //variables auxiliares double cLat=0.0; //variable de salida int cod=GEOC_ARC_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //por defecto, las coordenadas de salida son 0.0 if((latP!=NULL)&&(lonP!=NULL)) { *latP = 0.0; *lonP = 0.0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si el arco CD está sobre el ecuador if(GEOC_ES_CERO(latC,tol)&&GEOC_ES_CERO(latD,tol)) { //comprobamos qué punto está en qué segmento //consideramos también el caso de que los segmentos sólo se toquen en un //extremo if(((lonA>(lonC-tol))&&(lonA<(lonD+tol)))|| ((lonA<(lonC+tol))&&(lonA>(lonD-tol)))) { //el punto A está entre C y D, los arcos se solapan cod = GEOC_ARC_INTERSEC_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latA; *lonP = lonA; } //salimos de la función return cod; } else if(((lonB>(lonC-tol))&&(lonB<(lonD+tol)))|| ((lonB<(lonC+tol))&&(lonB>(lonD-tol)))) { //el punto B está entre C y D, los arcos se solapan cod = GEOC_ARC_INTERSEC_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice B *latP = latB; *lonP = lonB; } //salimos de la función return cod; } else { //salimos de la función return cod; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas cartesianas tridimensionales geocéntricas de C cLat = cos(latC); xC = cLat*cos(lonC); yC = cLat*sin(lonC); zC = sin(latC); //coordenadas cartesianas tridimensionales geocéntricas de D cLat = cos(latD); xD = cLat*cos(lonD); yD = cLat*sin(lonD); zD = sin(latD); //calculamos la intersección de dos círculos máximos //aquí ya no cabe caso singular, ya que si los dos arcos estuviesen en el //ecuador habría sido detectado en el chequeo del principio de la función IntersecCircMaxEsfAux(tol,xC,yC,zC,xD,yD,zD,&xP,&yP,&zP); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos los posibles puntos de intersección lonP1 = atan2(yP,xP); lonP2 = lonP1+GEOC_CONST_PI; lonP2 = (lonP2>GEOC_CONST_PI) ? lonP2-2.0*GEOC_CONST_PI : lonP2; //vamos comprobando si algún punto de corte coincide con A, B, C o D if(GEOC_ES_CERO(lonP1,tol)||GEOC_ES_CERO(lonP2,tol)) { //los arcos no son colineales cod = GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice A *latP = latA; *lonP = lonA; } } else if(GEOC_ES_CERO(lonP1-lonB,tol)||GEOC_ES_CERO(lonP2-lonB,tol)) { //los arcos no son colineales cod = GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice B *latP = latB; *lonP = lonB; } } else if((GEOC_ES_CERO(latC,tol))&& (GEOC_ES_CERO(lonP1-lonC,tol)||GEOC_ES_CERO(lonP2-lonC,tol))) { //los arcos no son colineales cod = GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice C *latP = 0.0; *lonP = lonC; } } else if((GEOC_ES_CERO(latD,tol))&& (GEOC_ES_CERO(lonP1-lonD,tol)||GEOC_ES_CERO(lonP2-lonD,tol))) { //los arcos no son colineales cod = GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN; //comprobamos si hay que asignar coordenadas de salida if((latP!=NULL)&&(lonP!=NULL)) { //el punto de corte es el vértice D *latP = 0.0; *lonP = lonD; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecArcCircMaxEsferaAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, const double xGC, const double yGC, const double zGC, const double xGD, const double yGD, const double zGD, double* latP, double* lonP) { //coordenadas de trabajo double xC=0.0,yC=0.0,zC=0.0,xD=0.0,yD=0.0,zD=0.0; double xP=0.0,yP=0.0,zP=0.0,lonP1=0.0,lonP2=0.0,lonPI=0.0; //variables auxiliares double cLat=0.0; //variable de salida int cod=GEOC_ARC_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //por defecto, las coordenadas de salida son 0.0 if((latP!=NULL)&&(lonP!=NULL)) { *latP = 0.0; *lonP = 0.0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si CD cruza o no el ecuador if(((latC>tol)&&(latD>tol))||((latC<-tol)&&(latD<-tol))) { //salimos de la función return cod; } else { //casos en que los arcos puedan tener algún extremo común cod = IntersecArcCirMaxEsferaVertComunAux(tol,lonB,latC,lonC,latD,lonD, latP,lonP); //si se ha encontrado intersección, salimos de la función if(cod!=GEOC_ARC_NO_INTERSEC) { //salimos de la función return cod; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //comprobamos si un extremo de un arco se apoya en el otro cod = IntersecArcCirMaxEsferaVertApoyadoAux(tol,lonB,latC,lonC, latD,lonD,latP,lonP); //si se ha encontrado intersección, salimos de la función if(cod!=GEOC_ARC_NO_INTERSEC) { //salimos de la función return cod; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //comprobamos si no se han pasado coordenadas cartesianas para C if(EsGeocNan(xC)&&EsGeocNan(yC)&&EsGeocNan(zC)) { //coordenadas cartesianas tridimensionales geocéntricas de C cLat = cos(latC); xC = cLat*cos(lonC); yC = cLat*sin(lonC); zC = sin(latC); } else { //copiamos las coordenadas pasadas xC = xGC; yC = yGC; zC = zGC; } //comprobamos si no se han pasado coordenadas cartesianas para D if(EsGeocNan(xD)&&EsGeocNan(yD)&&EsGeocNan(zD)) { //coordenadas cartesianas tridimensionales geocéntricas de D cLat = cos(latD); xD = cLat*cos(lonD); yD = cLat*sin(lonD); zD = sin(latD); } else { //copiamos las coordenadas pasadas xD = xGD; yD = yGD; zD = zGD; } //calculamos la intersección de dos círculos máximos //aquí ya no cabe caso singular, ya que si los dos arcos estuviesen en //el ecuador habría sido detectado por la llamadas a //IntersecArcCirMaxEsferaVertComunAux() o //IntersecArcCirMaxEsferaVertApoyadoAux() IntersecCircMaxEsfAux(tol,xC,yC,zC,xD,yD,zD,&xP,&yP,&zP); //calculamos los posibles puntos de intersección lonP1 = atan2(yP,xP); lonP2 = lonP1+GEOC_CONST_PI; lonP2 = (lonP2>GEOC_CONST_PI) ? lonP2-2.0*GEOC_CONST_PI : lonP2; //compruebo si alguna de esas longitudes está en el segmento AB if(((lonP1>-tol)&&(lonP1lonB-tol))) { //asigno el código de salida cod = GEOC_ARC_INTERSEC; //longitud de la intersección lonPI = lonP1; } else if(((lonP2>-tol)&&(lonP2lonB-tol))) { //asigno el código de salida cod = GEOC_ARC_INTERSEC; //longitud de la intersección lonPI = lonP2; } //compruebo si, habiendo corte, hay coordenadas de salida if((cod!=GEOC_ARC_NO_INTERSEC)&&(latP!=NULL)&&(lonP!=NULL)) { //asigno las coordenadas a las variables de salida *latP = 0.0; *lonP = lonPI; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ int IntersecArcCircMaxEsfera(const double latA, const double lonA, const double latB, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP) { //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas de trabajo double xC=0.0,yC=0.0,zC=0.0,xD=0.0,yD=0.0,zD=0.0; double xCR=0.0,yCR=0.0,zCR=0.0,xDR=0.0,yDR=0.0,zDR=0.0; double lonBR=0.0,latCR=0.0,lonCR=0.0,latDR=0.0,lonDR=0.0; double latPR=0.0,lonPR=0.0; //matriz de rotación double mRot[3][3]; //variable auxiliar double cLat=0.0; //variable de salida int cod=GEOC_ARC_NO_INTERSEC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //por defecto, si no hay intersección, las coordenadas de salida son 0.0 if((latP!=NULL)&&(lonP!=NULL)) { *latP = 0.0; *lonP = 0.0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si los rectángulos son disjuntos, los segmentos no se tocan if(ArcosCircMaxDisjuntos(tol, GEOC_MIN(lonA,lonB),GEOC_MAX(lonA,lonB), GEOC_MIN(lonC,lonD),GEOC_MAX(lonC,lonD))) { //salimos de la función return cod; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la matriz de rotación para llevar AB al ecuador RotaArco00Ecuador(tol,latA,lonA,latB,lonB,mRot,&lonBR); //calculamos las coordenadas cartesianas de los puntos C y D cLat = cos(latC); xC = cLat*cos(lonC); yC = cLat*sin(lonC); zC = sin(latC); cLat = cos(latD); xD = cLat*cos(lonD); yD = cLat*sin(lonD); zD = sin(latD); //rotamos los puntos C y D AplicaMatrizRotacionCoorCart(1,xC,yC,zC,mRot,&xCR,&yCR,&zCR); AplicaMatrizRotacionCoorCart(1,xD,yD,zD,mRot,&xDR,&yDR,&zDR); //calculamos las coordenadas geodésicas rotadas latCR = asin(zCR); lonCR = atan2(yCR,xCR); latDR = asin(zDR); lonDR = atan2(yDR,xDR); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la intersección cod = IntersecArcCircMaxEsferaAux(tol,lonBR,latCR,lonCR,latDR,lonDR,xCR,yCR, zCR,xDR,yDR,zDR,&latPR,&lonPR); //transformamos el resultado al sistema original, si ha lugar if((cod!=GEOC_ARC_NO_INTERSEC)&&(latP!=NULL)&&(lonP!=NULL)) { AplicaMatrizRotacionCoorGeod(-1,latPR,lonPR,mRot,latP,lonP); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return cod; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/eucli.c000755 001750 001750 00000024433 13655033577 015240 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom interp @{ \file eucli.c \brief Definición de funciones para la realización de cálculos de geometría euclídea. \author José Luis García Pallero, jgpallero@gmail.com \date 27 de octubre de 2009 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/eucli.h" /******************************************************************************/ /******************************************************************************/ double Dist2D(const double x1, const double y1, const double x2, const double y2) { //calculamos y salimos de la función return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } /******************************************************************************/ /******************************************************************************/ void Dist2DVC(const double x1, const double y1, const double x2, const double y2, const double varx1, const double varx1y1, const double vary1, const double varx2, const double varx2y2, const double vary2, double* dist, double* varDist) { //matrices auxiliares double j[4],jvc[4]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la distancia *dist = Dist2D(x1,y1,x2,y2); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //rellenamos la matriz jacobiana j[0] = -(x2-x1)/(*dist); j[1] = -(y2-y1)/(*dist); j[2] = -j[0]; j[3] = -j[1]; //producto de la matriz jacobiana por la matriz de varianza-covarianza jvc[0] = j[0]*varx1+j[1]*varx1y1; jvc[1] = j[0]*varx1y1+j[1]*vary1; jvc[2] = j[2]*varx2+j[3]*varx2y2; jvc[3] = j[2]*varx2y2+j[3]*vary2; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //realizamos la propagación de errores *varDist = jvc[0]*j[0]+jvc[1]*j[1]+jvc[2]*j[2]+jvc[3]*j[3]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ double Dist3D(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2) { //calculamos y salimos de la función return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)); } /******************************************************************************/ /******************************************************************************/ void Dist3DVC(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double varx1, const double varx1y1, const double varx1z1, const double vary1, const double vary1z1, const double varz1, const double varx2, const double varx2y2, const double varx2z2, const double vary2, const double vary2z2, const double varz2, double* dist, double* varDist) { //matrices auxiliares double j[6],jvc[6]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la distancia *dist = Dist3D(x1,y1,z1,x2,y2,z2); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //rellenamos la matriz jacobiana j[0] = -(x2-x1)/(*dist); j[1] = -(y2-y1)/(*dist); j[2] = -(z2-z1)/(*dist); j[3] = -j[0]; j[4] = -j[1]; j[5] = -j[2]; //producto de la matriz jacobiana por la matriz de varianza-covarianza jvc[0] = j[0]*varx1+j[1]*varx1y1+j[2]*varx1z1; jvc[1] = j[0]*varx1y1+j[1]*vary1+j[2]*vary1z1; jvc[2] = j[0]*varx1z1+j[1]*vary1z1+j[2]*varz1; jvc[3] = j[3]*varx2+j[4]*varx2y2+j[5]*varx2z2; jvc[4] = j[3]*varx2y2+j[4]*vary2+j[5]*vary2z2; jvc[5] = j[3]*varx2z2+j[4]*vary2z2+j[5]*varz2; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //realizamos la propagación de errores *varDist = jvc[0]*j[0]+jvc[1]*j[1]+jvc[2]*j[2]+jvc[3]*j[3]+jvc[4]*j[4]+ jvc[5]*j[5]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ double AnguloVecPlano(const double x1, const double y1, const double x2, const double y2) { //variables auxiliares double num=0.0,den=0.0; //variable de salida double alfa=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el numerador de la fórmula que da el coseno del ángulo num = x1*x2+y1*y2; //calculamos el denominador de la fórmula que da el coseno del ángulo den = sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)); //calculamos el coseno del ángulo, teniendo en cuenta casos singulares if(den==0.0) { //si el denominador es 0.0, el ángulo es 0.0 y su coseno 1.0 alfa = 1.0; } else { //no hay singularidad alfa = num/den; } //calculamos el ángulo alfa = acos(alfa); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return alfa; } /******************************************************************************/ /******************************************************************************/ double AlturaTriangulo(const double xVert, const double yVert, const double xBase1, const double yBase1, const double xBase2, const double yBase2) { //ángulo entra la base en el punto 1 y el vértice double alfa=0.0; //longitud del punto 1 de la base al vértice double lon=0.0; //variables auxiliares double dxv=0.0,dyv=0.0,dxb=0.0,dyb=0.0; //variable de salida double h=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos los incrementos de coordenadas auxiliares dxv = xVert-xBase1; dyv = yVert-yBase1; dxb = xBase2-xBase1; dyb = yBase2-yBase1; //calculamos el ángulo entre la base y el segmento que une el punto inicial //de ésta con el vértice alfa = AnguloVecPlano(dxv,dyv,dxb,dyb); //longitud del lado que une la base con el vértice 1 de la base lon = sqrt(dxv*dxv+dyv*dyv); //calculamos la altura h = fabs(lon*sin(alfa)); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return h; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/polil.c000755 001750 001750 00000165503 13655514100 015244 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file polil.c \brief Definición de funciones para el trabajo con polilíneas. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 03 de junio de 2011 \copyright Copyright (c) 2011-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/polil.h" /******************************************************************************/ /******************************************************************************/ int GeocParOmpPolil(char version[]) { //comprobamos si hay paralelización #if defined(_OPENMP) //comprobamos si hay que extraer versión if(version!=NULL) { //calculamos la versión VersionOpenMP(_OPENMP,version); } //salimos de la función return 1; #else if(version!=NULL) { //utilizamos la variable version para que no dé warming al compilar strcpy(version,""); } //salimos de la función return 0; #endif } /******************************************************************************/ /******************************************************************************/ polil* IniciaPolilVacia(void) { //estructura de salida polil* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos memoria para la estructura sal = (polil*)malloc(sizeof(polil)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //inicializamos los campos escalares a 0 sal->nElem = 0; sal->nPolil = 0; sal->hayLim = 0; //inicializamos los campos vectoriales a NULL sal->x = NULL; sal->y = NULL; sal->posIni = NULL; sal->nVert = NULL; sal->xMin = NULL; sal->xMax = NULL; sal->yMin = NULL; sal->yMax = NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int AuxCreaPolil1(const size_t nElem, const size_t* posNanX, const size_t* posNanY, const size_t nNanX, const size_t nNanY, size_t* nElemMax, size_t* nPolil) { //índice para recorrer bucles size_t i=0; //variable de salida int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay el mismo número de NaN en los dos vectores if(nNanX!=nNanY) { //salimos de la función return GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL; } //comprobamos si hay NaN en las mismas posiciones de los vectores for(i=0;i fin del #pragma omp parallel sections //comprobamos los posibles errores de asignación de memoria if(((posNanX==NULL)&&(nNanX!=0))||((posNanY==NULL)&&(nNanY!=0))) { //liberamos la memoria asignada LibMemPolil(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los vectores tienen bien colocados los NaN y calculamos //el número máximo de elementos de los vectores de la estructura y el //número de polilíneas *idError = AuxCreaPolil1(nElem,posNanX,posNanY,nNanX,nNanY,&nElemMax, &nPolil); //comprobamos los posibles errores if(*idError!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(sal); free(posNanX); free(posNanY); //escribimos el mensaje de error if(*idError==GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL) { GEOC_ERROR("Error: Los vectores de trabajo no contienen el mismo " "número de polilíneas"); } else if(*idError==GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL) { GEOC_ERROR("Error: Los vectores de trabajo no contienen las mismas " "polilíneas"); } //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el número de polilíneas sal->nPolil = nPolil; //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(sal,nElemMax,nPolil) #endif { //asignamos memoria para los vectores de la estructura #if defined(_OPENMP) #pragma omp section #endif sal->x = (double*)malloc(nElemMax*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->y = (double*)malloc(nElemMax*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->posIni = (size_t*)malloc(nPolil*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->nVert = (size_t*)malloc(nPolil*sizeof(double)); } // --> fin del #pragma omp parallel sections //comprobamos los posibles errores if((sal->x==NULL)||(sal->y==NULL)||(sal->posIni==NULL)||(sal->nVert==NULL)) { //liberamos la memoria asignada LibMemPolil(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //copiamos las polilíneas a la estructura //como ya sabemos que el número de NaN y sus posiciones son los mismos para //los vectores x e y, trabajamos con los valores para el vector x AuxCreaPolil3(x,y,nElem,incX,incY,posNanX,nNanX,sal->x,sal->y,sal->posIni, sal->nVert,&ptos,&nPolil); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay de verdad alguna polilínea if(nPolil==0) { //liberamos la memoria asignada LibMemPolil(sal); free(posNanX); free(posNanY); //creamos la estructura vacía sal = IniciaPolilVacia(); //comprobamos los posibles errores if(sal==NULL) { //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //salimos de la función return sal; } //asignamos el número de elementos a la estructura sal->nElem = ptos; //comprobamos si hay que reajustar el tamaño de los vectores de coordenadas if(ptos!=nElemMax) { //asignamos el nuevo tamaño de los vectores sal->nElem = ptos; //reajustamos los tamaños sal->x = (double*)realloc(sal->x,ptos*sizeof(double)); sal->y = (double*)realloc(sal->y,ptos*sizeof(double)); } //comprobamos si el número de polilíneas es el estimado if(nPolil!=sal->nPolil) { //asignamos de nuevo la variable de número de polilíneas sal->nPolil = nPolil; //reajustamos los tamaños sal->posIni = (size_t*)realloc(sal->posIni,nPolil*sizeof(size_t)); sal->nVert = (size_t*)realloc(sal->nVert,nPolil*sizeof(size_t)); } //comprobamos los posibles errores if((sal->x==NULL)||(sal->y==NULL)||(sal->posIni==NULL)||(sal->nVert==NULL)) { //liberamos la memoria asignada LibMemPolil(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria asignada free(posNanX); free(posNanY); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ void EnlazaCamposPolil(polil* poliEnt, polil* poliSal) { //LIBERAMOS LA POSIBLE MEMORIA ASIGNADA A LOS CAMPOS VECTORIALES DE LA //ESTRUCTURA DE SALIDA //comprobamos si hay algún elemento en los vectores de coordenadas if(poliSal->nElem) { free(poliSal->x); free(poliSal->y); } //comprobamos si hay alguna polilínea en los vectores de posiciones if(poliSal->nPolil) { free(poliSal->posIni); free(poliSal->nVert); } //comprobamos si hay límites calculados if(poliSal->hayLim) { free(poliSal->xMin); free(poliSal->xMax); free(poliSal->yMin); free(poliSal->yMax); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //enlazamos todos los campos de la estructura de entrada en la de salida poliSal->nElem = poliEnt->nElem; poliSal->x = poliEnt->x; poliSal->y = poliEnt->y; poliSal->nPolil = poliEnt->nPolil; poliSal->posIni = poliEnt->posIni; poliSal->nVert = poliEnt->nVert; poliSal->hayLim = poliEnt->hayLim; poliSal->xMin = poliEnt->xMin; poliSal->xMax = poliEnt->xMax; poliSal->yMin = poliEnt->yMin; poliSal->yMax = poliEnt->yMax; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ polil* CopiaPolil(const polil* poli, int* idError) { //polilínea de salida polil* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la variable de error *idError = GEOC_ERR_NO_ERROR; //inicializamos la polilínea de salida sal = IniciaPolilVacia(); //comprobamos los posibles errores if(sal==NULL) { //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //sólo continuamos si la polilínea de entrada contiene datos if(poli->nElem) { //copiamos las coordenadas de los vértices *idError = AnyadeDatosPolil(sal,poli->x,poli->y,poli->nElem,1,1); //comprobamos si ha ocurrido algún error if((*idError)!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(sal); //escribimos el mensaje de error if((*idError)==GEOC_ERR_ASIG_MEMORIA) { GEOC_ERROR("Error de asignación de memoria"); } else if((*idError)==GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL) { GEOC_ERROR("Error: Los vectores de coordenadas de la\n" "polilínea de entrada no contienen el mismo número " "de polilíneas"); } else if((*idError)==GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL) { GEOC_ERROR("Error: Los vectores de coordenadas de la\n" "polilínea de entrada no contienen las mismas " "polilíneas"); } //salimos de la función return NULL; } //comprobamos si hay que calcular límites if(poli->hayLim) { //calculamos los límites *idError = CalcLimitesPolil(sal); //comprobamos los posibles errores if((*idError)!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(sal); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int AnyadePolilPolil(polil* poli, const polil* anyade) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //número total de elementos size_t nElem=0,nPolil=0; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si la polilínea a añadir está vacía, salimos de la función if((anyade!=NULL)&&(anyade->nPolil==0)) { //salimos de la función sin hacer nada return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el número total de elementos de la polilínea conjunta nElem = poli->nElem+anyade->nElem; //si la polilínea original contenía datos, al número total de elementos hay //que restarle 1 por el NaN común que sobra al juntar las dos estructuras if(poli->nPolil) { nElem--; } //calculamos el número total de polilíneas nPolil = poli->nPolil+anyade->nPolil; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //reasignamos memoria para cubrir los nuevos datos poli->x = (double*)realloc(poli->x,nElem*sizeof(double)); poli->y = (double*)realloc(poli->y,nElem*sizeof(double)); poli->posIni = (size_t*)realloc(poli->posIni,nPolil*sizeof(size_t)); poli->nVert = (size_t*)realloc(poli->nVert,nPolil*sizeof(size_t)); //reasignamos también para los posibles vectores de límites if(poli->hayLim) { poli->xMin = (double*)realloc(poli->xMin,nPolil*sizeof(double)); poli->xMax = (double*)realloc(poli->xMax,nPolil*sizeof(double)); poli->yMin = (double*)realloc(poli->yMin,nPolil*sizeof(double)); poli->yMax = (double*)realloc(poli->yMax,nPolil*sizeof(double)); } //comprobamos los posibles errores en las asignaciones obligatorias if((poli->x==NULL)||(poli->y==NULL)||(poli->posIni==NULL)|| (poli->nVert==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //comprobamos los posibles errores en las asignaciones de límites if(poli->hayLim) { if((poli->xMin==NULL)||(poli->xMax==NULL)||(poli->yMin==NULL)|| (poli->yMax==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posición de inicio para copiar en la estructura de salida //si la estructura de salida está vacía, se comienza en la primera posición //si tiene datos, se comienza a continuación en la última (dentro del bucle, //la suma de posIni hace que se comience a continuación de la última) pos = (poli->nPolil==0) ? 0 : poli->nElem-1; //recorremos el número de nuevos elementos for(i=0;inElem;i++) { //copiamos las coordenadas poli->x[pos+i] = anyade->x[i]; poli->y[pos+i] = anyade->y[i]; } //calculamos las posiciones a sumar para ajustar las posiciones de inicio de //las polilíneas añadidas //si la estructura de salida está vacía, se copian las posiciones tal cual //si tiene datos, se suman las posiciones ya ocupadas pos = (poli->nPolil==0) ? 0 : poli->nElem-1; //recorremos el número de polilíneas for(i=0;inPolil;i++) { //copiamos las posiciones de inicio actualizadas y el número de vértices poli->posIni[poli->nPolil+i] = anyade->posIni[i]+pos; poli->nVert[poli->nPolil+i] = anyade->nVert[i]; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular límites if(poli->hayLim) { //comprobamos si ya están calculados if(anyade->hayLim) { //recorremos el número de polilíneas y copiamos los límites for(i=0;inPolil;i++) { //copiamos los límites poli->xMin[poli->nPolil+i] = anyade->xMin[i]; poli->xMax[poli->nPolil+i] = anyade->xMax[i]; poli->yMin[poli->nPolil+i] = anyade->yMin[i]; poli->yMax[poli->nPolil+i] = anyade->yMax[i]; } } else { //calculamos los límites y los copiamos LimitesPoligonosPolig(&(anyade->x[1]),&(anyade->y[1]),1,1, anyade->posIni,anyade->nVert,anyade->nPolil, anyade->posIni[0],&(poli->xMin[poli->nPolil]), &(poli->xMax[poli->nPolil]), &(poli->yMin[poli->nPolil]), &(poli->yMax[poli->nPolil])); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ajustamos los tamaños antes de salir poli->nElem = nElem; poli->nPolil = nPolil; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ int AnyadeDatosPolil(polil* poli, const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY) { //polilínea auxiliar polil* aux=NULL; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //contemplamos una posible salida rápida if(nElem==0) { //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos una nueva polilínea con los datos a añadir aux = CreaPolil(x,y,nElem,incX,incY,&estado); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(aux); //escribimos el mensaje de error if(estado==GEOC_ERR_ASIG_MEMORIA) { GEOC_ERROR("Error de asignación de memoria"); } else if(estado==GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL) { GEOC_ERROR("Error: Los vectores de trabajo no contienen el mismo " "número de polilíneas"); } else if(estado==GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL) { GEOC_ERROR("Error: Los vectores de trabajo no contienen las mismas " "polilíneas"); } //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //añadimos la nueva estructura estado = AnyadePolilPolil(poli,aux); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(aux); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria utilizada LibMemPolil(aux); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void LibMemPolil(polil* datos) { //comprobamos si hay memoria que liberar if(datos!=NULL) { //liberamos la memoria asignada al vector de coordenadas X if(datos->x!=NULL) { free(datos->x); } //liberamos la memoria asignada al vector de coordenadas Y if(datos->y!=NULL) { free(datos->y); } //liberamos la memoria asignada al vector de posiciones if(datos->posIni!=NULL) { free(datos->posIni); } //liberamos la memoria asignada al vector de número de vértices if(datos->nVert!=NULL) { free(datos->nVert); } //liberamos la memoria asignada a los vector de coordenadas X mínimas if(datos->xMin!=NULL) { free(datos->xMin); } //liberamos la memoria asignada a los vector de coordenadas X máximas if(datos->xMax!=NULL) { free(datos->xMax); } //liberamos la memoria asignada a los vector de coordenadas Y mínimas if(datos->yMin!=NULL) { free(datos->yMin); } //liberamos la memoria asignada a los vector de coordenadas Y máximas if(datos->yMax!=NULL) { free(datos->yMax); } //liberamos la memoria asignada a la estructura free(datos); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int CalcLimitesPolil(polil* poli) { //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((poli->nPolil==0)||(poli->hayLim)) { //salimos de la función si la estructura no contiene polilíneas o si //éstas ya tienen calculados sus límites return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli) #endif { //asignamos memoria para los vectores de límites #if defined(_OPENMP) #pragma omp section #endif poli->xMin = (double*)malloc((poli->nPolil)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->xMax = (double*)malloc((poli->nPolil)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->yMin = (double*)malloc((poli->nPolil)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->yMax = (double*)malloc((poli->nPolil)*sizeof(double)); } // --> fin del #pragma omp parallel sections //comprobamos los posibles errores if((poli->xMin==NULL)||(poli->xMax==NULL)||(poli->yMin==NULL)|| (poli->yMax==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //indicamos que sí hay límites poli->hayLim = 1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos los límites de todas las polilíneas LimitesPoligonosPolig(poli->x,poli->y,1,1,poli->posIni,poli->nVert, poli->nPolil,0,poli->xMin,poli->xMax,poli->yMin, poli->yMax); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void EscalaYTrasladaPolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim) { //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,escalaX,trasladaX,escalaY,trasladaY) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos los factores de escala y las traslaciones a las coordenadas X EscalaYTrasladaVector(poli->x,poli->nElem,1,escalaX,trasladaX); #if defined(_OPENMP) #pragma omp section #endif //aplicamos los factores de escala y las traslaciones a las coordenadas Y EscalaYTrasladaVector(poli->y,poli->nElem,1,escalaY,trasladaY); } // --> fin del #pragma omp parallel sections //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ESTA PARTE NO LA PARALELIZAMOS, YA QUE SUPONEMOS QUE EL NÚMERO DE //POLÍGONOS EN UNA ESTRUCTURA SIEMPRE SERÁ MUCHÍSIMO MENOR QUE EL NÚMERO //TOTAL DE VÉRTICES //comprobamos si hay que aplicar el factor a los límites if(aplicaLim&&poli->hayLim) { //aplicamos los factores de escala y las traslaciones a los límites EscalaYTrasladaVector(poli->xMin,poli->nPolil,1,escalaX,trasladaX); EscalaYTrasladaVector(poli->xMax,poli->nPolil,1,escalaX,trasladaX); EscalaYTrasladaVector(poli->yMin,poli->nPolil,1,escalaY,trasladaY); EscalaYTrasladaVector(poli->yMax,poli->nPolil,1,escalaY,trasladaY); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void TrasladaYEscalaPolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim) { //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,escalaX,trasladaX,escalaY,trasladaY) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos las traslaciones y los factores de escala a las coordenadas X TrasladaYEscalaVector(poli->x,poli->nElem,1,escalaX,trasladaX); #if defined(_OPENMP) #pragma omp section #endif //aplicamos las traslaciones y los factores de escala a las coordenadas Y TrasladaYEscalaVector(poli->y,poli->nElem,1,escalaY,trasladaY); } // --> fin del #pragma omp parallel sections //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ESTA PARTE NO LA PARALELIZAMOS, YA QUE SUPONEMOS QUE EL NÚMERO DE //POLÍGONOS EN UNA ESTRUCTURA SIEMPRE SERÁ MUCHÍSIMO MENOR QUE EL NÚMERO //TOTAL DE VÉRTICES //comprobamos si hay que aplicar el factor a los límites if(aplicaLim&&poli->hayLim) { //aplicamos las traslaciones y los factores de escala a los límites TrasladaYEscalaVector(poli->xMin,poli->nPolil,1,escalaX,trasladaX); TrasladaYEscalaVector(poli->xMax,poli->nPolil,1,escalaX,trasladaX); TrasladaYEscalaVector(poli->yMin,poli->nPolil,1,escalaY,trasladaY); TrasladaYEscalaVector(poli->yMax,poli->nPolil,1,escalaY,trasladaY); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void MuevePolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int orden, const int aplicaLim) { //comprobamos el orden de aplicación de los factores if(orden==0) { //primero los factores de escala y luego las traslaciones EscalaYTrasladaPolil(poli,escalaX,escalaY,trasladaX,trasladaY, aplicaLim); } else { //primero las traslaciones y luego los factores de escala TrasladaYEscalaPolil(poli,escalaX,escalaY,trasladaX,trasladaY, aplicaLim); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int AligeraPolil(polil* poli, const int esf, const double facCoor, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto) { //índices para recorrer bucles size_t i=0,j=0; //posición inicial de la polilínea de trabajo y número de puntos aligerados size_t posIni=0,nVert=0,nPtos=0; //polilínea que es un mismo punto int pmp=0; //coordenadas de trabajo double* x=NULL; double* y=NULL; double* xF=NULL; double* yF=NULL; //vértices de la polilínea de entrada más larga size_t nVertMax=0; //estructura auxiliar polil* aux=NULL; //vector de posiciones después del aligerado size_t* pos=NULL; //variable de salida int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos una posible salida rápida if(poli->nPolil==0) { //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar vacía aux = IniciaPolilVacia(); //comprobamos los posibles errores if(aux==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay factor de escala para las coordenadas if(facCoor!=1.0) { //vértices de la polilínea más larga nVertMax = MaximoSizeT(poli->nVert,poli->nPolil,1); //asignamos memoria para las coordenadas con factor de escala xF = (double*)malloc(nVertMax*sizeof(double)); yF = (double*)malloc(nVertMax*sizeof(double)); //comprobamos posibles errores if((xF==NULL)||(yF==NULL)) { //liberamos la memoria asignada LibMemPolil(aux); free(xF); free(yF); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos el número de polilíneas almacenadas for(i=0;inPolil;i++) { //extraemos la posición inicial de la polilínea de trabajo posIni = poli->posIni[i]; //número de vértices de la polilínea nVert = poli->nVert[i]; //comprobamos si hay factor de escala para las coordenadas if(facCoor!=1.0) { //copiamos las coordenadas y aplicamos el factor de escala for(j=0;jx[posIni+j]); yF[j] = facCoor*(poli->y[posIni+j]); } } else { //las coordenadas de la polilínea se quedan como están xF = &(poli->x[posIni]); yF = &(poli->y[posIni]); } //aligeramos la polilínea de trabajo pos = AligeraPolilinea(xF,yF,nVert,1,1,tol,paralelizaTol,robusto, nSegRobOrig,nSegRobAuto,esf,&nPtos); //comprobamos posibles errores if(pos==NULL) { //liberamos la memoria asignada LibMemPolil(aux); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //comprobamos si la polilínea se ha quedado en dos puntos if(nPtos==2) { //comprobamos si los dos puntos son el mismo pmp = ((poli->x[posIni+pos[0]])==(poli->x[posIni+pos[1]]))&& ((poli->y[posIni+pos[0]])==(poli->y[posIni+pos[1]])); } //comprobamos si después del aligerado todavía queda una polilínea que //no sea un único punto if((nPtos>2)||((nPtos==2)&&(!pmp))) { //memoria para los vectores de coordenadas de la polilínea aligerada x = (double*)malloc(nPtos*sizeof(double)); y = (double*)malloc(nPtos*sizeof(double)); //comprobamos posibles errores if((x==NULL)||(y==NULL)) { //liberamos la memoria asignada LibMemPolil(aux); free(pos); free(x); free(y); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //recorremos el número de puntos de la polilínea aligerada for(j=0;jx[posIni+pos[j]]; y[j] = poli->y[posIni+pos[j]]; } //añadimos las coordenadas a la polilínea aligerada estado = AnyadeDatosPolil(aux,x,y,nPtos,1,1); //sólo puede haber ocurrido un error de asignación de memoria, ya //que suponemos que la polilínea de entrada es correcta if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(aux); free(pos); free(x); free(y); if(facCoor!=1.0) { free(xF); free(yF); } //escribimos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //liberamos la memoria asignada a los vectores de coordenadas free(x); free(y); } //liberamos la memoria asignada al vector de posiciones del aligerado free(pos); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular límites if(poli->hayLim) { //calculamos los límites estado = CalcLimitesPolil(aux); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolil(aux); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //enlazamos los campos de la estructura auxiliar a los de la estructura de //salida EnlazaCamposPolil(aux,poli); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria asignada free(aux); if(facCoor!=1.0) { free(xF); free(yF); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void ImprimeCabeceraPolilFichero(const polil* poli, const size_t indice, const char iniCab[], const int impLim, const char formCoor[], const double factorX, const double factorY, FILE* idFich) { //número de vértices de la polilínea de trabajo size_t nVert=0; //límites double xMin=0.0,xMax=0.0,yMin=0.0,yMax=0.0,limAux=0.0; //variables de posición size_t pos=0,posXMin=0,posXMax=0,posYMin=0,posYMax=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //número de vértices a imprimir de la polilínea nVert = poli->nVert[indice]; //posición de inicio de la polilínea pos = poli->posIni[indice]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //imprimimos la marca de inicio y el número de vértices fprintf(idFich,"%s %8zu",iniCab,nVert); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que imprimir los límites if(impLim) { //comprobamos si ya están calculados los límites if(poli->hayLim) { //extraemos los límites xMin = poli->xMin[indice]; xMax = poli->xMax[indice]; yMin = poli->yMin[indice]; yMax = poli->yMax[indice]; } else { //buscamos las posiciones de los elementos máximo y mínimo //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,pos,nVert,posXMin,posXMax,posYMin,posYMax) #endif { //posiciones en el vector X #if defined(_OPENMP) #pragma omp section #endif MinMax(&(poli->x[pos]),nVert,1,&posXMin,&posXMax); //posiciones en el vector Y #if defined(_OPENMP) #pragma omp section #endif MinMax(&(poli->y[pos]),nVert,1,&posYMin,&posYMax); } // --> fin del #pragma omp parallel sections //extraemos los valores extremos xMin = poli->x[pos+posXMin]; xMax = poli->x[pos+posXMax]; yMin = poli->y[pos+posYMin]; yMax = poli->y[pos+posYMax]; } //comprobamos si el factor de escala para X es negativo if(factorX<0.0) { //los límites cambian limAux = xMin; xMin = xMax; xMax = limAux; //aplicamos el factor de escala xMin *= factorX; xMax *= factorX; } //comprobamos si el factor de escala para Y es negativo if(factorY<0.0) { //los límites cambian limAux = yMin; yMin = yMax; yMax = limAux; //aplicamos el factor de escala yMin *= factorY; yMax *= factorY; } //imprimimos los límites fprintf(idFich," "); fprintf(idFich,formCoor,xMin); fprintf(idFich," "); fprintf(idFich,formCoor,xMax); fprintf(idFich," "); fprintf(idFich,formCoor,yMin); fprintf(idFich," "); fprintf(idFich,formCoor,yMax); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salto de línea final fprintf(idFich,"\n"); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void ImprimePolilFichero(const polil* poli, const double factorX, const double factorY, const int iniNan, const int finNan, const char formCoor[], const int impCabecera, const char iniCab[], const int impLim, FILE* idFich) { //índices para recorrer bucles size_t i=0,j=0; //cadena de formato para imprimir los posibles valores NaN char formNan[GEOC_NAN_LON_FORM_NUM_SIMPLE+1]; //variable de posición size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si la estructura contiene alguna polilínea if(poli->nPolil==0) { //salimos sin imprimir nada return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la cadena de formato para imprimir los polibles NaN FormatoNumFormatoTexto(formCoor,formNan); //comprobamos si hay que imprimir la marca separadora al principio if(iniNan) { //la imprimimos ImprimeGeocNanTexto(idFich,2,formNan,1); } //recorremos el número de polilíneas for(i=0;inPolil;i++) { //comprobamos si hay que imprimir la cabecera if(impCabecera) { //imprimos la cabecera ImprimeCabeceraPolilFichero(poli,i,iniCab,impLim,formCoor,factorX, factorY,idFich); } //posición del punto inicial de la polilínea pos = poli->posIni[i]; //recorremos el número de vértices de la polilínea de trabajo for(j=0;jnVert[i];j++) { //imprimimos las coordenadas, multiplicadas por factor fprintf(idFich,formCoor,factorX*poli->x[pos+j]); fprintf(idFich,formCoor,factorY*poli->y[pos+j]); fprintf(idFich,"\n"); } //imprimimos la marca separadora al final (menos para el último) if(i!=(poli->nPolil-1)) { ImprimeGeocNanTexto(idFich,2,formNan,1); } } //comprobamos si hay que imprimir la marca separadora al final if(finNan) { //la imprimimos ImprimeGeocNanTexto(idFich,2,formNan,1); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/ptopol.c000755 001750 001750 00000153353 13656271305 015452 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file ptopol.c \brief Declaración de funciones para la realización de chequeos de inclusión de puntos en polígonos. En el momento de la compilación ha de seleccionarse el tipo de dato que se utilizará en los cálculos intermedios de las funciones \ref PtoEnPoligonoVerticeBorde y \ref PtoEnPoligonoVerticeBordeDouble. Si los puntos de trabajo están muy alejados de los polígonos pueden darse casos de resultados erróneos. Sería conveniente que los cálculos internedios se hiciesen en variables de 64 bits, pero el tipo long int suele ser de 4 bytes en procesadores de 32 bits. Para seleccionar este tipo como long long int, lo que en procesadores de 32 bits equivale a una variable de 64 bits, es necesario definir la variable para el preprocesador \em PTOPOL_BORDE_LONG_64. En procesadores de 64 bits no es necesario (aunque puede utilizarse), ya que el tipo long int tiene una longitud de 64 bits. Si no se define la variable, se usará un tipo long int para los cálculos intermedios. En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. El uso del tipo long long int en procesadores de 32 bits puede hacer que las funciones se ejecuten hasta 10 veces más lentamente que si se utiliza el tipo long int. Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits, los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 05 de abril de 2010 \copyright Copyright (c) 2010-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/ptopol.h" /******************************************************************************/ /******************************************************************************/ int GeocParOmpPtopol(char version[]) { //comprobamos si hay paralelización #if defined(_OPENMP) //comprobamos si hay que extraer versión if(version!=NULL) { //calculamos la versión VersionOpenMP(_OPENMP,version); } //salimos de la función return 1; #else if(version!=NULL) { //utilizamos la variable version para que no dé warming al compilar strcpy(version,""); } //salimos de la función return 0; #endif } /******************************************************************************/ /******************************************************************************/ int GeocLongLongIntPtopol(void) { //comprobamos si se ha pasado la variable del preprocesador #if defined(PTOPOL_BORDE_LONG_64) return 1; #else return 0; #endif } /******************************************************************************/ /******************************************************************************/ int PtoEnRectangulo(const double x, const double y, const double xMin, const double xMax, const double yMin, const double yMax) { //posibles posiciones del punto if((xxMax)||(yyMax)) { //punto fuera return GEOC_PTO_FUERA_POLIG; } else if((x>xMin)&&(xyMin)&&(y=xMin2)&&(xMax1<=xMax2)&&(yMin1>=yMin2)&&(yMax1<=yMax2)) { //el rectángulo está contenido sal = 1; } } else { //el borde no se tiene en cuenta if((xMin1>xMin2)&&(xMax1yMin2)&&(yMax1y)!=(coorY[posJY]>y))&& (x<(coorX[posJX]-coorX[posIX])*(y-coorY[posIY])/ (coorY[posJY]-coorY[posIY])+coorX[posIX])) { c = !c; } } //asignamos el elemento de salida if(c) { //el punto está dentro del polígono c = GEOC_PTO_DENTRO_POLIG; } else { //el punto está fuera del polígono c = GEOC_PTO_FUERA_POLIG; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return c; } /******************************************************************************/ /******************************************************************************/ void PtosEnPoligono(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double* coorX, const double* coorY, const size_t N, const size_t incCoorX, const size_t incCoorY, int* situacion, const size_t incSituacion) { //índice para recorrer bucles size_t i=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(nPtos,incSituacion,situacion,incX,x,incY,y,N,incCoorX,coorX,incCoorY, \ coorY) \ private(i) #endif //recorremos los puntos a chequear for(i=0;i0)!=(cy1>0); Lstrad = (cy<0)!=(cy1<0); //straddle computation if(Rstrad||Lstrad) { //compute intersection of e with x axis X = ((double)(cx*cy1-cx1*cy))/((double)(cy1-cy)); //crosses ray if strictly positive intersection if(Rstrad&&(X>0.0)) { Rcross++; } //crosses ray if strictly negative intersection if(Lstrad&&(X<0.0)) { Lcross++; } } } //q on the edge if left and right cross are not the same parity if((Rcross%2)!=(Lcross%2)) { //el punto está en un borde return GEOC_PTO_BORDE_POLIG; } //q inside if an odd number of crossings if((Rcross%2)==1) { //el punto es interior return GEOC_PTO_DENTRO_POLIG; } else { //el punto es exterior return GEOC_PTO_FUERA_POLIG; } } /******************************************************************************/ /******************************************************************************/ void PtosEnPoligonoVerticeBorde(const long* x, const long* y, const size_t nPtos, const size_t incX, const size_t incY, const long* coorX, const long* coorY, const size_t N, const size_t incCoorX, const size_t incCoorY, int* situacion, const size_t incSituacion) { //índice para recorrer bucles size_t i=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(nPtos,incSituacion,situacion,incX,x,incY,y,N,incCoorX,coorX,incCoorY, \ coorY) \ private(i) #endif //recorremos los puntos a chequear for(i=0;idmax) { dmax = aux; } } //compruebo la precisión de trabajo if(sizeof(ptopol_long)==4) { //precisión de 32 bits (4 bytes) fmult = floor(GEOC_PTO_POLIG_LEJOS_ESCALA_DIST* GEOC_PTO_POLIG_LEJOS_32/dmax); } else { //precisión de 64 bits (8 bytes) fmult = floor(GEOC_PTO_POLIG_LEJOS_ESCALA_DIST* GEOC_PTO_POLIG_LEJOS_64/dmax); } } else { fmult = factor; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //pasamos a número entero el punto a evaluar if(redondeo) { //redondeo fX = (ptopol_long)(round(fmult*x)); fY = (ptopol_long)(round(fmult*y)); } else { //truncamiento fX = (ptopol_long)(fmult*x); fY = (ptopol_long)(fmult*y); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //for each edge e=(i-1,i), see if crosses ray for(i=0;i0)!=(cy1>0); Lstrad = (cy<0)!=(cy1<0); //straddle computation if(Rstrad||Lstrad) { //compute intersection of e with x axis X = ((double)(cx*cy1-cx1*cy))/((double)(cy1-cy)); //crosses ray if strictly positive intersection if(Rstrad&&(X>0.0)) { Rcross++; } //crosses ray if strictly negative intersection if(Lstrad&&(X<0.0)) { Lcross++; } } } //q on the edge if left and right cross are not the same parity if((Rcross%2)!=(Lcross%2)) { //el punto está en un borde return GEOC_PTO_BORDE_POLIG; } //q inside if an odd number of crossings if((Rcross%2)==1) { //el punto es interior return GEOC_PTO_DENTRO_POLIG; } else { //el punto es exterior return GEOC_PTO_FUERA_POLIG; } } /******************************************************************************/ /******************************************************************************/ void PtosEnPoligonoVerticeBordeDouble(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double* coorX, const double* coorY, const size_t N, const size_t incCoorX, const size_t incCoorY, const double factor, const int redondeo, int* situacion, const size_t incSituacion) { //índice para recorrer bucles size_t i=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(nPtos,incSituacion,situacion,incX,x,incY,y,N,incCoorX,coorX,incCoorY, \ coorY,factor,redondeo) \ private(i) #endif //recorremos los puntos a chequear for(i=0;i cierro el if(continuar) si compilamos para OpenMP #endif } // --> fin del #pragma omp parallel for } else { //hacemos una comprobación normal pos = PtoEnPoligono(x,y,coorX,coorY,N,incX,incY); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return pos; } /******************************************************************************/ /******************************************************************************/ int PtoEnPoligonoVerticeInd(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, size_t* poli) { //índice para recorrer bucles size_t i=0; //posiciones de inicio de los vértices X e Y size_t iniX=0,iniY=0; //número de elementos del polígono a chequear size_t nElem=0; //variable auxiliar de situación de punto int posAux=0; //variable indicadora de continuación de chequeos size_t continuar=1; //variable de salida int pos=GEOC_PTO_FUERA_POLIG; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el polígono que contiene al punto *poli = 0; //comprobamos si hay valores NaN if(nNan) { //paralelización con OpenMP //utilizo schedule(dynamic) para que los polígonos vayan siendo //chequeados uno a uno según los hilos de ejecución van quedándose //libres //hago esto porque es muy probable que los polígonos vengan listados de //mayor a menor número de vértices y así se podrá trabajar con varios //polígonos pequeños mientras se testea uno grande #if defined(_OPENMP) #pragma omp parallel for default(none) schedule(dynamic) \ shared(nNan,continuar,posNan,incX,x,coorX,incY,y,coorY,pos,poli) \ private(i,iniX,iniY,nElem,posAux) #endif //recorremos desde el primer NaN hasta el penúltimo for(i=0;i<(nNan-1);i++) { //hacemos que todos los hilos vean la variable continuar actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif //comprobamos si hay que continuar chequeando polígonos if(continuar) { //extraemos los datos de definición del polígono DatosPoliIndividualEnVecInd(posNan,i,incX,incY,&iniX,&iniY, &nElem); //comprobamos la inclusión para el polígono de trabajo posAux = PtoEnPoligonoVertice(x,y,&coorX[iniX],&coorY[iniY], nElem,incX,incY); //me aseguro de que las variables involucradas sean actualizadas //por un hilo cada vez, sin posibilidad de modificación por //varios al mismo tiempo #if defined(_OPENMP) #pragma omp critical(paraSiPuntoDentro) #endif { //si el punto no está fuera, no se han de hacer más operaciones //el chequear 'continuar' asegura que nos quedemos con el primer //polígono en que está incluido el punto, ya que una vez que el //hilo con punto encontrado actualice la variable continuar, el //resto con posibles resultados positivos no pasarán este if() if(continuar&&(posAux!=GEOC_PTO_FUERA_POLIG)) { //asignamos la variable de salida pos = posAux; //asignamos el polígono que contiene al punto *poli = i; //indicamos que no hay que continuar haciendo pruebas //esta variable se usa para el caso de ejecución en paralelo continuar = 0; //hacemos que todos los hilos vean la variable continuar //actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif } } } } // --> fin del #pragma omp parallel for } else { //hacemos una comprobación normal pos = PtoEnPoligonoVertice(x,y,coorX,coorY,N,incX,incY); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return pos; } /******************************************************************************/ /******************************************************************************/ int PtoEnPoligonoVerticeBordeInd(const long x, const long y, const long* coorX, const long* coorY, const size_t N, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, size_t* poli) { //índice para recorrer bucles size_t i=0; //posiciones de inicio de los vértices X e Y size_t iniX=0,iniY=0; //número de elementos del polígono a chequear size_t nElem=0; //variable auxiliar de situación de punto int posAux=0; //variable indicadora de continuación de chequeos size_t continuar=1; //variable de salida int pos=GEOC_PTO_FUERA_POLIG; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el polígono que contiene al punto *poli = 0; //comprobamos si hay valores NaN if(nNan) { //paralelización con OpenMP //utilizo schedule(dynamic) para que los polígonos vayan siendo //chequeados uno a uno según los hilos de ejecución van quedándose //libres //hago esto porque es muy probable que los polígonos vengan listados de //mayor a menor número de vértices y así se podrá trabajar con varios //polígonos pequeños mientras se testea uno grande #if defined(_OPENMP) #pragma omp parallel for default(none) schedule(dynamic) \ shared(nNan,continuar,posNan,incX,x,coorX,incY,y,coorY,pos,poli) \ private(i,iniX,iniY,nElem,posAux) #endif //recorremos desde el primer NaN hasta el penúltimo for(i=0;i<(nNan-1);i++) { //hacemos que todos los hilos vean la variable continuar actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif //comprobamos si hay que continuar chequeando polígonos if(continuar) { //extraemos los datos de definición del polígono DatosPoliIndividualEnVecInd(posNan,i,incX,incY,&iniX,&iniY, &nElem); //comprobamos la inclusión para el polígono de trabajo posAux = PtoEnPoligonoVerticeBorde(x,y,&coorX[iniX], &coorY[iniY],nElem,incX, incY); //me aseguro de que las variables involucradas sean actualizadas //por un hilo cada vez, sin posibilidad de modificación por //varios al mismo tiempo #if defined(_OPENMP) #pragma omp critical(paraSiPuntoDentro) #endif { //si el punto no está fuera, no se han de hacer más operaciones //el chequear 'continuar' asegura que nos quedemos con el primer //polígono en que está incluido el punto, ya que una vez que el //hilo con punto encontrado actualice la variable continuar, el //resto con posibles resultados positivos no pasarán este if() if(continuar&&(posAux!=GEOC_PTO_FUERA_POLIG)) { //asignamos la variable de salida pos = posAux; //asignamos el polígono que contiene al punto *poli = i; //indicamos que no hay que continuar haciendo pruebas //esta variable se usa para el caso de ejecución en paralelo continuar = 0; //hacemos que todos los hilos vean la variable continuar //actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif } } } } // --> fin del #pragma omp parallel for } else { //hacemos una comprobación normal pos = PtoEnPoligonoVerticeBorde(x,y,coorX,coorY,N,incX,incY); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return pos; } /******************************************************************************/ /******************************************************************************/ int PtoEnPoligonoVerticeBordeDoubleInd(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const double factor, const int redondeo, const size_t* posNan, const size_t nNan, size_t* poli) { //índice para recorrer bucles size_t i=0; //posiciones de inicio de los vértices X e Y size_t iniX=0,iniY=0; //número de elementos del polígono a chequear size_t nElem=0; //variable auxiliar de situación de punto int posAux=0; //variable indicadora de continuación de chequeos size_t continuar=1; //variable de salida int pos=GEOC_PTO_FUERA_POLIG; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el polígono que contiene al punto *poli = 0; //comprobamos si hay valores NaN if(nNan) { //paralelización con OpenMP //utilizo schedule(dynamic) para que los polígonos vayan siendo //chequeados uno a uno según los hilos de ejecución van quedándose //libres //hago esto porque es muy probable que los polígonos vengan listados de //mayor a menor número de vértices y así se podrá trabajar con varios //polígonos pequeños mientras se testea uno grande #if defined(_OPENMP) #pragma omp parallel for default(none) schedule(dynamic) \ shared(nNan,continuar,posNan,incX,x,coorX,incY,y,coorY,pos,factor,redondeo, \ poli) \ private(i,iniX,iniY,nElem,posAux) #endif //recorremos desde el primer NaN hasta el penúltimo for(i=0;i<(nNan-1);i++) { //hacemos que todos los hilos vean la variable continuar actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif //comprobamos si hay que continuar chequeando polígonos if(continuar) { //extraemos los datos de definición del polígono DatosPoliIndividualEnVecInd(posNan,i,incX,incY,&iniX,&iniY, &nElem); //comprobamos la inclusión para el polígono de trabajo posAux = PtoEnPoligonoVerticeBordeDouble(x,y,&coorX[iniX], &coorY[iniY],nElem, incX,incY,factor, redondeo); //me aseguro de que las variables involucradas sean actualizadas //por un hilo cada vez, sin posibilidad de modificación por //varios al mismo tiempo #if defined(_OPENMP) #pragma omp critical(paraSiPuntoDentro) #endif { //si el punto no está fuera, no se han de hacer más operaciones //el chequear 'continuar' asegura que nos quedemos con el primer //polígono en que está incluido el punto, ya que una vez que el //hilo con punto encontrado actualice la variable continuar, el //resto con posibles resultados positivos no pasarán este if() if(continuar&&(posAux!=GEOC_PTO_FUERA_POLIG)) { //asignamos la variable de salida pos = posAux; //asignamos el polígono que contiene al punto *poli = i; //indicamos que no hay que continuar haciendo pruebas //esta variable se usa para el caso de ejecución en paralelo continuar = 0; //hacemos que todos los hilos vean la variable continuar //actualizada #if defined(_OPENMP) #pragma omp flush(continuar) #endif } } } } // --> fin del #pragma omp parallel for } else { //hacemos una comprobación normal pos = PtoEnPoligonoVerticeBordeDouble(x,y,coorX,coorY,N,incX,incY, factor,redondeo); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return pos; } /******************************************************************************/ /******************************************************************************/ void GeneraPtoEnPoligono(const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const double factor, const int redondeo, double* x, double* y) { //número de vértices de trabajo size_t n=N; //coordenadas de los vértices de un triángulo y centroide double x1=0.0,y1=0.0,x2=0.0,y2=0.0,x3=0.0,y3=0.0,xc=0.0,yc=0.0; //identificador de inclusión en polígono int dentro=GEOC_PTO_FUERA_POLIG; //variables auxiliares int camina=0; size_t pos1=0,pos2=0,pos3=0; //inicializo las coordenadas de salida *x = GeocNan(); *y = GeocNan(); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si el primer vértice se repite al final if((coorX[0]==coorX[(N-1)*incX])&&(coorY[0]==coorY[(N-1)*incY])) { //trabajamos con todos los vértices, menos el último n = N-1; } //compruebo si hay un número suficiente de vértices if(n<3) { //salimos de la función return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializo el primer triángulo x1 = coorX[0]; y1 = coorY[0]; x2 = coorX[incX]; y2 = coorY[incY]; x3 = coorX[2*incX]; y3 = coorY[2*incY]; //identificador de punto a mover y posiciones camina = 3; pos1 = 0; pos2 = 1; pos3 = 2; //entramos en un bucle infinito while(1) { //calculamos las coordenadas del centroide del triángulo, que siempre //está dentro de él xc = (x1+x2+x3)/3.0; yc = (y1+y2+y3)/3.0; //comprobamos si el punto está dentro del polígono dentro = PtoEnPoligonoVerticeBordeDouble(xc,yc,coorX,coorY,N,incX,incY, factor,redondeo); //si está dentro salgo del bucle if(dentro==GEOC_PTO_DENTRO_POLIG) { //asigno las coordenadas *x = xc; *y = yc; //salgo del bucle break; } //compruebo qué punto he de mover if(camina==3) { //muevo el punto 3 pos3++; //comprobamos si se ha llegado al final if(pos3==n) { //hay que empezar a mover el punto 2 camina = 2; //devuelvo la posición del tercer punto al último de la lista pos3 = n-1; //siguiente vuelta, aunque se repita el cálculo anterior continue; } } else if(camina==2) { //muevo el punto 2 pos2++; //compruebo si he llegado al final para el punto 2 if(pos2==(n-1)) { //hay que empezar a mover el punto 1 camina = 1; //posición del segundo punto al penúltimo de la lista pos2 = n-2; //siguiente vuelta, aunque se repita el cálculo anterior continue; } } else { //nuevo punto 1 pos1++; //los puntos 2 y 3 son los que vienen a continuación de él pos2 = pos1+1; pos3 = pos2+1; //compruebo si he llegado al final para el punto 1 if(pos1==(n-2)) { //salimos del bucle break; } //en la siguiente vuelta moveremos el tercer vértice camina = 3; } //extraigo las coordenadas de los puntos del triángulo x1 = coorX[pos1*incX]; y1 = coorY[pos1*incY]; x2 = coorX[pos2*incX]; y2 = coorY[pos2*incY]; x3 = coorX[pos3*incX]; y3 = coorY[pos3*incY]; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/polig.c000755 001750 001750 00000235644 14332155552 015250 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file polig.c \brief Definición de funciones para el trabajo con polígonos. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 20 de abril de 2011 \copyright Copyright (c) 2011-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/polig.h" /******************************************************************************/ /******************************************************************************/ int GeocParOmpPolig(char version[]) { //comprobamos si hay paralelización #if defined(_OPENMP) //comprobamos si hay que extraer versión if(version!=NULL) { //calculamos la versión VersionOpenMP(_OPENMP,version); } //salimos de la función return 1; #else if(version!=NULL) { //utilizamos la variable version para que no dé warming al compilar strcpy(version,""); } //salimos de la función return 0; #endif } /******************************************************************************/ /******************************************************************************/ polig* IniciaPoligVacio(void) { //estructura de salida polig* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos memoria para la estructura sal = (polig*)malloc(sizeof(polig)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //inicializamos los campos escalares a 0 sal->nElem = 0; sal->nPolig = 0; sal->hayLim = 0; sal->hayArea = 0; //inicializamos los campos vectoriales a NULL sal->x = NULL; sal->y = NULL; sal->posIni = NULL; sal->nVert = NULL; sal->xMin = NULL; sal->xMax = NULL; sal->yMin = NULL; sal->yMax = NULL; sal->area = NULL; sal->atr = NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int AuxCreaPolig1(const size_t nElem, const size_t* posNanX, const size_t* posNanY, const size_t nNanX, const size_t nNanY, size_t* nElemMax, size_t* nPolig) { //índice para recorrer bucles size_t i=0; //variable de salida int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay el mismo número de NaN en los dos vectores if(nNanX!=nNanY) { //salimos de la función return GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG; } //comprobamos si hay NaN en las mismas posiciones de los vectores for(i=0;i fin del #pragma omp parallel sections //comprobamos los posibles errores de asignación de memoria if(((posNanX==NULL)&&(nNanX!=0))||((posNanY==NULL)&&(nNanY!=0))) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los vectores tienen bien colocados los NaN y calculamos //el número máximo de elementos de los vectores de la estructura y el //número de polígonos *idError = AuxCreaPolig1(nElem,posNanX,posNanY,nNanX,nNanY,&nElemMax, &nPolig); //comprobamos los posibles errores if(*idError!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //escribimos el mensaje de error if(*idError==GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG) { GEOC_ERROR("Error: Los vectores de trabajo no contienen el mismo " "número de polígonos"); } else if(*idError==GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG) { GEOC_ERROR("Error: Los vectores de trabajo no contienen los mismos " "polígonos"); } //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el número de polígonos sal->nPolig = nPolig; //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(sal,nElemMax,nPolig) #endif { //asignamos memoria para los vectores de la estructura #if defined(_OPENMP) #pragma omp section #endif sal->x = (double*)malloc(nElemMax*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->y = (double*)malloc(nElemMax*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->posIni = (size_t*)malloc(nPolig*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif sal->nVert = (size_t*)malloc(nPolig*sizeof(double)); } // --> fin del #pragma omp parallel sections //comprobamos los posibles errores if((sal->x==NULL)||(sal->y==NULL)||(sal->posIni==NULL)||(sal->nVert==NULL)) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //copiamos los polígonos a la estructura //como ya sabemos que el número de NaN y sus posiciones son los mismos para //los vectores x e y, trabajamos con los valores para el vector x AuxCreaPolig3(x,y,nElem,incX,incY,posNanX,nNanX,sal->x,sal->y,sal->posIni, sal->nVert,&ptos,&nPolig); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay de verdad algún polígono if(nPolig==0) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //creamos la estructura vacía sal = IniciaPoligVacio(); //comprobamos los posibles errores if(sal==NULL) { //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //salimos de la función return sal; } //asignamos el número de elementos a la estructura sal->nElem = ptos; //comprobamos si hay que reajustar el tamaño de los vectores de coordenadas if(ptos!=nElemMax) { //asignamos el nuevo tamaño de los vectores sal->nElem = ptos; //reajustamos los tamaños sal->x = (double*)realloc(sal->x,ptos*sizeof(double)); sal->y = (double*)realloc(sal->y,ptos*sizeof(double)); } //comprobamos si el número de polígonos es el estimado if(nPolig!=sal->nPolig) { //asignamos de nuevo la variable de número de polígonos sal->nPolig = nPolig; //reajustamos los tamaños sal->posIni = (size_t*)realloc(sal->posIni,nPolig*sizeof(size_t)); sal->nVert = (size_t*)realloc(sal->nVert,nPolig*sizeof(size_t)); } //comprobamos los posibles errores if((sal->x==NULL)||(sal->y==NULL)||(sal->posIni==NULL)||(sal->nVert==NULL)) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el vector de atributos sal->atr = (int*)malloc(sal->nPolig*sizeof(int)); //comprobamos los posibles errores if(sal->atr==NULL) { //liberamos la memoria asignada LibMemPolig(sal); free(posNanX); free(posNanY); //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //Inicializamos el vector de atributos a 0 for(i=0;inPolig;i++) { sal->atr[i] = 0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria asignada free(posNanX); free(posNanY); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ void EnlazaCamposPolig(polig* poliEnt, polig* poliSal) { //LIBERAMOS LA POSIBLE MEMORIA ASIGNADA A LOS CAMPOS VECTORIALES DE LA //ESTRUCTURA DE SALIDA //comprobamos si hay algún elemento en los vectores de coordenadas if(poliSal->nElem) { free(poliSal->x); free(poliSal->y); } //compruebo si hay algún polígono en los vectores de posiciones y atributos if(poliSal->nPolig) { free(poliSal->posIni); free(poliSal->nVert); free(poliSal->atr); } //comprobamos si hay límites calculados if(poliSal->hayLim) { free(poliSal->xMin); free(poliSal->xMax); free(poliSal->yMin); free(poliSal->yMax); } //comprobamos si hay superficies calculadas if(poliSal->hayArea) { free(poliSal->area); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //enlazamos todos los campos de la estructura de entrada en la de salida poliSal->nElem = poliEnt->nElem; poliSal->x = poliEnt->x; poliSal->y = poliEnt->y; poliSal->nPolig = poliEnt->nPolig; poliSal->posIni = poliEnt->posIni; poliSal->nVert = poliEnt->nVert; poliSal->hayLim = poliEnt->hayLim; poliSal->xMin = poliEnt->xMin; poliSal->xMax = poliEnt->xMax; poliSal->yMin = poliEnt->yMin; poliSal->yMax = poliEnt->yMax; poliSal->hayArea = poliEnt->hayArea; poliSal->area = poliEnt->area; poliSal->atr = poliEnt->atr; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ polig* CopiaPolig(const polig* poli, int* idError) { //polígono de salida polig* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la variable de error *idError = GEOC_ERR_NO_ERROR; //inicializamos el polígono de salida sal = IniciaPoligVacio(); //comprobamos los posibles errores if(sal==NULL) { //asignamos la variable de error *idError = GEOC_ERR_ASIG_MEMORIA; //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //sólo continuamos si el polígono de entrada contiene datos if(poli->nElem) { //copiamos las coordenadas de los vértices *idError = AnyadeDatosPolig(sal,poli->x,poli->y,poli->nElem,1,1); //comprobamos si ha ocurrido algún error if((*idError)!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(sal); //escribimos el mensaje de error if((*idError)==GEOC_ERR_ASIG_MEMORIA) { GEOC_ERROR("Error de asignación de memoria"); } else if((*idError)==GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG) { GEOC_ERROR("Error: Los vectores de coordenadas del polígono\n" "de entrada no contienen el mismo número de " "polígonos"); } else if((*idError)==GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG) { GEOC_ERROR("Error: Los vectores de coordenadas del polígono\n" "de entrada no contienen los mismos polígonos"); } //salimos de la función return NULL; } //comprobamos si hay que calcular límites if(poli->hayLim) { //calculamos los límites *idError = CalcLimitesPolig(sal); //comprobamos los posibles errores if((*idError)!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(sal); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //comprobamos si hay que calcular superficies if(poli->hayArea) { //calculamos las áreas *idError = CalcAreaPolig(sal,1.0,0,0.0,0.0); //comprobamos los posibles errores if((*idError)!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(sal); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int AnyadePoligPolig(polig* poli, const polig* anyade) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //número total de elementos size_t nElem=0,nPolig=0; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si el polígono a añadir está vacío, salimos de la función if((anyade!=NULL)&&(anyade->nPolig==0)) { //salimos de la función sin hacer nada return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el número total de elementos del polígono conjunto nElem = poli->nElem+anyade->nElem; //si el polígono original contenía datos, al número total de elementos hay //que restarle 1 por el NaN común que sobra al juntar las dos estructuras if(poli->nPolig) { nElem--; } //calculamos el número total de polígonos nPolig = poli->nPolig+anyade->nPolig; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //reasignamos memoria para cubrir los nuevos datos poli->x = (double*)realloc(poli->x,nElem*sizeof(double)); poli->y = (double*)realloc(poli->y,nElem*sizeof(double)); poli->posIni = (size_t*)realloc(poli->posIni,nPolig*sizeof(size_t)); poli->nVert = (size_t*)realloc(poli->nVert,nPolig*sizeof(size_t)); poli->atr = (int*)realloc(poli->atr,nPolig*sizeof(int)); //reasignamos también para los posibles vectores de límites y superficies if(poli->hayLim) { poli->xMin = (double*)realloc(poli->xMin,nPolig*sizeof(double)); poli->xMax = (double*)realloc(poli->xMax,nPolig*sizeof(double)); poli->yMin = (double*)realloc(poli->yMin,nPolig*sizeof(double)); poli->yMax = (double*)realloc(poli->yMax,nPolig*sizeof(double)); } if(poli->hayArea) { poli->area = (double*)realloc(poli->area,nPolig*sizeof(double)); } //comprobamos los posibles errores en las asignaciones obligatorias if((poli->x==NULL)||(poli->y==NULL)||(poli->posIni==NULL)|| (poli->nVert==NULL)||(poli->atr==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //comprobamos los posibles errores en las asignaciones de límites if(poli->hayLim) { if((poli->xMin==NULL)||(poli->xMax==NULL)||(poli->yMin==NULL)|| (poli->yMax==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //comprobamos los posibles errores en las asignaciones de áreas if(poli->hayArea) { if(poli->area==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posición de inicio para copiar en la estructura de salida //si la estructura de salida está vacía, se comienza en la primera posición //si tiene datos, se comienza a continuación en la última (dentro del bucle, //la suma de posIni hace que se comience a continuación de la última) pos = (poli->nPolig==0) ? 0 : poli->nElem-1; //recorremos el número de nuevos elementos for(i=0;inElem;i++) { //copiamos las coordenadas poli->x[pos+i] = anyade->x[i]; poli->y[pos+i] = anyade->y[i]; } //calculamos las posiciones a sumar para ajustar las posiciones de inicio de //los polígonos añadidos //si la estructura de salida está vacía, se copian las posiciones tal cual //si tiene datos, se suman las posiciones ya ocupadas pos = (poli->nPolig==0) ? 0 : poli->nElem-1; //recorremos el número de polígonos for(i=0;inPolig;i++) { //copiamos las posiciones de inicio actualizadas y el número de vértices poli->posIni[poli->nPolig+i] = anyade->posIni[i]+pos; poli->nVert[poli->nPolig+i] = anyade->nVert[i]; poli->atr[poli->nPolig+i] = anyade->atr[i]; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular límites if(poli->hayLim) { //comprobamos si ya están calculados if(anyade->hayLim) { //recorremos el número de polígonos y copiamos los límites for(i=0;inPolig;i++) { //copiamos los límites poli->xMin[poli->nPolig+i] = anyade->xMin[i]; poli->xMax[poli->nPolig+i] = anyade->xMax[i]; poli->yMin[poli->nPolig+i] = anyade->yMin[i]; poli->yMax[poli->nPolig+i] = anyade->yMax[i]; } } else { //calculamos los límites y los copiamos LimitesPoligonosPolig(&(anyade->x[1]),&(anyade->y[1]),1,1, anyade->posIni,anyade->nVert,anyade->nPolig, anyade->posIni[0],&(poli->xMin[poli->nPolig]), &(poli->xMax[poli->nPolig]), &(poli->yMin[poli->nPolig]), &(poli->yMax[poli->nPolig])); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular áreas if(poli->hayArea) { //comprobamos si ya están calculadas if(anyade->hayArea) { //recorremos el número de polígonos y copiamos las superficies for(i=0;inPolig;i++) { //copiamos los límites poli->area[poli->nPolig+i] = anyade->area[i]; } } else { //calculamos las superficies y las copiamos AreaPoligonosSimplesPolig(&(anyade->x[1]),&(anyade->y[1]),1,1, anyade->posIni,anyade->nVert, anyade->nPolig,anyade->posIni[0], &(poli->area[poli->nPolig])); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ajustamos los tamaños antes de salir poli->nElem = nElem; poli->nPolig = nPolig; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ int AnyadeDatosPolig(polig* poli, const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY) { //polígono auxiliar polig* aux=NULL; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //contemplamos una posible salida rápida if(nElem==0) { //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos un nuevo polígono con los datos a añadir aux = CreaPolig(x,y,nElem,incX,incY,&estado); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); //escribimos el mensaje de error if(estado==GEOC_ERR_ASIG_MEMORIA) { GEOC_ERROR("Error de asignación de memoria"); } else if(estado==GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG) { GEOC_ERROR("Error: Los vectores de trabajo no contienen el mismo " "número de polígonos"); } else if(estado==GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG) { GEOC_ERROR("Error: Los vectores de trabajo no contienen los mismos " "polígonos"); } //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //añadimos la nueva estructura estado = AnyadePoligPolig(poli,aux); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria utilizada LibMemPolig(aux); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void LibMemPolig(polig* datos) { //comprobamos si hay memoria que liberar if(datos!=NULL) { //liberamos la memoria asignada al vector de coordenadas X if(datos->x!=NULL) { free(datos->x); } //liberamos la memoria asignada al vector de coordenadas Y if(datos->y!=NULL) { free(datos->y); } //liberamos la memoria asignada al vector de posiciones if(datos->posIni!=NULL) { free(datos->posIni); } //liberamos la memoria asignada al vector de número de vértices if(datos->nVert!=NULL) { free(datos->nVert); } //liberamos la memoria asignada a los vector de coordenadas X mínimas if(datos->xMin!=NULL) { free(datos->xMin); } //liberamos la memoria asignada a los vector de coordenadas X máximas if(datos->xMax!=NULL) { free(datos->xMax); } //liberamos la memoria asignada a los vector de coordenadas Y mínimas if(datos->yMin!=NULL) { free(datos->yMin); } //liberamos la memoria asignada a los vector de coordenadas Y máximas if(datos->yMax!=NULL) { free(datos->yMax); } //liberamos la memoria asignada al vector de áreas if(datos->area!=NULL) { free(datos->area); } //liberamos la memoria asignada al vector de atributos if(datos->atr!=NULL) { free(datos->atr); } //liberamos la memoria asignada a la estructura free(datos); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int CalcLimitesPolig(polig* poli) { //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((poli->nPolig==0)||(poli->hayLim)) { //salimos de la función si la estructura no contiene polígonos o si //éstos ya tienen calculados sus límites return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli) #endif { //asignamos memoria para los vectores de límites #if defined(_OPENMP) #pragma omp section #endif poli->xMin = (double*)malloc((poli->nPolig)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->xMax = (double*)malloc((poli->nPolig)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->yMin = (double*)malloc((poli->nPolig)*sizeof(double)); #if defined(_OPENMP) #pragma omp section #endif poli->yMax = (double*)malloc((poli->nPolig)*sizeof(double)); } // --> fin del #pragma omp parallel sections //comprobamos los posibles errores if((poli->xMin==NULL)||(poli->xMax==NULL)||(poli->yMin==NULL)|| (poli->yMax==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //indicamos que sí hay límites poli->hayLim = 1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos los límites de todos los polígonos LimitesPoligonosPolig(poli->x,poli->y,1,1,poli->posIni,poli->nVert, poli->nPolig,0,poli->xMin,poli->xMax,poli->yMin, poli->yMax); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void LimitesPoligono(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, double* xMin, double* xMax, double* yMin, double* yMax) { //posiciones de los elementos máximo y mínimo size_t posXMin=0,posXMax=0,posYMin=0,posYMax=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //buscamos las posiciones de los elementos máximo y mínimo //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(incX,x,nElem,posXMin,posXMax,incY,y,posYMin,posYMax) #endif { //posiciones en el vector X #if defined(_OPENMP) #pragma omp section #endif MinMax(x,nElem,incX,&posXMin,&posXMax); //posiciones en el vector Y #if defined(_OPENMP) #pragma omp section #endif MinMax(y,nElem,incY,&posYMin,&posYMax); } // --> fin del #pragma omp parallel sections //extraemos los valores de las posiciones calculadas *xMin = x[posXMin*incX]; *xMax = x[posXMax*incX]; *yMin = y[posYMin*incY]; *yMax = y[posYMax*incY]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void LimitesPoligonosPolig(const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posIni, const size_t* nVert, const size_t nPolig, const size_t restaPosIni, double* xMin, double* xMax, double* yMin, double* yMax) { //índice para recorrer bucles size_t i=0; //posición inicial del polígono de trabajo size_t pI=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) schedule(dynamic) \ shared(nPolig,posIni,restaPosIni,incX,x,incY,y,nVert,xMin,xMax,yMin,yMax) \ private(i,pI) #endif //recorremos el número de polígonos for(i=0;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int CalcAreaPolig(polig* poli, const double facCoor, const int geo, const double a, const double f) { //índices para recorrer bucles size_t i=0,j=0; //variable de posición size_t pos=0; //longitud origen double lon0=0.0; //coordenadas de trabajo double* x=NULL; double* y=NULL; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if(poli->nPolig==0) { //salimos de la función si la estructura return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si la estructura no contiene área calculada if(!(poli->hayArea)) { //asignamos memoria para el vector de superficies poli->area = (double*)malloc((poli->nPolig)*sizeof(double)); //comprobamos los posibles errores if(poli->area==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //indicamos que sí hay superficies poli->hayArea = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si trabajamos sobre la superficie del elipsoide if(geo||(facCoor!=1.0)) { //asignamos memoria para los vectores auxiliares x = (double*)malloc((poli->nElem)*sizeof(double)); y = (double*)malloc((poli->nElem)*sizeof(double)); //comprobamos posibles errores if((x==NULL)||(y==NULL)) { //volvemos a indicar que no hay áreas poli->hayArea = 0; //liberamos la memoria asignada free(poli->area); free(x); free(y); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //copiamos las coordenadas y aplicamos factor de escala //si estamos sobre el elipsoide, este paso se hace luego if(!geo) { for(i=0;inElem;i++) { x[i] = poli->x[i]*facCoor; y[i] = poli->y[i]*facCoor; } } else { //recorremos los polígonos for(i=0;inPolig;i++) { //posición de inicio en los vectores de coordenadas pos = poli->posIni[i]; //calculamos la longitud media del polígono de trabajo lon0 = Media(&(poli->x[pos]),poli->nVert[i],1); //recorremos los vértices del polígono for(j=0;jnVert[i];j++) { //proyectamos, aplicando el factor de escala ProjCilinEquivLambertLat0Ec(poli->y[pos+j]*facCoor, poli->x[pos+j]*facCoor, lon0*facCoor,a,f,&x[pos+j], &y[pos+j]); } } } //calculamos las superficies de todos los polígonos //pongo la orden aquí para evitar un warning en mkoctfile AreaPoligonosSimplesPolig(x,y,1,1,poli->posIni,poli->nVert,poli->nPolig, 0,poli->area); } else { //no hace falta copiarlas a los vectores auxiliares, sólo enlazarlas x = poli->x; y = poli->y; //calculamos las superficies de todos los polígonos //pongo la orden aquí para evitar un warning en mkoctfile AreaPoligonosSimplesPolig(x,y,1,1,poli->posIni,poli->nVert,poli->nPolig, 0,poli->area); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria utilizada if(geo||(facCoor!=1.0)) { free(x); free(y); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ double AreaPoligonoSimple(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY) { //índice para recorrer bucles size_t i=0; //número de elementos de trabajo, que inicializamos con el valor pasado size_t nElemTrab=nElem; //variable de salida double area=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si el primer punto es el mismo que el último, restamos una unidad al //número de elementos pasado, ya que el algoritmo está preparado para //trabajar con un vector en el que no se repite el primer punto if((x[0]==x[(nElem-1)*incX])&&(y[0]==y[(nElem-1)*incY])) { //el número de elementos de trabajo es uno menos que el pasado nElemTrab = nElem-1; } //el algoritmo utilizado es la segunda expresión de la ecuación 21.4.20 del //Numerical Recipes, tercera edición, página 1127 //recorremos los puntos hasta el penúltimo for(i=0;i<(nElemTrab-1);i++) { //vamos sumando area += (x[(i+1)*incX]+x[i*incX])*(y[(i+1)*incY]-y[i*incY]); } //sumamos la contribución del último lado, es decir, el lado que contiene //como vértice final al primer punto area += (x[0]+x[(nElemTrab-1)*incX])*(y[0]-y[(nElemTrab-1)*incY]); //dividimos entre dos para calcular el área real area /= 2.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return area; } /******************************************************************************/ /******************************************************************************/ void AreaPoligonosSimplesPolig(const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posIni, const size_t* nVert, const size_t nPolig, const size_t restaPosIni, double* area) { //índice para recorrer bucles size_t i=0; //posición inicial del polígono de trabajo size_t pI=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) schedule(dynamic) \ shared(nPolig,posIni,restaPosIni,area,incX,x,incY,y,nVert) \ private(i,pI) #endif //recorremos el número de polígonos for(i=0;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void EscalaYTrasladaPolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim, const int aplicaArea) { //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,escalaX,trasladaX,escalaY,trasladaY) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos los factores de escala y las traslaciones a las coordenadas X EscalaYTrasladaVector(poli->x,poli->nElem,1,escalaX,trasladaX); #if defined(_OPENMP) #pragma omp section #endif //aplicamos los factores de escala y las traslaciones a las coordenadas Y EscalaYTrasladaVector(poli->y,poli->nElem,1,escalaY,trasladaY); } // --> fin del #pragma omp parallel sections //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ESTA PARTE NO LA PARALELIZAMOS, YA QUE SUPONEMOS QUE EL NÚMERO DE //POLÍGONOS EN UNA ESTRUCTURA SIEMPRE SERÁ MUCHÍSIMO MENOR QUE EL NÚMERO //TOTAL DE VÉRTICES //comprobamos si hay que aplicar el factor a los límites if(aplicaLim&&poli->hayLim) { //aplicamos los factores de escala y las traslaciones a los límites EscalaYTrasladaVector(poli->xMin,poli->nPolig,1,escalaX,trasladaX); EscalaYTrasladaVector(poli->xMax,poli->nPolig,1,escalaX,trasladaX); EscalaYTrasladaVector(poli->yMin,poli->nPolig,1,escalaY,trasladaY); EscalaYTrasladaVector(poli->yMax,poli->nPolig,1,escalaY,trasladaY); } //comprobamos si hay que aplicar el factor a las superficies if(aplicaArea&&poli->hayArea) { //aplicamos el factor de escala a las áreas EscalaYTrasladaVector(poli->area,poli->nPolig,1,fabs(escalaX*escalaY), 0.0); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void TrasladaYEscalaPolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim, const int aplicaArea) { //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,escalaX,trasladaX,escalaY,trasladaY) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos las traslaciones y los factores de escala a las coordenadas X TrasladaYEscalaVector(poli->x,poli->nElem,1,escalaX,trasladaX); #if defined(_OPENMP) #pragma omp section #endif //aplicamos las traslaciones y los factores de escala a las coordenadas Y TrasladaYEscalaVector(poli->y,poli->nElem,1,escalaY,trasladaY); } // --> fin del #pragma omp parallel sections //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ESTA PARTE NO LA PARALELIZAMOS, YA QUE SUPONEMOS QUE EL NÚMERO DE //POLÍGONOS EN UNA ESTRUCTURA SIEMPRE SERÁ MUCHÍSIMO MENOR QUE EL NÚMERO //TOTAL DE VÉRTICES //comprobamos si hay que aplicar el factor a los límites if(aplicaLim&&poli->hayLim) { //aplicamos las traslaciones y los factores de escala a los límites TrasladaYEscalaVector(poli->xMin,poli->nPolig,1,escalaX,trasladaX); TrasladaYEscalaVector(poli->xMax,poli->nPolig,1,escalaX,trasladaX); TrasladaYEscalaVector(poli->yMin,poli->nPolig,1,escalaY,trasladaY); TrasladaYEscalaVector(poli->yMax,poli->nPolig,1,escalaY,trasladaY); } //comprobamos si hay que aplicar el factor a las superficies if(aplicaArea&&poli->hayArea) { //aplicamos el factor de escala a las áreas TrasladaYEscalaVector(poli->area,poli->nPolig,1,fabs(escalaX*escalaY), 0.0); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void MuevePolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int orden, const int aplicaLim, const int aplicaArea) { //comprobamos el orden de aplicación de los factores if(orden==0) { //primero los factores de escala y luego las traslaciones EscalaYTrasladaPolig(poli,escalaX,escalaY,trasladaX,trasladaY,aplicaLim, aplicaArea); } else { //primero las traslaciones y luego los factores de escala TrasladaYEscalaPolig(poli,escalaX,escalaY,trasladaX,trasladaY,aplicaLim, aplicaArea); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int AligeraPolig(polig* poli, const int esf, const double facCoor, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, const double a, const double f) { //índices para recorrer bucles size_t i=0,j=0; //tolerancia angular double tolAng=fabs(GEOC_ARC_RES_ANG); //posición inicial del polígono de trabajo y número de puntos del aligerado size_t posIni=0,nVert=0,nPtos=0; //puntos colineales int colin=0; //coordenadas de los polígonos aligerados double* x=NULL; double* y=NULL; double* xF=NULL; double* yF=NULL; //vértices del polígono de entrada más largo size_t nVertMax=0; //matriz de rotación y coordenadas en el sistema rotado double mRot[3][3]; double latCR=0.0; //estructura auxiliar polig* aux=NULL; //vector de posiciones después del aligerado size_t* pos=NULL; //variable de salida int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos una posible salida rápida if(poli->nPolig==0) { //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar vacía aux = IniciaPoligVacio(); //comprobamos los posibles errores if(aux==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay factor de escala para las coordenadas if(facCoor!=1.0) { //vértices del polígono más largo nVertMax = MaximoSizeT(poli->nVert,poli->nPolig,1); //asignamos memoria para las coordenadas con factor de escala xF = (double*)malloc(nVertMax*sizeof(double)); yF = (double*)malloc(nVertMax*sizeof(double)); //comprobamos posibles errores if((xF==NULL)||(yF==NULL)) { //liberamos la memoria asignada LibMemPolig(aux); free(xF); free(yF); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos el número de polígonos almacenados for(i=0;inPolig;i++) { //extraemos la posición inicial del polígono de trabajo posIni = poli->posIni[i]; //número de vértices del polígono nVert = poli->nVert[i]; //comprobamos si hay factor de escala para las coordenadas if(facCoor!=1.0) { //copiamos las coordenadas y aplicamos el factor de escala for(j=0;jx[posIni+j]); yF[j] = facCoor*(poli->y[posIni+j]); } } else { //las coordenadas del polígono se quedan como están xF = &(poli->x[posIni]); yF = &(poli->y[posIni]); } //aligeramos el polígono de trabajo pos = AligeraPolilinea(xF,yF,nVert,1,1,tol,paralelizaTol,robusto, nSegRobOrig,nSegRobAuto,esf,&nPtos); //comprobamos posibles errores if(pos==NULL) { //liberamos la memoria asignada LibMemPolig(aux); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //comprobamos si el polígono se ha quedado en tres puntos if(nPtos==3) { //distinguimos entre trabajo sobre la esfera y sobre el plano if(esf) { //calculamos la rotación para pasar a un sistema que contenga a //los dos primeros puntos en el ecuador, con el primero en //(lat=0,lon=0) RotaArco00Ecuador(tolAng, yF[pos[0]],xF[pos[0]],yF[pos[1]],xF[pos[1]], mRot,NULL); //calculamos la latitud del tercer punto AplicaMatrizRotacionCoorGeod(1,yF[pos[2]],xF[pos[2]],mRot, &latCR,NULL); //comprobamos si la latitud es 0.0 if(GEOC_ES_CERO(latCR,GEOC_ARC_RES_ANG)) { //los puntos son colineales colin = 1; } } else { //comprobamos si los tres puntos son colineales colin = TresPuntosColineales2D(poli->x[posIni+pos[0]], poli->y[posIni+pos[0]], poli->x[posIni+pos[1]], poli->y[posIni+pos[1]], poli->x[posIni+pos[2]], poli->y[posIni+pos[2]]); } } //comprobamos si después del aligerado queda algún polígono if((nPtos>3)||((nPtos==3)&&(!colin))) { //asignamos memoria para los vectores de coordenadas del polígono //aligerado x = (double*)malloc(nPtos*sizeof(double)); y = (double*)malloc(nPtos*sizeof(double)); //comprobamos posibles errores if((x==NULL)||(y==NULL)) { //liberamos la memoria asignada LibMemPolig(aux); free(pos); free(x); free(y); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //recorremos el número de puntos del polígono aligerado for(j=0;jx[posIni+pos[j]]; y[j] = poli->y[posIni+pos[j]]; } //añadimos las coordenadas al polígono aligerado estado = AnyadeDatosPolig(aux,x,y,nPtos,1,1); //sólo puede haber ocurrido un error de asignación de memoria, ya //que suponemos que el polígono de entrada es correcto if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); free(pos); free(x); free(y); if(facCoor!=1.0) { free(xF); free(yF); } //escribimos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //liberamos la memoria asignada a los vectores de coordenadas free(x); free(y); } //liberamos la memoria asignada al vector de posiciones del aligerado free(pos); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que calcular límites if(poli->hayLim) { //calculamos los límites estado = CalcLimitesPolig(aux); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); if(facCoor!=1.0) { free(xF); free(yF); } //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //comprobamos si hay que calcular superficies if(poli->hayArea) { //calculamos las áreas estado = CalcAreaPolig(aux,facCoor,esf,a,f); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //enlazamos los campos de la estructura auxiliar a los de la estructura de //salida EnlazaCamposPolig(aux,poli); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria asignada free(aux); if(facCoor!=1.0) { free(xF); free(yF); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ void ImprimeCabeceraPoligFichero(const polig* poli, const size_t indice, const char iniCab[], const int impLim, const char formCoor[], const int impArea, const char formArea[], const int impAtr, const char formAtr[], const double factorX, const double factorY, const int repitePrimerPunto, FILE* idFich) { //número de vértices del polígono de trabajo size_t nVert=0; //superficie de los polígonos double area=0.0; //límites double xMin=0.0,xMax=0.0,yMin=0.0,yMax=0.0,limAux=0.0; //variables de posición size_t pos=0,posXMin=0,posXMax=0,posYMin=0,posYMax=0; //variable auxiliar size_t aux=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ajustamos la variable auxiliar como el posible número a restar si no hay //que repetir el primer vértice del polígono aux = (repitePrimerPunto) ? 0 : 1; //número de vértices a imprimir del polígono nVert = poli->nVert[indice]-aux; //posición de inicio del polígono pos = poli->posIni[indice]; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //imprimimos la marca de inicio y el número de vértices fprintf(idFich,"%s %8zu",iniCab,nVert); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que imprimir la superficie if(impArea) { //comprobamos si ya está calculada la superficie o no if(poli->hayArea) { //aplicamos los factores de escala y extraemos la superficie area = poli->area[indice]*fabs(factorX)*fabs(factorY); } else { //calculamos la superficie area = AreaPoligonoSimple(&(poli->x[pos]),&(poli->y[pos]), poli->nVert[indice],1,1); //aplicamos los factores de escala area *= fabs(factorX)*fabs(factorY); } //imprimimos el valor de la superficie fprintf(idFich," "); fprintf(idFich,formArea,area); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que imprimir los límites if(impLim) { //comprobamos si ya están calculados los límites if(poli->hayLim) { //extraemos los límites xMin = poli->xMin[indice]; xMax = poli->xMax[indice]; yMin = poli->yMin[indice]; yMax = poli->yMax[indice]; } else { //buscamos las posiciones de los elementos máximo y mínimo //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(poli,pos,nVert,posXMin,posXMax,posYMin,posYMax) #endif { //posiciones en el vector X #if defined(_OPENMP) #pragma omp section #endif MinMax(&(poli->x[pos]),nVert,1,&posXMin,&posXMax); //posiciones en el vector Y #if defined(_OPENMP) #pragma omp section #endif MinMax(&(poli->y[pos]),nVert,1,&posYMin,&posYMax); } // --> fin del #pragma omp parallel sections //extraemos los valores extremos xMin = poli->x[pos+posXMin]; xMax = poli->x[pos+posXMax]; yMin = poli->y[pos+posYMin]; yMax = poli->y[pos+posYMax]; } //comprobamos si el factor de escala para X es negativo if(factorX<0.0) { //los límites cambian limAux = xMin; xMin = xMax; xMax = limAux; //aplicamos el factor de escala xMin *= factorX; xMax *= factorX; } //comprobamos si el factor de escala para Y es negativo if(factorY<0.0) { //los límites cambian limAux = yMin; yMin = yMax; yMax = limAux; //aplicamos el factor de escala yMin *= factorY; yMax *= factorY; } //imprimimos los límites fprintf(idFich," "); fprintf(idFich,formCoor,xMin); fprintf(idFich," "); fprintf(idFich,formCoor,xMax); fprintf(idFich," "); fprintf(idFich,formCoor,yMin); fprintf(idFich," "); fprintf(idFich,formCoor,yMax); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que imprimir los atributos if(impAtr) { //imprimimos el valor del atributo fprintf(idFich," "); fprintf(idFich,formAtr,poli->atr[indice]); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salto de línea final fprintf(idFich,"\n"); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void ImprimePoligFichero(const polig* poli, const double factorX, const double factorY, const int repitePrimerPunto, const int iniNan, const int finNan, const char formCoor[], const int impCabecera, const char iniCab[], const int impLim, const int impArea, const char formArea[], const int impAtr, const char formAtr[], FILE* idFich) { //índices para recorrer bucles size_t i=0,j=0; //cadena de formato para imprimir los posibles valores NaN char formNan[GEOC_NAN_LON_FORM_NUM_SIMPLE+1]; //variable de posición size_t pos=0; //variable auxiliar size_t aux=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si la estructura contiene algún polígono if(poli->nPolig==0) { //salimos sin imprimir nada return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la cadena de formato para imprimir los polibles NaN FormatoNumFormatoTexto(formCoor,formNan); //ajustamos la variable auxiliar como el posible número a restar si no hay //que repetir el primer vértice de los polígonos aux = (repitePrimerPunto) ? 0 : 1; //comprobamos si hay que imprimir la marca separadora al principio if(iniNan) { //la imprimimos ImprimeGeocNanTexto(idFich,2,formNan,1); } //recorremos el número de polígonos for(i=0;inPolig;i++) { //comprobamos si hay que imprimir la cabecera if(impCabecera) { //imprimos la cabecera ImprimeCabeceraPoligFichero(poli,i,iniCab,impLim,formCoor,impArea, formArea,impAtr,formAtr,factorX,factorY, repitePrimerPunto,idFich); } //posición del punto inicial del polígono pos = poli->posIni[i]; //recorremos el número de vértices del polígono de trabajo for(j=0;j<(poli->nVert[i]-aux);j++) { //imprimimos las coordenadas, multiplicadas por los factores fprintf(idFich,formCoor,factorX*poli->x[pos+j]); fprintf(idFich,formCoor,factorY*poli->y[pos+j]); fprintf(idFich,"\n"); } //imprimimos la marca separadora al final (menos para el último) if(i!=(poli->nPolig-1)) { ImprimeGeocNanTexto(idFich,2,formNan,1); } } //comprobamos si hay que imprimir la marca separadora al final if(finNan) { //la imprimimos ImprimeGeocNanTexto(idFich,2,formNan,1); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/posmatvec.c000755 001750 001750 00000030222 12175463336 016125 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup algebra anespec geopot gshhs matriz mmcc snx @{ \file posmatvec.c \brief Definición de funciones para realizar cálculos de posiciones de elementos en matrices almacenadas en formato vector. \author José Luis García Pallero, jgpallero@gmail.com \date 14 de enero de 2009 \section Licencia Licencia Copyright (c) 2009-2013, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/posmatvec.h" /******************************************************************************/ /******************************************************************************/ int EsAlmMatVecCMO(void) { //determinamos la salida dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //el almacenamiento no es column major order return 0; #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //el almacenamiento es column major order return 1; #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ void TipoAlmMatVec(char tipo[]) { //determinamos la cadena de código dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //asignamos la cadena correspondiente al tipo row major order strcpy(tipo,GEOC_MATR_COD_ALM_RMO); #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //asignamos la cadena correspondiente al tipo column major order strcpy(tipo,GEOC_MATR_COD_ALM_CMO); #else #error *****No se ha definido el tipo de almacenamiento matricial #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ size_t Lmfc(const size_t filMem, const size_t colMem) { //distinguimos según el tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //almacenamiento row major order return GEOC_LMFC_RMO(filMem,colMem); #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //almacenamiento column major order return GEOC_LMFC_CMO(filMem,colMem); #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ size_t IncElemFil(const size_t filMem) { //distinguimos según el tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //almacenamiento row major order //0*filMem para que el compilador no dé warning por variable no usada return 1+0*filMem; #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //almacenamiento column major order return filMem; #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ size_t IncElemCol(const size_t colMem) { //distinguimos según el tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //almacenamiento row major order return colMem; #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //almacenamiento column major order //0*colMem para que el compilador no dé warning por variable no usada return 1+0*colMem; #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ size_t PosMatVec(const size_t filMem, const size_t colMem, const size_t fil, const size_t col) { //calculamos la posición en el vector dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //almacenamiento row major order return GEOC_POSMATVEC_RMO(filMem,colMem,fil,col); #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //almacenamiento column major order return GEOC_POSMATVEC_CMO(filMem,colMem,fil,col); #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ void PosVecMat(const size_t filMem, const size_t colMem, const size_t posVec, size_t* fil, size_t* col) { //calculamos la posición en la matriz dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //calculamos la fila //la division se realiza entre elementos del mismo tipo, por lo que el //resultado tambien lo es (el redondeo de la division se hace por //truncamiento) //se añade el factor 0*filMem para que el compilador no emita un warning por //variable no usada *fil = posVec/colMem+0*filMem; //calculamos la columna *col = posVec%colMem; #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //calculamos la fila *fil = posVec%filMem; //calculamos la columna //la division se realiza entre elementos del mismo tipo, por lo que el //resultado tambien lo es (el redondeo de la division se hace por //truncamiento) //se añade el factor 0*colMem para que el compilador no emita un warning por //variable no usada *col = posVec/filMem+0*colMem; #else #error *****No se ha definido el tipo de almacenamiento matricial #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ size_t PosMatGenBanVec(const size_t diagInf, const size_t diagSup, const size_t fil, const size_t col) { //filas de la matriz empaquetada si el almacenamiento es COLUMN MAJOR ORDER //y columnas si es ROW MAJOR ORDER size_t lda=diagSup+diagInf+1; //calculamos la posición en el vector dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //columna en la matriz empaquetada donde se encuentra el elemento de trabajo size_t colAux=diagInf-fil+col; //calculamos la posición en el vector return fil*lda+colAux; #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //fila en la matriz empaquetada donde se encuentra el elemento de trabajo size_t filAux=diagSup+fil-col; //calculamos la posición en el vector return col*lda+filAux; #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ size_t PosMatTriEmVec(const size_t dim, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col) { //calculamos la posición en el vector dependiendo del tipo de almacenamiento #if defined(ROW_MAJOR_ORDER_MATVEC) //distinguimos entre matriz triangular superior e inferior if(supInf==GeocMatTriSup) { //calculamos la posición return GEOC_POSMATVEC_TRIEM_SUP_RMO(dim,fil,col); } else { //calculamos la posición return GEOC_POSMATVEC_TRIEM_INF_RMO(dim,fil,col); } #elif defined(COLUMN_MAJOR_ORDER_MATVEC) //distinguimos entre matriz triangular superior e inferior if(supInf==GeocMatTriSup) { //calculamos la posición return GEOC_POSMATVEC_TRIEM_SUP_CMO(dim,fil,col); } else { //calculamos la posición return GEOC_POSMATVEC_TRIEM_INF_CMO(dim,fil,col); } #else #error *****No se ha definido el tipo de almacenamiento matricial #endif } /******************************************************************************/ /******************************************************************************/ size_t PosMatTriBanVec(const size_t diag, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col) { //diagonales de la matriz de trabajo size_t diagInf=0,diagSup=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos las diagonales de la matriz de trabajo if(supInf==GeocMatTriSup) { diagSup = diag; } else if(supInf==GeocMatTriInf) { diagInf = diag; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posicion return PosMatGenBanVec(diagInf,diagSup,fil,col); } /******************************************************************************/ /******************************************************************************/ size_t PosMatSimEmVec(const size_t dim, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col) { //calculamos y salimos de la función return PosMatTriEmVec(dim,supInf,fil,col); } /******************************************************************************/ /******************************************************************************/ size_t PosMatSimBanVec(const size_t diag, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col) { //calculamos y salimos de la función return PosMatTriBanVec(diag,supInf,fil,col); } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/geocomp.c000644 001750 001750 00000012016 13655033577 015557 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup anespec general geocomp geodesia geom geopot gravim mmcc @{ \file geocomp.c \brief Definición de funciones para la obtención de información de la implementación de OpenMP usada. \author José Luis García Pallero, jgpallero@gmail.com \date 25 de agosto de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/geocomp.h" /******************************************************************************/ /******************************************************************************/ void VersionOpenMP(const int macro_OPENMP, char version[]) { //vamos comprobando los valores de la macro if(macro_OPENMP==GEOC_OMP_F_1_0) { //versión 1.0 strcpy(version,GEOC_OMP_V_1_0); } else if(macro_OPENMP==GEOC_OMP_F_2_0) { //versión 2.0 strcpy(version,GEOC_OMP_V_2_0); } else if(macro_OPENMP==GEOC_OMP_F_2_5) { //versión 2.5 strcpy(version,GEOC_OMP_V_2_5); } else if(macro_OPENMP==GEOC_OMP_F_3_0) { //versión 3.0 strcpy(version,GEOC_OMP_V_3_0); } else if(macro_OPENMP==GEOC_OMP_F_3_1) { //versión 3.1 strcpy(version,GEOC_OMP_V_3_1); } else { //versión desconocida strcpy(version,GEOC_OMP_V_DESC); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int FechaVersionOpenMP(const char version[]) { //variable de salida int fecha=GEOC_OMP_F_DESC; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //vamos comprobando los valores de la versión if(!strcmp(version,GEOC_OMP_V_1_0)) { //versión 1.0 fecha = GEOC_OMP_F_1_0; } else if(!strcmp(version,GEOC_OMP_V_2_0)) { //versión 2.0 fecha = GEOC_OMP_F_2_0; } else if(!strcmp(version,GEOC_OMP_V_2_5)) { //versión 2.5 fecha = GEOC_OMP_F_2_5; } else if(!strcmp(version,GEOC_OMP_V_3_0)) { //versión 3.0 fecha = GEOC_OMP_F_3_0; } else if(!strcmp(version,GEOC_OMP_V_3_1)) { //versión 3.1 fecha = GEOC_OMP_F_3_1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return fecha; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/proyecaux.c000644 001750 001750 00000010355 12463477174 016152 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup gshhs geom proyec @{ \file proyecaux.c \brief Definición de funciones de algunas proyecciones cartográficas para no usar PROJ.4. \author José Luis García Pallero, jgpallero@gmail.com \date 16 de agosto de 2013 \copyright Copyright (c) 2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/proyecaux.h" /******************************************************************************/ /******************************************************************************/ void ProjCilinEquivLambertLat0Ec(const double lat, const double lon, const double lon0, const double a, const double f, double* x, double* y) { //variables auxiliares double k0=0.0,q=0.0,sLat=0.0,e=0.0,e2=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ASUMIMOS QUE EL PARALELO ORIGEN ES EL ECUADOR //distinguimos entre la esfera y el elipsoide if(f==0.0) { //proyectamos *x = a*(lon-lon0); *y = a*sin(lat); } else { //calculamos el seno de la latitud geodésica sLat = sin(lat); //calculamos la primera excentricidad del elipsoide e = sqrt(2.0*f-f*f); e2 = e*e; //el parámetro k0 porque el paralelo estándar es el ecuador k0 = 1.0; //calculamos el parámetro q q = (1.0-e2)* (sLat/(1.0-e2*sLat*sLat)- 1.0/(2.0*e)*log((1.0-e*sLat)/(1.0+e*sLat))); //proyectamos *x = a*k0*(lon-lon0); *y = a*q/(2.0*k0); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/000755 001750 001750 00000000000 14217415600 015350 5ustar00topotopo000000 000000 octclip-2.0.3/src/libgeoc/fgeneral.h000755 001750 001750 00000112674 13242775336 017336 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup eop general geom geopot matriz @{ \file fgeneral.h \brief Declaración de macros y funciones de utilidad general. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 25 de septiembre de 2009 \version 1.0 \copyright Copyright (c) 2009-2018, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _FGENERAL_H_ #define _FGENERAL_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include #include #include #include"libgeoc/constantes.h" #include"libgeoc/errores.h" #include"libgeoc/geocomp.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_UNIX \brief Comprueba si estamos en un entorno UNIX o compatible. \return Dos posibilidades: - 1: Estamos en un entorno UNIX o compatible. - 0: No estamos en un entorno UNIX o compatible. \note Esta variable sólo se puede usar en sentencias condicionales del preprocesador. \date 03 de enero de 2013: Creación de la constante. \note Esta macro todavía no está probada. */ #define GEOC_UNIX 0 #if (!defined(_WIN32)&&(defined(__unix__)||defined(__unix)||defined(unix)|| \ (defined(__APPLE__)&&defined(__MACH__)))) #undef GEOC_UNIX #define GEOC_UNIX 1 #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SUNOS \brief Comprueba si estamos en un entorno de sistema operativo de Oracle (antigua Sun). \return Dos posibilidades: - 1: Estamos en un entorno de Oracle. - 0: No estamos en un entorno de Oracle. \note Esta variable sólo se puede usar en sentencias condicionales del preprocesador. \date 18 de enero de 2013: Creación de la constante. \note Esta macro todavía no está probada. */ #define GEOC_SUNOS 0 #if (defined(__sun__)||defined(__sun)||defined(__SunOS)) #undef GEOC_SUNOS #define GEOC_SUNOS 1 #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_WINDOWS \brief Comprueba si estamos en un entorno Microsoft Windows de 32 ó 64 bits. \return Dos posibilidades: - 1: Estamos en un entorno MS Windows. - 0: No estamos en un entorno MS Windows. \note Esta variable sólo se puede usar en sentencias condicionales del preprocesador. \date 07 de enero de 2013: Creación de la constante. \note Esta macro todavía no está probada. */ #define GEOC_WINDOWS 0 #if (defined(__WIN32__)||defined(__WIN32)||defined(_WIN32)||defined(WIN32)|| \ defined(__WIN64__)||defined(__WIN64)||defined(_WIN64)||defined(WIN64)) #undef GEOC_WINDOWS #define GEOC_WINDOWS 1 #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SIGNO \brief Macro para determinar el signo de un escalar. \param[in] a Un número. \return Signo del dato de entrada. Dos posibilidades: - -1.0: El dato pasado es negativo. - 1.0: El dato pasado es positivo o 0.0. \date 10 de junio de 2011: Creación de la macro. */ #define GEOC_SIGNO(a) ((a)>=0.0 ? 1.0 : -1.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MAX \brief Macro para seleccionar el valor máximo entre dos escalares. \param[in] a Un número. \param[in] b Otro número. \return El mayor de los dos argumentos de entrada. \date 25 de septiembre de 2009: Creación de la macro. */ #define GEOC_MAX(a,b) ((a)>(b) ? (a) : (b)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MIN \brief Macro para seleccionar el valor mínimo entre dos escalares. \param[in] a Un número. \param[in] b Otro número. \return El menor de los dos argumentos de entrada. \date 25 de septiembre de 2009: Creación de la macro. */ #define GEOC_MIN(a,b) ((a)<(b) ? (a) : (b)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ES_PAR \brief Macro para comprobar si un número de tipo entero es par. \param[in] a Un número. \return Dos posibilidades: - 0: El número es impar. - 1: El número es par. \note Esta macro usa el operador \b % de C para calcular el resto de la división del número pasado entre 2, por lo que el argumento de entrada ha de ser de tipo entero: \p char, \p short, \p int, \p long o \p long \p long (con los identificadores \p signed o \p undigned). \date 15 de marzo de 2011: Creación de la macro. \date 11 de septiembre de 2012: Renombrado de la macro. */ #define GEOC_ES_PAR(a) ((a)%2 ? 0 : 1) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ES_CERO \brief Macro para comprobar si un número puede considerarse cero con una cierta tolerancia. \param[in] num Número a comprobar. \param[in] tol Tolerancia. Ha de ser un número \b POSITIVO. \return Dos posibilidades: - 0: \em num es distinto de 0, tal que \f$num<=-tol\f$ o \f$num>=tol\f$. - 1: \em num es 0, tal que \f$ -tol < num < tol\f$. \note Para que esta macro funcione correctamente, \em tol ha de ser un número \b POSITIVO. \date 13 de marzo de 2010: Creación de la macro. \todo Esta macro todavía no está probada. */ #define GEOC_ES_CERO(num,tol) (((num)>(-(tol)))&&((num)<(tol)) ? 1 : 0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_DBL \brief Macro para realizar una conversión explícita a tipo de dato \p double. \param[in] a Un número. \return Órdenes para la conversión explícita del dato pasado a \p double. \date 19 de junio de 2011: Creación de la macro. */ #define GEOC_DBL(a) ((double)(a)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_COMPARA_VERSIONES \brief Compara dos números de versión. \param[in] vMay1 Número de versión mayor de la versión 1 a comparar. \param[in] vMen1 Número de versión menor de la versión 1 a comparar. \param[in] vMic1 Número de versión micro de la versión 1 a comparar. \param[in] vMay2 Número de versión mayor de la versión 2 a comparar. \param[in] vMen2 Número de versión menor de la versión 2 a comparar. \param[in] vMic2 Número de versión micro de la versión 2 a comparar. \return Dos posibilidades: - 1: Si la versión 1 es mayor (posterior) o igual que la versión 2. - 0: Si la versión 1 es menor (anterior) que la versión 2. \date 05 de agosto de 2012: Creación de la constante. \note Esta macro todavía no está probada. */ #define GEOC_COMPARA_VERSIONES(vMay1,vMen1,vMic1,vMay2,vMen2,vMic2) \ (((vMay1)>(vMay2))|| \ (((vMay1)==(vMay2))&&((vMen1)>(vMen2)))|| \ (((vMay1)==(vMay2))&&((vMen1)==(vMen2))&&((vMic1)>=(vMic2)))) /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref fgeneral.c. \param[out] version Cadena identificadora de la versión de OpenMP utilizada. Este argumento sólo se utiliza si su valor de entrada es distinto de \p NULL y si hay alguna función compilada con OpenMP. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 22 de agosto de 2011: Creación de la función. \date 25 de agosto de 2011: Adición del argumento de entrada \em version. */ int GeocParOmpFgeneral(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Mete un ángulo en el dominio \f$]-2*\pi,2*\pi[\f$. \param[in] angulo Valor angular, en radianes. \return Valor angular de entrada, en el dominio \f$]-2*\pi,2*\pi[\f$, en radianes. \note Esta función elimina todas las vueltas completas a la circunferencia que hacen que el posible valor de entrada esté fuera de los límites del dominio de salida. \date 10 de junio de 2011: Creación de la función. */ double PonAnguloDominio(const double angulo); /******************************************************************************/ /******************************************************************************/ /** \brief Busca en una lista de coordenadas de una polilínea en una dimensión las posiciones de inicio y fin del segmento que encierra a un punto dado. \param[in] valor Coordenada del punto de trabajo, contenido en el segmento a buscar. \param[in] lista Lista con las coordenadas de la polilínea. \param[in] nDatos Número de elementos de la lista de coordenadas pasadas. \param[in] incDatos Posiciones de separación entre cada elemento de \em lista. Ha de ser un número positivo. \param[out] posInicio Posición en \em lista de la coordenada inicial del segmento buscado. \param[out] posFin Posición en \em lista de la coordenada final del segmento buscado. \note Para convertir las posiciones devueltas por la función en las posiciones reales del array en memoria, han de ser multiplicadas por el valor \em incDatos. \note En las siguientes notas, cuando se habla de la longitud o el número de elementos de \em lista quiere decir el número de datos de trabajo, no todas las posiciones almacenadas en memoria. \note Esta función no comprueba internamente si la longitud de \em lista es congruente con el valor \em nDatos. \note Esta función supone que \em lista contiene un número de elementos >= 2. \note Esta función supone que los elementos almacenados en \em lista están ordenados de menor a mayor. \note Esta función supone que \em lista[0] <= \em valor >= \em lista[nDatos-1]. \note Si algún elemento de \em lista es igual a \em valor, su posición será el punto de inicio del segmento calculado, excepto si el elemento de \em lista es el último, en cuyo caso será el punto final. \date 06 de diciembre de 2010: Creación de la función. */ void BuscaSegmento1DInc(const double valor, const double* lista, const size_t nDatos, const size_t incDatos, size_t* posInicio, size_t* posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Busca en una lista de coordenadas de una polilínea en una dimensión las posiciones de inicio y fin del segmento que encierra a un punto dado. \param[in] valor Coordenada del punto de trabajo, contenido en el segmento a buscar. \param[in] lista Lista con las coordenadas de la polilínea. \param[in] nDatos Número de elementos de la lista de coordenadas pasadas. \param[out] posInicio Posición en \em lista de la coordenada inicial del segmento buscado. \param[out] posFin Posición en \em lista de la coordenada final del segmento buscado. \note Esta función no comprueba internamente si la longitud de \em lista es congruente con el valor \em nDatos. \note Esta función supone que \em lista contiene un número de elementos >= 2. \note Esta función supone que los elementos almacenados en \em lista están ordenados de menor a mayor. \note Esta función supone que \em lista[0] <= \em valor >= \em lista[nDatos-1]. \note Si algún elemento de \em lista es igual a \em valor, su posición será el punto de inicio del segmento calculado, excepto si el elemento de \em lista es el último, en cuyo caso será el punto final. \date 11 de octubre de 2009: Creación de la función. */ void BuscaSegmento1D(const double valor, const double* lista, const size_t nDatos, size_t* posInicio, size_t* posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Busca las posiciones fila y columna del elemento de una matriz correspondiente a la esquina NW del cuadrado que encierra a un punto dado. \param[in] xPto Coordenada X del punto de trabajo. \param[in] yPto Coordenada Y del punto de trabajo. \param[in] xMin Coordenada X mínima (esquina W) de los puntos almacenados en la matriz. \param[in] xMax Coordenada X máxima (esquina E) de los puntos almacenados en la matriz. \param[in] yMin Coordenada Y mínima (esquina S) de los puntos almacenados en la matriz. \param[in] yMax Coordenada Y máxima (esquina N) de los puntos almacenados en la matriz. \param[in] pasoX Paso de malla (valor absoluto) en la dirección X. \param[in] pasoY Paso de malla (valor absoluto) en la dirección Y. \param[out] fil Fila del elemento NW del cuadrado que encierra al punto de trabajo. \param[out] col Columna del elemento NW del cuadrado que encierra al punto de trabajo. \note Esta función no comprueba internamente si las coordenadas del punto de trabajo son congruentes con los límites de la matriz. \note Esta función asume que los pasos de malla son congruentes con los límites de la malla (supone que el cálculo del número de nodos es un número entero o del tipo X.9... o X.0...). \note Esta función asume que \em xMin < \em xMax y que \em yMin < \em yMax. \note Esta función asume que \em pasoX y \em pasoY han sido introducidos en valor absoluto. \date 15 de mayo de 2010: Creación de la función. \date 25 de septiembre de 2011: Corrección de error que hacía que se calculase una fila de más en determinados casos. \todo Esta función no está probada. */ void BuscaPosNWEnMalla(const double xPto, const double yPto, const double xMin, const double xMax, const double yMin, const double yMax, const double pasoX, const double pasoY, size_t* fil, size_t* col); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de mínimo valor en una lista de tipo \p double. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de mínimo valor. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 22 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ double Minimo(const double* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de máximo valor en una lista de tipo \p double. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de máximo valor. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 22 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ double Maximo(const double* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de mínimo valor absoluto en una lista de tipo \p double. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de mínimo valor absoluto. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 22 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ double MinimoAbs(const double* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de máximo valor absoluto en una lista de tipo \p double. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de máximo valor absoluto. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 22 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ double MaximoAbs(const double* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de mínimo valor en una lista de tipo \p size_t. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de mínimo valor. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 24 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ size_t MinimoSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el elemento de máximo valor en una lista de tipo \p size_t. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \return Elemento de máximo valor. \note Esta función se puede ejecutar en paralelo con OpenMP, versión 3.1 o superior (se detecta automáticamente en la compilación). \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \date 24 de agosto de 2011: Creación de la función. \todo Esta función todavía no está probada con OpenMP. */ size_t MaximoSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos); /******************************************************************************/ /******************************************************************************/ /** \brief Busca las posiciones que ocupan en una lista de tipo \p double los elementos de menor y mayor valor. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \param[out] posMin Posición en \em lista del elemento de menor valor. \param[out] posMax Posición en \em lista del elemento de mayor valor. \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \note Si hay varios elementos en la lista que se corresponden con el valor menor o mayor, la posición devuelta es la correspondiente al primer elemento a partir del inicio. \note Las posiciones devueltas lo son atendiendo al parámetro \em nDatos, por lo que para obtener las posiciones reales del elemento en memoria han de ser multiplicadas por el valor \em incDatos. \date 27 de octubre de 2009: Creación de la función. \date 29 de mayo de 2011: Adición del argumento de entrada \em incDatos. */ void MinMax(const double* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax); /******************************************************************************/ /******************************************************************************/ /** \brief Busca las posiciones que ocupan en una lista los elementos de menor y mayor valor absoluto. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \param[out] posMin Posición en \em lista del elemento de menor valor absoluto. \param[out] posMax Posición en \em lista del elemento de mayor valor absoluto. \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \note Si hay varios elementos en la lista que se corresponden con el valor menor o mayor, la posición devuelta es la correspondiente al primer elemento a partir del inicio. \note Las posiciones devueltas lo son atendiendo al parámetro \em nDatos, por lo que para obtener las posiciones reales del elemento en memoria han de ser multiplicadas por el valor \em incDatos. \date 27 de octubre de 2009: Creación de la función. \date 29 de mayo de 2011: Adición del argumento de entrada \em incDatos. */ void MinMaxAbs(const double* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax); /******************************************************************************/ /******************************************************************************/ /** \brief Busca las posiciones que ocupan en una lista de tipo \p size_t los elementos de menor y mayor valor. \param[in] lista Lista de valores. \param[in] nDatos Número de elementos de la lista de valores. \param[in] incDatos Posiciones de separación entre los elementos del vector \em lista. Este argumento siempre ha de ser un número positivo. \param[out] posMin Posición en \em lista del elemento de menor valor. \param[out] posMax Posición en \em lista del elemento de mayor valor. \note Esta función no comprueba internamente si la longitud de \em lista es congruente con los valores de \em nDatos e \em incDatos. \note Esta función supone que \em lista contiene un número de elementos >= 1. \note Si hay varios elementos en la lista que se corresponden con el valor menor o mayor, la posición devuelta es la correspondiente al primer elemento a partir del inicio. \note Las posiciones devueltas lo son atendiendo al parámetro \em nDatos, por lo que para obtener las posiciones reales del elemento en memoria han de ser multiplicadas por el valor \em incDatos. \date 08 de enero de 2010: Creación de la función. \date 29 de mayo de 2011: Adición del argumento de entrada \em incDatos. */ void MinMaxSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax); /******************************************************************************/ /******************************************************************************/ /** \brief Asigna memoria para una matriz bidimensional en estilo C. \param[in] fil Número de filas de la matriz. \param[in] col Número de columnas de la matriz. \return Puntero a la matriz creada. Si ocurre algún error de asignación de memoria, se devuelve NULL. \note La memoria asignada no se inicializa a ningún valor. \note Los datos se almacenan en ROW MAJOR ORDER de forma contigua en memoria. \note Esta función no controla si alguna de las dimensiones pasadas es 0. \date 14 de enero de 2010: Creación de la función. \date 02 de diciembre de 2010: Reprogramación de la función para que los datos se almacenen en memoria de forma contigua. */ double** AsigMemMatrizC(const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Libera memoria de una matriz bidimensional en estilo C. \param[in] matriz Puntero al espacio de memoria a liberar. \date 14 de enero de 2010: Creación de la función. \date 27 de febrero de 2010: Corregido bug que hacía que la función diese error si se le pasaba un puntero a NULL. */ void LibMemMatrizC(double** matriz); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula las posiciones de comienzo de elementos repetidos en un vector. \brief
  • Para un vector de datos [1,2,2,3,4,4] se devuelve el vector de posiciones [0,1,3,4].
  • Para un vector de datos [1,2,2,3,4] se devuelve el vector de posiciones [0,1,3,4].
  • Para un vector de datos [1,1,1,1,1] se devuelve el vector de posiciones [0].
  • Para un vector de datos [1] se devuelve el vector de posiciones [0].
\param[in] datos Vector de datos. \param[in] nDatos Número de elementos de \em datos. No puede ser 0. \param[in] incDatos Posiciones de separación entre los elementos del vector \em datos. Este argumento siempre ha de ser un número positivo. \param[out] nRepe Número de elementos del vector de posiciones de comienzo de elementos repetidos devuelto por la función. \return Vector, de \em nRepe elementos, que almacena las posiciones de comienzo de elementos repetidos en el vector \em datos. Las posiciones devueltas no tienen en cuenta el argumento \em incDatos, luego no son posiciones en el array realmente almacenado en memoria. Los índices comienzan en 0. Si ocurre un error de asignación de memoria se devuelve \p NULL. \note Esta función no comprueba internamente el vector pasado contiene suficiente memoria. \note Esta función no comprueba internamente si las dimensiones del vector pasado son congruentes con el espacio almacenado en memoria. \note Esta función no comprueba internamente si el argumento \em nDatos es igual a 0. \note Para calcular con los valores de salida las posiciones reales en el vector \em datos es necesario tener en cuenta el argumento \em incDatos. \date 02 de febrero de 2011: Creación de la función. */ size_t* PosRepeEnVector(const double* datos, const size_t nDatos, const size_t incDatos, size_t* nRepe); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el número de elementos repetidos en un vector a partir de la salida de la función \ref PosRepeEnVector. \brief
  • Para un vector de datos [1,2,2,3,4,4], donde la función \ref PosRepeEnVector devuelve el vector de posiciones [0,1,3,4], esta función devuelve el vector [1,2,1,2].
  • Para un vector de datos [1,2,2,3,4], donde la función \ref PosRepeEnVector devuelve el vector de posiciones [0,1,3,4], esta función devuelve el vector [1,2,1,1].
  • Para un vector de datos [1,1,1,1,1], donde la función \ref PosRepeEnVector devuelve el vector de posiciones [0], esta función devuelve el vector [5].
  • Para un vector de datos [1], donde la función \ref PosRepeEnVector devuelve el vector de posiciones [0], esta función devuelve el vector [1].
\param[in] pos Vector de posiciones devuelto por la función \ref PosRepeEnVector. \param[in] nPos Número de elementos de \em pos. No puede ser 0. \param[in] nElemVecOrig Número de elementos del vector de datos original. \return Vector, de \em nPos elementos, que almacena el número de elementos repetidos a partir de cada posición (incluida ésta) almacenada en el vector \em pos. Si ocurre un error de asignación de memoria se devuelve \p NULL. \note Esta función no comprueba internamente el vector pasado contiene suficiente memoria. \note Esta función no comprueba internamente si las dimensiones del vector pasado son congruentes con el espacio almacenado en memoria. \note Esta función no comprueba internamente si el argumento \em nPos es igual a 0. \date 02 de febrero de 2011: Creación de la función. */ size_t* NumElemRepeEnVector(const size_t* pos, const size_t nPos, const size_t nElemVecOrig); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica un factor de escala y una traslación (en este orden) a los elementos de un vector. \param[in,out] vector Vector de datos. Al término de la ejecución de la función, se ha aplicado un factor de escala y una traslación (en este orden) a los elementos del vector. \param[in] nElem Número de elementos de \em vector. \param[in] inc Posiciones de separación entre los elementos del vector \em vector. Este argumento siempre ha de ser un número positivo. \param[in] escala Factor de escala a aplicar. \param[in] traslada Traslación a aplicar. \note Primero se aplica el factor de escala y luego la traslación. \note Esta función asume que el vector de entrada \em vector tiene memoria asignada. \date 18 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void EscalaYTrasladaVector(double* vector, const size_t nElem, const size_t inc, const double escala, const double traslada); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica una traslación y un factor de escala (en este orden) a los elementos de un vector. \param[in,out] vector Vector de datos. Al término de la ejecución de la función, se ha aplicado una traslación y un factor de escala (en este orden) a los elementos del vector. \param[in] nElem Número de elementos de \em vector. \param[in] inc Posiciones de separación entre los elementos del vector \em vector. Este argumento siempre ha de ser un número positivo. \param[in] escala Factor de escala a aplicar. \param[in] traslada Traslación a aplicar. \note Primero se aplica la traslación y luego el factor de escala. \note Esta función asume que el vector de entrada \em vector tiene memoria asignada. \date 18 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void TrasladaYEscalaVector(double* vector, const size_t nElem, const size_t inc, const double escala, const double traslada); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/greiner.h000755 001750 001750 00000134070 14217415545 017174 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file greiner.h \brief Definición de estructuras y declaración de funciones para el recorte de polígonos mediante el algoritmo de Greiner-Hormann (http://davis.wpi.edu/~matt/courses/clipping/). \author José Luis García Pallero, jgpallero@gmail.com \date 14 de mayo de 2011 \copyright Copyright (c) 2011-2022, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _GREINER_H_ #define _GREINER_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include #include #include"libgeoc/errores.h" #include"libgeoc/eucli.h" #include"libgeoc/geocnan.h" #include"libgeoc/polig.h" #include"libgeoc/ptopol.h" #include"libgeoc/segmento.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_GREINER_FAC_EPS_PERTURB \brief Factor de escala para el cálculo de la cantidad mínima de perturbación. \brief A base de hacer pruebas he visto que es desaconsejable un valor por debajo de 10.0. \date 22 de mayo de 2011: Creación de la constante. */ #define GEOC_GREINER_FAC_EPS_PERTURB 10.0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_GREINER_BUFFER_PTOS \brief Número de puntos para ir asignando memoria en bloques para los polígonos de salida en la funcion \ref Paso3Greiner. Ha de ser un número mayor o igual a 2. \date 23 de mayo de 2011: Creación de la constante. */ #define GEOC_GREINER_BUFFER_PTOS 100 /******************************************************************************/ /******************************************************************************/ /** \enum GEOC_OP_BOOL_POLIG \brief Operación booleana entre polígonos. \date 21 de mayo de 2011: Creación del tipo. */ enum GEOC_OP_BOOL_POLIG { /** \brief Intersección entre polígonos. */ GeocOpBoolInter=111, /** \brief Unión de polígonos. */ GeocOpBoolUnion=112, /** \brief Unión exclusiva de polígonos. */ GeocOpBoolXor=113, /** \brief Operación A-B. */ GeocOpBoolAB=114, /** \brief Operación B-A. */ GeocOpBoolBA=115 }; /******************************************************************************/ /******************************************************************************/ /** \struct _vertPoliClip \brief Estructura de definición de un vértice de un polígono usado en operaciones de recorte. El polígono se almacena en memoria como una lista doblemente enlazada de vértices. \date 14 de mayo de 2011: Creación de la estructura. */ typedef struct _vertPoliClip { /** \brief Coordenada X del vértice. */ double x; /** \brief Coordenada Y del vértice. */ double y; /** \brief Coordenada X perturbada del vértice. */ double xP; /** \brief Coordenada Y perturbada del vértice. */ double yP; /** \brief Vértice anterior. */ struct _vertPoliClip* anterior; /** \brief Vértice siguiente. */ struct _vertPoliClip* siguiente; /** \brief Enlace al mismo nodo, perteneciente a otro polígono. Los puntos de intersección pertenecen tanto al polígono de recorte como al recortado. */ struct _vertPoliClip* vecino; /** \brief Indicador de primer punto de polígono. Dos posibilidades: - 0: No es el primer punto del polígono. - Distinto de 0: Sí es el primer punto del polígono. */ char ini; /** \brief Indicador de punto de intersección. Dos posibilidades: - 0: No es un punto de intersección. - Distinto de 0: Sí es un punto de intersección. */ char interseccion; /** \brief Indicador de punto de entrada al interior del otro polígono. Dos posibilidades: - 0: No es un punto de entrada, es de salida. - Distinto de 0: Sí es un punto de entrada. */ char entrada; /** \brief Indicador de punto visitado. Dos posibilidades: - 0: No ha sido visitado. - Distinto de 0: Sí ha sido visitado. */ char visitado; /** \brief Distancia, en tanto por uno, de un nodo de intersección con respecto al primer vértice del segmento que lo contiene. */ double alfa; }vertPoliClip; /******************************************************************************/ /******************************************************************************/ /** \brief Crea un vértice de tipo \ref _vertPoliClip y lo inserta entre otros dos. \param[in] x Coordenada X del vértice. \param[in] y Coordenada Y del vértice. \param[in] anterior Vértice anterior (puede ser \p NULL). \param[in] siguiente Vértice siguiente (puede ser \p NULL). \param[in] vecino Campo _vertPoliClip::vecino (puede ser \p NULL). \param[in] ini Campo _vertPoliClip::ini. \param[in] interseccion Campo _vertPoliClip::interseccion. \param[in] entrada Campo _vertPoliClip::entrada. \param[in] visitado Campo _vertPoliClip::visitado. \param[in] alfa Campo _vertPoliClip::alfa. \return Puntero al nuevo vértice creado. Si se devuelve \p NULL, ha ocurrido un error de asignación de memoria. \date 18 de mayo de 2011: Creación de la función. \date 21 de mayo de 2011: Eliminación del algumento \em siguientePoli y adición del argumento \em ini. \todo Esta función todavía no está probada. */ vertPoliClip* CreaVertPoliClip(const double x, const double y, vertPoliClip* anterior, vertPoliClip* siguiente, vertPoliClip* vecino, const char ini, const char interseccion, const char entrada, const char visitado, const double alfa); /******************************************************************************/ /******************************************************************************/ /** \brief Crea un polígono, como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] x Vector de coordenadas X de los nodos del polígono. \param[in] y Vector de coordenadas Y de los nodos del polígono. \param[in] nCoor Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \return Puntero al primer vértice de la lista. Si se devuelve \p NULL, ha ocurrido un error de asignación de memoria. \note Esta función asume que el argumento \em nCoor es mayor que 0. \note En la lista de salida que representa al polígono, el primer vértice siempre se repite al final. Si en los vectores \em x e \em y el último elemento no es igual que el primero, igualmente se crea en la lista de salida. \note Si en los vectores de coordenadas \em x e \em y hay valores #GEOC_NAN éstos \b*NO* serán considerados como separadores de múltiples polígonos, por lo que en la estructura de salida se asumirá que se almacena un polígono único cuyos vértices son los pasados sin tener en cuenta los pares (#GEOC_NAN,#GEOC_NAN). \date 18 de mayo de 2011: Creación de la función. \date 24 de mayo de 2011: Adición del soporte de coordenadas (#GEOC_NAN,#GEOC_NAN) en los vectores de entrada. \todo Esta función todavía no está probada. */ vertPoliClip* CreaPoliClip(const double* x, const double* y, const size_t nCoor, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Libera la memoria asignada a un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] poli Puntero al primer elemento del polígono. \note Esta función no comprueba si hay vértices del polígono anteriores al vértice de entrada, por lo que si se quiere liberar toda la memoria asignada a un polígono, el vértice pasado ha de ser el primero de la lista. \note Esta función \b *NO* trabaja con listas circulares. \date 18 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void LibMemPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina los vértices no originales de un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] poli Puntero al primer elemento del polígono. \return Puntero al primer elemento del polígono original. Si se devuelve \p NULL, ninguno de los vértices pertenecía al polígono original. \note Esta función asume que el primero y el último vértices originales del polígono pasado tienen las mismas coordenadas. \note Los vértices eliminados por esta función son todos aquéllos cuyo campo _vertPoliClip::interseccion sea distinto de 0. \note Aunque se supone que el primer vértice de un polígono siempre es un vértice original, si no lo es, la variable de entrada queda modificada. Por tanto, siempre es recomendable capturar la variable de salida, que garantiza la posición del primer elemento. \note Las coordenadas de todos los vértices originales vuelven a ser la de inicio, es decir, los campos _vertPoliClip::xP e _vertPoliClip::yP se sobreescriben con los valores almacenados en _vertPoliClip::x e _vertPoliClip::y. \note Esta función \b *NO* trabaja con listas circulares. \date 18 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* ReiniciaPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Reinicia los vértices de un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip para poder volver a calcular otra operación booleana sin tener que recalcular las intersecciones. \brief Esta función devuelve todos los campos _vertPoliClip::visitado a 0 y los campos _vertPoliClip::entrada a 0. \param[in] poli Puntero al primer elemento del polígono. \return Puntero al primer elemento del polígono original. Si se devuelve \p NULL, quiere decir qie el argumento de entrada valía \p NULL. \note Esta función \b *NO* trabaja con listas circulares. \date 30 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* ReiniciaVerticesPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el siguiente vértice original en un polígono. \param[in] vert Puntero al vértice a partir del cual se ha de buscar. \return Puntero al siguiente vértice original en el polígono. Si se devuelve \p NULL, se ha llegado al final. \note Esta función asume que el primero y el último vértices originales del polígono pasado tienen las mismas coordenadas. \note Los vértices no originales son todos aquéllos cuyo campo _vertPoliClip::interseccion es distinto de 0. \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* SiguienteVertOrigPoliClip(vertPoliClip* vert); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el siguiente vértice que sea una intersección no visitada en un polígono. \param[in] vert Puntero al vértice a partir del cual se ha de buscar. \return Puntero al siguiente vértice que sea una intersección no visitada en el polígono. Si se devuelve \p NULL, se ha llegado al final. \note Esta función asume que el primero y el último vértices originales del polígono pasado tienen las mismas coordenadas. \note Los vértices intersección no visitados son todos aquéllos cuyo campo _vertPoliClip::visitado es 0. \note Esta función asume que el vértice inicial del polígono, aquél cuyo campo _vertPoliClip::ini vale 1, es un vértice original. \note Esta función puede trabajar con listas circulares y no circulares. \date 21 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* SiguienteIntersecNoVisitadaPoliClip(vertPoliClip* vert); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el último vértice de un polígono almacenado como una lista doblemente enlazada de vértives \ref _vertPoliClip. \param[in] poli Puntero al primer elemento del polígono. \return Puntero al último vértice del polígono, que es aquél cuyo campo _vertPoliClip::siguiente apunta a \p NULL. Si se devuelve \p NULL, significa que el argumento pasado en \em poli vale \p NULL. \note Esta función \b *NO* trabaja con listas circulares. \date 21 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* UltimoVertPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Inserta un vértice de tipo \ref _vertPoliClip entre otros dos, atendiendo al campo _vertPoliClip::alfa. \param[in] ins Vértice a insertar. \param[in] extremoIni Extremo inicial del segmento donde se insertará \em ins. \param[in] extremoFin Extremo final del segmento donde se insertará \em ins. \note Esta función asume que todos los elementos pasados tienen memoria asignada. \note Si entre \em extremoIni y \em extremoFin hay más vértices, \em ins se insertará de tal modo que los campos _vertPoliClip::alfa queden ordenados de menor a mayor. \note Si el campo _vertPoliClip::alfa de \em ins tiene el mismo valor que el de \em extremoIni, \em ins se insertará justo a continuación de \em extremoIni. \note Si el campo _vertPoliClip::alfa de \em ins tiene el mismo valor que el de \em extremoFin, \em ins se insertará justo antes de \em extremoIni. \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void InsertaVertPoliClip(vertPoliClip* ins, vertPoliClip* extremoIni, vertPoliClip* extremoFin); /******************************************************************************/ /******************************************************************************/ /** \brief Convierte una lista doblemente enlazada de elementos \ref _vertPoliClip en una lista doblemente enlazada circular. \param[in,out] poli Vértice inicial del polígono, almacenado como lista doblemente enlazada, pero no cerrada. Al término de la ejecución de la función la lista se ha cerrado, por medio de un enlace del penúltimo elemento (el último es el primero repetido) con el primero. \return Puntero al último elemento del polígono original que, al ser el primer elemento repetido, queda almacenado en memoria pero no neferenciado por el polígono. Si el valor devuelto es \p NULL quiere decir que el argumento de entrada era \p NULL. \note Esta función \b *NO* trabaja con listas circulares. \date 21 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPoliClip* CierraPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Convierte una lista doblemente enlazada circular de elementos \ref _vertPoliClip en una lista doblemente enlazada simple. \param[in,out] poli Vértice inicial del polígono, almacenado como lista doblemente enlazada circular. Al término de la ejecución de la función la lista ha recuperado su condición de doblemente enlazada sin cerrar. \param[in] ultimo Puntero al último elemento de la lista doblemente enlazada original. Este argumento ha de ser el valor devuelto por la función \ref CierraPoliClip. \note Esta función asume que los elementos pasados tienen memoria asignada. \note Esta función sólo trabaja con listas circulares. \date 21 de mayo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void AbrePoliClip(vertPoliClip* poli, vertPoliClip* ultimo); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en un polígono de un número arbitrario de lados. Esta función puede no dar resultados correctos para puntos en los bordes y/o los vértices del polígono. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] poli Polígono, almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Sólo se tienen en cuenta los vértices originales del polígono, que son todos aquéllos cuyo campo _vertPoliClip::interseccion es distinto de 0. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. \note El código de esta función ha sido adaptado de la función \ref PtoEnPoligono. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función no detecta el caso de que el punto de trabajo esté en el borde o en un vértice del polígono. En este caso, el test puede dar el punto dentro o fuera, indistintamente (el chequeo del mismo punto con el mismo polígono siempre dará el mismo resultado). \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int PtoEnPoliClip(const double x, const double y, vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en un polígono de un número arbitrario de lados. Esta función puede no dar resultados correctos para puntos en los bordes del polígono. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] poli Polígono, almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Sólo se tienen en cuenta los vértices originales del polígono, que son todos aquéllos cuyo campo _vertPoliClip::interseccion es distinto de 0. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice del polígono. \note El código de esta función ha sido adaptado de la función \ref PtoEnPoligonoVertice. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función utiliza en uno de sus pasos la función \ref PtoEnPoliClip y se comporta igual que ella en el caso de puntos en el borde. \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int PtoEnPoliClipVertice(const double x, const double y, vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Cuenta el número de vértices originales que hay en un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] poli Polígono, almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Sólo se tienen en cuenta los vértices originales del polígono, que son todos aquéllos cuyo campo _vertPoliClip::interseccion es distinto de 0. \return Número de vértices originales almacenados. El último vértice, que es igual al primero, también se cuenta. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ size_t NumeroVertOrigPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Cuenta el número total de vértices que hay en un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] poli Polígono, almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Se tienen en cuenta todos los vértices. \return Número total de vértices almacenados. El último vértice, que debe ser igual al primero, también se cuenta. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función \b *NO* trabaja con listas circulares. \date 19 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ size_t NumeroVertPoliClip(vertPoliClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la cantidad mínima a añadir a un número para que el valor de la suma sea distinto del número original. \param[in] x Número a perturbar. \param[in] factor Factor para ir multiplicando el valor a añadir a \em x mientras no sea suficiente para producir una perturbación detectable. Un buen valor para este argumento es #GEOC_GREINER_FAC_EPS_PERTURB. \return Cantidad mínima a añadir a \em x para que el valor de la suma sea distinto de \em x. \note Esta función no comprueba internamente si \em factor es menor o igual que 1, lo que daría lugar a que la función entrase en un bucle infinito. \note Como valor inicial de la cantidad a añadir se toma el producto de \em factor por la constante \p DBL_EPSILON, perteneciente al fichero \p float.h de C estándar. \date 22 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ double CantPerturbMin(const double x, const double factor); /******************************************************************************/ /******************************************************************************/ /** \brief Modifica un número la cantidad mínima para que sea distinto del número original. \param[in] x Número a perturbar. \param[in] factor Factor para el cálculo de la cantidad perturbadora mínima. Ver la documentación de la función \ref CantPerturbMin para obtener más detalles. Un buen valor para este argumento es #GEOC_GREINER_FAC_EPS_PERTURB. \return Número perturbado. \note La perturbación de \em x se realiza de la siguiente manera: - Se calcula la cantidad mínima perturbadora \p perturb con la función \ref CantPerturbMin. - Se calcula un número seudoaleatorio con la función de C estándar rand() (el generador de números seudoaleatorios se inicializa con la orden srand((unsigned int)time(NULL));). - Se comprueba la paridad del número seudoaleatorio generado para obtener la variable \p signo, de tal forma que: - Si el número seudoaleatorio es par: \p signo vale 1.0. - Si el número seudoaleatorio es impar: \p signo vale -1.0. - Se perturba \em x como xPerturb=x+signo*perturb. \date 22 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ double PerturbaPuntoMin(const double x, const double factor); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza el paso número 1 del algoritmo de Greiner-Hormann, que consiste en el cálculo de los puntos de intersección entre los dos polígonos de trabajo. \param[in,out] poliBas Polígono base, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función se le han añadido los puntos de intersección. \param[in,out] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función se le han añadido los puntos de intersección. \param[in] facPer Factor para el posible cálculo de la perturbación de las coordenadas de algunos vértices. Este valor es usado internamente por la función \ref PerturbaPuntoMin (ver su documentación). Un buen valor para este argumento es #GEOC_GREINER_FAC_EPS_PERTURB. \param[out] nIntersec Número de intersecciones calculadas. \param[out] nPerturb Número de puntos perturbados en el proceso. \return Variable de estado. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si las variables \em poliBas y \em poliRec son polígonos correctamente almacenados. \note En el caso de tener que perturbar algún vértice, sólo se modifican los de \em poliRec, dejando las coordenadas del polígono base inalteradas. \date 22 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int Paso1Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const double facPer, size_t* nIntersec, size_t* nPerturb); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza el paso número 2 del algoritmo de Greiner-Hormann, que consiste en la asignación de los puntos de intersección como entrada o salida. \param[in,out] poliBas Polígono base, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función los puntos de intersección han sido marcados como entrada o salida. \param[in,out] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función los puntos de intersección han sido marcados como entrada o salida. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIG, excepto la unión exclusiva \p xor. En el caso de indicar la operación de unión exclusiva \p xor, se realiza una intersección y \b *NO* se avisa del argumento incorrecto. \note Esta función no comprueba si las variables \em poliBas y \em poliRec son polígonos correctamente almacenados. \date 22 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ void Paso2Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIG op); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza el paso número 3 del algoritmo de Greiner-Hormann, que consiste en la generación de los polígonos resultado. \param[in,out] poliBas Polígono base, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip, tal y como sale de la función \ref Paso2Greiner. Al término de la ejecución de la función los puntos visitados han sido marcados en el campo _vertPoliClip::visitado. \param[in,out] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip, tal y como sale de la función \ref Paso2Greiner. Al término de la ejecución de la función los puntos visitados han sido marcados en el campo _vertPoliClip::visitado. \return Estructura \ref polig con los polígonos resultado de la operación. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si las variables \em poliBas y \em poliRec son polígonos correctamente almacenados. \date 22 de mayo de 2011: Creación de la función. \date 29 de mayo de 2011: Cambio de la variable de salida por la estructura \ref polig. \todo Esta función no está probada. */ polig* Paso3Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza una operación booleana entre dos polígonos mediante el algoritmo de Greiner-Hormann. \param[in,out] poliBas Polígono base, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función se han añadido los puntos de intersección con \em poliRec. \param[in,out] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. Al término de la ejecución de la función se han añadido los puntos de intersección con \em poliRec. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIG. Varias posibilidades: - #GeocOpBoolInter: Realiza la intersección entre \em poliBas y \em poliRec. - #GeocOpBoolUnion: Realiza la unión entre \em poliBas y \em poliRec. - #GeocOpBoolXor: Realiza la unión exclusiva entre \em poliBas y \em poliRec. - #GeocOpBoolAB: Realiza la sustracción \em poliBas-poliRec. - #GeocOpBoolBA: Realiza la sustracción \em poliRec-poliBas. \param[in] facPer Factor para el posible cálculo de la perturbación de las coordenadas de algunos vértices. Este valor es usado internamente por la función \ref Paso1Greiner (ver su documentación). Un buen valor para este argumento es #GEOC_GREINER_FAC_EPS_PERTURB. \param[in] compruebaHuecosUnion Identificador para comprobar si alguno de los polígonos generados en la operación #GeocOpBoolUnion es es realidad un elemento que no pertenece a ninguno de los polígonos originales, caso que puede darse en algunas situaciones con polígonos de trabajo no convexos. Esta opción sólo es tenida en cuenta si \em op vale #GeocOpBoolUnion Dos posibles valores: - 0: No se comprueba. - Distinto de 0: Sí se comprueba. \param[out] nIntersec Número de intersecciones calculadas. \param[out] nPerturb Número de puntos perturbados en el proceso. \return Estructura \ref polig con los polígonos resultado de la operación. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. Cada elemento del campo polig::atr puede tener dos posibles valores: - 0: El polígono correspondiente es un agujero, luego no es un resultado válido para la operación solicitada en \em op. Este valor sólo puede darse si \em op vale #GeocOpBoolUnion y si se ha pasado un valor de \em compruebaHuecosOr distinto de 0. - 1: El polígono correspondiente es válido para la operación solicitada en \em op. \note Esta función no comprueba si las variables \em poliBas y \em poliRec son polígonos correctamente almacenados. \note Esta función no comprueba internamente si \em op pertenece al tipo enumerado #GEOC_OP_BOOL_POLIG. Si se introduce un valor no perteneciente al tipo, se realiza la operación #GeocOpBoolInter. \note En el caso de tener que perturbar algún vértice, sólo se modifican los de \em poliRec, dejando las coordenadas de \em poliBase inalteradas. \note Si \em facPer es menor o igual que 1, se sustituye internamente su valor por #GEOC_GREINER_FAC_EPS_PERTURB (ver documentación de la función \ref CantPerturbMin). \note Esta función realiza la unión exclusiva #GeocOpBoolXor mediante la unión de las operaciones individuales #GeocOpBoolAB y #GeocOpBoolBA. Esta última unión simplemente es el almacenamiento en la estructura de salida de los resultados de #GeocOpBoolAB y #GeocOpBoolBA. En ningún momento se realiza la operación booleana #GeocOpBoolUnion entre los resultados de #GeocOpBoolAB y #GeocOpBoolBA. \note Esta función asume que tanto \em poliBas como \em poliRec almacenan cada una un polígono único. \note Los polígonos pueden tener autointersecciones. \date 22 de mayo de 2011: Creación de la función. \date 29 de mayo de 2011: Cambio de la variable de salida por la estructura \ref polig. \date 30 de mayo de 2011: Adición de la capacidad de calcular la operación unión exclusiva \p xor. \date 11 de mayo de 2011: Adición del atributo polig::atr y del argumento de entrada \em compruebaHuecosUnion. \todo Esta función no está probada. */ polig* PoliBoolGreiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIG op, const double facPer, const int compruebaHuecosUnion, size_t* nIntersec, size_t* nPerturb); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza una operación booleana entre múltiples polígonos mediante el algoritmo de Greiner-Hormann. \param[in] poliBas Estructura \ref polig que almacena los polígonos base. \param[in] poliRec Estructura \ref polig que almacena los polígonos de recorte. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIG. Varias posibilidades: - #GeocOpBoolInter: Realiza la intersección entre los polígonos almacenados en \em poliBas y los almacenados en \em poliRec. - #GeocOpBoolUnion: Realiza la unión entre los polígonos almacenados en \em poliBas y los almacenados en \em poliRec. - #GeocOpBoolXor: Realiza la unión exclusiva entre los polígonoa almacenados en \em poliBas y los almacenados en \em poliRec. - #GeocOpBoolAB: Realiza la sustracción entre todos los polígonos \em poliBas-poliRec. - #GeocOpBoolBA: Realiza la sustracción entre todos los polígonos \em poliRec-poliBas. \param[in] facPer Factor para el posible cálculo de la perturbación de las coordenadas de algunos vértices. Este valor es usado internamente por la función \ref Paso1Greiner (ver su documentación). Un buen valor para este argumento es #GEOC_GREINER_FAC_EPS_PERTURB. \param[in] compruebaHuecosUnion Identificador para comprobar si alguno de los polígonos generados en la operación #GeocOpBoolUnion es es realidad un elemento que no pertenece a ninguno de los polígonos originales, caso que puede darse en algunas situaciones con polígonos de trabajo no convexos. Esta opción sólo es tenida en cuenta si \em op vale #GeocOpBoolUnion Dos posibles valores: - 0: No se comprueba. - Distinto de 0: Sí se comprueba. \param[out] nIntersec Número total de intersecciones calculadas entre todas los polígonos. \param[out] nPerturb Número total de puntos perturbados en el proceso. \return Estructura \ref polig con los polígonos resultado de las operaciones. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función realiza la operación \em op con todas las combinaciones posibles de polígonos. Es decir, se recorren todos los polígonos almacenados en \em poliBas y con cada uno de ellos se realiza la operación \em op con cada polígono almacenado en \em poliRec. \note Esta función no comprueba si las variables \em poliBas y \em poliRec son polígonos correctamente almacenados. \note Esta función no comprueba internamente si \em op pertenece al tipo enumerado #GEOC_OP_BOOL_POLIG. Si se introduce un valor no perteneciente al tipo, se realiza la operación #GeocOpBoolInter. \note En el caso de tener que perturbar algún vértice, sólo se modifican los correspondientes a \em poliRec, dejando las coordenadas de los polígonos de \em poliBase inalteradas. \note Si \em facPer es menor o igual que 1, se sustituye internamente su valor por #GEOC_GREINER_FAC_EPS_PERTURB (ver documentación de la función \ref CantPerturbMin). \note Esta función realiza la unión exclusiva #GeocOpBoolXor mediante la unión de las operaciones individuales #GeocOpBoolAB y #GeocOpBoolBA. Esta última unión simplemente es el almacenamiento en la estructura de salida de los resultados de #GeocOpBoolAB y #GeocOpBoolBA. En ningún momento se realiza la operación booleana #GeocOpBoolUnion entre los resultados de #GeocOpBoolAB y #GeocOpBoolBA. \note Los polígonos pueden tener autointersecciones. \date 07 de junio de 2011: Creación de la función. \date 11 de mayo de 2011: Adición del atributo polig::atr y del argumento de entrada \em compruebaHuecosUnion. \todo Esta función no está probada. */ polig* PoliBoolGreinerMult(const polig* poliBas, const polig* poliRec, const enum GEOC_OP_BOOL_POLIG op, const double facPer, const int compruebaHuecosUnion, size_t* nIntersec, size_t* nPerturb); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polig a partir de todos los vértices de un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] poli Polígono de trabajo, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. El puntero pasado ha de apuntar al primer elemento del polígono (no se controla internamente). \param[in] coorOrig Identificador para copiar las coordenadas originales o perturbadas. Dos posibilidades: - 0: Se copiarán las coordenadas perturbadas _vertPoliClip::xP e _vertPoliClip::yP. - Distinto de 0: Se copiarán las coordenadas originales _vertPoliClip::x e _vertPoliClip::y. \return Estructura \ref polig que representa el polígono. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función \b *NO* trabaja con listas circulares. \note Esta función realiza una copia en memoria de las coordenadas de los vértices de la estructura \em poli a la estructura de salida. \date 29 de mayo de 2011: Creación de la función. \date 25 de marzo de 2022: Adición de polig::atr a la estructura de salida. \todo Esta función no está probada. */ polig* CreaPoligPoliClip(vertPoliClip* poli, const int coorOrig); /******************************************************************************/ /******************************************************************************/ /** \brief Añade los vértices de un polígono almacenado como una lista doblemente enlazada de elementos \ref _vertPoliClip a una estructura \ref polig previamente creada. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se han añadido los polígonos de la estructura \em anyade. \param[in] anyade Polígono a añadir, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. El puntero pasado ha de apuntar al primer elemento del polígono (no se controla internamente). \param[in] coorOrig Identificador para copiar las coordenadas originales o perturbadas. Dos posibilidades: - 0: Se copiarán las coordenadas perturbadas _vertPoliClip::xP e _vertPoliClip::yP. - Distinto de 0: Se copiarán las coordenadas originales _vertPoliClip::x e _vertPoliClip::y. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si la variable \em poli es un polígono correctamente almacenado. \note Esta función no comprueba si la variable \em anyade es un polígono correctamente almacenado. \note Esta función \b *NO* trabaja con listas circulares. \note Esta función realiza una copia en memoria de las coordenadas de los vértices de la estructura \em poli a la estructura de salida. \note Esta función crea internamente una estructura \ref polig para luego añadirla a \em poli con la función \ref AnyadePoligPolig. \date 29 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int AnyadePoligClipPolig(polig* poli, vertPoliClip* anyade, const int coorOrig); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/eucli.h000755 001750 001750 00000026421 13655033577 016650 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom interp @{ \file eucli.h \brief Declaración de funciones para la realización de cálculos de geometría euclídea. \author José Luis García Pallero, jgpallero@gmail.com \date 27 de octubre de 2009 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _EUCLI_H_ #define _EUCLI_H_ /******************************************************************************/ /******************************************************************************/ #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia euclídea entre dos puntos en el plano. \param[in] x1 Coordenada X del punto inicial. \param[in] y1 Coordenada Y del punto inicial. \param[in] x2 Coordenada X del punto final. \param[in] y2 Coordenada Y del punto final. \return Distancia euclídea entre los dos puntos. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \date 27 de octubre de 2009: Creación de la función. \todo Esta función todavía no está probada. */ double Dist2D(const double x1, const double y1, const double x2, const double y2); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia euclídea entre dos puntos en el plano y realiza la propagación de errores correspondiente. \param[in] x1 Coordenada X del punto inicial. \param[in] y1 Coordenada Y del punto inicial. \param[in] x2 Coordenada X del punto final. \param[in] y2 Coordenada Y del punto final. \param[in] varx1 Varianza de la coordenada X del punto inicial. \param[in] varx1y1 Covarianza entre las coordenadas X e Y del punto inicial. \param[in] vary1 Varianza de la coordenada Y del punto inicial. \param[in] varx2 Varianza de la coordenada X del punto final. \param[in] varx2y2 Covarianza entre las coordenadas X e Y del punto final. \param[in] vary2 Varianza de la coordenada Y del punto final. \param[out] dist Distancia euclídea entre los dos puntos. \param[out] varDist Varianza de la distancia calculada. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \note Las unidades de las matrices de varianza-covarianza han de ser congruentes con las de las coordenadas pasadas. \date 27 de octubre de 2009: Creación de la función. \todo Esta función todavía no está probada. */ void Dist2DVC(const double x1, const double y1, const double x2, const double y2, const double varx1, const double varx1y1, const double vary1, const double varx2, const double varx2y2, const double vary2, double* dist, double* varDist); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia euclídea entre dos puntos en el espacio. \param[in] x1 Coordenada X del punto inicial. \param[in] y1 Coordenada Y del punto inicial. \param[in] z1 Coordenada Z del punto inicial. \param[in] x2 Coordenada X del punto final. \param[in] y2 Coordenada Y del punto final. \param[in] z2 Coordenada Z del punto final. \return Distancia euclídea entre los dos puntos. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \date 27 de octubre de 2009: Creación de la función. \todo Esta función todavía no está probada. */ double Dist3D(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia euclídea entre dos puntos en el espacio y realiza la propagación de errores correspondiente. \param[in] x1 Coordenada X del punto inicial. \param[in] y1 Coordenada Y del punto inicial. \param[in] z1 Coordenada Z del punto inicial. \param[in] x2 Coordenada X del punto final. \param[in] y2 Coordenada Y del punto final. \param[in] z2 Coordenada Z del punto final. \param[in] varx1 Varianza de la coordenada X del punto inicial. \param[in] varx1y1 Covarianza entre las coordenadas X e Y del punto inicial. \param[in] varx1z1 Covarianza entre las coordenadas X y Z del punto inicial. \param[in] vary1 Varianza de la coordenada Y del punto inicial. \param[in] vary1z1 Covarianza entre las coordenadas Y y Z del punto inicial. \param[in] varz1 Varianza de la coordenada Z del punto inicial. \param[in] varx2 Varianza de la coordenada X del punto final. \param[in] varx2y2 Covarianza entre las coordenadas X e Y del punto final. \param[in] varx2z2 Covarianza entre las coordenadas X y Z del punto final. \param[in] vary2 Varianza de la coordenada Y del punto final. \param[in] vary2z2 Covarianza entre las coordenadas Y y Z del punto final. \param[in] varz2 Varianza de la coordenada Z del punto final. \param[out] dist Distancia euclídea entre los dos puntos. \param[out] varDist Varianza de la distancia calculada. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \note Las unidades de las matrices de varianza-covarianza han de ser congruentes con las de las coordenadas pasadas. \date 27 de octubre de 2009: Creación de la función. \todo Esta función todavía no está probada. */ void Dist3DVC(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double varx1, const double varx1y1, const double varx1z1, const double vary1, const double vary1z1, const double varz1, const double varx2, const double varx2y2, const double varx2z2, const double vary2, const double vary2z2, const double varz2, double* dist, double* varDist); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el ángulo formado por dos vectores en el plano. \param[in] x1 Coordenada X del primer vector. \param[in] y1 Coordenada Y del primer vector. \param[in] x2 Coordenada X del segundo vector. \param[in] y2 Coordenada Y del segundo vector. \return Ángulo formado por los dos vectores, en radianes. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \date 04 de julio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ double AnguloVecPlano(const double x1, const double y1, const double x2, const double y2); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la altura de un triángulo a partir de las coordenadas de sus vértices. \param[in] xVert Coordenada X del vértice a partir del cual se calculará la altura. \param[in] yVert Coordenada Y del vértice a partir del cual se calculará la altura. \param[in] xBase1 Coordenada X del primer punto de la base del triángulo. \param[in] yBase1 Coordenada Y del primer punto de la base del triángulo. \param[in] xBase2 Coordenada X del segundo punto de la base del triángulo. \param[in] yBase2 Coordenada Y del segundo punto de la base del triángulo. \return Altura del triángulo, dada como la longitud del segmento que, partiendo del vértice pasado, corta en ángulo recto a la base. \note Esta función asume que todas las coordenadas vienen dadas en las mismas unidades. \date 04 de julio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ double AlturaTriangulo(const double xVert, const double yVert, const double xBase1, const double yBase1, const double xBase2, const double yBase2); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/posmatvec.h000755 001750 001750 00000064440 12175464533 017547 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup algebra anespec geopot gshhs matriz mmcc snx @{ \file posmatvec.h \brief Declaración de funciones para realizar cálculos de posiciones de elementos en matrices almacenadas en formato vector. En el momento de la compilación de las funciones de cálculo de posición ha de seleccionarse el tipo de almacenamiento matricial. Para realizar la selección es necesario definir la variable \em ROW_MAJOR_ORDER_MATVEC si se quiere almacenamiento de tipo ROW MAJOR ORDER o \em COLUMN_MAJOR_ORDER_MATVEC si se quiere almacenamiento de tipo COLUMN MAJOR ORDER. En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. Una matriz puede ser almacenada en formato vector de dos formas distintas: ROW MAJOR ORDER y COLUMN MAJOR ORDER. En la primera, la matriz es almacenada por filas, mientras que en la segunda lo es por columnas. Por ejemplo, la matriz \code m = [1 2 3 4 5 6 7 8] \endcode será almacenada en ROW MAJOR ORDER como \code m = [1 2 3 4 5 6 7 8] \endcode y en COLUMN MAJOR ORDER como \code m = [1 5 2 6 3 7 4 8] \endcode \author José Luis García Pallero, jgpallero@gmail.com \date 14 de enero de 2009 \section Licencia Licencia Copyright (c) 2009-2013, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _POSMATVEC_H_ #define _POSMATVEC_H_ /******************************************************************************/ /******************************************************************************/ #include #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_LON_CAD_COD_ALM \brief Longitud máxima de una cadena para almacenar el código identificador de tipo de almacenamiento matricial. \date 25 de septiembre de 2009: Creación de la constante. */ #define GEOC_LON_CAD_COD_ALM 25 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MATR_COD_ALM_RMO \brief Código identificador de almacenamiento como ROW MAJOR ORDER. \date 14 de enero de 2009: Creación de la constante. */ #define GEOC_MATR_COD_ALM_RMO "ROW-MAJOR-ORDER" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MATR_COD_ALM_CMO \brief Código identificador de almacenamiento como COLUMN MAJOR ORDER. \date 14 de enero de 2009: Creación de la constante. */ #define GEOC_MATR_COD_ALM_CMO "COLUMN-MAJOR-ORDER" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_INICIO_VEC \brief Macro para seleccionar el índice correspondiente al primer elemento de un vector dependiendo del valor de las posiciones de separación entre sus elementos. El índice buscado será diferente de 0 cuando el valor de posiciones de separación sea menor que 0. \param[in] n Número de elementos del vector. Ha de ser una variable de tipo \p size_t. \param[in] inc Posiciones de separación entre los elementos del vector. \return Índice del primer elemento del vector. \note Esta macro ha sido copiada (sólo se le ha cambiado el nombre) del fichero \em cblas.h del código fuente de la biblioteca \p gsl \p v.1.12, que se distribuye bajo licencia GPL v.3 o posterior. \date 19 de noviembre de 2009: Creación de la macro. */ #define GEOC_INICIO_VEC(n,inc) ((inc) >= 0 ? 0 : ((n)-1)*(size_t)(-(inc))) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_LMFC_RMO \brief Devuelve las columnas almacenadas en memoria de una matriz. \param[in] filMem Filas de la matriz almacenada en memoria. \param[in] colMem Columnas de la matriz almacenada en memoria. \return Número de columnas almacenadas en memoria. \date 25 de noviembre de 2009: Creación de la macro. */ //se añade 0*filMem para que el compilador no dé warning por variable no usada #define GEOC_LMFC_RMO(filMem,colMem) ((colMem)+0*(filMem)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_LMFC_CMO \brief Devuelve las filas almacenadas en memoria de una matriz. \param[in] filMem Filas de la matriz almacenada en memoria. \param[in] colMem Columnas de la matriz almacenada en memoria. \return Número de filas almacenadas en memoria. \date 25 de noviembre de 2009: Creación de la macro. */ //se añade 0*colMem para que el compilador no dé warning por variable no usada #define GEOC_LMFC_CMO(filMem,colMem) ((filMem)+0*(colMem)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_RMO \brief Calcula la posición de un elemento de una matriz almacenada en ROW MAJOR ORDER en el vector que la contiene. \param[in] filMem Filas reales (almacenadas en memoria) de la matriz. \param[in] colMem Columnas reales (almacenadas en memoria) de la matriz. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 25 de noviembre de 2009: Creación de la macro. \date 13 de abril de 2010: Cambio de las dimensiones de la matriz por las realmente almacenadas en memoria. */ //se añade 0*filMem para que el compilador no dé warning por variable no usada #define GEOC_POSMATVEC_RMO(filMem,colMem,fil,col) \ ((fil)*(colMem)+(col)+0*(filMem)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_CMO \brief Calcula la posición de un elemento de una matriz almacenada en COLUMN MAJOR ORDER en el vector que la contiene. \param[in] filMem Filas reales (almacenadas en memoria) de la matriz. \param[in] colMem Columnas reales (almacenadas en memoria) de la matriz. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 25 de noviembre de 2009: Creación de la macro. \date 13 de abril de 2010: Cambio de las dimensiones de la matriz por las realmente almacenadas en memoria. */ //se añade 0*colMem para que el compilador no dé warning por variable no usada #define GEOC_POSMATVEC_CMO(filMem,colMem,fil,col) \ ((col)*(filMem)+(fil)+0*(colMem)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_TRIEM_INF_RMO \brief Calcula la posición de un elemento de una matriz triangular inferior empaquetada en ROW MAJOR ORDER en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 29 de enero de 2011: Creación de la macro. */ //se añade 0*dim para que el compilador no dé warning por variable no usada #define GEOC_POSMATVEC_TRIEM_INF_RMO(dim,fil,col) \ ((col)+(fil)*((fil)+1)/2+0*(dim)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_TRIEM_SUP_RMO \brief Calcula la posición de un elemento de una matriz triangular superior empaquetada en ROW MAJOR ORDER en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 29 de enero de 2011: Creación de la macro. */ #define GEOC_POSMATVEC_TRIEM_SUP_RMO(dim,fil,col) \ ((col)-(fil)+(fil)*(2*(dim)-(fil)+1)/2) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_TRIEM_INF_CMO \brief Calcula la posición de un elemento de una matriz triangular inferior empaquetada en COLUMN MAJOR ORDER en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 29 de enero de 2011: Creación de la macro. */ #define GEOC_POSMATVEC_TRIEM_INF_CMO(dim,fil,col) \ ((fil)-(col)+(col)*(2*(dim)-(col)+1)/2) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_POSMATVEC_TRIEM_SUP_CMO \brief Calcula la posición de un elemento de una matriz triangular superior empaquetada en COLUMN MAJOR ORDER en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta macro no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 29 de enero de 2011: Creación de la macro. */ //se añade 0*dim para que el compilador no dé warning por variable no usada #define GEOC_POSMATVEC_TRIEM_SUP_CMO(dim,fil,col) \ ((fil)+(col)*((col)+1)/2+0*(dim)) /******************************************************************************/ /******************************************************************************/ /** \enum GEOC_MATR_ID_TRI \brief Indicador de parte de triangular de matriz. \date 26 de julio de 2009: Creación del tipo. */ enum GEOC_MATR_ID_TRI { /** \brief Indicador de parte triangular superior. */ GeocMatTriSup=121, /** \brief Indicador de parte triangular inferior. */ GeocMatTriInf=122 }; /******************************************************************************/ /******************************************************************************/ /** \enum GEOC_MATR_ID_DIAG \brief Indicador del contenido de la diagonal de una matriz triangular. \date 26 de septiembre de 2009: Creación del tipo. */ enum GEOC_MATR_ID_DIAG { /** \brief Indicador de diagonal con algún elemento distinto de 1. */ GeocMatDiagNoUnos=131, /** \brief Indicador de diagonal cuyos elementos son 1. */ GeocMatDiagUnos=132 }; /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si el tipo de almacenamiento utilizado es COLUMN-MAJOR-ORDER. \return Dos posibilidades: - 0: El tipo de almacenamiento es ROW-MAJOR-ORDER. - Distinto de 0: El tipo de almacenamiento es COLUMN-MAJOR-ORDER. \note El tipo de almacenamiento se selecciona en el momento de la compilación mediante la definición de una de las siguientes variables: \em ROW_MAJOR_ORDER_MATVEC (para un almacenamiento de tipo ROW MAJOR ORDER) o \em COLUMN_MAJOR_ORDER_MATVEC (para un almacenamiento de tipo COLUMN MAJOR ORDER). En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. \date 29 de julio de 2013: Creación de la función. */ int EsAlmMatVecCMO(void); /******************************************************************************/ /******************************************************************************/ /** \brief Devuelve el código de almacenamiento utilizado. \param[out] tipo Cadena de texto identificadora del tipo de almacenamiento. Una de las almacenadas en #GEOC_MATR_COD_ALM_RMO o #GEOC_MATR_COD_ALM_CMO. \note El tipo de almacenamiento se selecciona en el momento de la compilación mediante la definición de una de las siguientes variables: \em ROW_MAJOR_ORDER_MATVEC (para un almacenamiento de tipo ROW MAJOR ORDER) o \em COLUMN_MAJOR_ORDER_MATVEC (para un almacenamiento de tipo COLUMN MAJOR ORDER). En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. \date 14 de enero de 2009: Creación de la función. */ void TipoAlmMatVec(char tipo[]); /******************************************************************************/ /******************************************************************************/ /** \brief Devuelve la longitud de las filas o columnas almacenadas en memoria de una matriz, según el tipo de almacenamiento utilizado. \param[in] filMem Filas de la matriz almacenada en memoria. \param[in] colMem Columnas de la matriz almacenada en memoria. \return Filas o columnas almacenadas en memoria. Si el tipo de almacenamiento es \em ROW_MAJOR_ORDER_MATVEC se devuelve \em colMem, mientras que si es \em COLUMN_MAJOR_ORDER_MATVEC se devuelve \em filMem. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \date 19 de noviembre de 2009: Creación de la función. \date 25 de noviembre de 2009: Cálculos internos mediante macros. \date 30 de enero de 2011: Añado el identificador \p const a los argumentos de entrada. */ size_t Lmfc(const size_t filMem, const size_t colMem); /******************************************************************************/ /******************************************************************************/ /** \brief Devuelve las posiciones entre cada elemento de una fila de una matriz densa. \param[in] filMem Filas de la matriz realmente almacenadas en memoria. \return Posiciones entre cada elemento de las filas de la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \date 30 de enero de 2011: Creación de la función. */ size_t IncElemFil(const size_t filMem); /******************************************************************************/ /******************************************************************************/ /** \brief Devuelve las posiciones entre cada elemento de una columna de una matriz densa. \param[in] colMem Columnas de la matriz realmente almacenadas en memoria. \return Posiciones entre cada elemento de las columnas de la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \date 30 de enero de 2011: Creación de la función. */ size_t IncElemCol(const size_t colMem); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz en el vector en el que está almacenada. \param[in] filMem Filas reales (almacenadas en memoria) de la matriz. \param[in] colMem Columnas reales (almacenadas en memoria) de la matriz. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 14 de enero de 2009: Creación de la función. \date 25 de noviembre de 2009: Cálculos internos mediante macros. \date 13 de abril de 2010: Cambio de las dimensiones de la matriz por las realmente almacenadas en memoria. */ size_t PosMatVec(const size_t filMem, const size_t colMem, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición en una matriz a partir de la posición en el vector en que está almacenada. \param[in] filMem Filas reales (almacenadas en memoria) de la matriz. \param[in] colMem Columnas reales (almacenadas en memoria) de la matriz. \param[in] posVec Posición en el vector. \param[out] fil Columna del elemento de trabajo. \param[out] col Columna del elemento de trabajo. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones de la matriz. \date 14 de enero de 2009: Creación de la función. \date 13 de abril de 2010: Cambio de las dimensiones de la matriz por las realmente almacenadas en memoria. */ void PosVecMat(const size_t filMem, const size_t colMem, const size_t posVec, size_t* fil, size_t* col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz general banda en el vector en el que está almacenada. \param[in] diagInf Número de subdiagonales de la matriz. \param[in] diagSup Número de superdiagonales de la matriz. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones y la parte que contiene datos de la matriz. \date 21 de agosto de 2009: Creación de la función. */ size_t PosMatGenBanVec(const size_t diagInf, const size_t diagSup, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz triangular empaquetada en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] supInf Identificador de matriz triangular superior o inferior. Ha de ser un elemento perteneciente al tipo enumerado #GEOC_MATR_ID_TRI. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si el argumento \em supInf es correcto. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones y la parte triangular de la matriz. \date 26 de julio de 2009: Creación de la función. */ size_t PosMatTriEmVec(const size_t dim, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz triangular banda en el vector en el que está almacenada. \param[in] diag Número de superdiagonales o subdiagonales de la matriz. \param[in] supInf Identificador de matriz triangular superior o inferior. Ha de ser un elemento perteneciente al tipo enumerado #GEOC_MATR_ID_TRI. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si el argumento \em supInf es correcto. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones y la parte que contiene datos de la matriz. \date 27 de septiembre de 2009: Creación de la función. */ size_t PosMatTriBanVec(const size_t diag, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz simétrica empaquetada en el vector en el que está almacenada. \param[in] dim Dimensiones de la matriz (filas==columnas). \param[in] supInf Identificador de la parte de matriz simétrica almacenada: superior o inferior. Ha de ser un elemento perteneciente al tipo enumerado #GEOC_MATR_ID_TRI. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si el argumento \em supInf es correcto. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones y la parte triangular de la matriz. \date 30 de enero de 2010: Creación de la función. */ size_t PosMatSimEmVec(const size_t dim, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la posición de un elemento de una matriz simétrica banda en el vector en el que está almacenada. \param[in] diag Número de superdiagonales o subdiagonales de la matriz. \param[in] supInf Identificador de la parte de matriz simétrica almacenada: superior o inferior. Ha de ser un elemento perteneciente al tipo enumerado #GEOC_MATR_ID_TRI. \param[in] fil Fila del elemento de trabajo. \param[in] col Columna del elemento de trabajo. \return Posición del elemento de trabajo en el vector que almacena la matriz. \note Esta función comprueba internamente el tipo de almacenamiento utilizado. \note Esta función no comprueba si el argumento \em supInf es correcto. \note Esta función no comprueba si la posición del elemento de trabajo concuerda con las dimensiones y la parte que contiene datos de la matriz. \date 27 de septiembre de 2009: Creación de la función. */ size_t PosMatSimBanVec(const size_t diag, const enum GEOC_MATR_ID_TRI supInf, const size_t fil, const size_t col); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/general.h000755 001750 001750 00000006243 13655033577 017164 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup general Módulo GENERAL \brief En este módulo se reúnen constantes, macros y funciones de utilidad general. @{ \file general.h \brief Inclusión de archivos de cabecera para la utilización de la biblioteca GENERAL. \author José Luis García Pallero, jgpallero@gmail.com \date 16 de febrero de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _GENERAL_H_ #define _GENERAL_H_ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/compilador.h" #include"libgeoc/constantes.h" #include"libgeoc/fgeneral.h" #include"libgeoc/ventorno.h" /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/constantes.h000755 001750 001750 00000027761 13655033577 017740 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup anespec astro eop general geodesia geom gravim marea @{ \file constantes.h \brief Definición de constantes generales. \author José Luis García Pallero, jgpallero@gmail.com \date 02 de marzo de 2009 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _CONSTANTES_H_ #define _CONSTANTES_H_ /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \typedef geoc_char \brief Nombre del tipo \p char para almacenar números en \p libgeoc. Se declara este tipo para dotar de portabilidad a la biblioteca, debido a que en algunas implementaciones de C la declaración \p char a secas corresponde a un tipo \p unsigned \p char en lugar de a un \p signed \p char, que es el que necesita \p libgeoc cuando almacena un número en un \p char. En la implementación de \p gcc para PowerPC, por ejemplo, el tipo por defecto de un \p char es \p unsigned \p char, lo que hace que se produzcan errores al intentar almacenar números negativos. \date 02 de marzo de 2009: Creación del tipo. */ typedef signed char geoc_char; /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_PI \brief Constante \em PI. Tomada del fichero \p gsl_math.h, de la biblioteca GSL. \date 02 de marzo de 2009: Creación de la constante. */ #define GEOC_CONST_PI (3.14159265358979323846264338328) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_E \brief Constante \em e (base de los logaritmos naturales). Tomada del fichero \p gsl_math.h, de la biblioteca GSL. \date 03 de octubre de 2010: Creación de la constante. */ #define GEOC_CONST_E (2.71828182845904523536028747135) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_GR \brief Paso de grados centesimales a radianes. */ #define GEOC_CONST_GR ((GEOC_CONST_PI)/200.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_RG \brief Paso de radianes a grados centesimales. \date 02 de marzo de 2009: Creación de la constante. */ #define GEOC_CONST_RG (1.0/(GEOC_CONST_GR)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_DR \brief Paso de grados sexagesimales en formato decimal a radianes. \date 02 de marzo de 2009: Creación de la constante. */ #define GEOC_CONST_DR ((GEOC_CONST_PI)/180.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_RD \brief Paso de radianes a grados sexagesimales en formato decimal. \date 02 de marzo de 2009: Creación de la constante. */ #define GEOC_CONST_RD (1.0/(GEOC_CONST_DR)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_SIMUGAL \brief Paso de atracción gravitatoria en el SI (m/s^2) a microgales. \date 05 de noviembre de 2009: Creación de la constante. */ #define GEOC_CONST_SIMUGAL (1.0e8) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_MJD \brief Constante a sustraer a una fecha juliana (en días) para convertirla en fecha juliana modificada (MJD). \date 04 de octubre de 2009: Creación de la constante. */ #define GEOC_CONST_MJD (2400000.5) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_J2000 \brief Constante a sustraer a una fecha juliana (en días) para convertirla en fecha juliana referida a J2000. \date 01 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_J2000 (2451545.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_JISGPS \brief Fecha juliana del día de inicio de las semanas GPS: 6 de enero de 1980, 00:00:00 horas. \date 02 de marzo de 2010: Creación de la constante. */ #define GEOC_CONST_JISGPS (2444244.5) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_MIN_HORA \brief Número de minutos que contiene una hora. \date 19 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_MIN_HORA (60.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_SEG_HORA \brief Número de segundos que contiene una hora. \date 01 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_SEG_HORA (3600.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_SEG_MIN \brief Número de segundos que contiene un minuto \date 19 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_SEG_MIN (60.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_SEG_DIA \brief Número de segundos que contiene un día. \date 24 de octubre de 2009: Creación de la constante. */ #define GEOC_CONST_SEG_DIA (86400.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_HORAS_DIA \brief Número de horas que contiene un día. \date 01 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_HORAS_DIA (24.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_DIAS_SIGLO_JUL \brief Número de días que contiene un siglo juliano. \date 01 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_DIAS_SIGLO_JUL (36525.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_DIAS_SEMANA \brief Número de días que contiene una semana. \date 02 de marzo de 2010: Creación de la constante. */ #define GEOC_CONST_DIAS_SEMANA (7.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_DIAS_ANYO_NORM \brief Número de días que contiene un año normal. \date 02 de marzo de 2010: Creación de la constante. */ #define GEOC_CONST_DIAS_ANYO_NORM (365.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_DIAS_ANYO_BIS \brief Número de días que contiene un año bisiesto. \date 02 de marzo de 2010: Creación de la constante. */ #define GEOC_CONST_DIAS_ANYO_BIS ((GEOC_CONST_DIAS_ANYO_NORM)+1.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_CPD_RH \brief Paso de ciclos por día a radianes por hora. \date 20 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_CPD_RH (2.0*(GEOC_CONST_PI)/(GEOC_CONST_HORAS_DIA)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_RH_CPD \brief Paso de radianes por hora a ciclos por día. \date 20 de diciembre de 2009: Creación de la constante. */ #define GEOC_CONST_RH_CPD (1.0/(GEOC_CONST_CPD_RH)) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_G \brief Constante de gravitación universal, en m^3/(kg*s^2). \date 04 de noviembre de 2009: Creación de la constante. */ #define GEOC_CONST_G (6.67428e-11) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_CONST_VRT \brief Velocidad de rotación de la Tierra, en radianes/s. \date 21 de enero de 2011: Creación de la constante. */ #define GEOC_CONST_VRT (7.292115e-5) /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/dpeuckere.h000644 001750 001750 00000170414 12463476262 017513 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeuckere.h \brief Declaración de funciones auxiliares para el aligerado de polilíneas sobre la superficie de la esfera, basadas en el algoritmo de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 15 de agosto de 2013 \copyright Copyright (c) 2013-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _DPEUCKERE_H_ #define _DPEUCKERE_H_ /******************************************************************************/ /******************************************************************************/ #if defined(_OPENMP) #include #endif #include #include"libgeoc/constantes.h" #include"libgeoc/geocnan.h" #include"libgeoc/dpeuckera.h" #include"libgeoc/arco.h" #include"libgeoc/geocomp.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref dpeuckerp.c. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 17 de agosto de 2013: Creación de la función. \date 03 de abril de 2014: Particularización de la función sólo para la esfera. */ int GeocParOmpDpeuckere(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea sobre la superficie de una esfera mediante una modificación del algoritmo de Douglas-Peucker. \brief El algoritmo original, a partir del cual se ha hecho esta modificación, está documentado en: \brief James E. Burt, 1989. Line Generalization on the Sphere. Geographical Analysis 21 (1), 68-74. También se utiliza una adaptación del criterio apuntado en: Ebisch, K., October 2002. A correction to the Douglas–Peucker line generalization algorithm. Computers and Geosciences 28 (8), 995–997. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices: longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] posIni Posición en los vectores de coordenadas del punto inicial del segmento base para añadir puntos a la línea simplificada. \param[in] posFin Posición en los vectores de coordenadas del punto final del segmento base para añadir puntos a la línea simplificada. \param[out] usados Vector de \em nPtos elementos para indicar los puntos que finalmente se usan en la polilínea simplificada. En la entrada, todos sus elementos han de contener el valor 0, excepto las posiciones \em 0 y \em nPtos-1, que han de contener el valor 1. En la salida, las posiciones correspondientes a los puntos de la línea inicial no utilizados almacenarán el valor \em 0, mientras que las posiciones de los puntos utilizados almacenarán el valor \em 1. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función es recursiva. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que los valores \em posIni y \em posFin son posiciones válidas. \note Esta función asume que el vector \em usados contiene suficiente memoria asignada. \date 21 de septiembre de 2013: Creación de la función. \todo Esta función todavía no está probada. */ void DouglasPeuckerOriginalEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const size_t posIni, const size_t posFin, char* usados); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea sobre la superficie de la esfera mediante un algoritmo no recursivo, inspirado en el de Douglas-Peucker. \brief Este algoritmo, comenzando por el primer punto de la polilínea, va uniendo puntos en arcos de tal forma que se eliminan todos aquellos puntos que queden a una distancia menor o igual a \em tol del arco de trabajo. Así aplicado, pueden ocurrir casos singulares en los que la polilínea aligerada tenga casos de auto intersección entre sus lados resultantes. Para evitar esto, se puede aplicar la versión robusta del algoritmo. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices, como longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: En este caso esta opción es equivalente a pasar #GeocDPeuckerRobNo. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos/arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los arcos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los arcos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de arcos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los arcos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los arcos hasta el inicio de la polilínea aligerada. \param[out] nPtosSal Número de puntos de la polilínea aligerada. \return Vector de \em nPtosSal elementos que contiene los índices en los vectores \em x e \em y de los vértices que formarán la polilínea aligerada. Si ocurre algún error de asignación de memoria se devuelve el valor \p NULL. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que \em nPtos es mayor que 0. En caso contrario, devuelve \p NULL, por lo que un valor de retorno igual a \p NULL sólo es indicativo de error cuando \em nPtos es mayor que 0. \note Esta función comprueba los casos especiales con \ref CasosEspecialesAligeraPolilinea. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 07 de julio de 2011: Creación de la función. \date 10 de julio de 2011: Cambio del tipo del argumento \em robusto al tipo enumerado #GEOC_DPEUCKER_ROBUSTO. \date 14 de mayo de 2012: Corregido bug que hacía que no se escogiese bien el vértice a añadir a la polilínea aligerada. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 17 de agosto de 2013: Comprobación de casos especiales y unificación de las funciones de aligerado en el plano y en la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ size_t* DouglasPeuckerRobustoEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, size_t* nPtosSal); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo, con OpenMP, si una serie de puntos entre los extremos de un arco base están en tolerancia, según el criterio de la familia de algoritmos de Douglas-Peucker. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] tol Tolerancia para eliminar vértices, como longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] posBaseIni Posición en los vectores \em x e \em y del punto inicial del arco base. \param[in] posBaseFin Posición en los vectores \em x e \em y del punto final del arco base. \param[in] posPtoIni Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial a partir del cual (incluido) se chequeará la tolerancia. \param[in] posPtoFin Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial hasta el cual (incluido) se chequeará la tolerancia. \param[in] lonFinR Longitud del punto final del arco base en el sistema rotado. \param[in] mRot Matriz de rotación aplicada a la base del triángulo para llevarla al ecuador, con el punto inicial en \f$(\varphi=0,\lambda=0)\f$. Este argumento ha de ser una matriz de 3x3 almacenada en el formato de C. \return Identificador de que los puntos intermedios están o no en tolerancia. Dos posibilidades: - 0: Hay algún punto que se sale de tolerancia. - Distinto de 0: Todos los puntos están en tolerancia. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si las posiciones pasadas en \em posBaseIni, \em posBaseFin, \em posPtoIni y \em posPtoFin son congruentes con el número de elementos de los vectores \em x, \em y y, en su caso \em xG, \em yG y \em zG. \note Esta función asume que \em posBaseIni < \em posPtoIni <= \em posPtoFin < \em posBaseFin. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \date 18 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerPuntosEnTolEsferaOMP(const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin, const double lonFinR, double mRot[][3]); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de puntos entre los extremos de un arco base están en tolerancia, según el criterio de la familia de algoritmos de Douglas-Peucker. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] tol Tolerancia para eliminar vértices, como longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] posBaseIni Posición en los vectores \em x e \em y del punto inicial del arco base. \param[in] posBaseFin Posición en los vectores \em x e \em y del punto final del arco base. \param[in] posPtoIni Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial a partir del cual (incluido) se chequeará la tolerancia. \param[in] posPtoFin Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial hasta el cual (incluido) se chequeará la tolerancia. \param[in] lonFinR Longitud del punto final del arco base en el sistema rotado. \param[in] mRot Matriz de rotación aplicada a la base del triángulo para llevarla al ecuador, con el punto inicial en \f$(\varphi=0,\lambda=0)\f$. Este argumento ha de ser una matriz de 3x3 almacenada en el formato de C. \return Identificador de que los puntos intermedios están o no en tolerancia. Dos posibilidades: - 0: Hay algún punto que se sale de tolerancia. - Distinto de 0: Todos los puntos están en tolerancia. \note Esta función no comprueba si las posiciones pasadas en \em posBaseIni, \em posBaseFin, \em posPtoIni y \em posPtoFin son congruentes con el número de elementos de los vectores \em x, \em y y, en su caso \em xG, \em yG y \em zG. \note Esta función asume que \em posBaseIni < \em posPtoIni <= \em posPtoFin < \em posBaseFin. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL y se trabaja sobre la esfera. \date 18 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerPuntosEnTolEsferaSerie(const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin, const double lonFinR, double mRot[][3]); /******************************************************************************/ /******************************************************************************/ /** \brief Aproximación robusta al aligerado de líneas consistente en evitar que los arcos creados intersecten con los de la polilínea original a partir del punto de trabajo actual. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] segAUsar Número de arcos a utilizar de la polilínea original. Si se pasa el valor 0 se utilizan todos los arcos que quedan desde el punto de trabajo hasta el final. \param[in] posIni Posición inicial del arco a chequear. \param[in,out] posFin Posición final del arco a chequear. Al término de la ejecución de la función almacena la posición del punto que hace que el arco de la polilínea aligerada no intersecte con ninguno de los que quedan de la polilínea original. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em xG, \em yG y \em zG, es congruente con el valor pasado en \em nPtos. \note Esta función no comprueba si los índices pasados en los argumentos \em posIni y \em posFin son congruentes con el tamaño de los vectores pasado en \em nPtos. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \date 07 de julio de 2011: Creación de la función. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 18 de agosto de 2013: Unificación para el uso sobre el plano y sobre la esfera. \date 20 de agosto de 2013: Reorganización interna de la ejecución en serie y en paralelo de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ void DouglasPeuckerRobIntersecOrigEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t segAUsar, const size_t posIni, size_t* posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo con OpenMP, si una serie de arcos se cortan con un arco base AB, a partir de éste en adelante. \param[in] xA Longitud, en radianes, del punto A. \param[in] yA Latitud, en radianes, del punto A. \param[in] xB Longitud, en radianes, del punto B. \param[in] yB Latitud, en radianes, del punto B. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] posIni Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial a partir del cual (incluido) se comenzarán a chequear arcos. \param[in] posFin Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto final hasta el cual (incluido) se chequearán arcos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los arcos desde \em posIni hasta \em posFin. - Distinto de 0: Hay al menos una intersección entre AB y los arcos desde \em posIni hasta \em posFin. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si los argumentos \em posIni y \em posFin son congruentes con las dimensiones de los vectores \em x \em y, \em xG, \em yG y \em zG. \note Esta función asume que \em posIni<\em posFin. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecEsfera, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecOrigEsferaOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de arcos se cortan con un arco base AB, a partir de éste en adelante. \param[in] xA Longitud, en radianes, del punto A. \param[in] yA Latitud, en radianes, del punto A. \param[in] xB Longitud, en radianes, del punto B. \param[in] yB Latitud, en radianes, del punto B. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] posIni Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto inicial a partir del cual (incluido) se comenzarán a chequear arcos. \param[in] posFin Posición en los vectores \em x, \em y, \em xG, \em yG y \em zG del punto final hasta el cual (incluido) se chequearán arcos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los arcos desde \em posIni hasta \em posFin. - Distinto de 0: Hay al menos una intersección entre AB y los arcos desde \em posIni hasta \em posFin. \note Esta función no comprueba si los argumentos \em posIni y \em posFin son congruentes con las dimensiones de los vectores \em x \em y, \em xG, \em yG y \em zG. \note Esta función asume que \em posIni<\em posFin. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecEsfera, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecOrigEsferaSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Aproximación robusta al aligerado de líneas consistente en evitar que los arcos creados intersecten con los anteriores de la polilínea aligerada. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] posIni Posición (en los vectores \em x e \em y) inicial del arco a chequear. \param[in,out] posFin Posición (en los vectores \em x e \em y) final del arco a chequear. Al término de la ejecución de la función almacena la posición del punto que hace que el arco de la polilínea aligerada no intersecte con ninguno de los anteriormente calculados. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] segAUsar Número de arcos a utilizar de la polilínea aligerada. Si se pasa el valor 0 se utilizan todos los arcos anteriores. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em xG, \em yG y \em zG, es congruente con el valor pasado en \em nPtos. \note Esta función no comprueba si los índices pasados en los argumentos \em posIni y \em posFin son congruentes con el tamaño de los vectores pasado en \em nPtos. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con el tamaño de los vectores \em x e \em y. \note Esta función no comprueba si el valor pasado en \em nPosAlig es congruente con el tamaño del vector \em posAlig. \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \date 05 de julio de 2011: Creación de la función. \date 14 de mayo de 2012: Modificación del argumento \em nPosAlig para que contenga el tamaño real del vector \em posAlig. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 18 de agosto de 2013: Unificación para el uso sobre el plano y sobre la esfera. \date 20 de agosto de 2013: Reorganización interna de la ejecución en serie y en paralelo de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ void DouglasPeuckerRobAutoIntersecEsfera(const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t posIni, size_t* posFin, const size_t* posAlig, const size_t nPosAlig, const size_t segAUsar); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo con OpenMP, si una serie de arcos de la polilínea ya aligerada se cortan con un arco base AB, a partir de éste hacia atrás. \param[in] xA Longitud, en radianes, del punto A. \param[in] yA Latitud, en radianes, del punto A. \param[in] xB Longitud, en radianes, del punto B. \param[in] yB Latitud, en radianes, del punto B. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] posIni Posición en el vector \em posAlig del punto inicial a partir del cual (incluido) se comenzarán a chequear arcos. \param[in] posFin Posición en el vector \em posAlig del punto final hasta el cual (incluido) se chequearán arcos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los arcos. - Distinto de 0: Hay al menos una intersección entre AB y los arcos. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con las dimensiones de los vectores \em x \em y, \em xG, \em yG y \em zG. \note Esta función no comprueba si los valores pasados en \em posIni, \em posFin y \em nPosAlig son congruentes con el tamaño del vector \em posAlig. \note Esta función asume que \em posIni>\em posFin (ya que vamos hacia atrás). \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecEsfera, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobAutoIntersecEsferaOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de arcos de la polilínea ya aligerada se cortan con un arco base AB, a partir de éste hacia atrás. \param[in] xA Longitud, en radianes, del punto A. \param[in] yA Latitud, en radianes, del punto A. \param[in] xB Longitud, en radianes, del punto B. \param[in] yB Latitud, en radianes, del punto B. \param[in] x Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] xG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas X cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] yG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Y cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] zG Vector de las mismas dimensiones que \em x e \em y que contiene las coordenadas Z cartesianas geocéntricas con esfera de radio unidad de los puntos de trabajo. Sus elementos han de estar situados de forma contigua en memoria. Este argumento sólo se tiene en cuenta si es distinto de \p NULL. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] posIni Posición en el vector \em posAlig del punto inicial a partir del cual (incluido) se comenzarán a chequear arcos. \param[in] posFin Posición en el vector \em posAlig del punto final hasta el cual (incluido) se chequearán arcos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los arcos. - Distinto de 0: Hay al menos una intersección entre AB y los arcos. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con las dimensiones de los vectores \em x \em y, \em xG, \em yG y \em zG. \note Esta función no comprueba si los valores pasados en \em posIni, \em posFin y \em nPosAlig son congruentes con el tamaño del vector \em posAlig. \note Esta función asume que \em posIni>\em posFin (ya que vamos hacia atrás). \note Los argumentos \em xG, \em yG y \em zG sólo son tenidos en cuenta si los tres son distintos de \p NULL. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecEsfera, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobAutoIntersecEsferaSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos arcos AB y CD en la esfera. Se asume que el arco AB está contenido en el ecuador, con el punto A de coordenadas \f$(\varphi=0,\lambda=0)\f$. \param[in] xB Longitud, en radianes, del punto B. \param[in] xC Longitud, en radianes, del punto C. \param[in] yC Latitud, en radianes, del punto C. \param[in] xD Longitud, en radianes, del punto D. \param[in] yD Latitud, en radianes, del punto D. \param[in] xGC Coordenada X cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] yGC Coordenada Y cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] zGC Coordenada Z cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] xGD Coordenada X cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] yGD Coordenada Y cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] zGD Coordenada Z cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] posFinAB Posición del punto final del arco AB en los vectores originales de coordenadas. \param[in] posIniCD Posición del punto inicial del arco CD en los vectores originales de coordenadas. \return Dos posibilidades: - 0: No hay intersección entre AB y CD. - Distinto de 0: Sí hay intersección entre AB y CD. \note El dominio de las longitudes pasadas ha de ser \f$]-\pi,\pi]\f$. \note Los argumentos \em xGC, \em yGC, \em zGC, \em xGD, \em yGD y \em zGD sólo son tenidos en cuenta si cada tríada es distinta de \ref GeocNan, en cuyo caso las coordenadas cartesianas tridimensionales geocéntricas, necesarias para los cálculos llevados a cabo por la función, son calculadas internamente a partir de los argumentos \em xC, \em yC, \em xD e \em yD. \note Esta función utiliza internamente las funciones \ref IntersecArcCircMaxEsferaAux, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 28 de marzo de 2014: Adición de los argumentos \em xGC, \em yGC, \em zGC, \em xGD, \em yGD y \em zGD. \date 02 de abril de 2014: Particularización de la función sólo para la esfera. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecEsfera(const double xB, const double xC, const double yC, const double xD, const double yD, const double xGC, const double yGC, const double zGC, const double xGD, const double yGD, const double zGD, const size_t posFinAB, const size_t posIniCD); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el seno en valor absoluto de la distancia sobre un círculo máximo del punto más alejado de un conjunto de puntos candidatos a un arco de círculo máximo para su uso en el aligerado de polilíneas mediante el algoritmo de Douglas-Peucker. \brief Esta función trabaja en un sistema de referencia esférico tal que la base del triángulo está situada en el ecuador, con su punto inicial el de coordenadas \f$(\varphi=0,\lambda=0)\f$. \param[in] lat Vector que contiene las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] lon Vector que contiene las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] incLat Posiciones de separación entre los elementos del vector \em lat. Este argumento siempre ha de ser un número positivo. \param[in] incLon Posiciones de separación entre los elementos del vector \em lon. Este argumento siempre ha de ser un número positivo. \param[in] posIni Posición en los vectores de coordenadas del punto inicial del segmento base. \param[in] posFin Posición en los vectores de coordenadas del punto final del segmento base. \param[out] pos Posición en los vectores de coordenadas del punto situado entre \em posIni y \em posFin más alejado de la línea base. Si \em posFin es el punto inmediatamente posterior a \em posIni, esta variable devuelve \em posIni. \return Seno en valor absoluto de la distancia angular sobre un círculo máximo del punto más alejado a la línea base. Si \em posFin es el punto inmediatamente posterior a \em posIni, se devuelve el valor -1.0. \note Esta función no comprueba si el número de elementos de los vectores \em lat y \em lon es congruente con los valores pasados en \em posIni y \em posFin. \note En el caso de que el arco \f$\alpha\f$ de trabajo sea mayor que \f$\frac{\pi}{2}\f$, esta función devuelve el valor \f$1+\cos(\alpha)\f$, en lugar del seno. \note Esta función puede devolver resultados erróneos si algún segmento base es mayor o igual que \f$\pi\f$. \date 21 de septiembre de 2013: Creación de la función. \date 26 de marzo de 2014: La función ahora devuelve el valor absoluto del seno de la distancia angular. \todo Esta función todavía no está probada. */ double DouglasPeuckerSenDistMaxEsfera(const double* lat, const double* lon, const size_t incLat, const size_t incLon, const size_t posIni, const size_t posFin, size_t* pos); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el seno en valor absoluto de la distancia sobre un círculo máximo de un punto a un arco para su uso en el aligerado de polilíneas mediante mi modificación del algoritmo de Douglas-Peucker. \brief Esta función trabaja en un sistema de referencia esférico tal que la base del triángulo está situada en el ecuador, con su punto inicial el de coordenadas \f$(\varphi=0,\lambda=0)\f$. \param[in] latVert Latitud del punto de trabajo, en el sistema original, en radianes. \param[in] lonVert Longitud del punto de trabajo, en el sistema original, en radianes. \param[in] xVert Coordenada X cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto de trabajo. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] yVert Coordenada Y cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto de trabajo. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] zVert Coordenada Z cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto de trabajo. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] lonBase2R Longiud del punto final de la base del triángulo, en el sistema rotado, en radianes. \param[out] mRot Matriz de rotación aplicada a la base del triángulo para llevarla al sistema descrito. Este argumento ha de ser una matriz de 3x3 almacenada en el formato de C. \return Seno en valor absoluto de la distancia angular sobre un círculo máximo del punto al arco base. \note En el caso de que el arco \f$\alpha\f$ de trabajo sea mayor que \f$\frac{\pi}{2}\f$, esta función devuelve el valor \f$1+\cos(\alpha)\f$, en lugar del seno. \note Ninguno de los lados ni ángulos del triángulo puede ser mayor de \f$\pi\f$, hecho que no se comprueba internamente. \note Los argumentos \em xVert, \em yVert y \em zVert sólo son tenidos en cuenta si los tres son distintos de \ref GeocNan, en cuyo caso las coordenadas cartesianas tridimensionales geocéntricas, necesarias para los cálculos llevados a cabo por la función, son calculadas internamente a partir de los argumentos \em latVert y \em lonVert. \date 15 de agosto de 2013: Creación de la función. \date 26 de marzo de 2014: La función ahora devuelve el valor absoluto del seno de la distancia angular. \todo Esta función todavía no está probada. */ double DouglasPeuckerSenDistMaxEsferaAux(const double latVert, const double lonVert, const double xVert, const double yVert, const double zVert, const double lonBase2R, double mRot[][3]); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/compilador.h000755 001750 001750 00000012261 13655033577 017675 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup general geopot @{ \file compilador.h \brief Declaración de funciones para la detección de compiladores. \author José Luis García Pallero, jgpallero@gmail.com \date 28 de abril de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _COMPILADOR_H_ #define _COMPILADOR_H_ /******************************************************************************/ /******************************************************************************/ #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si el compilador utilizado para compilar este fichero es de la familia GCC. \param[out] noGnu Identificador de que estamos ante un compilador que no es de la familia GCC, diga lo que diga la variable devuelta por la función (ver nota al final de la documentación). Este argumento sólo es utilizado si en la entrada su valor es distinto de \p NULL. Dos posibles valores de salida: - 0: El compilador \b *ES* de la familia GCC. - Distinto de 0: El compilador \b *NO* \b *ES* de la familia GCC. \return Dos posibilidades: - 0: El compilador no pertenece a la familia GCC. - Distinto de 0: El compilador sí pertenece a la familia GCC (para una validez total de este valor hay que tener en cuenta el argumento \em noGnu). \note Esta función realiza la comprobación mediante el chequeo de la existencia de la constante simbólica \p __GNUC__. Este hecho hace que la detección del compilador se lleve a cabo durante la compilación del fichero que contiene a esta función, por lo que hay que tener en cuenta si ésta es llamada desde una función contenida en otro fichero que no fue compilado con un compilador de la familia GCC. \note Algunos compiladores, como el Intel C/C++ Compiler (\p icc), definen por defecto la macro \p __GNUC__, por lo que la detección puede ser errónea. Para estos casos ha de tenerse en cuenta el argumento \em noGnu. \note En las versiones más recientes de \p icc, el argumento \p -no-gcc suprime la definición de \p __GNUC__. \date 11 de octubre de 2009: Creación de la función. */ int EsCompiladorGNU(int* noGnu); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/calctopo.h000644 001750 001750 00000010050 13655033577 017337 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geodesia geom @{ \file calctopo.h \brief Declaración de funciones para cálculos de topografía. \author José Luis García Pallero, jgpallero@gmail.com \date 05 de julio de 2011 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _CALCTOPO_H_ #define _CALCTOPO_H_ /******************************************************************************/ /******************************************************************************/ #include #include"libgeoc/constantes.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el acimut topográfico entre dos puntos. \param[in] x1 Coordenada X del primer punto. \param[in] y1 Coordenada y del primer punto. \param[in] x2 Coordenada X del segundo punto. \param[in] y2 Coordenada y del segundo punto. \return Acimut del primer al segundo punto, en radianes. \date 05 de julio de 2011: Creación de la función. \todo Esta función todavía no ha sido probada. */ double AcimutTopografico(const double x1, const double y1, const double x2, const double y2); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/errores.h000755 001750 001750 00000136375 13655033577 017242 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup errores Módulo ERRORES \ingroup anespec eop fichero geodesia geom general geopot gshhs marea matriz \ingroup mmcc orden snx texto \brief En este módulo se reúnen los ficheros necesarios para realizar el tratamiento de errores que puedan ocurrir en la biblioteca. @{ \file errores.h \brief Declaración de funciones y constantes para el tratamiento de errores. En el momento de la compilación ha de seleccionarse el comportamiento de la función \ref GeocError. Para realizar la selección es necesario definir las variables para el preprocesador \em ESCRIBE_MENSAJE_ERROR si se quiere que la función imprima un mensaje de error y/o \em FIN_PROGRAMA_ERROR si se quiere que la función termine la ejecución del programa en curso. Si no se define ninguna variable, la función no ejecuta ninguna acción. En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. \author José Luis García Pallero, jgpallero@gmail.com \date 06 de marzo de 2009 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include #include /******************************************************************************/ /******************************************************************************/ #ifndef _ERRORES_H_ #define _ERRORES_H_ /******************************************************************************/ /******************************************************************************/ //GENERAL #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PLINEA \brief Palabra \em Línea para ser utilizada en el mensaje que imprime la macro #GEOC_ERROR. Esta constante se define porque el preprocesador del compilador \p pgcc no soporta letras con tilde escritas directamente en las órdenes a ejecutar por las macros. \date 10 de enero de 2011: Creación de la constante. */ #define GEOC_PLINEA "Línea" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_TIPO_ERR_NADA \brief Indicador de que la función \ref GeocError no hace nada. \date 09 de enero de 2011: Creación de la constante. */ #define GEOC_TIPO_ERR_NADA 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_TIPO_ERR_MENS_Y_EXIT \brief Indicador de que la función \ref GeocError imprime un mensaje descriptivo en la salida de error \em stderr y termina la ejecución del programa en curso. \date 09 de enero de 2011: Creación de la constante. */ #define GEOC_TIPO_ERR_MENS_Y_EXIT 1 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_TIPO_ERR_MENS \brief Indicador de que la función \ref GeocError imprime un mensaje descriptivo en la salida de error \em stderr y no termina la ejecución del programa en curso. \date 09 de enero de 2011: Creación de la constante. */ #define GEOC_TIPO_ERR_MENS 2 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_TIPO_ERR_EXIT \brief Indicador de que la función \ref GeocError termina la ejecución del programa en curso. \date 09 de enero de 2011: Creación de la constante. */ #define GEOC_TIPO_ERR_EXIT 3 /******************************************************************************/ /******************************************************************************/ /** \brief Indica el tipo de acción que realiza la función \ref GeocError. \return Cuatro posibles valores: - #GEOC_TIPO_ERR_NADA: La función \ref GeocError no hace nada. - #GEOC_TIPO_ERR_MENS_Y_EXIT: La función \ref GeocError imprime un mensaje descriptivo en la salida de error \em stderr y termina la ejecución del programa en curso. - #GEOC_TIPO_ERR_MENS: La función \ref GeocError imprime un mensaje descriptivo en la salida de error \em stderr y no detiene la ejecución del programa en curso. - #GEOC_TIPO_ERR_EXIT: La función \ref GeocError detiene la ejecución del programa en curso. \date 09 de enero de 2011: Creación de la función. */ int GeocTipoError(void); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime un mensaje en la salida de error \em stderr y/o sale del programa en ejecución. \param[in] mensaje Cadena de texto a imprimir. \param[in] funcion Nombre de la función desde donde se ha invocado a esta función. \note Si este fichero se compila con las variables para el preprocesador \em ESCRIBE_MENSAJE_ERROR y \em FIN_PROGRAMA_ERROR, esta función imprime el mensaje de error y termina la ejecución del programa en curso mediante la llamada a la función \em exit(EXIT_FAILURE), de la biblioteca estándar de C. \note Si este fichero se compila con la variable para el preprocesador \em ESCRIBE_MENSAJE_ERROR, esta función imprime el mensaje de error. \note Si este fichero se compila con la variable para el preprocesador \em FIN_PROGRAMA_ERROR, esta función termina la ejecución del programa en curso mediante la llamada a la función \em exit(EXIT_FAILURE), de la biblioteca estándar de C. \note Si este fichero se compila sin variables para el preprocesador, esta función no hace nada. \date 10 de enero de 2011: Creación de la función. */ void GeocError(const char mensaje[], const char funcion[]); /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERROR \brief Macro para imprimir un mensaje en la salida de error \em stderr y/o sale del programa en ejecución. \param[in] mensaje Cadena de texto a imprimir. \note Esta macro llama internamente a la función \ref GeocError. \note Esta macro pasa como argumento \em funcion a \ref GeocError la variable del preprocesador \em __func__, de C99. \date 10 de enero de 2011: Creación de la macro. */ #define GEOC_ERROR(mensaje) \ { \ if(GeocTipoError()!=GEOC_TIPO_ERR_NADA) \ { \ fprintf(stderr,"\n\n"); \ fprintf(stderr,"********************\n********************\n"); \ fprintf(stderr,GEOC_PLINEA" %d del fichero '%s'\n",__LINE__,__FILE__); \ GeocError(mensaje,(const char*)__func__); \ fprintf(stderr,"********************\n********************\n\n"); \ } \ else \ { \ GeocError(mensaje,(const char*)__func__); \ } \ } /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //GENERAL #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NO_ERROR \brief Indicador de que no ha ocurrido ningun error. \date 06 de marzo de 2009: Creación de la constante. */ #define GEOC_ERR_NO_ERROR 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_LECTURA_FICHERO \brief Indicador de que ha ocurrido un error en la lectura de un fichero. \date 06 de marzo de 2009: Creación de la constante. */ #define GEOC_ERR_LECTURA_FICHERO 1001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_ESCRITURA_FICHERO \brief Indicador de que ha ocurrido un error en escritura de un fichero. \date 20 de agosto de 2009: Creación de la constante. */ #define GEOC_ERR_ESCRITURA_FICHERO 1002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_QUEDAN_DATOS_EN_FICHERO \brief Indicador de que quedan datos por leer en un fichero. \date 06 de marzo de 2009: Creación de la constante. */ #define GEOC_ERR_QUEDAN_DATOS_EN_FICHERO 1003 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NO_QUEDAN_DATOS_EN_FICHERO \brief Indicador de que no quedan datos por leer en un fichero. \date 25 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_NO_QUEDAN_DATOS_EN_FICHERO 1004 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NO_HAY_DATOS_EN_FICHERO \brief Indicador de que no hay datos a leer en un fichero. \date 02 de diciembre de 2010: Creación de la constante. */ #define GEOC_ERR_NO_HAY_DATOS_EN_FICHERO 1005 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_LINEA_LARGA_EN_FICHERO \brief Indicador de que una línea de un fichero es demasiado larga. \date 23 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_LINEA_LARGA_EN_FICHERO 1006 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_LINEA_CORTA_EN_FICHERO \brief Indicador de que una línea de un fichero es demasiado corta. \date 23 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_LINEA_CORTA_EN_FICHERO 1007 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_ARG_ENTRADA_INCORRECTO \brief Indicador de que un argumento de entrada de una función es incorrecto. \date 06 de marzo de 2009: Creación de la constante. */ #define GEOC_ERR_ARG_ENTRADA_INCORRECTO 1008 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_ASIG_MEMORIA \brief Indicador de que ha ocurrido un error en la asignación de memoria. \date 06 de marzo de 2009: Creación de la constante. */ #define GEOC_ERR_ASIG_MEMORIA 1009 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_FUERA_DOMINIO \brief Indicador de que ha ocurrido un error porque un dato está fuera de dominio. \date 04 de octubre de 2009: Creación de la constante. */ #define GEOC_ERR_FUERA_DOMINIO 1010 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_FUERA_DOMINIO_MAYOR \brief Indicador de que ha ocurrido un error porque un dato está fuera de dominio. En este caso, el dato se sale del dominio por arriba (porque es demasiado grande). \date 26 de octubre de 2009: Creación de la constante. */ #define GEOC_ERR_FUERA_DOMINIO_MAYOR 1011 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_FUERA_DOMINIO_MENOR \brief Indicador de que ha ocurrido un error porque un dato está fuera de dominio. En este caso, el dato se sale del dominio por abajo (porque es demasiado pequeño). \date 26 de octubre de 2009: Creación de la constante. */ #define GEOC_ERR_FUERA_DOMINIO_MENOR 1012 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_INTERP \brief Indicador de que ha ocurrido un error en una interpolación. \date 15 de mayo de 2010: Creación de la constante. */ #define GEOC_ERR_INTERP 1013 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_INTERP_NO_DATO \brief Indicador de que no hay datos para realizar una interpolación. \date 30 de mayo de 2010: Creación de la constante. */ #define GEOC_ERR_INTERP_NO_DATO 1014 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_DIV_ENTRE_CERO \brief Indicador de que se ha realizado una división entre cero. \date 26 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_DIV_ENTRE_CERO 1015 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_DIM_MATRIZ \brief Indicador de dimensiones de una matriz erróneas. \date 02 de diciembre de 2010: Creación de la constante. */ #define GEOC_ERR_DIM_MATRIZ 1016 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_MATRIZ_SINGULAR \brief Indicador de matriz singular. \date 12 de marzo de 2011: Creación de la constante. */ #define GEOC_ERR_MATRIZ_SINGULAR 1017 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //EOP #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_EOP_ERRORES \brief Indicador de que ha ocurrido un error porque una estructura eop no contiene información de errores. \date 04 de octubre de 2009: Creación de la constante. */ #define GEOC_ERR_EOP_ERRORES 2001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_EOP_DOS_PUNTOS \brief Indicador de que ha ocurrido un error porque en una interpolación cuadrática sólo hay dos puntos disponibles. \date 12 de octubre de 2009: Creación de la constante. */ #define GEOC_ERR_EOP_DOS_PUNTOS 2002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_EOP_NO_DATOS \brief Indicador de que una estructura eop no contiene datos. \date 19 de junio de 2010: Creación de la constante. */ #define GEOC_ERR_EOP_NO_DATOS 2003 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //SINEX #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_LINEA_ILEGAL \brief Indicador de que una línea de un fichero SINEX no comienza por una de las cadenas permitidas (#GEOC_SNX_CAD_COMENTARIO, #GEOC_SNX_CAD_INI_CABECERA, #GEOC_SNX_CAD_INI_BLOQUE, #GEOC_SNX_CAD_FIN_BLOQUE o #GEOC_SNX_CAD_INI_DATOS). \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_LINEA_ILEGAL 3001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_LINEA_LARGA \brief Indicador de que una línea de un fichero SINEX es demasiado larga (más de #GEOC_SNX_LON_MAX_LIN_FICH carácteres). \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_LINEA_LARGA 3002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_LINEA_CORTA \brief Indicador de que una línea de un fichero SINEX es demasiado corta. \date 29 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_LINEA_CORTA 3003 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_NO_BLOQUES \brief Indicador de que en un fichero SINEX no hay bloques válidos. \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_NO_BLOQUES 3004 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_ID_BLOQUE_DISTINTO \brief Indicador de que en un fichero SINEX los identificadores de bloque tras las marcas de inicio y fin son distintos. \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_ID_BLOQUE_DISTINTO 3005 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BLOQUE_NO_INICIO \brief Indicador de que en un fichero SINEX un bloque no tiene identificador de inicio. \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_BLOQUE_NO_INICIO 3006 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BLOQUE_NO_FIN \brief Indicador de que en un fichero SINEX un bloque no tiene identificador de fin. \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_BLOQUE_NO_FIN 3007 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_NO_FIN_FICH \brief Indicador de que un fichero SINEX no tiene indicador de fin de fichero. \date 28 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_NO_FIN_FICH 3008 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_NO_ID_CABECERA \brief Indicador de que un fichero SINEX no tiene indicador cabecera. \date 29 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_NO_ID_CABECERA 3009 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_FORMATO_CABECERA \brief Indicador de que un fichero SINEX tiene una cabecera que no respeta el formato. \date 29 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_FORMATO_CABECERA 3010 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_CODFICH_INC \brief Indicador de que un fichero SINEX tiene un indicador de código de tipo de fichero incorrecto. \date 05 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_CODFICH_INC 3011 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_TIPODOC_INC \brief Indicador de que un fichero SINEX tiene un indicador de tipo de documento incorrecto. \date 05 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_TIPODOC_INC 3012 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_VERS_INC \brief Indicador de que un fichero SINEX tiene un indicador de versión incorrecto. \date 30 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_VERS_INC 3013 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_FECHA_INC \brief Indicador de que una fecha es incorrecta en un fichero SINEX. \date 30 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_FECHA_INC 3014 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_CODOBS_INC \brief Indicador de que el código de observación es incorrecto en un fichero SINEX. \date 30 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_CODOBS_INC 3015 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_CODCONSTR_INC \brief Indicador de que el código de constreñimiento es incorrecto en un fichero SINEX. \date 30 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_CODCONSTR_INC 3016 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_SOLCONT_INC \brief Indicador de que un código de solución contenida en un fichero SINEX es incorrecto. \date 31 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_SOLCONT_INC 3017 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_NSOLCONT_INC \brief Indicador de que un código de solución contenida en un fichero SINEX es incorrecto. \date 31 de diciembre de 2009: Creación de la constante. */ #define GEOC_ERR_SNX_NSOLCONT_INC 3018 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_FORM_LINEA_INC \brief Indicador de que una línea de un fichero SINEX tiene un formato incorrecto. \date 01 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_FORM_LINEA_INC 3019 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BFR_TIPOINF_INC \brief Indicador de que el código de tipo de información de un bloque FILE/REFERENCE de un fichero SINEX es incorrecto. \date 01 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BFR_TIPOINF_INC 3020 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BND_CODNUT_INC \brief Indicador de que el código de modelo de nutación de un bloque NUTATION/DATA de un fichero SINEX es incorrecto. \date 03 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BND_CODNUT_INC 3021 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BPD_CODPREC_INC \brief Indicador de que el código de modelo de precesión de un bloque PRECESSION/DATA de un fichero SINEX es incorrecto. \date 03 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BPD_CODPREC_INC 3022 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSII_GRADLATSEX_INC \brief Indicador de que un valor de grados sexagesimales de latitud de un bloque SITE/ID de un fichero SINEX es incorrecto. \date 15 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSII_GRADLATSEX_INC 3023 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSII_GRADLONSEX_INC \brief Indicador de que un valor de grados sexagesimales de longitud de un bloque SITE/ID de un fichero SINEX es incorrecto. \date 15 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSII_GRADLONSEX_INC 3024 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSII_MINSEX_INC \brief Indicador de que un valor de minutos sexagesimales de un bloque SITE/ID de un fichero SINEX es incorrecto. \date 15 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSII_MINSEX_INC 3025 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSII_SEGSEX_INC \brief Indicador de que un valor de segundos sexagesimales de un bloque SITE/ID de un fichero SINEX es incorrecto. \date 15 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSII_SEGSEX_INC 3026 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSE_CODSREX_INC \brief Indicador de que un código del sistema de referencia utilizado para definir la excentricidad de una antena de un bloque SITE/ECCENTRICITY de un fichero SINEX es incorrecto. \date 23 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSE_CODSREX_INC 3027 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_CODGNSS_INC \brief Indicador de que un código de constelación GNSS utilizado en un fichero SINEX es incorrecto. \date 28 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_CODGNSS_INC 3028 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSAP_CODFREC_INC \brief Indicador de que un código frecuencia de satélite GNSS de un bloque SATELLITE/PHASE_CENTER de un fichero SINEX es incorrecto. \date 28 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSAP_CODFREC_INC 3029 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSAP_TIPOPCV_INC \brief Indicador de que un código indicador de tipo de variación del centro de fase de un bloque SATELLITE/PHASE_CENTER de un fichero SINEX es incorrecto. \date 28 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSAP_TIPOPCV_INC 3030 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSAP_MODAPPCV_INC \brief Indicador de que un código indicador de modelo de aplicación de las variaciones del centro de fase de un bloque SATELLITE/PHASE_CENTER de un fichero SINEX es incorrecto. \date 28 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSAP_MODAPPCV_INC 3031 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_BSOES_IDPARAM_INC \brief Indicador de que un identificador de parámetro estadístico de un bloque SOLUTION/STATISTICS de un fichero SINEX es incorrecto. \date 28 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_BSOES_IDPARAM_INC 3032 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_IDUNID_INC \brief Indicador de que un identificador de unidades utilizado en un fichero SINEX es incorrecto. \date 29 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_IDUNID_INC 3033 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_TIPPAR_INC \brief Indicador de que un identificador de tipo de parámetro utilizado en un fichero SINEX es incorrecto. \date 29 de enero de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_TIPPAR_INC 3034 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_PTRIAN_INC \brief Indicador de que un identificador de parte triangular de una matriz simétrica utilizado en un fichero SINEX es incorrecto. \date 17 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_PTRIAN_INC 3035 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_TIPOMAT_INC \brief Indicador de que un identificador de tipo de matriz utilizado en un fichero SINEX es incorrecto. \date 17 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_TIPOMAT_INC 3036 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_SNX_POSMAT_INC \brief Indicador de que una posición en una matriz almacenada en un fichero SINEX es incorrecta. \date 17 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_SNX_POSMAT_INC 3037 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //GTS #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GTS_VERT_FHULL \brief Indicador de que un vértice de una nube de puntos está fuera del \em convex \em hull que la engloba. \date 09 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_GTS_VERT_FHULL 4001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GTS_VERT_FSUP \brief Indicador de que un vértice está fuera de una superficie. \date 22 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_GTS_VERT_FSUP 4002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GTS_VERT_DUPL \brief Indicador de que un vértice de una nube de puntos está duplicado. \date 09 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_GTS_VERT_DUPL 4003 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GTS_CONF_CONSTR \brief Indicador de que ha habido un conflicto con un constreñimiento en un proceso de triangulación. \date 09 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_GTS_CONF_CONSTR 4004 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //PMAREA #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PMAREA_NO_HAY_BLOQUE \brief Indicador de que no existe un bloque buscado en un fichero. \date 24 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_PMAREA_NO_HAY_BLOQUE 5001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PMAREA_LIN_FICH_INC \brief Indicador de que una línea de fichero de parámetros de marea es incorrecta. \date 25 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_PMAREA_LIN_FICH_INC 5002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PMAREA_DEF_BLOQUE_INC \brief Indicador de que una definición de bloque de parámetros de marea en un fichero es incorrecta. \date 25 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_PMAREA_DEF_BLOQUE_INC 5003 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PMAREA_LIM_FDOM \brief Indicador de que alguno de los límites de la malla está fuera de dominio. \date 25 de abril de 2010: Creación de la constante. */ #define GEOC_ERR_PMAREA_LIM_FDOM 5004 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //GEOPOT #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRADO_ORDEN_MAL \brief Indicador de que los grados y/u órdenes pasados a una función no son correctos. \date 25 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRADO_ORDEN_MAL 6001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRACE_LINFO_NO \brief Indicador de que no hay línea (o la que hay no es la primera) de información general de un fichero de un desarrollo del potencial de la Tierra en armónicos esféricos en formato de GRACE. \date 16 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRACE_LINFO_NO 6002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRACE_LINFO_REPE \brief Indicador de que la línea de información general de un fichero de un desarrollo del potencial de la Tierra en armónicos esféricos en formato de GRACE está repetida. \date 16 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRACE_LINFO_REPE 6003 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRACE_CAB_INCOMP \brief Indicador de cabecera incompleta en un fichero de un desarrollo del potencial de la Tierra en armónicos esféricos en formato de GRACE está repetida. \date 17 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRACE_CAB_INCOMP 6004 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRACE_MEZCLA_TIPO_COEF \brief Indicador de que en un fichero de un desarrollo del potencial de la Tierra en armónicos esféricos en formato de GRACE hay definiciones de coeficientes de distintas versiones. \date 23 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRACE_MEZCLA_TIPO_COEF 6005 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GEOPOT_GRACE_NLINEAS_DATOS_MAL \brief Indicador de que en un fichero de un desarrollo del potencial de la Tierra en armónicos esféricos en formato de GRACE no coinciden el número de líneas de datos leídas en dos pasadas distintas sobre el fichero. \date 24 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_GEOPOT_GRACE_NLINEAS_DATOS_MAL 6006 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //NUMLOVE #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NUMLOVE_NO_HAY_BLOQUE \brief Indicador de que no existe un bloque buscado en un fichero. \date 29 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_NUMLOVE_NO_HAY_BLOQUE 7001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NUMLOVE_DEF_BLOQUE_INC \brief Indicador de que una línea de fichero de números de Love es incorrecta. \date 29 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_NUMLOVE_DEF_BLOQUE_INC 7002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_NUMLOVE_LIN_FICH_INC \brief Indicador de que una definición de bloque de números de Love en un fichero es incorrecta. \date 29 de noviembre de 2010: Creación de la constante. */ #define GEOC_ERR_NUMLOVE_LIN_FICH_INC 7003 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //GSHHS #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GSHHS_VERS_ANTIGUA \brief Indicador de que la versión de un fichero de GSHHS es antigua. \date 16 de abril de 2011: Creación de la constante. */ #define GEOC_ERR_GSHHS_VERS_ANTIGUA 8001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_GSHHS_CREA_POLI \brief Indicador de que ha ocurrido un error de tipo #GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG o #GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG al crear una estructura \ref polig o \ref polil \date 19 de junio de 2011: Creación de la constante. */ #define GEOC_ERR_GSHHS_CREA_POLI 8002 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //POLIG #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG \brief Indicador de que dos vectores de coordenadas no contienen el mismo número de polígonos. \date 27 de mayo de 2011: Creación de la constante. */ #define GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG 9001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG \brief Indicador de que dos vectores de coordenadas no contienen los mismos polígonos. \date 27 de mayo de 2011: Creación de la constante. */ #define GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG 9002 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //POLIL #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL \brief Indicador de que dos vectores de coordenadas no contienen el mismo número de polilíneas. \date 03 de junio de 2011: Creación de la constante. */ #define GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL 10001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL \brief Indicador de que dos vectores de coordenadas no contienen las mismas polilíneas. \date 03 de junio de 2011: Creación de la constante. */ #define GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL 10002 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ //PROYEC #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PROYEC_INI_PROJ \brief Indicador de que ha ocurrido un error en la inicialización de una proyección de PROJ.4. \date 31 de mayo de 2011: Creación de la constante. */ #define GEOC_ERR_PROYEC_INI_PROJ 11001 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PROYEC_NO_INV_PROJ \brief Indicador de que una proyección cartográfica de PROJ.4 no tiene paso inverso. \date 31 de mayo de 2011: Creación de la constante. */ #define GEOC_ERR_PROYEC_NO_INV_PROJ 11002 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ERR_PROYEC_PROJ_ERROR \brief Indicador de que ha ocurrido un error al proyectar un punto con PROJ.4. \date 31 de mayo de 2011: Creación de la constante. */ #define GEOC_ERR_PROYEC_PROJ_ERROR 11003 /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/recpolil.h000755 001750 001750 00000056274 13656226554 017371 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file recpolil.h \brief Definición de estructuras y declaración de funciones para el recorte de polilíneas por medio de polígonos. \author José Luis García Pallero, jgpallero@gmail.com \date 04 de junio de 2011 \copyright Copyright (c) 2011-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _RECPOLIL_H_ #define _RECPOLIL_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include"libgeoc/errores.h" #include"libgeoc/eucli.h" #include"libgeoc/geocnan.h" #include"libgeoc/greiner.h" #include"libgeoc/polig.h" #include"libgeoc/polil.h" #include"libgeoc/ptopol.h" #include"libgeoc/segmento.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_RECPOLIL_BUFFER_PTOS \brief Número de puntos para ir asignando memoria en bloques para las polilíneas de salida en la funcion \ref Paso2Recpolil. Ha de ser un número mayor o igual a 2. \date 04 de junio de 2011: Creación de la constante. */ #define GEOC_RECPOLIL_BUFFER_PTOS 100 /******************************************************************************/ /******************************************************************************/ /** \enum GEOC_OP_BOOL_POLIL \brief Operación booleana entre polilínea y polígono. \date 04 de junio de 2011: Creación del tipo. */ enum GEOC_OP_BOOL_POLIL { /** \brief Polilínea interior al polígono. */ GeocOpBoolDentro=111, /** \brief Polilínea exterior al polígono. */ GeocOpBoolFuera=112 }; /******************************************************************************/ /******************************************************************************/ /** \struct _vertPolilClip \brief Estructura de definición de un vértice de una polilínea usada en operaciones de recorte. La polilínea se almacena en memoria como una lista doblemente enlazada de vértices. \date 04 de junio de 2011: Creación de la estructura. */ typedef struct _vertPolilClip { /** \brief Coordenada X del vértice. */ double x; /** \brief Coordenada Y del vértice. */ double y; /** \brief Vértice anterior. */ struct _vertPolilClip* anterior; /** \brief Vértice siguiente. */ struct _vertPolilClip* siguiente; /** \brief Indicador de punto de la polilínea original. Dos posibilidades: - 0: No es un punto de la polilínea original. - Distinto de 0: Sí es un punto de la polilínea original. */ char orig; /** \brief Posición del vértice con respecto al polígono de recorte. Tres posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_BORDE_POLIG: El punto está en el borde o en un vértice del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. */ char pos; /** \brief Distancia, en tanto por uno, de un nodo de intersección con respecto al primer vértice del segmento que lo contiene. */ double alfa; }vertPolilClip; /******************************************************************************/ /******************************************************************************/ /** \brief Crea un vértice de tipo \ref _vertPolilClip y lo inserta entre otros dos. \param[in] x Coordenada X del vértice. \param[in] y Coordenada Y del vértice. \param[in] anterior Vértice anterior (puede ser \p NULL). \param[in] siguiente Vértice siguiente (puede ser \p NULL). \param[in] orig Campo _vertPolilClip::orig. \param[in] pos Campo _vertPolilClip::pos. \param[in] alfa Campo _vertPolilClip::alfa. \return Puntero al nuevo vértice creado. Si se devuelve \p NULL, ha ocurrido un error de asignación de memoria. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPolilClip* CreaVertPolilClip(const double x, const double y, vertPolilClip* anterior, vertPolilClip* siguiente, const char orig, const char pos, const double alfa); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una polilínea, como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] x Vector de coordenadas X de los nodos de la polilínea. \param[in] y Vector de coordenadas Y de los nodos de la polilínea. \param[in] nCoor Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \return Puntero al primer vértice de la lista. Si se devuelve \p NULL, ha ocurrido un error de asignación de memoria. \note Esta función asume que el argumento \em nCoor es mayor que 0. \note Si en los vectores de coordenadas \em x e \em y hay valores #GEOC_NAN éstos \b*NO* serán considerados como separadores de múltiples polilíneas, por lo que en la estructura de salida se asumirá que se almacena una polilínea única cuyos vértices son los pasados sin tener en cuenta los pares (#GEOC_NAN,#GEOC_NAN). \note Esta función asigna el valor 0 a todos los campos _vertPolilClip::pos de los elementos creados. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPolilClip* CreaPolilClip(const double* x, const double* y, const size_t nCoor, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Libera la memoria asignada a una polilínea almacenada como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] poli Puntero al primer elemento de la polilínea. \note Esta función no comprueba si hay vértices de la polilínea anteriores al vértice de entrada, por lo que si se quiere liberar toda la memoria asignada a una polilínea, el vértice pasado ha de ser el primero de la lista. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void LibMemPolilClip(vertPolilClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina los vértices no originales de una polilínea almacenada como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] poli Puntero al primer elemento de la polilínea. \return Puntero al primer elemento de la polilínea original. Si se devuelve \p NULL, ninguno de los vértices pertenecía a la polilínea original. \note Los vértices eliminados por esta función son todos aquéllos cuyo campo _vertPolilClip::orig sea igual a 0. \note Aunque se supone que el primer vértice de una polilínea siempre es un vértice original, si no lo es, la variable de entrada queda modificada. Por tanto, siempre es recomendable capturar la variable de salida, que garantiza la posición del primer elemento. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPolilClip* ReiniciaPolilClip(vertPolilClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Busca el siguiente vértice original en una polilínea. \param[in] vert Puntero al vértice a partir del cual se ha de buscar. \return Puntero al siguiente vértice original en la polilínea. Si se devuelve \p NULL, se ha llegado al final. \note Los vértices no originales son todos aquéllos cuyo campo _vertPolilClip::orig es distinto de 0. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ vertPolilClip* SiguienteVertOrigPolilClip(vertPolilClip* vert); /******************************************************************************/ /******************************************************************************/ /** \brief Inserta un vértice de tipo \ref _vertPolilClip entre otros dos, atendiendo al campo _vertPolilClip::alfa. \param[in] ins Vértice a insertar. \param[in] extremoIni Extremo inicial del segmento donde se insertará \em ins. \param[in] extremoFin Extremo final del segmento donde se insertará \em ins. \note Esta función asume que todos los elementos pasados tienen memoria asignada. \note Si entre \em extremoIni y \em extremoFin hay más vértices, \em ins se insertará de tal modo que los campos _vertPolilClip::alfa queden ordenados de menor a mayor. \note Si el campo _vertPolilClip::alfa de \em ins tiene el mismo valor que el de \em extremoIni, \em ins se insertará justo a continuación de \em extremoIni. \note Si el campo _vertPolilClip::alfa de \em ins tiene el mismo valor que el de \em extremoFin, \em ins se insertará justo antes de \em extremoIni. \date 04 de junio de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void InsertaVertPolilClip(vertPolilClip* ins, vertPolilClip* extremoIni, vertPolilClip* extremoFin); /******************************************************************************/ /******************************************************************************/ /** \brief Cuenta el número de vértices originales que hay en una polilínea almacenada como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] poli Polilínea, almacenado como una lista doblemente enlazada de elementos \ref _vertPolilClip. Sólo se tienen en cuenta los vértices originales de la polilínea, que son todos aquéllos cuyo campo _vertPolilClip::orig es distinto de 0. \return Número de vértices originales almacenados. \note Esta función no comprueba si la variable \em poli es una polilínea correctamente almacenada. \date 04 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ size_t NumeroVertOrigPolilClip(vertPolilClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Cuenta el número total de vértices que hay en una polilínea almacenada como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] poli Polilínea, almacenado como una lista doblemente enlazada de elementos \ref _vertPolilClip. Se tienen en cuenta todos los vértices. \return Número total de vértices almacenados. \note Esta función no comprueba si la variable \em poli es una polilínea correctamente almacenada. \date 04 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ size_t NumeroVertPolilClip(vertPolilClip* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza el paso número 1 del algoritmo de recorte de polilíneas, que consiste en el cálculo de los puntos de intersección de la polilínea de trabajo con el polígono de recorte. \brief Este paso está inspirado en el primer paso del algoritmo de Greiner-Hormann. \param[in,out] poli Polilínea de trabajo, representada como una lista doblemente enlazada de elementos \ref _vertPolilClip. Al término de la ejecución de la función se le han añadido los puntos de intersección con el polígono de recorte y se han asignado los valores correctos al campo _vertPolilClip::pos de cada vértice. \param[in] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[out] nIntersec Número de intersecciones (intersecciones propiamente dichas y puntos en el borde del polígono) calculadas. \return Variable de estado. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si las variables \em polil y \em poliRec son estructuras correctamente almacenadas. \note El polígono \em poliRec puede provenir de una operación booleana previa entre polígonos, ya que sólo se recorrerán sus vértices originales, que serán aquéllos cuyo campo _vertPoliClip::interseccion valga 0. \date 06 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ int Paso1Recpolil(vertPolilClip* poli, vertPoliClip* poliRec, size_t* nIntersec); /******************************************************************************/ /******************************************************************************/ /** \brief Realiza el paso número 2 del algoritmo de recorte de polilíneas, que consiste en la generación de lss polilíneas resultado. \param[in] poli Polilínea a recortar, representada como una lista doblemente enlazada de elementos \ref _vertPolilClip, tal y como sale de la función \ref Paso1Recpolil. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIL. \return Estructura \ref polil con las polilíneas resultado de la operación. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si la variable \em polil es una polilínea correctamente almacenada. \date 06 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ polil* Paso2Recpolil(vertPolilClip* poli, const enum GEOC_OP_BOOL_POLIL op); /******************************************************************************/ /******************************************************************************/ /** \brief Recorta una polilínea según un polígono de recorte. \param[in,out] poli Polilínea de trabajo, representada como una lista doblemente enlazada de elementos \ref _vertPolilClip. Al término de la ejecución de la función se le han añadido los puntos de intersección con el polígono de recorte y se han asignado los valores correctos al campo _vertPolilClip::pos de cada vértice. \param[in] poliRec Polígono de recorte, representado como una lista doblemente enlazada de elementos \ref _vertPoliClip. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIL. Varias posibilidades: - #GeocOpBoolDentro: Calcula la porción de \em poli que está dentro \em poliRec. - #GeocOpBoolFuera: Calcula la porción de \em poli que está fuera \em poliRec. \param[out] nIntersec Número de intersecciones calculadas. \return Estructura \ref polil con las polilíneas resultado de la operación. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si las variables \em poli y \em poliRec son estructuras correctamente almacenadas. \note Esta función no comprueba internamente si \em op pertenece al tipo enumerado #GEOC_OP_BOOL_POLIL. Si se introduce un valor no perteneciente al tipo, se realiza la operación #GeocOpBoolDentro. \note Esta función asume que los puntos de borde pertenecen al interior del polígono de recorte. \note Esta función asume que los puntos de borde sólo pertenecen al exterior del polígono de recorte cuando son principio o final de polilínea recortada. \note Esta función asume que tanto \em poli como \em poliRec almacenan cada una un elemento único (polilínea y polígono respectivamente). \note La polilínea y el polígono pueden tener autointersecciones. \date 06 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ polil* RecortaPolil(vertPolilClip* poli, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIL op, size_t* nIntersec); /******************************************************************************/ /******************************************************************************/ /** \brief Recorta múltiples polilíneas según múltiples polígonos de recorte. \param[in] poli Estructura \ref polil que almacena las polilíneas de trabajo. \param[in] poliRec Estructura \ref polig que almacena los polígonos de recorte. \param[in] op Identificador de la operación a realizar. Ha de ser un elemento del tipo enumerado #GEOC_OP_BOOL_POLIL. Varias posibilidades: - #GeocOpBoolDentro: Calcula la porción de las polilíneas almacenadas en \em poli que están dentro de los polígonos almacenados en \em poliRec. - #GeocOpBoolFuera: Calcula la porción de las polilíneas almacenadas en \em poli que están fuera de los polígonos almacenados en \em poliRec. \param[out] nIntersec Número total de intersecciones calculadas entre todas las polilíneas con todos los polígonos. \return Estructura \ref polil con las polilíneas resultado de las operaciones. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función realiza la operación \em op con todas las combinaciones posibles de polilíneas y polígonos. Es decir, se recorren todas las polilíneas y con cada una de ellas se realiza la operación \em op con cada polígono almacenado en \em poliRec. \note Esta función no comprueba si las variables \em poli y \em poliRec son estructuras correctamente almacenadas. \note Esta función no comprueba internamente si \em op pertenece al tipo enumerado #GEOC_OP_BOOL_POLIL. Si se introduce un valor no perteneciente al tipo, se realiza la operación #GeocOpBoolDentro. \note Esta función asume que los puntos de borde pertenecen al interior de los polígonos de recorte. \note Esta función asume que los puntos de borde sólo pertenecen al exterior de los polígonos de recorte cuando son principio o final de polilínea recortada. \note Las polilíneas y los polígonos pueden tener autointersecciones. \date 06 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ polil* RecortaPolilMult(const polil* poli, const polig* poliRec, const enum GEOC_OP_BOOL_POLIL op, size_t* nIntersec); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polil a partir de todos los vértices de una polilínea almacenada como una lista doblemente enlazada de elementos \ref _vertPolilClip. \param[in] poli Polilínea de trabajo, representada como una lista doblemente enlazada de elementos \ref _vertPolilClip. El puntero pasado ha de apuntar al primer elemento de la polilínea (no se controla internamente). \return Estructura \ref polil que representa la polilínea. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \note Esta función no comprueba si la variable \em poli es una polilínea correctamente almacenada. \note Esta función realiza una copia en memoria de las coordenadas de los vértices de la estructura \em poli a la estructura de salida. \date 06 de junio de 2011: Creación de la función. \todo Esta función no está probada. */ polil* CreaPolilPolilClip(vertPolilClip* poli); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/polil.h000755 001750 001750 00000132357 12463476332 016670 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file polil.h \brief Definición de estructuras y declaración de funciones para el trabajo con polilíneas. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 03 de junio de 2011 \copyright Copyright (c) 2011-2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _POLIL_H_ #define _POLIL_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include"libgeoc/dpeucker.h" #include"libgeoc/dpeuckera.h" #include"libgeoc/errores.h" #include"libgeoc/fgeneral.h" #include"libgeoc/geocnan.h" #include"libgeoc/geocomp.h" #include"libgeoc/polig.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \struct polil \brief Estructura contenedora de los vértices que definen el contorno de una o varias polilíneas. \date 03 de junio de 2011: Creación de la estructura. */ typedef struct { /** \brief Número de elementos de los vectores de coordenadas. */ size_t nElem; /** \brief Vector de polil::nElem elementos, que almacena las coordenadas X de los vértices de la polilínea (o las polilíneas), así como los separadores entre polilíneas. La primera coordenada de cada polilínea se repite al final. */ double* x; /** \brief Vector de polil::nElem elementos, que almacena las coordenadas Y de los vértices de la polilínea (o las polilíneas), así como los separadores entre polilíneas. La primera coordenada de cada polilínea se repite al final. */ double* y; /** \brief Número de polilíneas almacenadas. */ size_t nPolil; /** \brief Vector de polil::nPolig elementos, que almacena las posiciones en los vectores \em x e \em y de inicio de cada polilínea almacenada. */ size_t* posIni; /** \brief Vector de polil::nPolig elementos, que almacena el número de vértices de cada polilínea almacenada. */ size_t* nVert; /** \brief Identificador de si la estructura contiene información acerca de los límites del rectángulo que encierra a cada polilínea almacenada. Dos posibilidades: - 0: La estructura no contiene información de los límites. - Distinto de 0: La estructura sí contiene información de los límites. */ int hayLim; /** \brief Vector de polil::nPolig elementos, que almacena la coordenada X mínima de cada polilínea almacenada. Este campo sólo contiene información si el campo polil::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* xMin; /** \brief Vector de polil::nPolig elementos, que almacena la coordenada X máxima de cada polilínea almacenada. Este campo sólo contiene información si el campo polil::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* xMax; /** \brief Vector de polil::nPolig elementos, que almacena la coordenada Y mínima de cada polilínea almacenada. Este campo sólo contiene información si el campo polil::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* yMin; /** \brief Vector de polil::nPolig elementos, que almacena la coordenada Y máxima de cada polilínea almacenada. Este campo sólo contiene información si el campo polil::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* yMax; }polil; /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref polil.c. \param[out] version Cadena identificadora de la versión de OpenMP utilizada. Este argumento sólo se utiliza si su valor de entrada es distinto de \p NULL y si hay alguna función compilada con OpenMP. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 03 de junio de 2011: Creación de la función. \date 25 de agosto de 2011: Adición del argumento de entrada \em version. */ int GeocParOmpPolil(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polil vacía. \return Estructura \ref polil vacía. Los campos escalares se inicializan con el valor 0 y los vectoriales con \p NULL. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \date 26 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ polil* IniciaPolilVacia(void); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para la rutina de creación de una estructura \ref polil a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función calcula el número máximo de elementos que almacenarán los vectores de coordenadas de una estructura \ref polil y el número de polilíneas almacenadas en los vectores de trabajo. \param[in] nElem Número de elementos de los vectores de coordenadas originales. \param[in] posNanX Vector que almacena las posiciones de los elementos #GEOC_NAN en el vector \em x de coordenadas originales. \param[in] posNanY Vector que almacena las posiciones de los elementos #GEOC_NAN en el vector \em y de coordenadas originales. \param[in] nNanX Número de elementos del vector \em posNanX. \param[in] nNanY Número de elementos del vector \em posNanY. \param[out] nElemMax Número máximo de elementos que contendrán los vectores de coordenadas de los elementos de la estructura. \param[out] nPolil Número de polilíneas almacenadas en los vectores \em x e \em y de coordenadas originales. \return Variable de error. Tres posibilidades: - #GEOC_ERR_NO_ERROR: Si todo ha ido bien. - #GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL: Si los vectores \em x e \em y de coordenadas originales almacenan un número distinto de polilíneas, es decir, \em nNanX es distinto que \em nNanY. - #GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL: Si algunas polilíneas almacenadas en \em x e \em y son distintas, es decir, las posiciones almacenadas en \em posNanX son distintas de las almacenadas en \em posNanY. \note Esta función no comprueba si el número de elementos de los vectores \em posNanX y \em posNanY es congruente con los valores pasados en \em nNanX y \em nNanY. \date 03 de junio de 2011: Creación de la función. \date 13 de junio de 2011: Corrección de error que hacía que el argumento \em nElemMax que calculase mal si los argumentos \em nNanX y/o \em nNanY valían 0. \note Esta función todavía no está probada. */ int AuxCreaPolil1(const size_t nElem, const size_t* posNanX, const size_t* posNanY, const size_t nNanX, const size_t nNanY, size_t* nElemMax, size_t* nPolil); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para la rutina de creación de una estructura \ref polil a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función copia una serie de datos de dos vectores en otros dos. \param[in] x Vector que contiene las coordenadas X de los vértices a copiar. \param[in] y Vector que contiene las coordenadas Y de los vértices a copiar. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] xSal Vector de \em nElem elementos para almacenar los elementos copiados del vector \em x. \param[out] ySal Vector de \em nElem elementos para almacenar los elementos copiados del vector \em y. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em xSal e \em ySal es congruente con los valores pasados en \em nElem, \em incX e \em incY. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void AuxCreaPolil2(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, double* xSal, double* ySal); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para las rutinas de creación de estructuras \ref polil a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función crea las polilíneas en el formato de almacenamiento de \ref polil a partir de los vectores de entrada. \param[in] x Vector que contiene las coordenadas X de los vértices de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de trabajo. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posNan Vector que almacena las posiciones de los elementos #GEOC_NAN en los vectores \em x e \em y. \param[in] nNan Número de elementos del vector \em posNan. \param[out] xSal Vector para almacenar las coordenadas X de los vértices de las polilíneas creadas. \param[out] ySal Vector para almacenar las coordenadas Y de los vértices de las polilíneas creadas. \param[out] posIni Vector para almacenar las posiciones de inicio de las polilíneas creadas. \param[out] nVert Vector para almacenar el número de vértices de las polilíneas creadas. \param[out] nPtos Número de posiciones con información almacenada en los vectores \em xSal e \em ySal. \param[out] nPolil Número de posiciones con información almacenada en los vectores \em posIni y \em nVert. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y y \em posNan es congruente con los valores pasados en \em nElem, \em incX, \em incY y \em nNan. \note Esta función asume que los vectores \em xSal, \em ySal, \em posIni y \em nVert tienen asignada suficiente memoria. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void AuxCreaPolil3(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, double* xSal, double* ySal, size_t* posIni, size_t* nVert, size_t* nPtos, size_t* nPolil); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polil a partir de dos vectores que contienen las coordenadas de los vértices de una o varias polilíneas. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea o polilíneas de trabajo. Si hay varias polilíneas, han de estar separados por un valor #GEOC_NAN. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea o polilíneas de trabajo. Si hay varias polilíneas, han de estar separados por un valor #GEOC_NAN. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] idError Identificador de error. Varias posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL: Los vectores \em x e \em y contienen un número distinto de polilíneas. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL: Los vectores \em x e \em y contienen distintas polilíneas. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \return Estructura \ref polil con las polilíneas pasadas. Si ocurre algún error, se devuelve \p NULL y el motivo del fallo se codifica en la variable \em idError. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \note Si los vectores \em x e \em y almacenan varias polilíneas, éstas se separan mediante valores #GEOC_NAN. Poner #GEOC_NAN en la primera posición y/o la última es opcional. \note Los posibles valores #GEOC_NAN han de estar en las mismas posiciones en \em x e \em y. \note Esta función no calcula los límites de las polilíneas, por lo que el campo polil::hayLim se inicializa a 0 y los campos polil::xMin, polil::xMax, polil::yMin y polil::yMax se inicializan a \p NULL. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ polil* CreaPolil(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, int* idError); /******************************************************************************/ /******************************************************************************/ /** \brief Enlaza el contenido de una estructura \ref polil a otra. \param[in] poliEnt Estructura \ref polil de entrada, que almacena los datos a enlazar. \param[out] poliSal Estructura \ref polil, cuyos campos serán enlazados a los de la estructura \em poliEnt. Esta estructura ha de estar, como mínimo, inicializada. Al término de la ejecución de la función, las estructuras \em poliEnt y \em poliSal comparten el mismo espacio de memoria en sus argumentos vectoriales. \note Esta función asume que la estructura de entrada \em poligEnt tiene memoria asignada. \note Esta función asume que la estructura de salida \em poligSal está, como mínimo, inicializada. \note Esta función libera la posible memoria asignada a los campos de \em poliSal antes de realizar el enlace. \date 19 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void EnlazaCamposPolil(polil* poliEnt, polil* poliSal); /******************************************************************************/ /******************************************************************************/ /** \brief Copia el contenido de una estructura \ref polil en otra. \param[in] poli Estructura \ref polil de entrada, que almacena los datos a copiar. \param[out] idError Identificador de error. Varias posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL: Los campos polil::x e polil::y de la polilínea de entrada contienenun número distinto de polilíneas. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL: Los campos polig::x e polig::y de la polilínea de entrada contienen distintas polilíneas. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \return Polilínea con los datos contenidos en \em poli copiados. Si ocurre algún error se devuelve \p NULL y la causa se almacena en el argumento \em idError. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \date 09 de julio de 2011: Creación de la función. \note Esta función todavía no está probada. */ polil* CopiaPolil(const polil* poli, int* idError); /******************************************************************************/ /******************************************************************************/ /** \brief Añade el contenido de una estructura \ref polil a otra. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se han añadido las polilíneas de la estructura \em anyade. \param[in] anyade Estructura cuyo contenido será añadido a \em poli. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función asume que la estructura de entrada \ref polil tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de las estructuras de entrada no se libera. \note Si la estructura \em poli guarda información de límites de las polilíneas almacenadas, esta información se calcula también para los nuevos datos (en realidad, si la estructura \em anyade ya los tiene calculados, simplemente se copian). \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ int AnyadePolilPolil(polil* poli, const polil* anyade); /******************************************************************************/ /******************************************************************************/ /** \brief Añade al contenido de una estructura \ref polil un conjunto de polilíneas definidas a partir de un listado con las coordenadas de sus vértices, de la misma forma que el utilizado en la función \ref CreaPolil. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se han añadido las polilíneas pasados en \em x e \em y. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea o polilíneas a añadir. Si hay varias polilíneas, han de estar separadas por un valor #GEOC_NAN. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea o polilíneas a añadir. Si hay varias polilíneas, han de estar separadas por un valor #GEOC_NAN. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIL_VEC_DISTINTO_NUM_POLIL: Los vectores \em x e \em y contienen un número distinto de polilíneas. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIL_VEC_DISTINTAS_POLIL: Los vectores \em x e \em y contienen distintas polilíneas. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de la estructura y los vectores de entrada no se libera. \note Si la estructura \em poli guarda información de límites de las polilíneas almacenadas, esta información se calcula también para los nuevos datos. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \note Si los vectores \em x e \em y almacenan varias polilíneas, éstas se separan mediante valores #GEOC_NAN. Poner #GEOC_NAN en la primera posición y/o la última es opcional. \note Los posibles valores #GEOC_NAN han de estar en las mismas posiciones en \em x e \em y. \note Esta función crea internamente una estructura \ref polil para luego añadirla a \em poli con la función \ref AnyadePolilPolil. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ int AnyadeDatosPolil(polil* poli, const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Libera la memoria asignada a una estructura \ref polil. \param[in] datos Estructura \ref polil. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void LibMemPolil(polil* datos); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los límites de todas las polilíneas almacenados en una estructura \ref polil. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se han añadido los límites de las polilíneas almacenadas. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función está paralelizada con OpenMP. \note Esta función asume que la estructura de entrada \ref polil tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de la estructura de entrada no se libera. \date 03 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ int CalcLimitesPolil(polil* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica un factor de escala y una traslación (en este orden) a las coordenadas de todas las polilíneas almacenadas en una estructura \ref polil. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se ha aplicado un factor de escala y una traslación (en este orden) a las coordenadas de todas las polilíneas almacenadas y, si se indica, a los límites. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] aplicaLim Identificador para aplicar o no los factores de escala y las traslaciones a los límites de las polilíneas (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican los factores de escala ni las traslaciones a los límites. - Distinto de 0: Sí se aplican los factores de escala y las traslaciones a los límites, si estos están calculados en la estructura de entrada. \note Esta función está paralelizada con OpenMP. \note Primero se aplican los factores de escala y luego las traslaciones. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \date 03 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void EscalaYTrasladaPolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica una traslación y un factor de escala (en este orden) a las coordenadas de todas las polilíneas almacenadss en una estructura \ref polil. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se ha aplicado una traslación y un factor de escala (en este orden) a las coordenadas de todas las polilíneas almacenadas y, si se indica, a los límites. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] aplicaLim Identificador para aplicar o no las traslaciones y los factores de escala a los límites de las polilíneas (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican las traslaciones ni los factores de escala a los límites. - Distinto de 0: Sí se aplican las traslaciones y los factores de escala a los límites, si estos están calculados en la estructura de entrada. \note Esta función está paralelizada con OpenMP. \note Primero se aplican las traslaciones y luego los factores de escala. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \date 03 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void TrasladaYEscalaPolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica un factor de escala y una traslación (el orden de aplicación se ha de seleccionar) a las coordenadas de todas las polilíneas almacenadas en una estructura \ref polil. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, se ha aplicado un factor de escala y una traslación (orden a seleccionar) a las coordenadas de todas las polilíneas almacenadas y, si se indica, a los límites. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] orden Orden de aplicación de los factores de escala y traslación. Dos posibilidades: - 0: Primero se aplican los factores de escala y luego las traslaciones \f$x'=f\cdot x+t\f$. - Distinto de 0: Primero se aplican las traslaciones y luego los factores de escala \f$x'=(x+t)\cdot f\f$. \param[in] aplicaLim Identificador para aplicar o no los factores de escala y las traslaciones a los límites de las polilíneas (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican los factores de escala ni las traslaciones a los límites. - Distinto de 0: Sí se aplican los factores de escala y las traslaciones a los límites, si estos están calculados en la estructura de entrada. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \date 03 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void MuevePolil(polil* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int orden, const int aplicaLim); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de las polilíneas almacenadas en una estructura \ref polil mediante un algoritmo inspirado en el de Douglas-Peucker. Se usa internamente la función \ref AligeraPolilinea. \param[in,out] poli Estructura \ref polil, que almacena una serie de polilíneas. Al término de la ejecución de la función, almacena el resultado de la aplicación a cada polilínea del algoritmo de aligerado de vértices implementado en la función \ref AligeraPolilinea. \param[in] esf Identificador de que la polilínea está sobre la superficie de la esfera. Dos posibilidades: - 0: La polilínea está en el plano euclideo. - Distinto de 0: La polilínea está sobre la esfera. \param[in] facCoor Factor de escala a aplicar a las coordenadas de la polilínea para realizar el aligerado. Si se trabaja sobre la esfera, este argumento ha de llevar las coordenadas de los puntos de trabajo a radianes. Las coordenadas devueltas al término de la ejecución de está función no se verán afectadas por este factor. \param[in] tol Tolerancia para eliminar vértices. Si se trabaja sobre la superficie de la esfera, este valor ha de estar en radianes, es decir, será una distancia sobre la superficie de la esfera de radio unidad. Ver la ayuda de la función \ref AligeraPolilinea. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: Utiliza el algoritmo de Douglas-Peucker original, que no es robusto. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de segmentos/arcos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los segmentos/arcos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los segmentos hasta el inicio de la polilínea aligerada. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función asume que \em poli está, como mínimo, inicializada. \note Si \em poli tiene límites calculados en la entrada, también los tendrá en la salida. \note Si \em poli está sobre la superficie de la esfera, el campo polil::x almacenará la longitud, mientras que polil::y almacenará la latitud. Del mismo modo, los límites polil::xMin y polil::xMax almacenarán longitudes y polil::yMin y polil::yMax, latitudes. \note Se asume que \em facCoor>0.0, condición que no se controla internamente. \note Una polilínea aligerada sólo será válida si después de aplicarle la función \ref AligeraPolilinea mantiene un mínimo de 2 puntos que no sean el mismo. Al término de la ejecución de esta función, el resultado puede ser una estructura \ref polil vacía. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 09 de julio de 2011: Creación de la función. \date 10 de julio de 2011: Cambio del tipo del argumento \em robusto al tipo enumerado #GEOC_DPEUCKER_ROBUSTO. \date 31 de julio de 2011: Corregido error con índices a la hora de guardar los resultados y modificación para no tomar como válidas las polilíneas que se quedan en sólo dos vértices que sean el mismo. \date 25 de mayo de 2012: Adición de la posibilidad de usar el algoritmo de Douglas-Peucker original. \date 16 de agosto de 2013: Adición de la capacidad de trabajar con polilíneas en la superficie de la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \date 21 de septiembre de 2013: Adición de la capacidad de trabajar sobre la esfera con el algoritmo de Douglas-Peucker original. \todo Esta función todavía no está probada. */ int AligeraPolil(polil* poli, const int esf, const double facCoor, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime una línea de cabecera para una polilínea almacenada en una estructura \ref polil. \param[in] poli Estructura \ref polil. \param[in] indice Índice de la polilínea de trabajo en la estructura. \param[in] iniCab Cadena de texto con la que comenzará la cabecera. \param[in] impLim Identificador para imprimir o no los límites de coordenadas de la polilínea de trabajo. Dos posibles valores: - 0: No se imprimen. - Distinto de 0: Sí se imprimen. \param[in] formCoor Cadena de caracteres indicadora del formato para escribir las coordenadas de los límites. Este argumento sólo se usa internamente si se ha indicado la impresión de límites. \param[in] factorX Factor para multiplicar las coordenadas X de los vértices antes de imprimirlas. \param[in] factorY Factor para multiplicar las coordenadas Y de los vértices antes de imprimirlas. \param[in] idFich Identificador de fichero abierto para escribir. \note Esta función está paralelizada con OpenMP. \note La cabecera completa tiene el siguiente formato: iniCab númVert xMín xMáx yMín yMáx. \note Si la estructura no tiene información de límites y se indica que se impriman, los valores se calculan internamente. \note Esta función asume que \em poli es una estructura \ref polil correctamente almacenada. \note Esta función no comprueba si la estructura pasada tiene memoria asignada. \note Esta función no comprueba internamente la validez de los argumentos de formato. \note Esta función no comprueba internamente si el identificador pasado corresponde a un fichero abierto para escribir. \date 18 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void ImprimeCabeceraPolilFichero(const polil* poli, const size_t indice, const char iniCab[], const int impLim, const char formCoor[], const double factorX, const double factorY, FILE* idFich); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime una estructura \ref polil en un fichero. \param[in] poli Estructura \ref polil. \param[in] factorX Factor para multiplicar las coordenadas X de los vértices antes de imprimirlas. \param[in] factorY Factor para multiplicar las coordenadas Y de los vértices antes de imprimirlas. \param[in] iniNan Identificador para imprimir o no la marca de separación de polilíneas (\p NaN) delante de la primera polilínea. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] finNan Identificador para imprimir o no la marca de separación de polilíneas (\p NaN) delante de la última polilínea. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formCoor Cadena de caracteres indicadora del formato de cada coordenada a imprimir. \param[in] impCabecera Identificador para imprimir o no una cabecera con información general por cada polilínea. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] iniCab Cadena de texto con la que comenzará la cabecera. \param[in] impLim Identificador para imprimir o no en la cabecera los límites de coordenadas de las polilíneas de trabajo. Dos posibles valores: - 0: No se imprimen. - Distinto de 0: Sí se imprimen. \param[in] idFich Identificador de fichero abierto para escribir. \note La cabecera completa tiene el siguiente formato: iniCab númVert xMín xMáx yMín yMáx. \note Si la estructura no tiene información de límites y se indica que se impriman, los valores se calculan internamente. \note Esta función asume que \em poli es una estructura \ref polil correctamente almacenada. \note Esta función no comprueba si la estructura pasada tiene memoria asignada. \note Esta función no comprueba internamente la validez de los argumentos de formato. \note Esta función no comprueba internamente si el identificador pasado corresponde a un fichero abierto para escribir. \date 03 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Adición de la capacidad de escritura de una cabecera y del uso de factores de escala independientes para las coordenadas X e Y. \date 22 de septiembre de 2011: Corregido bug que hacía que, dependiendo del compilador y/o los flags de optimización en la compilación, se imprimiesen mal (con un signo menos delante) los valores Not-a-Number. \note Esta función todavía no está probada. */ void ImprimePolilFichero(const polil* poli, const double factorX, const double factorY, const int iniNan, const int finNan, const char formCoor[], const int impCabecera, const char iniCab[], const int impLim, FILE* idFich); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/dpeuckerp.h000644 001750 001750 00000131451 12463476271 017524 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeuckerp.h \brief Declaración de funciones para el aligerado de polilíneas en el plano basadas en el algoritmo de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 04 de julio de 2011 \copyright Copyright (c) 2011-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _DPEUCKERP_H_ #define _DPEUCKERP_H_ /******************************************************************************/ /******************************************************************************/ #if defined(_OPENMP) #include #endif #include #include #include"libgeoc/dpeuckera.h" #include"libgeoc/segmento.h" #include"libgeoc/geocomp.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref dpeuckerp.c. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 17 de agosto de 2013: Creación de la función. \date 03 de abril de 2014: Particularización de la función sólo para el plano. */ int GeocParOmpDpeuckerp(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea en el plano mediante el algoritmo de Douglas-Peucker. \brief El algoritmo original está documentado en: \brief Douglas, D. H., Peucker, T. K., 1973. Algorithms for the reduction of the number of points required to represent a digitized line or its caricature. The Canadian Cartographer 10 (2), 112–122. También se utiliza el criterio apuntado en: Ebisch, K., October 2002. A correction to the Douglas–Peucker line generalization algorithm. Computers and Geosciences 28 (8), 995–997. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices, en las mismas unidades que las coordenadas de los vértices. \param[in] posIni Posición en los vectores de coordenadas del punto inicial del segmento base para añadir puntos a la línea simplificada. \param[in] posFin Posición en los vectores de coordenadas del punto final del segmento base para añadir puntos a la línea simplificada. \param[out] usados Vector de \em nPtos elementos para indicar los puntos que finalmente se usan en la polilínea simplificada. En la entrada, todos sus elementos han de contener el valor 0, excepto las posiciones \em 0 y \em nPtos-1, que han de contener el valor 1. En la salida, las posiciones correspondientes a los puntos de la línea inicial no utilizados almacenarán el valor \em 0, mientras que las posiciones de los puntos utilizados almacenarán el valor \em 1. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función es recursiva. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que los valores \em posIni y \em posFin son posiciones válidas. \note Esta función asume que el vector \em usados contiene suficiente memoria asignada. \date 25 de mayo de 2012: Creación de la función. \todo Esta función todavía no está probada. */ void DouglasPeuckerOriginalPlano(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const size_t posIni, const size_t posFin, char* usados); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea en el plano mediante un algoritmo no recursivo, inspirado en el de Douglas-Peucker. \brief Este algoritmo, comenzando por el primer punto de la polilínea, va uniendo puntos en segmentos de tal forma que se eliminan todos aquellos puntos que queden a una distancia menor o igual a \em tol del segmento de trabajo. Así aplicado, pueden ocurrir casos singulares en los que la polilínea aligerada tenga casos de auto intersección entre sus lados resultantes. Para evitar esto, se puede aplicar la versión robusta del algoritmo. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices, en las mismas unidades que las coordenadas de éstos. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: En este caso esta opción es equivalente a pasar #GeocDPeuckerRobNo. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de segmentos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los segmentos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los segmentos hasta el inicio de la polilínea aligerada. \param[out] nPtosSal Número de puntos de la polilínea aligerada. \return Vector de \em nPtosSal elementos que contiene los índices en los vectores \em x e \em y de los vértices que formarán la polilínea aligerada. Si ocurre algún error de asignación de memoria se devuelve el valor \p NULL. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que \em nPtos es mayor que 0. En caso contrario, devuelve \p NULL, por lo que un valor de retorno igual a \p NULL sólo es indicativo de error cuando \em nPtos es mayor que 0. \note Esta función comprueba los casos especiales con \ref CasosEspecialesAligeraPolilinea. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 07 de julio de 2011: Creación de la función. \date 10 de julio de 2011: Cambio del tipo del argumento \em robusto al tipo enumerado #GEOC_DPEUCKER_ROBUSTO. \date 14 de mayo de 2012: Corregido bug que hacía que no se escogiese bien el vértice a añadir a la polilínea aligerada. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 17 de agosto de 2013: Comprobación de casos especiales y unificación de las funciones de aligerado en el plano y en la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ size_t* DouglasPeuckerRobustoPlano(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, size_t* nPtosSal); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo, con OpenMP, si una serie de puntos entre los extremos de un segmento base están en tolerancia, según el criterio de la familia de algoritmos de Douglas-Peucker. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices, en las mismas unidades que las coordenadas de éstos. \param[in] posBaseIni Posición en los vectores \em x e \em y del punto inicial del segmento base. \param[in] posBaseFin Posición en los vectores \em x e \em y del punto final del segmento base. \param[in] posPtoIni Posición en los vectores \em x e \em y del punto inicial a partir del cual (incluido) se chequeará la tolerancia. \param[in] posPtoFin Posición en los vectores \em x e \em y del punto inicial hasta el cual (incluido) se chequeará la tolerancia. \return Identificador de que los puntos intermedios están o no en tolerancia. Dos posibilidades: - 0: Hay algún punto que se sale de tolerancia. - Distinto de 0: Todos los puntos están en tolerancia. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si las posiciones pasadas en \em posBaseIni, \em posBaseFin, \em posPtoIni y \em posPtoFin son congruentes con el número de elementos de los vectores \em x e \em y. \note Esta función asume que \em posBaseIni < \em posPtoIni <= \em posPtoFin < \em posBaseFin. \date 18 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerPuntosEnTolPlanoOMP(const double* x, const double* y, const size_t incX, const size_t incY, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de puntos entre los extremos de un segmento base están en tolerancia, según el criterio de la familia de algoritmos de Douglas-Peucker. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices, en las mismas unidades que las coordenadas de éstos. \param[in] posBaseIni Posición en los vectores \em x e \em y del punto inicial del segmento/arco base. \param[in] posBaseFin Posición en los vectores \em x e \em y del punto final del segmento/arco base. \param[in] posPtoIni Posición en los vectores \em x e \em y del punto inicial a partir del cual (incluido) se chequeará la tolerancia. \param[in] posPtoFin Posición en los vectores \em x e \em y del punto inicial hasta el cual (incluido) se chequeará la tolerancia. \return Identificador de que los puntos intermedios están o no en tolerancia. Dos posibilidades: - 0: Hay algún punto que se sale de tolerancia. - Distinto de 0: Todos los puntos están en tolerancia. \note Esta función no comprueba si las posiciones pasadas en \em posBaseIni, \em posBaseFin, \em posPtoIni y \em posPtoFin son congruentes con el número de elementos de los vectores \em x e \em y. \note Esta función asume que \em posBaseIni < \em posPtoIni <= \em posPtoFin < \em posBaseFin. \date 18 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerPuntosEnTolPlanoSerie(const double* x, const double* y, const size_t incX, const size_t incY, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin); /******************************************************************************/ /******************************************************************************/ /** \brief Aproximación robusta al aligerado de líneas consistente en evitar que los segmentos creados intersecten con los de la polilínea original a partir del punto de trabajo actual. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] segAUsar Número de segmentos a utilizar de la polilínea original. Si se pasa el valor 0 se utilizan todos los segmentos que quedan desde el punto de trabajo hasta el final. \param[in] posIni Posición inicial del segmento a chequear. \param[in,out] posFin Posición final del segmento a chequear. Al término de la ejecución de la función almacena la posición del punto que hace que el segmento de la polilínea aligerada no intersecte con ninguno de los que quedan de la polilínea original. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función no comprueba si los índices pasados en los argumentos \em posIni y \em posFin son congruentes con el tamaño de los vectores pasado en \em nPtos. \date 07 de julio de 2011: Creación de la función. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 18 de agosto de 2013: Unificación para el uso sobre el plano y sobre la esfera. \date 20 de agosto de 2013: Reorganización interna de la ejecución en serie y en paralelo de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ void DouglasPeuckerRobIntersecOrigPlano(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const size_t segAUsar, const size_t posIni, size_t* posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo con OpenMP, si una serie de segmentos se cortan con un segmento/arco base AB, a partir de éste en adelante. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Posición en los vectores \em x e \em y del punto inicial a partir del cual (incluido) se comenzarán a chequear segmentos. \param[in] posFin Posición en los vectores \em x e \em y del punto final hasta el cual (incluido) se chequearán segmentos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los segmentos desde \em posIni hasta \em posFin. - Distinto de 0: Hay al menos una intersección entre AB y los segmentos desde \em posIni hasta \em posFin. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si los argumentos \em posIni y \em posFin son congruentes con las dimensiones de los vectores \em x e \em y. \note Esta función asume que \em posIni<\em posFin. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecPlano, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecOrigPlanoOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de segmentos se cortan con un segmento base AB, a partir de éste en adelante. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Posición en los vectores \em x e \em y del punto inicial a partir del cual (incluido) se comenzarán a chequear segmentos. \param[in] posFin Posición en los vectores \em x e \em y del punto final hasta el cual (incluido) se chequearán segmentos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los segmentos desde \em posIni hasta \em posFin. - Distinto de 0: Hay al menos una intersección entre AB y los segmentos desde \em posIni hasta \em posFin. \note Esta función no comprueba si los argumentos \em posIni y \em posFin son congruentes con las dimensiones de los vectores \em x e \em y. \note Esta función asume que \em posIni<\em posFin. \note Esta función utiliza internamente la función \ref DouglasPeuckerRobIntersecPlano, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecOrigPlanoSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Aproximación robusta al aligerado de líneas consistente en evitar que los segmentos creados intersecten con los anteriores de la polilínea aligerada. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Posición (en los vectores \em x e \em y) inicial del segmento a chequear. \param[in,out] posFin Posición (en los vectores \em x e \em y) final del segmento a chequear. Al término de la ejecución de la función almacena la posición del punto que hace que el segmento de la polilínea aligerada no intersecte con ninguno de los anteriormente calculados. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] segAUsar Número de segmentos a utilizar de la polilínea aligerada. Si se pasa el valor 0 se utilizan todos los segmentos anteriores. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y. \note Esta función no comprueba si los índices pasados en los argumentos \em posIni y \em posFin son congruentes con el tamaño de los vectores pasado en \em nPtos. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con el tamaño de los vectores \em x e \em y. \note Esta función no comprueba si el valor pasado en \em nPosAlig es congruente con el tamaño del vector \em posAlig. \date 05 de julio de 2011: Creación de la función. \date 14 de mayo de 2012: Modificación del argumento \em nPosAlig para que contenga el tamaño real del vector \em posAlig. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 18 de agosto de 2013: Unificación para el uso sobre el plano y sobre la esfera. \date 20 de agosto de 2013: Reorganización interna de la ejecución en serie y en paralelo de la función. \date 27 de marzo de 2014: Adición de los argumentos \em xG, \em yG y \em zG. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ void DouglasPeuckerRobAutoIntersecPlano(const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, size_t* posFin, const size_t* posAlig, const size_t nPosAlig, const size_t segAUsar); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en paralelo con OpenMP, si una serie de segmentos de la polilínea ya aligerada se cortan con un segmento base AB, a partir de éste hacia atrás. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] posIni Posición en el vector \em posAlig del punto inicial a partir del cual (incluido) se comenzarán a chequear segmentos. \param[in] posFin Posición en el vector \em posAlig del punto final hasta el cual (incluido) se chequearán segmentos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los segmentos. - Distinto de 0: Hay al menos una intersección entre AB y los segmentos. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con el tamaño de los vectores \em x e \em y. \note Esta función no comprueba si los valores pasados en \em posIni, \em posFin y \em nPosAlig son congruentes con el tamaño del vector \em posAlig. \note Esta función asume que \em posIni>\em posFin (ya que vamos hacia atrás). \date 20 de agosto de 2013: Creación de la función. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobAutoIntersecPlanoOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba, mediante una ejecución en serie, si una serie de segmentos de la polilínea ya aligerada se cortan con un segmento base AB, a partir de éste hacia atrás. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posAlig Vector de posiciones de \em x e \em y utilizadas en la polilínea aligerada. \param[in] nPosAlig Número de elementos de \em posAlig. \param[in] posIni Posición en el vector \em posAlig del punto inicial a partir del cual (incluido) se comenzarán a chequear segmentos. \param[in] posFin Posición en el vector \em posAlig del punto final hasta el cual (incluido) se chequearán segmentos. \return Dos posibilidades: - 0: No hay ninguna intersección entre AB y los segmentos. - Distinto de 0: Hay al menos una intersección entre AB y los segmentos. \note Esta función no comprueba si los índices almacenados en \em posAlig son congruentes con el tamaño de los vectores \em x e \em y. \note Esta función no comprueba si los valores pasados en \em posIni, \em posFin y \em nPosAlig son congruentes con el tamaño del vector \em posAlig. \note Esta función asume que \em posIni>\em posFin (ya que vamos hacia atrás). \date 20 de agosto de 2013: Creación de la función. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobAutoIntersecPlanoSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos segmentos AB y CD en el plano. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] xC Coordenada X del punto C. \param[in] yC Coordenada Y del punto C. \param[in] xD Coordenada X del punto D. \param[in] yD Coordenada Y del punto D. \param[in] posFinAB Posición del punto final del segmento AB en los vectores originales de coordenadas. \param[in] posIniCD Posición del punto inicial del segmento CD en los vectores originales de coordenadas. \return Dos posibilidades: - 0: No hay intersección entre AB y CD. - Distinto de 0: Sí hay intersección entre AB y CD. \note Esta función utiliza internamente las funciones \ref IntersecSegmentos2D o \ref IntersecSegmentos2DSimple, que no son robustas. En consecuencia, los resultados de esta función tampoco lo son. \date 20 de agosto de 2013: Creación de la función. \date 28 de marzo de 2014: Adición de los argumentos \em xGC, \em yGC, \em zGC, \em xGD, \em yGD y \em zGD. \date 01 de abril de 2014: Particularización de la función sólo para el plano. \todo Esta función todavía no está probada. */ int DouglasPeuckerRobIntersecPlano(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, const size_t posFinAB, const size_t posIniCD); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia a un segmento del punto más alejado de un conjunto de puntos candidatos para su uso en el aligerado de polilíneas mediante el algoritmo de Douglas-Peucker. \brief Esta función implementa el criterio apuntado en: \brief Ebisch, K., October 2002. A correction to the Douglas–Peucker line generalization algorithm. Computers and Geosciences 28 (8), 995–997. \param[in] x Vector que contiene las coordenadas X de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de la polilínea de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Posición en los vectores de coordenadas del punto inicial del segmento base. \param[in] posFin Posición en los vectores de coordenadas del punto final del segmento base. \param[out] pos Posición en los vectores de coordenadas del punto más alejado de la línea base. Si \em posFin es el punto inmediatamente posterior a \em posIni, esta variable devuelve \em posIni. \return Distancia del punto más alejado a la línea base. Si \em posFin es el punto inmediatamente posterior a \em posIni, se devuelve el valor -1.0. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados en \em posIni y \em posFin. \date 25 de mayo de 2012: Creación de la función. \date 16 de marzo de 2014: Reestructuración de la función para el cálculo de la distancia de una forma más eficiente por medio de la transformación del sistema de coordenadas original. \todo Esta función todavía no está probada. */ double DouglasPeuckerDistMaxPlano(const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin, size_t* pos); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los parámetros de rotación para girar el sistema de coordenadas con origen en el punto inicial de la base y llevar el eje X a coincidir con ella, para su uso en el aligerado de polilíneas mediante el algoritmo de Douglas-Peucker. \param[in] xBase2RB1 Coordenada X del punto final de la base en el sistema de coordenadas original, reducida al punto inicial. \param[in] yBase2RB1 Coordenada Y del punto final de la base en el sistema de coordenadas original, reducida al punto inicial. \param[out] sAlfa Seno del ángulo de rotación para llevar el eje X del sistema de coordenadas (con origen en el punto inicial de la base) a coincidir con el segmento base. \param[out] cAlfa Coseno del ángulo de rotación para llevar el eje X del sistema de coordenadas (con origen en el punto inicial de la base) a coincidir con el segmento base. \param[out] lonBase Longitud de la base. \date 16 de marzo de 2014: Creación de la función. \todo Esta función todavía no está probada. */ void DouglasPeuckerParamRotaBase(const double xBase2RB1, const double yBase2RB1, double* sAlfa, double* cAlfa, double* lonBase); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la distancia de un punto a un segmento AB para su uso en el aligerado de polilíneas mediante el algoritmo de Douglas-Peucker. \brief Esta función implementa el criterio apuntado en: \brief Ebisch, K., October 2002. A correction to the Douglas–Peucker line generalization algorithm. Computers and Geosciences 28 (8), 995–997. \param[in] lonBase Longitud de la base. \param[in] sAlfa Seno del ángulo de rotación para llevar el eje X del sistema de coordenadas (con origen en el punto inicial de la base) a coincidir con el segmento base. \param[in] cAlfa Coseno del ángulo de rotación para llevar el eje X del sistema de coordenadas (con origen en el punto inicial de la base) a coincidir con el segmento base. \param[in] xVertRB1 Coordenada X del punto de trabajo en el sistema de coordenadas original, reducida al punto inicial de la base. \param[in] yVertRB1 Coordenada Y del punto de trabajo en el sistema de coordenadas original, reducida al punto inicial de la base. \return Distancia del punto a la línea base. \note Los argumentos \em lonBase, \em sAlfa y \em cAlfa son los parámetros calculados por la función \ref DouglasPeuckerParamRotaBase. \date 16 de marzo de 2014: Creación de la función. \todo Esta función todavía no está probada. */ double DouglasPeuckerDistMaxPlanoAux(const double lonBase, const double sAlfa, const double cAlfa, const double xVertRB1, const double yVertRB1); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/mate.h000755 001750 001750 00000057365 12463477120 016500 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup mate Módulo MATEMATICAS \ingroup anespec gshhs legendre \brief En este módulo se reúnen las funciones necesarias para la realización de cálculos matemáticos generales. @{ \file mate.h \brief Declaración de funciones para la realización de cálculos matemáticos generales. En el momento de la compilación de las funciones que dan el factorial de un número y el producto de una serie de números ha de seleccionarse el tipo de cálculo a utilizar (para números mayores que #GEOC_MATE_CONST_DBL_NMAXFAC y #GEOC_MATE_CONST_LDBL_NMAXFAC). Para realizar el cálculo es necesario definir la variable \em CALCULO_PRODUCTO_MULT si se quiere utilizar el producto o \em CALCULO_PRODUCTO_LOG si se quieren utilizar logaritmos. En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. \author José Luis García Pallero, jgpallero@gmail.com \date 17 de mayo de 2010 \copyright Copyright (c) 2009-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _MATE_H_ #define _MATE_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include"libgeoc/constantes.h" #include"libgeoc/posmatvec.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PROD_MULT \brief Identificador de cálculo de productos de series de números correlativos por multiplicación directa. \date 30 de diciembre de 2010: Creación de la constante. */ #define GEOC_PROD_MULT 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PROD_LOG \brief Identificador de cálculo de productos de series de números correlativos por logaritmos. \date 30 de diciembre de 2010: Creación de la constante. */ #define GEOC_PROD_LOG 1 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MATE_CONST_DBL_NMAXFAC \brief Número más alto para el que se almacena su factorial de manera explícita para tipo de dato \p double. \date 03 de octubre de 2010: Creación de la constante. */ #define GEOC_MATE_CONST_DBL_NMAXFAC (170) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_MATE_CONST_LDBL_NMAXFAC \brief Número más alto para el que se almacena su factorial de manera explícita para tipo de dato \p long \p double. \date 03 de octubre de 2010: Creación de la constante. */ #define GEOC_MATE_CONST_LDBL_NMAXFAC (200) /******************************************************************************/ /******************************************************************************/ /** \struct __mateFactExpl \brief Estructura contenedora de valores explícitos de algunos factoriales. \brief Esta estructura se basa en la que se puede encontrar en el fichero \p gamma.c, de la biblioteca GSL. \date 03 de octubre de 2010: Creación de la estructura. */ typedef struct { /** \brief Número. */ size_t numero; /** \brief Factorial del número almacenado en __mateFacExpl::numero. */ long double valor; }__mateFactExpl; /******************************************************************************/ /******************************************************************************/ /** \brief Indica el tipo de cálculo del producto de una serie de números correlativos. \return Dos posibles valores: - #GEOC_PROD_MULT: Cálculo por multiplicación directa. - #GEOC_PROD_LOG: Cálculo mediante logaritmos. \date 30 de diciembre de 2010: Creación de la función. */ int GeocTipoCalcProd(void); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la media de una serie de valores de tipo \p double. \param[in] datos Dirección de comienzo del vector que almacena los datos. \param[in] nDatos Número de datos que contiene el vector. \param[in] inc Posiciones de separación entre los elementos del vector de datos. Si es un número negativo, el vector se recorre desde el final hasta el principio. \return Valor medio de la serie de datos. \note Esta función asume que \em nDatos>0. \date 19 de noviembre de 2009: Creación de la función. */ double Media(const double* datos, const size_t nDatos, const int inc); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la varianza de una serie de valores de tipo \p double. \brief Esta función calcula la varianza mediante la fórmula \f$ \sigma^2_x=\frac{\sum_{i=1}^{N}(x_i-\bar{x})^2}{N-1}, \f$ donde \f$N\f$ es el número de elementos de trabajo y \f$\bar{x}\f$ es la media. \param[in] datos Dirección de comienzo del vector que almacena los datos. \param[in] nDatos Número de datos que contiene el vector. \param[in] inc Posiciones de separación entre los elementos del vector de datos. Si es un número negativo, el vector se recorre desde el final hasta el principio. \param[in] media Valor medio de la serie de datos. \note Esta función asume que \em nDatos>1. \return Varianza de la serie de datos. \date 09 de marzo de 2011: Creación de la función. */ double Varianza(const double* datos, const size_t nDatos, const int inc, const double media); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la media ponderada de una serie de valores de tipo \p double. \param[in] datos Dirección de comienzo del vector que almacena los datos. \param[in] nDatos Número de datos que contienen los vectores \em datos y \em pesos. \param[in] incDatos Posiciones de separación entre los elementos del vector \em datos. Si es un número negativo, el vector se recorre desde el final hasta el principio. \param[in] pesos Dirección de comienzo del vector que almacena los pesos. \param[in] incPesos Posiciones de separación entre los elementos del vector \em pesos. Si es un número negativo, el vector se recorre desde el final hasta el principio. \return Valor medio de la serie de datos. \note Esta función asume que \em nDatos>0. \date 23 de abril de 2010: Creación de la función. \todo Esta función no está probada. */ double MediaPonderada(const double* datos, const size_t nDatos, const int incDatos, const double* pesos, const int incPesos); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la mediana de una serie de valores de tipo \p double. \param[in] datos Dirección de comienzo del vector que almacena los datos, que ha de estar ordenado (en orden ascendente o descendente, da igual). \param[in] nDatos Número de datos que contiene el vector. \param[in] inc Posiciones de separación entre los elementos del vector de datos. Si es un número negativo, el vector se recorre desde el final hasta el principio. \date 19 de noviembre de 2009: Creación de la función. */ double Mediana(const double* datos, const size_t nDatos, const int inc); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números mediante multiplicaciones. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie, calculado mediante multiplicaciones. \date 03 de octubre de 2010: Creación de la función. */ double ProductoMult(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números mediante multiplicaciones. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie, calculado mediante multiplicaciones. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double ProductoMultLD(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números mediante logaritmos. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie, calculado mediante logaritmos. \date 03 de octubre de 2010: Creación de la función. */ double ProductoLog(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números mediante logaritmos. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie, calculado mediante logaritmos. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double ProductoLogLD(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie. \date 03 de octubre de 2010: Creación de la función. */ double Producto(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto de una serie de números. \param[in] inicio Número inicial de la serie. \param[in] fin Número final de la serie. \return Producto acumulado de los números de la serie. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double ProductoLD(size_t inicio, size_t fin); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número mediante productos. \param[in] numero Número. \return Factorial del número pasado. \date 03 de octubre de 2010: Creación de la función. */ double FactorialMult(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número mediante productos. \param[in] numero Número. \return Factorial del número pasado. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double FactorialMultLD(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número como el antilogaritmo de la suma de logaritmos. \param[in] numero Número. \return Factorial del número pasado. \date 03 de octubre de 2010: Creación de la función. */ double FactorialLog(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número como el antilogaritmo de la suma de logaritmos. \param[in] numero Número. \return Factorial del número pasado. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double FactorialLogLD(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número. \param[in] numero Número. \return Factorial del número pasado. \note Si el número es menor o igual que #GEOC_MATE_CONST_DBL_NMAXFAC, el factorial se toma de un array donde están almacenados de manera explícita los resultados. Si es mayor que #GEOC_MATE_CONST_DBL_NMAXFAC, el factorial se calcula. \date 02 de marzo de 2009: Creación de la función. \date 03 de octubre de 2010: Reprogramación de la función como llamada a las funciones \ref FactorialMult o \ref FactorialLog y cambio del tipo de dato devuelto de \p size_t a \p double. */ double Factorial(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el factorial de un número. \param[in] numero Número. \return Factorial del número pasado. \note Si el número es menor o igual que #GEOC_MATE_CONST_LDBL_NMAXFAC, el factorial se toma de un array donde están almacenados de manera explícita los resultados. Si es mayor que #GEOC_MATE_CONST_LDBL_NMAXFAC, el factorial se calcula. \note Los cálculos intermedios y el resultado se almacenan en datos de tipo \p long \p double, para prevenir desbordamientos (el tipo de dato \p double -8 bytes- sólo es capaz de almacenar los rangos -1.79769e308 a -2.22507e-308 y 2.22507e-308 a 1.79769e308). \date 03 de octubre de 2010: Creación de la función. */ long double FactorialLD(size_t numero); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el producto vectorial de dos vectores. \param[in] x1 Coordenada X del primer vector. \param[in] y1 Coordenada Y del primer vector. \param[in] z1 Coordenada Z del primer vector. \param[in] x2 Coordenada X del segundo vector. \param[in] y2 Coordenada Y del segundo vector. \param[in] z2 Coordenada Z del segundo vector. \param[out] x Coordenada X del vector producto vectorial de 1 y 2. \param[out] y Coordenada Y del vector producto vectorial de 1 y 2. \param[out] z Coordenada Z del vector producto vectorial de 1 y 2. \date 08 de agosto de 2013: Creación de la función. \todo Esta función no está probada. */ void ProductoVectorial(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, double* x, double* y, double* z); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los senos y cosenos de una serie de ángulos equiespaciados. \brief Esta función utiliza en el cálculo las expresiones (ecuacies número 5.4.6 y 5.4.7, pág. 219) que se puede encontrar en: William H. Press, Saul A. Teukolsky, William T. Vetterling y Brian P. Flannery, 2007, Numerical recipes. The Art of Scientific Computing, 3a edición. Cambridge University Press, ISBN: 978-0-521-88068-8. \param[in] anguloIni Ángulo inicial de la serie, en radianes. \param[in] incAngulo Incremento entre los valores algulares de la serie, en radianes. \param[in] numValores Número de valores angulares de la serie, incluido \em anguloIni. \param[out] seno Vector para almacenar el seno de los valores angulares de la serie. \param[in] incSeno Posiciones de separación entre los elementos del vector de salida \em seno. Este argumento siempre ha de ser un número positivo. \param[out] coseno Vector para almacenar el coseno de los valores angulares de la serie. \param[in] incCoseno Posiciones de separación entre los elementos del vector de salida \em coseno. Este argumento siempre ha de ser un número positivo. \note Esta función no comprueba internamente si los vectores pasados contienen suficiente memoria. \note Según pruebas realizadas, para una serie de 1000000 de elementos con incremento angular de 50 grados, las diferencias con respecto a los senos y cosenos calculados con las funciones de math.h están en el entorno de 1e-10. Para incrementos de 1 grado, en el entorno de 1e-12. \date 27 de diciembre de 2014: Creación de la función. \todo Esta función no está probada. */ void SinCosRecurrencia(const double anguloIni, const double incAngulo, const size_t numValores, double* seno, const size_t incSeno, double* coseno, const size_t incCoseno); /******************************************************************************/ /******************************************************************************/ /** \brief Construye un \em spline cúbico natural para una serie de puntos e interpola el valor de la función para una posición dada. \param[in] x Puntero a la dirección de memoria donde comienza el vector que almacena las coordenadas X de los puntos dato. \param[in] y Puntero a la dirección de memoria donde comienza el vector que almacena los valores de la función a interpolar, correspondientes a cada posición del vector pasado en el argumento \em x. \param[in] nDatos Tamaño de los vectores \em x e \em y. \param[in,out] xInterp Puntero a la dirección de memoria donde comienza el vector que almacena las coordenadas X de los puntos a interpolar. Al término de la ejecución de la función, este argumento almacena las coordenadas Y interpoladas. \param[in] nInterp Tamaño del vector \em xInterp. \note El código de esta función es una modificación de la versión que se puede encontrar en: http://koders.com/cpp/fid16BE3A5D46A7AC7BF84EECB1ADBF99B913A8F610.aspx \note El código original está acogido a la GNU Lesser General Public License Version 2.1 \note Esta función no controla internamente si los vectores \em x e \em y son del tamaño especificado en \em nDatos. \note Esta función no controla internamente si el vector \em xInterp es del tamaño especificado en \em nInterp. \note Esta función no controla internamente si las coordenadas X de los puntos a interpolar están dentro o fuera de los límites de los puntos dato. \date 02 de marzo de 2009: Creación de la función. \todo Esta función todavía no está programada. */ void SplineCubicoNatural(double* x, double* y, size_t nDatos, double* xInterp, size_t nInterp); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/polig.h000755 001750 001750 00000206125 14047015257 016651 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file polig.h \brief Definición de estructuras y declaración de funciones para el trabajo con polígonos. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 20 de abril de 2011 \copyright Copyright (c) 2011-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _POLIG_H_ #define _POLIG_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include #include"libgeoc/arco.h" #include"libgeoc/constantes.h" #include"libgeoc/dpeucker.h" #include"libgeoc/dpeuckera.h" #include"libgeoc/errores.h" #include"libgeoc/fgeneral.h" #include"libgeoc/geocnan.h" #include"libgeoc/geocomp.h" #include"libgeoc/proyecaux.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \struct polig \brief Estructura contenedora de los vértices que definen el contorno de uno o varios polígono. \date 20 de abril de 2011: Creación de la estructura. \date 26 de mayo de 2011: Reorganización total de la estructura. \date 28 de mayo de 2011: Adición de los campos polig::hayArea, polig::area, polig::hayLim, polig::xMin, polig::xMax, polig::yMin e polig::yMax. \date 10 de mayo de 2020: Adición del campo polig::atr. */ typedef struct { /** \brief Número de elementos de los vectores de coordenadas. */ size_t nElem; /** \brief Vector de polig::nElem elementos, que almacena las coordenadas X de los vértices del polígono (o los polígonos), así como los separadores entre polígonos. La primera coordenada de cada polígono se repite al final. */ double* x; /** \brief Vector de polig::nElem elementos, que almacena las coordenadas Y de los vértices del polígono (o los polígonos), así como los separadores entre polígonos. La primera coordenada de cada polígono se repite al final. */ double* y; /** \brief Número de polígonos almacenados. */ size_t nPolig; /** \brief Vector de polig::nPolig elementos, que almacena las posiciones en los vectores \em x e \em y de inicio de cada polígono almacenado. */ size_t* posIni; /** \brief Vector de polig::nPolig elementos, que almacena el número de vértices de cada polígono almacenado. El último vértice de cada polígono, que es el primero repetido, también entra en la cuenta. */ size_t* nVert; /** \brief Identificador de si la estructura contiene información acerca de los límites del rectángulo que encierra a cada polígono almacenado. Dos posibilidades: - 0: La estructura no contiene información de los límites. - Distinto de 0: La estructura sí contiene información de los límites. */ int hayLim; /** \brief Vector de polig::nPolig elementos, que almacena la coordenada X mínima de cada polígono almacenado. Este campo sólo contiene información si el campo polig::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* xMin; /** \brief Vector de polig::nPolig elementos, que almacena la coordenada X máxima de cada polígono almacenado. Este campo sólo contiene información si el campo polig::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* xMax; /** \brief Vector de polig::nPolig elementos, que almacena la coordenada Y mínima de cada polígono almacenado. Este campo sólo contiene información si el campo polig::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* yMin; /** \brief Vector de polig::nPolig elementos, que almacena la coordenada Y máxima de cada polígono almacenado. Este campo sólo contiene información si el campo polig::hayLim es distinto de 0; si no, es igual a \p NULL. */ double* yMax; /** \brief Identificador de si la estructura contiene información acerca de la superficie de los polígonos almacenados. Dos posibilidades: - 0: La estructura no contiene información de superficie. - Distinto de 0: La estructura sí contiene información de superficie. */ int hayArea; /** \brief Vector de polig::nPolig elementos, que almacena la superficie de cada polígono almacenado. Este campo sólo contiene información si el campo polig::hayArea es distinto de 0; si no, es igual a \p NULL. La superficie almacenada sólo es correcta si el polígono es simple, esto es, si sus lados no se cortan entre ellos mismos. El área de los polígono puede ser negativa o positiva, de tal forma que: - Si es negativa: Los vértices de polígono están ordenados en el sentido de las agujas del reloj. - Si es positiva: Los vértices de polígono están ordenados en sentido contrario al de las agujas del reloj. */ double* area; /** \brief Vector de polig::nPolig elementos, que almacena un atributo cualquiera elegido por el usuario referido a cada polígono. Este campo sólo sirve para posibles manejos del usuario en el empleo de la estructura. Los elementos se inicializan con el valor 0. */ int* atr; }polig; /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref polig.c. \param[out] version Cadena identificadora de la versión de OpenMP utilizada. Este argumento sólo se utiliza si su valor de entrada es distinto de \p NULL y si hay alguna función compilada con OpenMP. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 27 de mayo de 2011: Creación de la función. \date 25 de agosto de 2011: Adición del argumento de entrada \em version. */ int GeocParOmpPolig(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polig vacía. \return Estructura \ref polig vacía. Los campos escalares se inicializan con el valor 0 y los vectoriales con \p NULL. Si se devuelve \p NULL ha ocurrido un error de asignación de memoria. \date 26 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ polig* IniciaPoligVacio(void); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para la rutina de creación de una estructura \ref polig a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función calcula el número máximo de elementos que almacenarán los vectores de coordenadas de una estructura \ref polig y el número de polígonos almacenados en los vectores de trabajo. \param[in] nElem Número de elementos de los vectores de coordenadas originales. \param[in] posNanX Vector que almacena las posiciones de los elementos #GEOC_NAN en el vector \em x de coordenadas originales. \param[in] posNanY Vector que almacena las posiciones de los elementos #GEOC_NAN en el vector \em y de coordenadas originales. \param[in] nNanX Número de elementos del vector \em posNanX. \param[in] nNanY Número de elementos del vector \em posNanY. \param[out] nElemMax Número máximo de elementos que contendrán los vectores de coordenadas de los elementos de la estructura. \param[out] nPolig Número de polígonos almacenados en los vectores \em x e \em y de coordenadas originales. \return Variable de error. Tres posibilidades: - #GEOC_ERR_NO_ERROR: Si todo ha ido bien. - #GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG: Si los vectores \em x e \em y de coordenadas originales almacenan un número distinto de polígonos, es decir, \em nNanX es distinto que \em nNanY. - #GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG: Si algunos polígonos almacenados en \em x e \em y son distintos, es decir, las posiciones almacenadas en \em posNanX son distintas de las almacenadas en \em posNanY. \note Esta función no comprueba si el número de elementos de los vectores \em posNanX y \em posNanY es congruente con los valores pasados en \em nNanX y \em nNanY. \date 26 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ int AuxCreaPolig1(const size_t nElem, const size_t* posNanX, const size_t* posNanY, const size_t nNanX, const size_t nNanY, size_t* nElemMax, size_t* nPolig); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para la rutina de creación de una estructura \ref polig a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función copia una serie de datos de dos vectores en otros dos. \param[in] x Vector que contiene las coordenadas X de los vértices a copiar. \param[in] y Vector que contiene las coordenadas Y de los vértices a copiar. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] xSal Vector para almacenar los elementos copiados del vector \em x. Ha de tener la suficiente memoria asignada para copiar \em nElem elementos más un posible elemento adicional, que es el primer elemento de \em x, si éste no se repite al final. \param[out] ySal Vector para almacenar los elementos copiados del vector \em y. Ha de tener la suficiente memoria asignada para copiar \em nElem elementos más un posible elemento adicional, que es el primer elemento de \em y, si éste no se repite al final. \param[out] nCopias Número de elementos copiados en los vectores \em xSal e \em ySal, incluido el primer punto repetido al final, si se copia. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em xSal e \em ySal es congruente con los valores pasados en \em nElem, \em incX e \em incY. \date 26 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ void AuxCreaPolig2(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, double* xSal, double* ySal, size_t* nCopias); /******************************************************************************/ /******************************************************************************/ /** \brief Función auxiliar para las rutinas de creación de estructuras \ref polig a partir de dos vectores que contienen las coordenadas de los vértices. \brief Esta función crea los polígonos en el formato de almacenamiento de \ref polig a partir de los vectores de entrada. \param[in] x Vector que contiene las coordenadas X de los vértices de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices de trabajo. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posNan Vector que almacena las posiciones de los elementos #GEOC_NAN en los vectores \em x e \em y. \param[in] nNan Número de elementos del vector \em posNan. \param[out] xSal Vector para almacenar las coordenadas X de los vértices de los polígonos creados. \param[out] ySal Vector para almacenar las coordenadas Y de los vértices de los polígonos creados. \param[out] posIni Vector para almacenar las posiciones de inicio de los polígonos creados. \param[out] nVert Vector para almacenar el número de vértices de los polígonos creados. \param[out] nPtos Número de posiciones con información almacenada en los vectores \em xSal e \em ySal. \param[out] nPolig Número de posiciones con información almacenada en los vectores \em posIni y \em nVert. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y y \em posNan es congruente con los valores pasados en \em nElem, \em incX, \em incY y \em nNan. \note Esta función asume que los vectores \em xSal, \em ySal, \em posIni y \em nVert tienen asignada suficiente memoria. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ void AuxCreaPolig3(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, double* xSal, double* ySal, size_t* posIni, size_t* nVert, size_t* nPtos, size_t* nPolig); /******************************************************************************/ /******************************************************************************/ /** \brief Crea una estructura \ref polig a partir de dos vectores que contienen las coordenadas de los vértices de uno o varios polígonos. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono o polígonos de trabajo. Si hay varios polígonos, han de estar separados por un valor #GEOC_NAN. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono o polígonos de trabajo. Si hay varios polígonos, han de estar separados por un valor #GEOC_NAN. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] idError Identificador de error. Varias posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG: Los vectores \em x e \em y contienen un número distinto de polígonos. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG: Los vectores \em x e \em y contienen distintos polígonos. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \return Estructura \ref polig con los polígonos pasados. Si ocurre algún error, se devuelve \p NULL y el motivo del fallo se codifica en la variable \em idError. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \note Si los vectores \em x e \em y almacenan varios polígonos, éstos se separan mediante valores #GEOC_NAN. Poner #GEOC_NAN en la primera posición y/o la última es opcional, pero sea cual sea la elección ha de ser la misma para los dos vectores. \note Los posibles valores #GEOC_NAN han de estar en las mismas posiciones en \em x e \em y. \note Para los polígonos, es opcional repetir las coordenadas del primer vértice al final del listado del resto de vértices. \note Esta función no calcula los límites de los polígonos ni su área, por lo que los campos polig::hayLim y polig::hayArea se inicializan a 0 y los campos polig::xMin, polig::xMax, polig::yMin, polig::yMax y polig::area se inicializan a \p NULL. \date 26 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ polig* CreaPolig(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, int* idError); /******************************************************************************/ /******************************************************************************/ /** \brief Enlaza el contenido de una estructura \ref polig a otra. \param[in] poliEnt Estructura \ref polig de entrada, que almacena los datos a enlazar. \param[out] poliSal Estructura \ref polig, cuyos campos serán enlazados a los de la estructura \em poliEnt. Esta estructura ha de estar, como mínimo, inicializada. Al término de la ejecución de la función, las estructuras \em poliEnt y \em poliSal comparten el mismo espacio de memoria en sus argumentos vectoriales. \note Esta función asume que la estructura de entrada \em poligEnt tiene memoria asignada. \note Esta función asume que la estructura de salida \em poligSal está, como mínimo, inicializada. \note Esta función libera la posible memoria asignada a los campos de \em poliSal antes de realizar el enlace. \date 19 de junio de 2011: Creación de la función. \note Esta función todavía no está probada. */ void EnlazaCamposPolig(polig* poliEnt, polig* poliSal); /******************************************************************************/ /******************************************************************************/ /** \brief Copia el contenido de una estructura \ref polig en otra. \param[in] poli Estructura \ref polig de entrada, que almacena los datos a copiar. \param[out] idError Identificador de error. Varias posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG: Los campos polig::x e polig::y del polígono de entrada contienen un número distinto de polígonos. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG: Los campos polig::x e polig::y del polígono de entrada contienen distintos polígonos. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \return Polígono con los datos contenidos en \em poli copiados. Si ocurre algún error se devuelve \p NULL y la causa se almacena en el argumento \em idError. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \date 09 de julio de 2011: Creación de la función. \note Esta función todavía no está probada. */ polig* CopiaPolig(const polig* poli, int* idError); /******************************************************************************/ /******************************************************************************/ /** \brief Añade el contenido de una estructura \ref polig a otra. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se han añadido los polígonos de la estructura \em anyade. \param[in] anyade Estructura cuyo contenido será añadido a \em poli. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función asume que la estructura de entrada \ref polig tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de las estructuras de entrada no se libera. \note Si la estructura \em poli guarda información de superficie y límites de los polígonos almacenados, esta información se calcula también para los nuevos datos (en realidad, si la estructura \em anyade ya los tiene calculados, simplemente se copian). \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ int AnyadePoligPolig(polig* poli, const polig* anyade); /******************************************************************************/ /******************************************************************************/ /** \brief Añade al contenido de una estructura \ref polig un conjunto de polígonos definidos a partir de un listado con las coordenadas de sus vértices, de la misma forma que el utilizado en la función \ref CreaPolig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se han añadido los polígonos pasados en \em x e \em y. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono o polígonos a añadir. Si hay varios polígonos, han de estar separados por un valor #GEOC_NAN. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono o polígonos a añadir. Si hay varios polígonos, han de estar separados por un valor #GEOC_NAN. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. - #GEOC_ERR_POLIG_VEC_DISTINTO_NUM_POLIG: Los vectores \em x e \em y contienen un número distinto de polígonos. No contienen el mismo número de identificadores #GEOC_NAN. - #GEOC_ERR_POLIG_VEC_DISTINTOS_POLIG: Los vectores \em x e \em y contienen distintos polígonos. Los marcadores #GEOC_NAN no están colocados en las mismas posiciones. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de la estructura y los vectores de entrada no se libera. \note Si la estructura \em poli guarda información de superficie y límites de los polígonos almacenados, esta información se calcula también para los nuevos datos. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \note Si los vectores \em x e \em y almacenan varios polígonos, éstos se separan mediante valores #GEOC_NAN. Poner #GEOC_NAN en la primera posición y/o la última es opcional. \note Los posibles valores #GEOC_NAN han de estar en las mismas posiciones en \em x e \em y. \note Para los polígonos, es opcional repetir las coordenadas del primer vértice al final del listado del resto de vértices. \note Esta función crea internamente una estructura \ref polig para luego añadirla a \em poli con la función \ref AnyadePoligPolig. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ int AnyadeDatosPolig(polig* poli, const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Libera la memoria asignada a una estructura \ref polig. \param[in] datos Estructura \ref polig. \date 20 de abril de 2011: Creación de la estructura. \date 26 de mayo de 2011: Reescritura de la función para el trabajo con la nueva versión de la estructura. \note Esta función todavía no está probada. */ void LibMemPolig(polig* datos); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los límites de todos los polígonos almacenados en una estructura \ref polig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se han añadido los límites de los polígonos almacenados. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función está paralelizada con OpenMP. \note Esta función asume que la estructura de entrada \ref polig tiene memoria asignada. \note En caso de error de asignación de memoria, la memoria de la estructura de entrada no se libera. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ int CalcLimitesPolig(polig* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los límites de un polígono a partir de las coordenadas de sus vértices. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono de trabajo. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono de trabajo. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] xMin Coordenada X mímina del polígono. \param[out] xMax Coordenada X máxima del polígono. \param[out] yMin Coordenada Y mímina del polígono. \param[out] yMax Coordenada Y máxima del polígono. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ void LimitesPoligono(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY, double* xMin, double* xMax, double* yMin, double* yMax); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los límites de una serie de polígonos a partir de las coordenadas de sus vértices, almacenadas en vectores en el formato de la estructura \ref polig. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono de trabajo, tal y como se almacenan en una estructura \ref polig. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono de trabajo, tal y como se almacenan en una estructura \ref polig. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Vector de \em nPolig elementos, que almacena las posiciones de inicio de los polígonos de trabajo. \param[in] nVert Vector de \em nPolig elementos, que almacena el número de vértices de los polígonos de trabajo. \param[in] nPolig Número de polígonos de trabajo. \param[in] restaPosIni Número de posiciones a restar a los valores almacenados en \em posIni, de tal forma que los índices de los vértices se refieran al inicio pasado mediante los punteros \em x e \em y. \param[out] xMin Vector de \em nPolig elementos para almacenar las coordenadas X mínimas calculadas de los polígonos. \param[out] xMax Vector de \em nPolig elementos para almacenar las coordenadas X máximas calculadas de los polígonos. \param[out] yMin Vector de \em nPolig elementos para almacenar las coordenadas Y mínimas calculadas de los polígonos. \param[out] yMax Vector de \em nPolig elementos para almacenar las coordenadas Y máximas calculadas de los polígonos. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em posIni, \em nVert, \em xMin, \em xMax, \em yMin e \em yMax es congruente con los valores pasados de \em incX, \em incY, \em nPolig y \em restaPoliIni. \note Esta función no comprueba si las coordenadas almacenadas en los vectores \em x e \em y están en el formato de la estructura \ref polig. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ void LimitesPoligonosPolig(const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posIni, const size_t* nVert, const size_t nPolig, const size_t restaPosIni, double* xMin, double* xMax, double* yMin, double* yMax); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el área de todos los polígonos almacenados en una estructura \ref polig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se han añadido las superficies de los polígonos almacenados. \param[in] facCoor Factor a aplicar a las coordenadas antes del cálculo de las superficies. Si los cálculos se van a hacer sobre el elipsoide, este argumento debe llevar las coordenadas a radianes, si no lo están. \param[in] geo Identificador de que el polígono está sobre la superficie del elipsoide. Dos posibilidades: - 0: El polígono está en el plano euclideo. - Distinto de 0: El polígono está sobre la superficie del elipsoide. \param[in] a Semieje mayor del elipsoide. Este argumento sólo es tenido en cuenta si se ha indicado trabajo sobre el elipsoide mediante el argumento \em geo. \param[in] f Aplanamiento del elipsoide. Este argumento sólo es tenido en cuenta si se ha indicado trabajo sobre el elipsoide mediante el argumento \em geo. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función asume que la estructura de entrada \ref polig tiene memoria asignada. \note El área calculada sólo es correcta si el polígono es simple, esto es, si sus lados no se cortan entre ellos mismos (ver la documentación de polig::area). \note Se asume que \em facCoor>0.0, condición que no se controla internamente. \note En caso de error de asignación de memoria, la memoria de la estructura de entrada no se libera. \note El cálculo del área sobre el elipsoide se realiza proyectando los puntos mediante una proyección cilíndrica equivalente de Lambert. \date 29 de mayo de 2011: Creación de la función. \date 01 de agosto de 2011: Corregido error que hacía que se calculasen mal las superficies debido a un incorrecto uso del argumento \em restaPosIni de la función \ref AreaPoligonosSimplesPolig. \date 16 de agosto de 2013: Adición de la capacidad de cálculo de áreas para polígonos sobre la superficie del elipsoide. \date 17 de agosto de 2013: Modificación de la función para que el área se calcule siempre, aunque la estructura ya la contenga. Se dota de esta capacidad por si se llama repetidas veces a la función con valores distintos de \em facCoor. \note Esta función todavía no está probada. */ int CalcAreaPolig(polig* poli, const double facCoor, const int geo, const double a, const double f); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el área de un polígono simple (sin intersecciones consigo mismo) a partir de las coordenadas de sus vértices. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono de trabajo. Las coordenadas del primer punto pueden repetirse o no al final, indistintamente. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono de trabajo. Las coordenadas del primer punto pueden repetirse o no al final, indistintamente. \param[in] nElem Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \return Superficie del polígono de trabajo. Dos posibilidades: - Número negativo: Los vértices del polígono están ordenados en el sentido de las agujas del reloj. - Número positivo: Los vértices del polígono están ordenados en el sentido contrario al de las agujas del reloj. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados de \em nElem, \em incX e \em incY. \note El algoritmo implementado es el correspondiente a la ecuación 21.4.20 del Numerical Recipes, tercera edición, página 1127. Este algoritmo trabaja con vectores de coordenadas en los que el primer punto no se repite al final. Esta función comprueba internamente si el primer punto se repite al final de los vectores pasados y actua en consecuencia para proporcionar un resultado correcto. \date 29 de mayo de 2011: Creación de la función. \date 23 de junio de 2011: Adición de la capacidad de trabajar con vectores de coordenadas en los que se repite el primer punto al final. \note Esta función todavía no está probada. */ double AreaPoligonoSimple(const double* x, const double* y, const size_t nElem, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el área de una serie de polígonos simples (sin intersecciones consigo mismo) a partir de las coordenadas de sus vértices, almacenadas en vectores en el formato de la estructura \ref polig. \param[in] x Vector que contiene las coordenadas X de los vértices del polígono de trabajo, tal y como se almacenan en una estructura \ref polig. \param[in] y Vector que contiene las coordenadas Y de los vértices del polígono de trabajo, tal y como se almacenan en una estructura \ref polig. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] posIni Vector de \em nPolig elementos, que almacena las posiciones de inicio de los polígonos de trabajo. \param[in] nVert Vector de \em nPolig elementos, que almacena el número de vértices de los polígonos de trabajo. \param[in] nPolig Número de polígonos de trabajo. \param[in] restaPosIni Número de posiciones a restar a los valores almacenados en \em posIni, de tal forma que los índices de los vértices se refieran al inicio pasado mediante los punteros \em x e \em y. \param[out] area Vector de \em nPolig elementos para almacenar las superficies calculadas de los polígonos. Los valores pueden ser positivos o negativos: - Número negativo: Los vértices del polígono están ordenados en el sentido de las agujas del reloj. - Número positivo: Los vértices del polígono están ordenados en el sentido contrario al de las agujas del reloj. \note Esta función está paralelizada con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em x, \em y, \em posIni, \em nVert y \em area es congruente con los valores pasados de \em incX, \em incY, \em nPolig y \em restaPoliIni. \note Esta función no comprueba si las coordenadas almacenadas en los vectores \em x e \em y están en el formato de la estructura \ref polig. \date 29 de mayo de 2011: Creación de la función. \note Esta función todavía no está probada. */ void AreaPoligonosSimplesPolig(const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posIni, const size_t* nVert, const size_t nPolig, const size_t restaPosIni, double* area); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica un factor de escala y una traslación (en este orden) a las coordenadas de todos los polígonos almacenados en una estructura \ref polig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se ha aplicado un factor de escala y una traslación (en este orden) a las coordenadas de todos los polígonos almacenados y, si se indica, a los límites y las superficies. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] aplicaLim Identificador para aplicar o no los factores de escala y las traslaciones a los límites de los polígonos (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican los factores de escala ni las traslaciones a los límites. - Distinto de 0: Sí se aplican los factores de escala y las traslaciones a los límites, si estos están calculados en la estructura de entrada. \param[in] aplicaArea Identificador para aplicar o no los factores de escala (que se aplican como un único factor \em escalaX*escalaY) a las áreas de los polígonos (sólo si están previemente calculadas). Dos posibilidades: - 0: No se aplican los factores a las áreas. - Distinto de 0: Sí se aplican los factores a las áreas, si estas están calculadas en la estructura de entrada. \note Esta función está paralelizada con OpenMP. \note Primero se aplican los factores de escala y luego las traslaciones. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \note A las áreas sólo se aplican los factores de escala, ya que son invariantes ante traslaciones. \note A las áreas, los factores de escala se aplican como uno solo, igual a \em escalaX*escalaY, para que éstas queden correctamente expresadas en las nuevas unidades a las que da lugar el escalado. \date 02 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void EscalaYTrasladaPolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim, const int aplicaArea); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica una traslación y un factor de escala (en este orden) a las coordenadas de todos los polígonos almacenados en una estructura \ref polig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se ha aplicado una traslación y un factor de escala (en este orden) a las coordenadas de todos los polígonos almacenados y, si se indica, a los límites y las superficies. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] aplicaLim Identificador para aplicar o no las traslaciones y los factores de escala a los límites de los polígonos (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican las traslaciones ni los factores de escala a los límites. - Distinto de 0: Sí se aplican las traslaciones y los factores de escala a los límites, si estos están calculados en la estructura de entrada. \param[in] aplicaArea Identificador para aplicar o no los factores de escala (que se aplican como un único factor \em escalaX*escalaY) a las áreas de los polígonos (sólo si están previemente calculadas). Dos posibilidades: - 0: No se aplican los factores a las áreas. - Distinto de 0: Sí se aplican los factores a las áreas, si estas están calculadas en la estructura de entrada. \note Esta función está paralelizada con OpenMP. \note Primero se aplican las traslaciones y luego los factores de escala. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \note A las áreas sólo se aplican los factores de escala, ya que son invariantes ante traslaciones. \note A las áreas, los factores de escala se aplican como uno solo, igual a \em escalaX*escalaY, para que éstas queden correctamente expresadas en las nuevas unidades a las que da lugar el escalado. \date 02 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void TrasladaYEscalaPolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int aplicaLim, const int aplicaArea); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica un factor de escala y una traslación (el orden de aplicación se ha de seleccionar) a las coordenadas de todos los polígonos almacenados en una estructura \ref polig. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, se ha aplicado un factor de escala y una traslación (orden a seleccionar) a las coordenadas de todos los polígonos almacenados y, si se indica, a los límites y las superficies. \param[in] escalaX Factor de escala a aplicar a las coordenadas X. \param[in] escalaY Factor de escala a aplicar a las coordenadas Y. \param[in] trasladaX Traslación a aplicar a las coordenadas X. \param[in] trasladaY Traslación a aplicar a las coordenadas Y. \param[in] orden Orden de aplicación de los factores de escala y traslación. Dos posibilidades: - 0: Primero se aplican los factores de escala y luego las traslaciones \f$x'=f\cdot x+t\f$. - Distinto de 0: Primero se aplican las traslaciones y luego los factores de escala \f$x'=(x+t)\cdot f\f$. \param[in] aplicaLim Identificador para aplicar o no los factores de escala y las traslaciones a los límites de los polígonos (sólo si están previemente calculados). Dos posibilidades: - 0: No se aplican los factores de escala ni las traslaciones a los límites. - Distinto de 0: Sí se aplican los factores de escala y las traslaciones a los límites, si estos están calculados en la estructura de entrada. \param[in] aplicaArea Identificador para aplicar o no los factores de escala (que se aplican como un único factor \em escalaX*escalaY) a las áreas de los polígonos (sólo si están previemente calculadas). Dos posibilidades: - 0: No se aplican los factores a las áreas. - Distinto de 0: Sí se aplican los factores a las áreas, si estas están calculadas en la estructura de entrada. \note Esta función asume que la estructura de entrada \em poli tiene memoria asignada. \note A las áreas sólo se aplican los factores de escala, ya que son invariantes ante traslaciones. \note A las áreas, los factores de escala se aplican como uno solo, igual a \em escalaX*escalaY, para que éstas queden correctamente expresadas en las nuevas unidades a las que da lugar el escalado. \date 02 de junio de 2011: Creación de la función. \date 18 de junio de 2011: Distinción entre factores de escala y traslaciones para las coordenadas X e Y. \note Esta función todavía no está probada. */ void MuevePolig(polig* poli, const double escalaX, const double escalaY, const double trasladaX, const double trasladaY, const int orden, const int aplicaLim, const int aplicaArea); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de los polígonos almacenados en una estructura \ref polig mediante un algoritmo inspirado en el de Douglas-Peucker. Se usa internamente la función \ref AligeraPolilinea. \param[in,out] poli Estructura \ref polig, que almacena una serie de polígonos. Al término de la ejecución de la función, almacena el resultado de la aplicación a cada polígono del algoritmo de aligerado de vértices implementado en la función \ref AligeraPolilinea. \param[in] esf Identificador de que el polígono está sobre la superficie de la esfera. Dos posibilidades: - 0: El polígono está en el plano euclideo. - Distinto de 0: El polígono está sobre la esfera. \param[in] facCoor Factor de escala a aplicar a las coordenadas del polígono para realizar el aligerado. Si se trabaja sobre la esfera, este argumento ha de llevar las coordenadas de los puntos de trabajo a radianes. Las coordenadas devueltas al término de la ejecución de está función no se verán afectadas por este factor. \param[in] tol Tolerancia para eliminar vértices. Si se trabaja sobre la superficie de la esfera, este valor ha de estar en radianes, es decir, será una distancia sobre la superficie de la esfera de radio unidad. Ver la ayuda de la función \ref AligeraPolilinea. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: Utiliza el algoritmo de Douglas-Peucker original, que no es robusto. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de segmentos/arcos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los segmentos/arcos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los segmentos hasta el inicio de la polilínea aligerada. \param[in] a Semieje mayor del elipsoide. Este argumento sólo es tenido en cuenta si se ha indicado trabajo sobre el elipsoide mediante el argumento \em geo. \param[in] f Aplanamiento del elipsoide. Este argumento sólo es tenido en cuenta si se ha indicado trabajo sobre el elipsoide mediante el argumento \em geo. \return Variable de error. Dos posibilidades: - #GEOC_ERR_NO_ERROR: Todo ha ido bien. - #GEOC_ERR_ASIG_MEMORIA: Ha ocurrido un error de asignación de memoria. \note Esta función asume que \em poli está, como mínimo, inicializado. \note Si \em poli tiene límites y/o áreas calculadas en la entrada, también los tendrá en la salida. \note Si \em poli está sobre la superficie de la esfera, el campo polig::x almacenará la longitud, mientras que polig::y almacenará la latitud. Del mismo modo, los límites polig::xMin y polig::xMax almacenarán longitudes y polig::yMin y polig::yMax, latitudes. \note Se asume que \em facCoor>0.0, condición que no se controla internamente. \note Un polígono aligerado sólo será válido si después de aplicarle la función \ref AligeraPolilinea mantiene un mínimo de 3 puntos no alineados, por lo que, al término de la ejecución de esta función, el resultado puede ser una estructura \ref polig vacía. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 09 de julio de 2011: Creación de la función. \date 10 de julio de 2011: Cambio del tipo del argumento \em robusto al tipo enumerado #GEOC_DPEUCKER_ROBUSTO. \date 31 de julio de 2011: Corregido error con índices a la hora de guardar los resultados y comprobación de que los polígonos de salida no estén compuestos por tres puntos alineados. \date 25 de mayo de 2012: Adición de la posibilidad de usar el algoritmo de Douglas-Peucker original. \date 16 de agosto de 2013: Adición de la capacidad de trabajar con polígonos en la superficie de la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \date 21 de septiembre de 2013: Adición de la capacidad de trabajar sobre la esfera con el algoritmo de Douglas-Peucker original. \todo Esta función todavía no está probada. */ int AligeraPolig(polig* poli, const int esf, const double facCoor, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, const double a, const double f); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime una línea de cabecera para un polígono almacenado en una estructura \ref polig. \param[in] poli Estructura \ref polig. \param[in] indice Índice del polígono de trabajo en la estructura. \param[in] iniCab Cadena de texto con la que comenzará la cabecera. \param[in] impLim Identificador para imprimir o no los límites de coordenadas del polígono de trabajo. Dos posibles valores: - 0: No se imprimen. - Distinto de 0: Sí se imprimen. \param[in] formCoor Cadena de caracteres indicadora del formato para escribir las coordenadas de los límites. Este argumento sólo se usa internamente si se ha indicado la impresión de límites. \param[in] impArea Identificador para imprimir o no la superficie del polígono de trabajo. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formArea Cadena de caracteres indicadora del formato para escribir el valor de la superficie. Este argumento sólo se usa internamente si se ha indicado la impresión de la superficie del polígono. \param[in] impAtr Identificador para imprimir o no el atributo almacenado en polig::atr. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formAtr Cadena de caracteres indicadora del formato para escribir el valor del atributo. Este argumento sólo se usa internamente si se ha indicado la impresión del atributo. \param[in] factorX Factor para multiplicar las coordenadas X de los vértices antes de imprimirlas. \param[in] factorY Factor para multiplicar las coordenadas Y de los vértices antes de imprimirlas. \param[in] repitePrimerPunto Identificador para tener o no en cuenta el primer vértice del polígono repetido al final del listado de coordenadas para el cálculo del número de vértices del polígono. Dos posibles valores: - 0: No se repite, luego no se tiene en cuenta. - Distinto de 0: Sí se repite, luego sí se tiene en cuenta. \param[in] idFich Identificador de fichero abierto para escribir. \note Esta función está paralelizada con OpenMP. \note La cabecera completa tiene el siguiente formato: iniCab númVert área xMín xMáx yMín yMáx atributo. \note Si la estructura no tiene información de límites y/o áreas y se indica que se impriman, los valores se calculan internamente. \note El área imprimida sólo es correcta si el polígono es simple, esto es, si sus lados no se cortan entre ellos mismos (ver la documentación de polig::area). \note Esta función asume que \em poli es una estructura \ref polig correctamente almacenada. \note Esta función no comprueba si la estructura pasada tiene memoria asignada. \note Esta función no comprueba internamente la validez de los argumentos de formato. \note Esta función no comprueba internamente si el identificador pasado corresponde a un fichero abierto para escribir. \date 18 de junio de 2011: Creación de la función. \date 10 de mayo de 2020: Adición de los argumentos \em impAtr y \em formAtr. \note Esta función todavía no está probada. */ void ImprimeCabeceraPoligFichero(const polig* poli, const size_t indice, const char iniCab[], const int impLim, const char formCoor[], const int impArea, const char formArea[], const int impAtr, const char formAtr[], const double factorX, const double factorY, const int repitePrimerPunto, FILE* idFich); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime una estructura \ref polig en un fichero. \param[in] poli Estructura \ref polig. \param[in] factorX Factor para multiplicar las coordenadas X de los vértices antes de imprimirlas. \param[in] factorY Factor para multiplicar las coordenadas Y de los vértices antes de imprimirlas. \param[in] repitePrimerPunto Identificador para repetir o no el primer vértice del polígono al final del listado de coordenadas. Dos posibles valores: - 0: No se repite. - Distinto de 0: Sí se repite. \param[in] iniNan Identificador para imprimir o no la marca de separación de polígonos (\p NaN) delante del primer polígono. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] finNan Identificador para imprimir o no la marca de separación de polígonos (\p NaN) detrás del último polígono. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formCoor Cadena de caracteres indicadora del formato de cada coordenada a imprimir. \param[in] impCabecera Identificador para imprimir o no una cabecera con información general por cada polígono. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] iniCab Cadena de texto con la que comenzará la cabecera. \param[in] impLim Identificador para imprimir o no en la cabecera los límites de coordenadas de los polígonos de trabajo. Dos posibles valores: - 0: No se imprimen. - Distinto de 0: Sí se imprimen. \param[in] impArea Identificador para imprimir o no en la cabecera la superficie de los polígonos de trabajo. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formArea Cadena de caracteres indicadora del formato para escribir el valor de la superficie. Este argumento sólo se usa internamente si se ha indicado la impresión de la superficie de los polígonos. \param[in] impAtr Identificador para imprimir o no el atributo almacenado en polig::atr. Dos posibles valores: - 0: No se imprime. - Distinto de 0: Sí se imprime. \param[in] formAtr Cadena de caracteres indicadora del formato para escribir el valor del atributo. Este argumento sólo se usa internamente si se ha indicado la impresión del atributo. \param[in] idFich Identificador de fichero abierto para escribir. \note La cabecera completa tiene el siguiente formato: iniCab númVert área xMín xMáx yMín yMáx atributo. \note Si la estructura no tiene información de límites y/o áreas y se indica que se impriman, los valores se calculan internamente. \note El área imprimida sólo es correcta si el polígono es simple, esto es, si sus lados no se cortan entre ellos mismos (ver la documentación de polig::area). \note Esta función asume que \em poli es una estructura \ref polig correctamente almacenada. \note Esta función no comprueba si la estructura pasada tiene memoria asignada. \note Esta función no comprueba internamente la validez de los argumentos de formato. \note Esta función no comprueba internamente si el identificador pasado corresponde a un fichero abierto para escribir. \date 26 de mayo de 2011: Creación de la función. \date 30 de mayo de 2011: Adición del argumento de entrada \em factor. \date 18 de junio de 2011: Adición de la capacidad de escritura de una cabecera y del uso de factores de escala independientes para las coordenadas X e Y. \date 22 de septiembre de 2011: Corregido bug que hacía que, dependiendo del compilador y/o los flags de optimización en la compilación, se imprimiesen mal (con un signo menos delante) los valores Not-a-Number. \date 10 de mayo de 2020: Adición de los argumentos \em impAtr y \em formAtr. \note Esta función todavía no está probada. */ void ImprimePoligFichero(const polig* poli, const double factorX, const double factorY, const int repitePrimerPunto, const int iniNan, const int finNan, const char formCoor[], const int impCabecera, const char iniCab[], const int impLim, const int impArea, const char formArea[], const int impAtr, const char formAtr[], FILE* idFich); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/ptopol.h000755 001750 001750 00000242647 13656245544 017076 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file ptopol.h \brief Declaración de funciones para la realización de chequeos de inclusión de puntos en polígonos. En el momento de la compilación ha de seleccionarse el tipo de dato que se utilizará en los cálculos intermedios de las funciones \ref PtoEnPoligonoVerticeBorde y \ref PtoEnPoligonoVerticeBordeDouble. Si los puntos de trabajo están muy alejados de los polígonos pueden darse casos de resultados erróneos. Sería conveniente que los cálculos internedios se hiciesen en variables de 64 bits, pero el tipo long int suele ser de 4 bytes en procesadores de 32 bits. Para seleccionar este tipo como long long int, lo que en procesadores de 32 bits equivale a una variable de 64 bits, es necesario definir la variable para el preprocesador \em PTOPOL_BORDE_LONG_64. En procesadores de 64 bits no es necesario (aunque puede utilizarse), ya que el tipo long int tiene una longitud de 64 bits. Si no se define la variable, se usará un tipo long int para los cálculos intermedios. En \p gcc, las variables para el preprocesador se pasan como \em -DXXX, donde \em XXX es la variable a introducir. El uso del tipo long long int en procesadores de 32 bits puede hacer que las funciones se ejecuten hasta 10 veces más lentamente que si se utiliza el tipo long int. Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits, los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 05 de abril de 2010 \copyright Copyright (c) 2010-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _PTOPOL_H_ #define _PTOPOL_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include"libgeoc/errores.h" #include"libgeoc/geocnan.h" #include"libgeoc/geocomp.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_FUERA_POLIG \brief Identificador de punto fuera de un polígono. \date 12 de abril de 2011: Creación de la constante. */ #define GEOC_PTO_FUERA_POLIG 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_DENTRO_POLIG \brief Identificador de punto dentro de un polígono. \date 12 de abril de 2011: Creación de la constante. */ #define GEOC_PTO_DENTRO_POLIG 1 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_VERTICE_POLIG \brief Identificador de punto que es un vértice de un polígono. \date 12 de abril de 2011: Creación de la constante. */ #define GEOC_PTO_VERTICE_POLIG 2 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_BORDE_POLIG \brief Identificador de punto que está en el borde de un polígono. \date 12 de abril de 2011: Creación de la constante. */ #define GEOC_PTO_BORDE_POLIG 3 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_POLIG_LEJOS_32 \brief Número de unidades máximas que puede estar alejado un punto de un polígono trabajando con variables reales de 32 bits para que los cálculos de inclusión en polígonos de forma arbitraria seas correctos. \date 11 de mayo de 2020: Creación de la constante. */ #define GEOC_PTO_POLIG_LEJOS_32 40000 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_POLIG_LEJOS_64 \brief Número de unidades máximas que puede estar alejado un punto de un polígono trabajando con variables reales de 64 bits para que los cálculos de inclusión en polígonos de forma arbitraria seas correctos. \date 11 de mayo de 2020: Creación de la constante. */ #define GEOC_PTO_POLIG_LEJOS_64 3000000000 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_PTO_POLIG_LEJOS_ESCALA_DIST \brief Factor de escala a aplicar a #GEOC_PTO_POLIG_LEJOS_32 o #GEOC_PTO_POLIG_LEJOS_64 para calcular el factor de multiplicación para el escalado de puntos y polígonos automáticaente. \date 11 de mayo de 2020: Creación de la constante. */ #define GEOC_PTO_POLIG_LEJOS_ESCALA_DIST 0.75 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_RECT_DISJUNTOS \brief Comprueba si dos rectángulos son disjuntos. \param[in] xMin1 Coordenada X mínima del rectángulo 1. \param[in] xMax1 Coordenada X máxima del rectángulo 1. \param[in] yMin1 Coordenada Y mínima del rectángulo 1. \param[in] yMax1 Coordenada Y máxima del rectángulo 1. \param[in] xMin2 Coordenada X mínima del rectángulo 2. \param[in] xMax2 Coordenada X máxima del rectángulo 2. \param[in] yMin2 Coordenada Y mínima del rectángulo 2. \param[in] yMax2 Coordenada Y máxima del rectángulo 2. \return Dos posibilidades: - 0: Los rectángulos no son disjuntos, es decir, tienen alguna parte común (se cortan o se tocan) o uno está completamente contenido en el otro. - Distinto de 0: Los rectángulos son disjuntos. \note Esta función asume que \em xMin1=(xMin2))&& \ ((yMin1)<=(yMax2))&&((yMax1)>=(yMin2)))) /******************************************************************************/ /******************************************************************************/ /** \typedef ptopol_long \brief Nombre del tipo long int o long long int para utilizar en los cálculos intermedios de las funciones \ref PtoEnPoligonoVerticeBorde y \ref PtoEnPoligonoVerticeBordeDouble. Si los puntos de trabajo están muy alejados de los polígonos pueden darse casos de resultados erróneos. Sería conveniente que los cálculos internedios se hiciesen en variables de 64 bits, pero el tipo long int suele ser de 4 bytes en procesadores de 32 bits. Mediante la variable del preprocesador PTOPOL_BORDE_LONG_64 indicamos que este tipo sea long long int, lo que en procesadores de 32 bits equivale a una variable de 64 bits. \note Este tipo de dato sólo es para uso interno en el fichero \ref ptopol.c. No se recomienda su uso fuera de él, ya que habría que tener el cuenta la variable del preprocesador cada vez que se incluyera este fichero (\ref ptopol.h) en un programa u otro fichero. \date 19 de abril de 2011: Creación del tipo. */ #if defined(PTOPOL_BORDE_LONG_64) typedef long long int ptopol_long; #else typedef long int ptopol_long; #endif /******************************************************************************/ /******************************************************************************/ /** \brief Indica si hay alguna función compilada en paralelo con OpenMP en el fichero \ref ptopol.c. \return Dos posibles valores: - 0: No hay ninguna función compilada en paralelo con OpenMP. - Distinto de 0: Sí hay alguna función compilada en paralelo con OpenMP. \note Esta función asume que el argumento \em version tiene suficiente memoria asignada (si es distinto de \p NULL). \date 13 de abril de 2011: Creación de la función. \date 25 de agosto de 2011: Adición del argumento de entrada \em version. */ int GeocParOmpPtopol(char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Indica si se está utilizando el tipo log long int para la realización de cálculos intermedios en las funciones de chequeo de puntos en polígonos que son capaces de detectar si un punto está en el borde. \return Dos posibles valores: - 0: No se está utilizando log long int. - Distinto de 0: Sí se está utilizando log long int. \date 19 de abril de 2011: Creación de la función. */ int GeocLongLongIntPtopol(void); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en un rectángulo. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] xMin Coordenada X mínima del rectángulo. \param[in] xMax Coordenada X máxima del rectángulo. \param[in] yMin Coordenada Y mínima del rectángulo. \param[in] yMax Coordenada Y máxima del rectángulo. \return Varias posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del rectángulo. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del rectángulo. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice del rectángulo. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera del rectángulo, pero no es un vértice. \note Esta función asume que \em xMinEsta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits, los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. \date 06 de abril de 2010: Creación de la función. \date 10 de abril de 2011: Adición de los argumentos de entrada \em incX e \em incY. \date 12 de abril de 2011: Las variables de salida son ahora constantes simbólicas. \date 18 de abril de 2011: Reescritura de la función, siguiendo la página 244 del libro de O'Rourke. La versión anterior la había adaptado del código de la web de O'Rourke, y lo había hecho mal. \todo Esta función no está probada. */ int PtoEnPoligonoVerticeBorde(const long x, const long y, const long* coorX, const long* coorY, const size_t N, const size_t incX, const size_t incY); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si una serie de puntos están contenidos en un polígono de un número arbitrario de lados. Esta función trata correctamente los puntos situados en los bordes y/o los vértices del polígono, pero sólo trabaja con datos de tipo entero. \param[in] x Vector que contiene las coordenadas X de los puntos de trabajo. \param[in] y Vector que contiene las coordenadas Y de los puntos de trabajo. \param[in] nPtos Número de elementos que contienen los vectores \em X e \em Y. \param[in] incX Posiciones de separación entre los elementos del vector \em X. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em Y. Este argumento siempre ha de ser un número positivo. \param[in] coorX Vector que contiene las coordenadas X de los vértices del polígono. Sólo puede contener un polígono. \param[in] coorY Vector que contiene las coordenadas Y de los vértices del polígono. Sólo puede contener un polígono. \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incCoorX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incCoorY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[out] situacion Vector de \em nPtos elementos que almacena la situación de los puntos con respecto al polígono de trabajo. Cada posición del vector se refiere a un punto de trabajo y puede almacenar cuatro valores: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice del polígono. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera del polígono, pero no es un vértice. \param[in] incSituacion Posiciones de separación entre los elementos del vector \em situacion. Este argumento siempre ha de ser un número positivo. \note Esta función se puede ejecutar en paralelo con OpenMP. \note El código de esta función ha sido tomado del texto Joseph O'Rourke (2001), Computational geometry in C, 2a edición, Cambridge University Press, página 244. \note Esta función utiliza internamente la función \ref PtoEnPoligonoVerticeBorde, por lo que todos sus casos especiales lo serán también de la nueva función. \note Esta función no comprueba si el número de elementos de los vectores \em X, \em Y y \em situacion es congruente con los valores padados en \em nPtos, \em incX, \em incY e \em incSituacion. Tampoco si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono, ni si la definición de éste está hecha de manera correcta. \note El polígono de trabajo ha de ser único, sin huecos. Es opcional repetir las coordenadas del primer punto al final del listado. \note Los vértices del polígono pueden listarse en sentido dextrógiro o levógiro. \note Esta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits, los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. \date 22 de enero de 2015: Creación de la función. */ void PtosEnPoligonoVerticeBorde(const long* x, const long* y, const size_t nPtos, const size_t incX, const size_t incY, const long* coorX, const long* coorY, const size_t N, const size_t incCoorX, const size_t incCoorY, int* situacion, const size_t incSituacion); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en un polígono de un número arbitrario de lados. Esta función trata correctamente los puntos situados en los bordes y/o los vértices del polígono. Trabaja con datos de tipo real, que convierte a enteros (por redondeo o truncamiento) intermamente, mediante la aplicación de un factor de escala. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] coorX Vector que contiene las coordenadas X de los vértices del polígono. Sólo puede contener un polígono. \param[in] coorY Vector que contiene las coordenadas Y de los vértices del polígono. Sólo puede contener un polígono. \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] factor Factor de multiplicación para aplicar a las coordenadas del punto de trabajo y de los vértices del polígono con el fin de aumentar su resolución antes de convertirlas en valores de tipo entero (\p long \p int). El uso de factores muy grandes puede provocar resultados erróneos. Ver la nota al final de la documentación de esta función. Si se pasa el valor \p 0 el factor de escala se calcula automáticamente, lo que puede hacer a la función un poco más lenta. \param[in] redondeo Identificador de redondeo o truncamiento en la conversión interna de variables de tipo \p double en variables de tipo \p long \p int. Dos posibilidades: - 0: La conversión se hace por truncamiento. - Distinto de 0: La conversión se hace por redondeo. \return Varias posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice del polígono. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera del polígono, pero no es un vértice. \note Esta función no comprueba si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono. \note El polígono ha de ser único, sin huecos. Es opcional repetir las coordenadas del primer punto al final del listado. \note Los vértices del polígono pueden listarse en sentido dextrógiro o levógiro. \note El código de esta función es el mismo que el de la función \ref PtoEnPoligonoVerticeBorde, salvo que convierte internamente varias variables intermedias de tipo \p double a tipo \p long \p int, que es el tipo de datos necesario para detectar correctamente si un punto pertenece al borde de un polígono. \note Las variables se redondean internamente con la orden (long)(round(factor*variable)), y se truncan con la orden (long)(factor*variable). \note Esta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. En este caso nos referimos a las coordenadas una vez aplicado el factor de escala \em factor. El cálculo automático del factor de escala si se pasa el valor \p 0 a \em factor se realiza de tal modo que la distancia entre el punto de trabajo y el vértice más alejado del polígono se ajuste lo más posible a los límites indicados para cada tipo de variable multiplicados por #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST (se hace para ser conservador y asegurar, por eso el valor de #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST es recomendable que sea menor que 1). \date 10 de abril de 2011: Creación de la función. \date 11 de abril de 2011: Adición del argumento de entrada \em redondeo. \date 12 de abril de 2011: Las variables de salida son ahora constantes simbólicas. \date 18 de abril de 2011: Reescritura de la función, siguiendo la página 244 del libro de O'Rourke. La versión anterior la había adaptado del código de la web de O'Rourke, y lo había hecho mal. \date 11 de mayo de 2020:Adición de la capacidad de cálculo automático del factor de multiplicación. \todo Esta función no está probada. */ int PtoEnPoligonoVerticeBordeDouble(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const double factor, const int redondeo); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si una serie de puntos están contenidos en un polígono de un número arbitrario de lados. Esta función trata correctamente los puntos situados en los bordes y/o los vértices del polígono. Trabaja con datos de tipo real, que convierte a enteros (por redondeo o truncamiento) intermamente, mediante la aplicación de un factor de escala. \param[in] x Vector que contiene las coordenadas X de los puntos de trabajo. \param[in] y Vector que contiene las coordenadas Y de los puntos de trabajo. \param[in] nPtos Número de elementos que contienen los vectores \em X e \em Y. \param[in] incX Posiciones de separación entre los elementos del vector \em X. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em Y. Este argumento siempre ha de ser un número positivo. \param[in] coorX Vector que contiene las coordenadas X de los vértices del polígono. Sólo puede contener un polígono. \param[in] coorY Vector que contiene las coordenadas Y de los vértices del polígono. Sólo puede contener un polígono. \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incCoorX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incCoorY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] factor Factor de multiplicación para aplicar a las coordenadas de los puntos de trabajo y de los vértices del polígono, con el fin de aumentar su resolución antes de convertirlas en valores de tipo entero (\p long \p int). El uso de factores muy grandes puede provocar resultados erróneos. Ver la nota al final de la documentación de esta función. Si se pasa el valor \p 0 el factor de escala se calcula automáticamente, lo que puede hacer a la función un poco más lenta. \param[in] redondeo Identificador de redondeo o truncamiento en la conversión interna de variables de tipo \p double en variables de tipo \p long \p int. Dos posibilidades: - 0: La conversión se hace por truncamiento. - Distinto de 0: La conversión se hace por redondeo. \param[out] situacion Vector de \em nPtos elementos que almacena la situación de los puntos con respecto al polígono de trabajo. Cada posición del vector se refiere a un punto de trabajo y puede almacenar cuatro valores: - #GEOC_PTO_FUERA_POLIG: El punto está fuera del polígono. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro del polígono. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice del polígono. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera del polígono, pero no es un vértice. \param[in] incSituacion Posiciones de separación entre los elementos del vector \em situacion. Este argumento siempre ha de ser un número positivo. \note Esta función se puede ejecutar en paralelo con OpenMP. \note El código de esta función ha sido tomado del texto Joseph O'Rourke (2001), Computational geometry in C, 2a edición, Cambridge University Press, página 244. \note Esta función utiliza internamente la función \ref PtoEnPoligonoVerticeBordeDouble, por lo que todos sus casos especiales lo serán también de la nueva función. \note Esta función no comprueba si el número de elementos de los vectores \em X, \em Y y \em situacion es congruente con los valores padados en \em nPtos, \em incX, \em incY e \em incSituacion. Tampoco si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono, ni si la definición de éste está hecha de manera correcta. \note El polígono de trabajo ha de ser único, sin huecos. Es opcional repetir las coordenadas del primer punto al final del listado. \note Los vértices del polígono pueden listarse en sentido dextrógiro o levógiro. \note Las variables se redondean internamente con la orden (long)(round(factor*variable)), y se truncan con la orden (long)(factor*variable). \note Esta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. En este caso nos referimos a las coordenadas una vez aplicado el factor de escala \em factor. El cálculo automático del factor de escala si se pasa el valor \p 0 a \em factor se realiza de tal modo que la distancia entre el punto de trabajo y el vértice más alejado del polígono se ajuste lo más posible a los límites indicados para cada tipo de variable multiplicados por #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST (se hace para ser conservador y asegurar, por eso el valor de #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST es recomendable que sea menor que 1). \date 22 de enero de 2015: Creación de la función. \date 11 de mayo de 2020:Adición de la capacidad de cálculo automático del factor de multiplicación. */ void PtosEnPoligonoVerticeBordeDouble(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double* coorX, const double* coorY, const size_t N, const size_t incCoorX, const size_t incCoorY, const double factor, const int redondeo, int* situacion, const size_t incSituacion); /******************************************************************************/ /******************************************************************************/ /** \brief Busca valores #GEOC_NAN es uno o dos vectores de datos. Esta función está pensada para el chequeo en paralelo de la inclusión de puntos en polígonos. \param[in] x Vector que contiene las coordenadas X de los vértices de una serie de polígonos, tal y como entraría en la definición de múltiples elementos (pero sin huecos) para la función \ref PtoEnPoligono. La marca de separación entre polígonos ha de ser #GEOC_NAN. \param[in] y Vector que contiene las coordenadas Y de los vértices de una serie de polígonos, tal y como entraría en la definición de múltiples elementos (pero sin huecos) para la función \ref PtoEnPoligono. La marca de separación entre polígonos ha de ser #GEOC_NAN. Este argumento puede valer NULL, en cuyo caso sólo se trabajará con el vector \em x. \param[in] N Número de elementos que contienen los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[out] nNan Número de valores #GEOC_NAN encontrados, que es el número de elementos del vector de salida. \return Varias posibilidades: - Si todo ha ido bien, vector que contiene las posiciones en el vector o vectores originales donde se almacena el valor #GEOC_NAN. Si se trabaja con los vectores \em x e \em y, la posición sólo se extrae si ambos vectores contienen #GEOC_NAN para una misma posición. - NULL: Pueden haber ocurrido dos cosas: - Si \em nNan vale 0, en los datos de entrada no hay ningún valor #GEOC_NAN. - Si \em nNan es mayor que 0, ha ocurrido un error interno de asignación de memoria. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con los valores pasados en \em N, \em incX e \em incY. \note Las posiciones de los elementos #GEOC_NAN encontradas se refieren al número de elementos \em N de los vectores de trabajo. Para encontrar la posición real en memoria es necesario tener en cuenta las variables \em incX e \em incY. \date 13 de abril de 2011: Creación de la función. \todo Esta función no está probada. */ size_t* BuscaGeocNanEnVectores(const double* x, const double* y, const size_t N, const size_t incX, const size_t incY, size_t* nNan); /******************************************************************************/ /******************************************************************************/ /** \brief Extrae los parámetros de inicio y número de elementos de un polígono en una lista de polígonos separados por un indicador. Esta función está pensada para el chequeo en paralelo de la inclusión de puntos en polígonos. \param[in] posInd Vector que contiene las posiciones de los indicadores en el vector original. Este argumento es el vector que devuelve la función \ref BuscaGeocNanEnVectores. \param[in] indPosInd Índice en el vector de posiciones de indicadores del indicador que da comienzo al polígono de trabajo. \param[in] incX Posiciones de separación entre los elementos del vector original que almacena las coordenadas X del listado de polígonos. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector original que almacena las coordenadas Y del listado de polígonos. Este argumento siempre ha de ser un número positivo. \param[out] iniX Posición de inicio de la coordenada X del polígono de trabajo en el vector original que almacena las coordenadas X del listado de polígonos. Para encontrar la posición real en memoria es necesario tener en cuenta la variable \em incX. \param[out] iniY Posición de inicio de la coordenada Y del polígono de trabajo en el vector original que almacena las coordenadas Y del listado de polígonos. Para encontrar la posición real en memoria es necesario tener en cuenta la variable \em incY. \param[out] nElem Número de elementos que conforman el polígono de trabajo. \note Esta función no comprueba si el vector \em posInd contiene datos. \note Esta función asume que el vector \em posInd contiene un número \b *PAR* de datos. \note Esta función asume que el argumento \em indPosInd no es la última posición del vector \em posInd. \date 13 de abril de 2011: Creación de la función. \todo Esta función no está probada. */ void DatosPoliIndividualEnVecInd(const size_t* posInd, const size_t indPosInd, const size_t incX, const size_t incY, size_t* iniX, size_t* iniY, size_t* nElem); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en una serie de polígonos individuales de un número arbitrario de lados. Esta función puede no dar resultados correctos para puntos en los bordes y/o los vértices del polígono. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] coorX Vector que contiene las coordenadas X de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] coorY Vector que contiene las coordenadas Y de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] posNan Vector que almacena las posiciones en los vectores \em coorX y \em coorY de los elementos #GEOC_NAN, que separan los polígonos individuales. Este vector es la salida de la función \ref BuscaGeocNanEnVectores. \param[in] nNan Número de elementos del vector \em posNan. \param[out] poli Número del polígono en que está incluido el punto de trabajo. Si hay varios polígonos que contienen al punto de trabajo no se puede asegurar cuál de ellos será el indicado en este argumento. Este argumento sólo tiene sentido si el valor retornado por la función es distinto de #GEOC_PTO_FUERA_POLIG. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera de todos los polígonos listados. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro de, al menos, un polígono de entre los listados. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono. \note Esta función no comprueba si el número de elementos del vector \em posNan es congruente con el valor pasado en \em nNan. \note Esta función no detecta el caso de que el punto de trabajo esté en el borde o en un vértice del polígono. En este caso, el test puede dar el punto dentro o fuera, indistintamente (el chequeo del mismo punto con el mismo polígono siempre dará el mismo resultado). \note La estructura de los vectores de coordenadas es la misma que la de la función \ref PtoEnPoligono. Las marcas de comienzo y final de los listados, así como las de separación entre polígonos han de ser valores #GEOC_NAN. \note Aunque los vectores \em coorX y \em coorY sólo contengan un polígono, los elementos primero y último han de ser #GEOC_NAN. \note Los huecos en los polígonos no serán tenidos en cuenta, serán tratados como polígonos individuales. \date 14 de abril de 2011: Creación de la función. \todo Esta función no está probada. */ int PtoEnPoligonoInd(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, size_t* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en una serie de polígonos individuales de un número arbitrario de lados. Esta función puede no dar resultados correctos para puntos en los bordes del polígono. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] coorX Vector que contiene las coordenadas X de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] coorY Vector que contiene las coordenadas Y de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] posNan Vector que almacena las posiciones en los vectores \em coorX y \em coorY de los elementos #GEOC_NAN, que separan los polígonos individuales. Este vector es la salida de la función \ref BuscaGeocNanEnVectores. \param[in] nNan Número de elementos del vector \em posNan. \param[out] poli Número del polígono en que está incluido el punto de trabajo. Si hay varios polígonos que contienen al punto de trabajo no se puede asegurar cuál de ellos será el indicado en este argumento. Este argumento sólo tiene sentido si el valor retornado por la función es distinto de #GEOC_PTO_FUERA_POLIG. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera de todos los polígonos listados. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro de, al menos, un polígono de entre los listados. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice de, al menos, un polígono de entre los listados. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono. \note Esta función no comprueba si el número de elementos del vector \em posNan es congruente con el valor pasado en \em nNan. \note Esta función no detecta el caso de que el punto de trabajo esté en el borde del polígono. En este caso, el test puede dar el punto dentro o fuera, indistintamente (el chequeo del mismo punto con el mismo polígono siempre dará el mismo resultado). \note La estructura de los vectores de coordenadas es la misma que la de la función \ref PtoEnPoligono. Las marcas de comienzo y final de los listados, así como las de separación entre polígonos han de ser valores #GEOC_NAN. \note Aunque los vectores \em coorX y \em coorY sólo contengan un polígono, los elementos primero y último han de ser #GEOC_NAN. \note Los huecos en los polígonos no serán tenidos en cuenta, serán tratados como polígonos individuales. \date 14 de abril de 2011: Creación de la función. \todo Esta función no está probada. */ int PtoEnPoligonoVerticeInd(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, size_t* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en una serie de polígonos individuales de un número arbitrario de lados. Esta función trata correctamente los puntos situados en los bordes y/o los vértices del polígono, pero sólo trabaja con datos de tipo entero. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] coorX Vector que contiene las coordenadas X de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] coorY Vector que contiene las coordenadas Y de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] posNan Vector que almacena las posiciones en los vectores \em coorX y \em coorY de los elementos #GEOC_NAN, que separan los polígonos individuales. Este vector es la salida de la función \ref BuscaGeocNanEnVectores. \param[in] nNan Número de elementos del vector \em posNan. \param[out] poli Número del polígono en que está incluido el punto de trabajo. Si hay varios polígonos que contienen al punto de trabajo no se puede asegurar cuál de ellos será el indicado en este argumento. Este argumento sólo tiene sentido si el valor retornado por la función es distinto de #GEOC_PTO_FUERA_POLIG. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera de todos los polígonos listados. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro de, al menos, un polígono de entre los listados. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice de, al menos, un polígono de entre los listados. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera de, al menos, un polígono de entre los listados, pero no es un vértice. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono. \note Esta función no comprueba si el número de elementos del vector \em posNan es congruente con el valor pasado en \em nNan. \note La estructura de los vectores de coordenadas es la misma que la de la función \ref PtoEnPoligono. Las marcas de comienzo y final de los listados, así como las de separación entre polígonos han de ser valores #GEOC_NAN. \note Aunque los vectores \em coorX y \em coorY sólo contengan un polígono, los elementos primero y último han de ser #GEOC_NAN. \note Los huecos en los polígonos no serán tenidos en cuenta, serán tratados como polígonos individuales. \note Esta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits, los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. \date 14 de abril de 2011: Creación de la función. \todo Esta función no está probada. */ int PtoEnPoligonoVerticeBordeInd(const long x, const long y, const long* coorX, const long* coorY, const size_t N, const size_t incX, const size_t incY, const size_t* posNan, const size_t nNan, size_t* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está contenido en una serie de polígonos individuales de un número arbitrario de lados. Esta función trata correctamente los puntos situados en los bordes y/o los vértices del polígono. Trabaja con datos de tipo real, que convierte a enteros (por redondeo o truncamiento) intermamente, mediante a aplicación de un factor de escala. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] coorX Vector que contiene las coordenadas X de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] coorY Vector que contiene las coordenadas Y de los vértices de los elementos. Puede contener varios polígonos, pero no huecos (si los hay, serán tratados como otros polígonos). \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] factor Factor de multiplicación para aplicar a las coordenadas del punto de trabajo y de los vértices de los polígonos, con el fin de aumentar su resolución antes de convertirlas en valores de tipo entero (\p long \p int). El uso de factores muy grandes puede provocar resultados erróneos. Ver la nota al final de la documentación de esta función. Si se pasa el valor \p 0 el factor de escala se calcula automáticamente, lo que puede hacer a la función un poco más lenta. \param[in] redondeo Identificador de redondeo o truncamiento en la conversión interna de variables de tipo \p double en variables de tipo \p long \p int. Dos posibilidades: - 0: La conversión se hace por truncamiento. - Distinto de 0: La conversión se hace por redondeo. \param[in] posNan Vector que almacena las posiciones en los vectores \em coorX y \em coorY de los elementos #GEOC_NAN, que separan los polígonos individuales. Este vector es la salida de la función \ref BuscaGeocNanEnVectores. \param[in] nNan Número de elementos del vector \em posNan. \param[out] poli Número del polígono en que está incluido el punto de trabajo. Si hay varios polígonos que contienen al punto de trabajo no se puede asegurar cuál de ellos será el indicado en este argumento. Este argumento sólo tiene sentido si el valor retornado por la función es distinto de #GEOC_PTO_FUERA_POLIG. \return Dos posibilidades: - #GEOC_PTO_FUERA_POLIG: El punto está fuera de todos los polígonos listados. - #GEOC_PTO_DENTRO_POLIG: El punto está dentro de, al menos, un polígono de entre los listados. - #GEOC_PTO_VERTICE_POLIG: El punto es un vértice de, al menos, un polígono de entre los listados. - #GEOC_PTO_BORDE_POLIG: El punto pertenece a la frontera de, al menos, un polígono de entre los listados, pero no es un vértice. \note Esta función se puede ejecutar en paralelo con OpenMP. \note Esta función no comprueba si el número de elementos de los vectores \em coorX y \em coorY es congruente con los valores pasados en \em N, \em incX e \em incY. Tampoco comprueba si \em N es un valor mayor o igual a 3, que es el número mínimo de vértices que ha de tener un polígono. \note Esta función no comprueba si el número de elementos del vector \em posNan es congruente con el valor pasado en \em nNan. \note Las variables se redondean internamente con la orden (long)(round(factor*variable)), y se truncan con la orden (long)(factor*variable). \note La estructura de los vectores de coordenadas es la misma que la de la función \ref PtoEnPoligono. Las marcas de comienzo y final de los listados, así como las de separación entre polígonos han de ser valores #GEOC_NAN. \note Aunque los vectores \em coorX y \em coorY sólo contengan un polígono, los elementos primero y último han de ser #GEOC_NAN. \note Los huecos en los polígonos no serán tenidos en cuenta, serán tratados como polígonos individuales. \note Esta función puede dar resultados incorrectos para puntos muy alejados de los polígonos de trabajo. Para intentar mitigar este efecto, puede seleccionarse mediante una variable del preprocesador la precisión de algunas variables intermedias. Para más información se recomienda leer el encabezado de este fichero. \note Con cálculos internos de 32 bits las coordenadas de los vértices del polígono no han de estar más lejos de las de los puntos de trabajo de unas #GEOC_PTO_POLIG_LEJOS_32 unidades. Con cálculos de 64 bits los polígonos pueden estar alejados de los puntos de trabajo unas #GEOC_PTO_POLIG_LEJOS_64 unidades, lo que corresponde a coordenadas Y UTM ajustadas al centímetro. Con esto podríamos chequear un punto en un polo con respecto a un polígono en el ecuador en coordenadas UTM expresadas en centímetros. En este caso nos referimos a las coordenadas una vez aplicado el factor de escala \em factor. El cálculo automático del factor de escala si se pasa el valor \p 0 a \em factor se realiza de tal modo que la distancia entre el punto de trabajo y el vértice más alejado del polígono se ajuste lo más posible a los límites indicados para cada tipo de variable multiplicados por #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST (se hace para ser conservador y asegurar, por eso el valor de #GEOC_PTO_POLIG_LEJOS_ESCALA_DIST es recomendable que sea menor que 1). \date 14 de abril de 2011: Creación de la función. \date 11 de mayo de 2020:Adición de la capacidad de cálculo automático del factor de multiplicación. \todo Esta función no está probada. */ int PtoEnPoligonoVerticeBordeDoubleInd(const double x, const double y, const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const double factor, const int redondeo, const size_t* posNan, const size_t nNan, size_t* poli); /******************************************************************************/ /******************************************************************************/ /** \brief Genera un punto en el interior de un polígono simple (sin huecos). \param[in] coorX Vector que contiene las coordenadas X de los vértices del polígono. Sólo puede contener un polígono. \param[in] coorY Vector que contiene las coordenadas Y de los vértices del polígono. Sólo puede contener un polígono. \param[in] N Número de elementos que contienen los vectores \em coorX y \em coorY. \param[in] incX Posiciones de separación entre los elementos del vector \em coorX. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em coorY. Este argumento siempre ha de ser un número positivo. \param[in] factor Factor de multiplicación interno para aplicar a las coordenadas de puntos y vértices en el chequeo de inclusión de punto en polígono. Ver la ayuda de la función \ref PtoEnPoligonoVerticeBordeDouble para más información. \param[in] redondeo Identificador de redondeo o truncamiento en la conversión interna de variables de tipo \p double en variables de tipo \p long \p int. Dos posibilidades: - 0: La conversión se hace por truncamiento. - Distinto de 0: La conversión se hace por redondeo. Ver la ayuda de la función \ref PtoEnPoligonoVerticeBordeDouble para más información. \param[out] x Coordenada X de un punto situado estrictamente en el interior (no en un vértice o borde) del polígono de trabajo. Si ha ocurrido algún error o no se han podido determinar coordenadas contiene #GEOC_NAN. \param[out] y Coordenada Y de un punto situado estrictamente en el interior (no en un vértice o borde) del polígono de trabajo. Si ha ocurrido algún error o no se han podido determinar coordenadas contiene #GEOC_NAN. \note El polígono ha de ser único, sin huecos. Es opcional repetir las coordenadas del primer punto al final del listado \note Esta función asume que el polígono está correctamente definido (que tiene los vértices suficientes para considerarse tal) Puede tener autointersecciones. \note El punto generado \b*NO* es aleatorio, sino que se busca a partir de la generación de triángulos con los vértices del polígono. Queda garantizado que ejecuciones con los mismos parámetros producirán siempre idéntico resultado. \note Los vértices del polígono pueden listarse en sentido dextrógiro o levógiro. \date 11 de mayo de 2020: Creación de la función. \todo Esta función no está probada. */ void GeneraPtoEnPoligono(const double* coorX, const double* coorY, const size_t N, const size_t incX, const size_t incY, const double factor, const int redondeo, double* x, double* y); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/dpeuckera.h000644 001750 001750 00000026665 12463476253 017517 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeuckera.h \brief Declaración de elementos y funciones auxiliares para el uso de la familia de algoritmos de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \date 18 de agosto de 2013 \copyright Copyright (c) 2013-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _DPEUCKERA_H_ #define _DPEUCKERA_H_ /******************************************************************************/ /******************************************************************************/ #include #include"libgeoc/arco.h" #include"libgeoc/errores.h" #include"libgeoc/ptopol.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_DPEUCKER_BUFFER_PTOS \brief Número de puntos para ir asignando memoria en bloques para el vector de salida de las funciones de aligerado de polilíneas. \date 17 de agosto de 2013: Creación de la constante. */ #define GEOC_DPEUCKER_BUFFER_PTOS 1000 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_DPEUCKER_NO_INTERSEC \brief Identificador de que dos segmentos o arcos no se cortan. \date 18 de agosto de 2013: Creación de la constante. */ #define GEOC_DPEUCKER_NO_INTERSEC 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_DP_RECT_DISJ \brief Comprueba si dos rectángulos son disjuntos. \param[in] esf Identificador de trabajo sobre la superficie de la esfera. Dos posibilidades: - 0: No se trabaja sobre la superficie de la esfere, sino en el plano. - Distinto de 0: Se trabaja sobre la superficie de la esfera de radio unidad. \param[in] tol Tolerancia angular, en radianes. Indica el valor por debajo del cual dos ángulos se consideran iguales. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] xMin1 Coordenada X o longitud, en radianes, mínima del rectángulo 1. \param[in] xMax1 Coordenada X o longitud, en radianes, máxima del rectángulo 1. \param[in] yMin1 Coordenada Y o latitud, en radianes, mínima del rectángulo 1. \param[in] yMax1 Coordenada Y o latitud, en radianes, máxima del rectángulo 1. \param[in] xMin2 Coordenada X o longitud, en radianes, mínima del rectángulo 2. \param[in] xMax2 Coordenada X o longitud, en radianes, máxima del rectángulo 2. \param[in] yMin2 Coordenada Y o latitud, en radianes, mínima del rectángulo 2. \param[in] yMax2 Coordenada Y o latitud, en radianes, máxima del rectángulo 2. \return Dos posibilidades: - 0: Los rectángulos no son disjuntos, es decir, tienen alguna parte común (se cortan o se tocan) o uno está completamente contenido en el otro. - Distinto de 0: Los rectángulos son disjuntos. \note Esta función asume que \em xMin1 #include"libgeoc/dpeuckera.h" #include"libgeoc/dpeuckere.h" #include"libgeoc/dpeuckerp.h" #include"libgeoc/errores.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea mediante una familia de algoritmos basados en el de Douglas-Peucker. \param[in] x Vector que contiene las coordenadas X o las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y o las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices. Dos posibilidades: - Si se trabaja en coordenadas planas, este argumento ha de estar en las mismas unidades que las coordenadas de los vértices. - Si se trabaja sobre la esfera, este argumento ha de ser una longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: Utiliza el algoritmo de Douglas-Peucker original, que no es robusto. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos/arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos/arcos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos/arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos/arcos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de segmentos/arcos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los segmentos/arcos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los segmentos hasta el inicio de la polilínea aligerada. \param[in] esf Identificador de trabajo sobre la superficie de la esfera. Dos posibilidades: - 0: No se trabaja sobre la superficie de la esfera, sino en el plano. - Distinto de 0: Se trabaja sobre la superficie de la esfera de radio unidad. \param[out] nPtosSal Número de puntos de la polilínea aligerada. \return Vector de \em nPtosSal elementos que contiene los índices en los vectores \em x e \em y de los vértices que formarán la polilínea aligerada. Si ocurre algún error de asignación de memoria se devuelve el valor \p NULL. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que \em nPtos es mayor que 0. En caso contrario, devuelve \p NULL, por lo que un valor de retorno igual a \p NULL sólo es indicativo de error cuando \em nPtos es mayor que 0. \note Esta función comprueba los casos especiales con \ref CasosEspecialesAligeraPolilinea. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 25 de mayo de 2012: Creación de la función. \date 08 de agosto de 2013: Comprobación de casos especiales. \date 17 de agosto de 2013: Unificación de las funciones de aligerado en el plano y en la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \date 21 de septiembre de 2013: Adición de la capacidad de trabajar sobre la esfera con el algoritmo de Douglas-Peucker original. \todo Esta función todavía no está probada. */ size_t* AligeraPolilinea(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, const int esf, size_t* nPtosSal); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea mediante el algoritmo original de Douglas-Peucker. \param[in] x Vector que contiene las coordenadas X o las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y o las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices. Dos posibilidades: - Si se trabaja en coordenadas planas, este argumento ha de estar en las mismas unidades que las coordenadas de los vértices. - Si se trabaja sobre la esfera, este argumento ha de ser una longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] esf Identificador de trabajo sobre la superficie de la esfera. Dos posibilidades: - 0: No se trabaja sobre la superficie de la esfera, sino en el plano. - Distinto de 0: Se trabaja sobre la superficie de la esfera de radio unidad. \param[out] nPtosSal Número de puntos de la polilínea aligerada. \return Vector de \em nPtosSal elementos que contiene los índices en los vectores \em x e \em y de los vértices que formarán la polilínea aligerada. Si ocurre algún error de asignación de memoria se devuelve el valor \p NULL. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que \em nPtos es mayor que 0. En caso contrario, devuelve \p NULL, por lo que un valor de retorno igual a \p NULL sólo es indicativo de error cuando \em nPtos es mayor que 0. \note Esta función puede devolver resultados erróneos si algún segmento base es mayor o igual que \f$\pi\f$. \date 21 de septiembre de 2013: Creación de la función. \todo Esta función todavía no está probada. */ size_t* DouglasPeuckerOriginal(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int esf, size_t* nPtosSal); /******************************************************************************/ /******************************************************************************/ /** \brief Elimina vértices de una polilínea mediante un algoritmo no recursivo, inspirado en el de Douglas-Peucker. \brief Este algoritmo, comenzando por el primer punto de la polilínea, va uniendo puntos en segmentos/arcos de tal forma que se eliminan todos aquellos puntos que queden a una distancia menor o igual a \em tol del segmento/arco de trabajo. Así aplicado, pueden ocurrir casos singulares en los que la polilínea aligerada tenga casos de auto intersección entre sus lados resultantes. Para evitar esto, se puede aplicar la versión robusta del algoritmo. \param[in] x Vector que contiene las coordenadas X o las longitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] y Vector que contiene las coordenadas Y o las latitudes, en radianes, de los vértices de la polilínea de trabajo. \param[in] nPtos Número de elementos de los vectores \em x e \em y. \param[in] incX Posiciones de separación entre los elementos del vector \em x. Este argumento siempre ha de ser un número positivo. \param[in] incY Posiciones de separación entre los elementos del vector \em y. Este argumento siempre ha de ser un número positivo. \param[in] tol Tolerancia para eliminar vértices. Dos posibilidades: - Si se trabaja en coordenadas planas, este argumento ha de estar en las mismas unidades que las coordenadas de los vértices. - Si se trabaja sobre la esfera, este argumento ha de ser una longitud de arco de círculo máximo sobre la esfera de radio unidad. \param[in] paralelizaTol Identificador para evaluar o no en paralelo si los puntos candidatos están en tolerancia. Dos posibilidades: - 0: Se evalúa en serie (aunque la compilación se haya hecho en paralelo) si los puntos están en tolerancia. - Distinto de 0: Se evalúa en paralelo (sólo si se ha compilado en paralelo) si los puntos están en tolerancia. \param[in] robusto Identificador para realizar o no un aligerado robusto. Ha de ser un elemento del tipo enumerado #GEOC_DPEUCKER_ROBUSTO. Varias posibilidades: - #GeocDPeuckerOriginal: En este caso esta opción es equivalente a pasar #GeocDPeuckerRobNo. - #GeocDPeuckerRobNo: Utiliza la variación no recursiva del algoritmo de Douglas-Peucker, que no es robusta. - #GeocDPeuckerRobSi: Se aplica el algoritmo robusto completo, que garantiza la no ocurrencia de auto intersecciones en la polilínea resultante. Internamente, primero se aplica el tratamiento robusto de la opción #GeocDPeuckerRobOrig y luego el de la opción #GeocDPeuckerRobAuto. - #GeocDPeuckerRobOrig: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos/arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos/arcos que forman los vértices que quedan por procesar de la polilínea original. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. - #GeocDPeuckerRobAuto: Se aplica un algoritmo semi robusto que consiste en garantizar que los segmentos/arcos de la polilínea aligerada que se van creando no intersectarán con ninguno de los segmentos/arcos de la polilínea aligerada creados con anterioridad. En casos muy especiales, este algoritmo puede seguir dando lugar a auto intersecciones. \param[in] nSegRobOrig Número de segmentos/arcos de la polilínea original a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobOrig. Si se pasa el valor 0, se utilizan todos los segmentos/arcos hasta el final de la polilínea original. \param[in] nSegRobAuto Número de segmentos de la polilínea aligerada a utilizar en el caso de tratamiento robusto con las opciones #GeocDPeuckerRobSi o #GeocDPeuckerRobAuto. Si se pasa el valor 0, se utilizan todos los segmentos hasta el inicio de la polilínea aligerada. \param[in] esf Identificador de trabajo sobre la superficie de la esfera. Dos posibilidades: - 0: No se trabaja sobre la superficie de la esfera, sino en el plano. - Distinto de 0: Se trabaja sobre la superficie de la esfera de radio unidad. \param[out] nPtosSal Número de puntos de la polilínea aligerada. \return Vector de \em nPtosSal elementos que contiene los índices en los vectores \em x e \em y de los vértices que formarán la polilínea aligerada. Si ocurre algún error de asignación de memoria se devuelve el valor \p NULL. \note Esta función no comprueba si el número de elementos de los vectores \em x e \em y es congruente con el valor pasado en \em nPtos. \note Esta función asume que \em nPtos es mayor que 0. En caso contrario, devuelve \p NULL, por lo que un valor de retorno igual a \p NULL sólo es indicativo de error cuando \em nPtos es mayor que 0. \note Esta función comprueba los casos especiales con \ref CasosEspecialesAligeraPolilinea. \note El argumento \em paralelizaTol \b SÓLO afecta a la paralelización de la comprobación de puntos en tolerancia. Los chequeos de intersección de segmentos/arcos siempre se hacen en paralelo (si el código ha sido compilado al efecto). \date 07 de julio de 2011: Creación de la función. \date 10 de julio de 2011: Cambio del tipo del argumento \em robusto al tipo enumerado #GEOC_DPEUCKER_ROBUSTO. \date 14 de mayo de 2012: Corregido bug que hacía que no se escogiese bien el vértice a añadir a la polilínea aligerada. \date 25 de mayo de 2012: Cambio de nombre de la función. \date 17 de agosto de 2013: Comprobación de casos especiales y unificación de las funciones de aligerado en el plano y en la esfera. \date 20 de agosto de 2013: Sustitución de las antiguas variables de entrada \em nPtosRobusto y \em nSegRobusto por \em nSegRobOrig y \em nSegRobAuto. \date 23 de agosto de 2013: Adición del argumento de entrada \em paralelizaTol. \todo Esta función todavía no está probada. */ size_t* DouglasPeuckerRobusto(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, const int esf, size_t* nPtosSal); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/geom.h000755 001750 001750 00000006405 13655033577 016476 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup geom Módulo GEOMETRIA \brief En este módulo se reúnen las funciones necesarias para el tratamiento de problemas de geometría. @{ \file geom.h \brief Inclusión de ficheros de cabecera para el trabajo con la biblioteca GEOMETRIA. \author José Luis García Pallero, jgpallero@gmail.com \date 26 de diciembre de 2009 \section Licencia Licencia Copyright (c) 2009-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _GEOM_H_ #define _GEOM_H_ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/dpeucker.h" #include"libgeoc/eucli.h" #include"libgeoc/greiner.h" #include"libgeoc/polig.h" #include"libgeoc/polil.h" #include"libgeoc/ptopol.h" #include"libgeoc/recpolil.h" #include"libgeoc/segmento.h" /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/proyecaux.h000644 001750 001750 00000011067 12463477176 017566 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup gshhs geom proyec @{ \file proyecaux.h \brief Declaración de funciones de algunas proyecciones cartográficas para no usar PROJ.4. \author José Luis García Pallero, jgpallero@gmail.com \date 16 de agosto de 2013 \copyright Copyright (c) 2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _PROYECAUX_H_ #define _PROYECAUX_H_ /******************************************************************************/ /******************************************************************************/ #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \brief Proyecta un punto según la proyección cilíndrica equivalente de Lambert, siendo el paralelo origen el ecuador. \param[in] lat Latitud geodésica del punto de trabajo, en radianes. \param[in] lon Longitud geodésica del punto de trabajo, en radianes. \param[in] lon0 Longitud geodésica origen, en radianes. \param[in] a Semieje mayor del elipsoide, en metros. \param[in] f Aplanamiento del elipsoide. \param[out] x Coordenada X proyectada. \param[out] y Coordenada Y proyectada. \note El incremento \em lon-lon0 no puede estar fuera del intervalo \f$[-\pi,\pi]\f$. \date 22 de junio de 2011: Creación de la función. \date 15 de noviembre de 2013: Adición de la capacidad de cálculo con puntos sobre la esfera. */ void ProjCilinEquivLambertLat0Ec(const double lat, const double lon, const double lon0, const double a, const double f, double* x, double* y); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/segmento.h000755 001750 001750 00000046022 12463476354 017367 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file segmento.h \brief Declaración de funciones para la realización de cálculos con segmentos. \author José Luis García Pallero, jgpallero@gmail.com \date 22 de abril de 2011 \copyright Copyright (c) 2011-2013, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _SEGMENTO_H_ #define _SEGMENTO_H_ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/fgeneral.h" #include"libgeoc/ptopol.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_NO_INTERSEC \brief Identificador de que dos segmentos no se cortan. \date 14 de mayo de 2011: Creación de la constante. */ #define GEOC_SEG_NO_INTERSEC 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC \brief Identificador de que dos segmentos se cortan en un punto, pero no son colineales. \date 14 de mayo de 2011: Creación de la constante. */ #define GEOC_SEG_INTERSEC 1 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN \brief Identificador de que dos segmentos se cortan en un punto, el cual es un extremo que está encima del otro segmento (excluidos los extremos de este otro segmento), pero no son colineales. \date 14 de mayo de 2011: Creación de la constante. */ #define GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN 2 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN \brief Identificador de que dos segmentos tienen un extremo común, pero no son colineales. \date 10 de agosto de 2013: Creación de la constante. */ #define GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN 3 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC_EXTREMOS_COLIN \brief Identificador de que dos segmentos tienen un solo extremo común y son colineales. \date 14 de mayo de 2011: Creación de la constante. \date 10 de agosto de 2013: Cambio de nombre de la constante. */ #define GEOC_SEG_INTERSEC_EXTREMOS_COLIN 4 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC_MISMO_SEG \brief Identificador de que dos segmentos tienen todos sus puntos extremos en común. \date 21 de mayo de 2011: Creación de la constante. */ #define GEOC_SEG_INTERSEC_MISMO_SEG 5 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_SEG_INTERSEC_COLIN \brief Identificador de que dos segmentos tienen más de un punto en común, es decir, se solapan, pero no son el mismo segmento. \date 14 de mayo de 2011: Creación de la constante. */ #define GEOC_SEG_INTERSEC_COLIN 6 /******************************************************************************/ /******************************************************************************/ /** \def POS_PTO_RECTA_2D \brief Calcula la posición relativa de un punto con respecto a una recta en el plano. \param[in] x Coordenada X del punto de trabajo. \param[in] y Coordenada Y del punto de trabajo. \param[in] xIni Coordenada X del punto inicial del segmento que define la recta. \param[in] yIni Coordenada Y del punto inicial del segmento que define la recta. \param[in] xFin Coordenada X del punto final del segmento que define la recta. \param[in] yFin Coordenada Y del punto final del segmento que define la recta. \return Varias posibilidades: - Menor que 0: El punto está a la derecha de la recta. - 0: El punto pertenece a la recta. - Mayor que 0: El punto está a la izquierda de la recta. \note Para la definición de derecha e izquierda, se considera que el sentido de la recta es aquél que se define del punto de inicio al punto final del segmento de trabajo. \note El resultado de esta macro no es robusto, es decir, puede dar resultados incorrectos debido a errores de redondeo (salvo que todas las coordenadas pasadas sean números enteros). \note Para evitar errores por desbordamiento, es conveniente utilizar esta macro con las coordenadas de los argumentos de entrada reducidas al centroide. \note El código de esta macro ha sido tomado de la función orient2dfast(), de http://www.cs.cmu.edu/afs/cs/project/quake/public/code/predicates.c \date 20 de abril de 2010: Creación de la función. \date 14 de mayo de 2011: Cambio de nombre a la función. \date 10 de agosto de 2013: Conversión de la antigua función en esta macro. */ #define POS_PTO_RECTA_2D(x,y,xIni,yIni,xFin,yFin) \ (((xIni)-(x))*((yFin)-(y))-((xFin)-(x))*((yIni)-(y))) /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si tres puntos (A, B, C) del plano son colineales. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] xC Coordenada X del punto C. \param[in] yC Coordenada Y del punto C. \return Dos posibilidades: - 0: Los puntos no son colineales. - Distinto de 0: Los puntos son colineales. \note Esta función utiliza internamente la macro \ref POS_PTO_RECTA_2D, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \note Esta función sirve de apoyo para \ref PtoComunSegmParalelos2D. \note Para evitar errores por desbordamiento, es conveniente utilizar esta función con las coordenadas de los argumentos de entrada reducidas al centroide. \date 14 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int TresPuntosColineales2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un punto está situado entre dos puntos (pero no es igual a ninguno de ellos) en el plano. Se asume que los tres puntos son colineales. \param[in] x Coordenada X del punto a comprobar. \param[in] y Coordenada Y del punto a comprobar. \param[in] xA Coordenada X del primer punto del segmento. \param[in] yA Coordenada Y del primer punto del segmento. \param[in] xB Coordenada X del segundo punto del segmento. \param[in] yB Coordenada Y del segundo punto del segmento. \return Dos posibilidades: - 0: El punto de trabajo no está situado entre los dos puntos dato o es igual a alguno de ellos. - Distinto de 0: El punto de trabajo sí está situado entre los dos puntos dato. \note Esta función sirve de apoyo para \ref PtoComunSegmParalelos2D. \date 14 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ int PuntoEntreDosPuntos2DColin(const double x, const double y, const double xA, const double yA, const double xB, const double yB); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula un punto común entre dos segmentos paralelos AB y CD. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] xC Coordenada X del punto C. \param[in] yC Coordenada Y del punto C. \param[in] xD Coordenada X del punto D. \param[in] yD Coordenada Y del punto D. \param[out] x Coordenada X del punto común. \param[out] y Coordenada Y del punto común. \return Dos posibilidades: - #GEOC_SEG_NO_INTERSEC: Los segmentos no tienen ningún punto en común. - #GEOC_SEG_INTERSEC_EXTREMOS_COLIN: Los segmentos tienen un extremo común y son colineales. - #GEOC_SEG_INTERSEC_MISMO_SEG: Los dos segmentos son idénticos. - #GEOC_SEG_INTERSEC_COLIN: Los segmentos tienen más de un punto en común. \note Esta función sirve de apoyo para \ref IntersecSegmentos2D. \note Esta función utiliza internamente la función \ref TresPuntosColineales2D, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \note Si los segmentos se tocan en los dos extremos (son el mismo segmento), las coordenadas devueltas son siempre las del vértice A. \note Si los segmentos tienen más de un punto en común, pero no son el mismo segmento, las coordenadas de salida siempre son las de un punto extremo de un segmento. Este punto extremo se intentará que sea uno de los puntos iniciales de algún segmento, anque si no lo es, será uno de los finales. El orden de preferencia de las coordenadas de salida es: A, C, B, D. \note Para evitar errores por desbordamiento, es conveniente utilizar esta función con las coordenadas de los argumentos de entrada reducidas al centroide. \date 14 de mayo de 2011: Creación de la función. \date 21 de mayo de 2011: Adición de nuevos valores de salida: #GEOC_SEG_INTERSEC_EXTREMOS_COLIN y #GEOC_SEG_INTERSEC_MISMO_SEG. \todo Esta función no está probada. */ int PtoComunSegmParalelos2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, double* x, double* y); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos segmentos AB y CD en el plano. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] xC Coordenada X del punto C. \param[in] yC Coordenada Y del punto C. \param[in] xD Coordenada X del punto D. \param[in] yD Coordenada Y del punto D. \param[out] x Coordenada X del punto común. \param[out] y Coordenada Y del punto común. \return Siete posibilidades: - #GEOC_SEG_NO_INTERSEC: Los segmentos no tienen ningún punto en común. - #GEOC_SEG_INTERSEC: Los segmentos se cortan en un punto. - #GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN: El extremo de un segmento toca al otro segmento en un punto (excluidos los extremos del segungo), pero los segmentos no son colineales. - #GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN: Los segmentos tienen un extremo común, pero no son colineales. - #GEOC_SEG_INTERSEC_EXTREMOS_COLIN: Los segmentos tienen un extremo común y son colineales. - #GEOC_SEG_INTERSEC_MISMO_SEG: Los dos segmentos son idénticos. - #GEOC_SEG_INTERSEC_COLIN: Los segmentos tienen más de un punto en común. \note Esta función utiliza internamente la función \ref PtoComunSegmParalelos2D, que no es robusta. En consecuencia, los resultados de esta función tampoco lo son. \note Si los segmentos se tocan en los dos extremos (son el mismo segmento), las coordenadas devueltas son siempre las del vértice A. \note Si los segmentos tienen más de un punto en común, pero no son el mismo segmento, las coordenadas de salida siempre son las de un punto extremo de un segmento. Este punto extremo se intentará que sea uno de los puntos iniciales de algún segmento, anque si no lo es, será uno de los finales. El orden de preferencia de las coordenadas de salida es: A, C, B, D. \note Si los segmentos no se tocan, los valores devueltos en \em x e \em y no tienen sentido. \date 14 de mayo de 2011: Creación de la función. \date 21 de mayo de 2011: Adición de un nuevo valor de salida: #GEOC_SEG_INTERSEC_MISMO_SEG. \date 06 de julio de 2011: Adición de chequeo rápido al principio de la función para descartar que los segmentos no tienen ningún punto en común. \date 10 de agosto de 2013: Adición de un nuevo valor de salida: #GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN. */ int IntersecSegmentos2D(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, double* x, double* y); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección, de manera simplificada, de dos segmentos AB y CD en el plano. \param[in] xA Coordenada X del punto A. \param[in] yA Coordenada Y del punto A. \param[in] xB Coordenada X del punto B. \param[in] yB Coordenada Y del punto B. \param[in] xC Coordenada X del punto C. \param[in] yC Coordenada Y del punto C. \param[in] xD Coordenada X del punto D. \param[in] yD Coordenada Y del punto D. \return Dos posibilidades: - #GEOC_SEG_NO_INTERSEC: No hay intersección, los segmentos no tienen ningún punto en común. - #GEOC_SEG_INTERSEC: Los segmentos se cortan; tienen, al menos, un punto en común. \note Esta función utiliza internamente la macro \ref POS_PTO_RECTA_2D y la función \ref PuntoEntreDosPuntos2DColin, las cuales no son robustas. En consecuencia, los resultados de esta función tampoco lo son. \note Para casos de intersección limpia, esta función es, como término medio, un 20% más rápida que \ref IntersecSegmentos2D. El hardware en el que se han hecho las pruebas es Intel Pentium M 1.3 GHz. \date 10 de agosto de 2013: Creación de la función. */ int IntersecSegmentos2DSimple(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD); /******************************************************************************/ /******************************************************************************/ /** \brief Convierte el valor de salida de la función \ref IntersecSegmentos2D en el equivalente de la función \ref IntersecSegmentos2DSimple. \param[in] cod2D Código de salida de la función \ref IntersecSegmentos2D. \return Código de salida equivalente de la función \ref IntersecSegmentos2DSimple. Las equivalencias son: - #GEOC_SEG_NO_INTERSEC -> #GEOC_SEG_NO_INTERSEC. - #GEOC_SEG_INTERSEC -> #GEOC_SEG_INTERSEC. - #GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN -> #GEOC_SEG_INTERSEC. - #GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN -> #GEOC_SEG_INTERSEC. - #GEOC_SEG_INTERSEC_EXTREMOS_COLIN -> #GEOC_SEG_INTERSEC. - #GEOC_SEG_INTERSEC_MISMO_SEG -> #GEOC_SEG_INTERSEC. - #GEOC_SEG_INTERSEC_COLIN -> #GEOC_SEG_INTERSEC. - Otro valor cualquiera -> #GEOC_SEG_NO_INTERSEC. \date 10 de agosto de 2013: Creación de la función. */ int CodIntSeg2DCodIntSeg2DSimple(const int cod2D); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/geocnan.h000755 001750 001750 00000027464 13655033577 017171 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup geocnan Módulo GEOCNAN \ingroup geom matriz gshhs \brief En este módulo se reúnen constantes y funciones para el trabajo con valores Not-a-Number. @{ \file geocnan.h \brief Declaración de constantes y funciones para el trabajo con valores Not-a-Number. \author José Luis García Pallero, jgpallero@gmail.com \date 26 de mayo de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2010-2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _GEOCNAN_H_ #define _GEOCNAN_H_ /******************************************************************************/ /******************************************************************************/ #include #include #include #include #include"libgeoc/errores.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_NAN \brief Constante \em Not-a-Number (\em NaN). Se define como \em 0.0/0.0. \date 21 de diciembre de 2010: Creación de la constante. */ #define GEOC_NAN (0.0/0.0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_NAN_TXT \brief Constante \em Not-a-Number (\em NaN), como cadena de texto. \date 22 de septiembre de 2011: Creación de la constante. */ #define GEOC_NAN_TXT "NaN" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_NAN_LON_FORM_NUM_SIMPLE \brief Longitud de una cadena de texto auxiliar para el cálculo de la longitud de una cadena de formato numérico simple. \date 22 de septiembre de 2011: Creación de la constante. */ #define GEOC_NAN_LON_FORM_NUM_SIMPLE 100 /******************************************************************************/ /******************************************************************************/ /** \brief Devuelve el número que representa el valor \em Not-a-Number (\em NaN), que se define como el resultado de la evaluación de la operación \em 0.0/0.0. \return Valor NaN. \note Esta función devuelve el valor almacenado en la constante #GEOC_NAN. \date 21 de diciembre de 2010: Creación de la función. \date 24 de mayo de 2011: Ahora la función devuelve el valor absoluto de #GEOC_NAN, calculado con la función fabs() de C estándar. Se ha hecho así porque, a veces, al imprimir un valor normal de #GEOC_NAN, éste aparecía con un signo negativo delante. \date 22 de septiembre de 2011: Lo del fabs() no funciona. Parece que los problemas en la impresión dependen del compilador y los flags de optimización utilizados. No obstante, se mantiene el uso de la función fabs() en el código. \todo Esta función todavía no está probada. */ double GeocNan(void); /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si un número es \em Not-a-Number (\em NaN). \param[in] valor Un número. \return Dos posibilidades: - 0: El número pasado no es NaN. - Distinto de 0: El número pasado sí es NaN. \note Esta función ha sido adaptada de LAPACK 3.2.1, disnan.f, (http://www.netlib.org/lapack). \date 21 de diciembre de 2010: Creación de la función. \todo Esta función todavía no está probada. */ int EsGeocNan(const double valor); /******************************************************************************/ /******************************************************************************/ /** \brief Busca valores #GEOC_NAN es un vector de datos. \param[in] datos Vector de trabajo. \param[in] nDatos Número de elementos que contiene el vector \em datos. \param[in] incDatos Posiciones de separación entre los elementos del vector \em datos. Este argumento siempre ha de ser un número positivo. \param[out] nNan Número de valores #GEOC_NAN encontrados, que es el número de elementos del vector de salida. \return Varias posibilidades: - Si todo ha ido bien, vector que contiene las posiciones en el vector original donde se almacena el valor #GEOC_NAN. - NULL: Pueden haber ocurrido dos cosas: - Si \em nNan vale 0, en los datos de entrada no hay ningún valor #GEOC_NAN. - Si \em nNan es mayor que 0, ha ocurrido un error interno de asignación de memoria. \note Esta función no comprueba si el número de elementos del vector \em datos es congruente con los valores pasados en \em nDatos e \em incDatos. \note Las posiciones de los elementos #GEOC_NAN encontradas se refieren al número de elementos \em nDatos del vector de trabajo. Para encontrar la posición real en memoria es necesario tener en cuenta la variable \em incDatos. \date 26 de mayo de 2011: Creación de la función. \todo Esta función no está probada. */ size_t* PosGeocNanEnVector(const double* datos, const size_t nDatos, const size_t incDatos, size_t* nNan); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula el número de carácteres que ocupa un valor numérico imprimido con determinado formato. \param[in] formato Cadena de formato para imprimir \b *UN \b ÚNICO* valor numérico (de cualquier tipo). \return Número de carácteres que ocupa un valor numérico imprimido según el formato pasado. \note Esta función no comprueba internamente si la cadena de formato es correcta. \note \em formato no puede dar lugar a un texto impreso de más de #GEOC_NAN_LON_FORM_NUM_SIMPLE carácteres. \date 22 de septiembre de 2011: Creación de la función. \todo Esta función todavía no está probada. */ size_t LonFormatoNumSimple(const char formato[]); /******************************************************************************/ /******************************************************************************/ /** \brief Convierte una cadena de formato para imprimir un \b *ÚNICO* número en una cadena para imprimir texto con el mismo ancho que el que tendría de haber sido imprimida como número. \param[in] formatoNum Cadena de formato para imprimir \b *UN \b ÚNICO* valor numérico (de cualquier tipo). \param[out] formatoTexto Cadena de texto que almacenará la cadena de formato para la impresión en modo texto. \note Esta función no comprueba internamente si la cadena de formato numérico es correcta. \note \em formatoNum no puede dar lugar a un texto impreso de más de #GEOC_NAN_LON_FORM_NUM_SIMPLE carácteres. \note Esta función asume que \em formatoTexto tiene espacio suficiente para almacenar la cadena de salida. \note Si \em formatoNum contiene al final carácteres de retorno de carro y salto de línea, estos no son tenidos en cuenta en la creación de la cadena de salida (no son tenidos en cuenta en el sentido de que no se añaden al formato de salida, pero el espacio que ocupan sí se computa). \date 22 de septiembre de 2011: Creación de la función. \todo Esta función todavía no está probada. */ void FormatoNumFormatoTexto(const char formatoNum[], char formatoTexto[]); /******************************************************************************/ /******************************************************************************/ /** \brief Imprime valores Not-a-Number en modo texto (#GEOC_NAN_TXT) es un fichero. \param[in] idFich Identificador del fichero de trabajo, abierto para escribir. \param[in] nNan Número de veces que se ha de imprimir el valor #GEOC_NAN_TXT, una a continuación de otra. \param[in] formato Cadena de formato para la impresión de cada valor #GEOC_NAN_TXT. \param[in] retCarro Identificador para añadir un retorno de carro y cambio de línea al final de la impresión de datos, independientemente del valor pasado en el argumento \em formato. Dos posibilidades: - 0: No se imprime retorno de carro y cambio de línea al final. - Distinto de 0: Sí se imprime retorno de carro y cambio de línea al final. \note Esta función no comprueba internamente si el fichero de entrada está abierto correctamente. \note Esta función no comprueba internamente si la cadena de formato es correcta. \note Si se ha indicado que se imprima salto de línea y retorno de carro al final, este se imprime aunque \em nNan valga 0. \date 22 de septiembre de 2011: Creación de la función. \todo Esta función no está probada. */ void ImprimeGeocNanTexto(FILE* idFich, const size_t nNan, const char formato[], const int retCarro); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/geocomp.h000644 001750 001750 00000023114 13655033577 017171 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \defgroup geocomp Módulo GEOC-OMP \ingroup anespec general geodesia geom geopot gravim mmcc \brief En este módulo se reúnen constantes y funciones para la obtención de información de la implementación de OpenMP usada. @{ \file geocomp.h \brief Declaración de macros y funciones para la obtención de información de la implementación de OpenMP usada. \author José Luis García Pallero, jgpallero@gmail.com \date 25 de agosto de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _GEOCOMP_H_ #define _GEOCOMP_H_ /******************************************************************************/ /******************************************************************************/ #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_1_0 \brief Valor (fecha YYYYMM) de la macro \p _OPENMP para la versión 1.0 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_1_0 (199810) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_2_0 \brief Valor (fecha YYYYMM) de la macro \p _OPENMP para la versión 2.0 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_2_0 (200203) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_2_5 \brief Valor (fecha YYYYMM) de la macro \p _OPENMP para la versión 2.5 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_2_5 (200505) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_3_0 \brief Valor (fecha YYYYMM) de la macro \p _OPENMP para la versión 3.0 de OpenMP. \date 22 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_3_0 (200805) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_3_1 \brief Valor (fecha YYYYMM) de la macro \p _OPENMP para la versión 3.1 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_3_1 (201107) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_1_0 \brief Cadena de texto identificadora de la versión 1.0 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_1_0 "1.0" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_2_0 \brief Cadena de texto identificadora de la versión 2.0 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_2_0 "2.0" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_2_5 \brief Cadena de texto identificadora de la versión 2.5 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_2_5 "2.5" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_3_0 \brief Cadena de texto identificadora de la versión 3.0 de OpenMP. \date 22 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_3_0 "3.0" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_3_1 \brief Cadena de texto identificadora de la versión 3.1 de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_3_1 "3.1" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_F_DESC \brief Fecha de versión de OpenMP desconocida. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_F_DESC (0) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_V_DESC \brief Versión de OpenMP correspondiente a un valor desconocido de la macro \p _OPENMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_V_DESC "0.0" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_OMP_LON_CAD_VERS \brief Longitud de la cadena de texto que almacena la versión de OpenMP. \date 25 de agosto de 2011: Creación de la constante. */ #define GEOC_OMP_LON_CAD_VERS (10) /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la versión de OpenMP a partir del valor de la macro \p _OPENMP. \param[in] macro_OPENMP Valor de la macro \p _OPENMP. \param[out] version Versión de OpenMP correspondiente al valor de la macro. Si el argumento \em macro_OPENMP almacena un valor desconocido, se devuelve #GEOC_OMP_V_DESC. \note Esta función asume que \em version tiene asignada suficiente memoria: como mínimo, espacio para una cadena de #GEOC_OMP_LON_CAD_VERS carácteres. \date 25 de agosto de 2011: Creación de la función. */ void VersionOpenMP(const int macro_OPENMP, char version[]); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la fecha (el valor de la macro \p _OPENMP) de una versión de OpenMP dada. \param[in] version Cadena de versión de OpenMP, tal como es calculada por la función \ref VersionOpenMP. \return Fecha, en el formato YYYYMM, correspondiente a la versión. Este valor debería coincidir con la macro \p _OPENMP de la implementación de OpenMP usada. \note En caso de pasar una cadena de versión errónea o desconocida, la función devuelve #GEOC_OMP_F_DESC. \date 25 de agosto de 2011: Creación de la función. */ int FechaVersionOpenMP(const char version[]); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/arco.h000644 001750 001750 00000104524 12463476227 016470 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file arco.h \brief Declaración de funciones para la realización de cálculos con arcos de circunferencia. \author José Luis García Pallero, jgpallero@gmail.com \date 08 de agosto de 2013 \copyright Copyright (c) 2013-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _ARCO_H_ #define _ARCO_H_ /******************************************************************************/ /******************************************************************************/ #include #include"libgeoc/constantes.h" #include"libgeoc/fgeneral.h" #include"libgeoc/geocnan.h" #include"libgeoc/mate.h" #include"libgeoc/ptopol.h" /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_RES_ANG \brief Resolución angular por debajo de la cual no se distinguirán dos valores angulares en radianes. \note Esta constante ha de ser \b SIEMPRE positiva. \date 14 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_RES_ANG (1.0e-12) /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_NO_INTERSEC \brief Identificador de que dos arcos no se cortan. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_NO_INTERSEC 0 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC \brief Identificador de que dos arcos se cortan en un punto, pero no son colineales. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC 1 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN \brief Identificador de que dos arcos se cortan en un punto, el cual es un extremo que está encima del otro arco, pero no son colineales. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN 2 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN \brief Identificador de que dos arcos tienen un extremo común, pero no son colineales. \date 13 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN 3 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC_EXTREMOS_COLIN \brief Identificador de que dos arcos tienen un punto común y son colineales. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC_EXTREMOS_COLIN 4 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC_MISMO_ARC \brief Identificador de que dos arcos tienen todos sus puntos extremos en común. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC_MISMO_ARC 5 /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ARC_INTERSEC_COLIN \brief Identificador de que dos arcos tienen más de un punto en común, es decir, se solapan, pero no son el mismo arco. \date 08 de agosto de 2013: Creación de la constante. */ #define GEOC_ARC_INTERSEC_COLIN 6 /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si dos rectángulos sobre la superficie de la esfera son disjuntos, atendiendo únicamente a la coordenada longitud geodésica. \param[in] tol Tolerancia angular, en radianes. Indica el valor por debajo del cual dos ángulos se consideran iguales. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] lonMin1 Longitud mínima del rectángulo 1, en radianes. \param[in] lonMax1 Longitud máxima del rectángulo 1, en radianes. \param[in] lonMin2 Longitud mínima del rectángulo 2, en radianes. \param[in] lonMax2 Longitud máxima del rectángulo 2, en radianes. \return Dos posibilidades: - 0: Los rectángulos no son disjuntos, es decir, tienen alguna parte común (se cortan o se tocan) o uno está completamente contenido en el otro. - Distinto de 0: Los rectángulos son disjuntos. \note Esta función asume que \em lonMin1mRot[fil][com]. \note El dominio de salida del acimut es \f$[0,2\pi[\f$. \date 13 de agosto de 2013: Creación de la función. \date 23 de septiembre de 2013: Adición del argumento \em tol. \todo Esta función no está probada. */ double AcimutArcoCircMaxEsf(const double tol, const double latA, const double lonA, const double latB, const double lonB, double mRot[][3]); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula una matriz de rotación tal que, aplicada a un arco de círculo máximo AB sobre la esfera, el punto A sea el punto de coordenadas \f$(\varphi=0,\lambda=0)\f$ y el B esté contenido en el ecuador. \param[in] tol Tolerancia angular, en radianes. Indica el valor por debajo del cual dos ángulos se consideran iguales. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] latA Latitud del punto A, en radianes. \param[in] lonA Longitud del punto A, en radianes. \param[in] latB Latitud del punto B, en radianes. \param[in] lonB Longitud del punto B, en radianes. \param[out] mRot Matriz de rotación para aplicar a las coordenadas cartesianas tridimensionales geocéntricas de los extremos de un segmento para llevarlos al sistema descrito anteriormente. Este argumento ha de ser una matriz de 3x3, almacenada en el formato de C. \param[out] lonBR Longitud del punto B en el sistema rotado, en el dominio \f$]-\pi,\pi]\f$, en radianes. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \note El argumento \em mRot ha de ser pasado como una matriz en formato de C; esto es, se accederá a sus elementos como mRot[fil][com]. \date 13 de agosto de 2013: Creación de la función. \date 23 de septiembre de 2013: Adición del argumento \em tol. \todo Esta función no está probada. */ void RotaArco00Ecuador(const double tol, const double latA, const double lonA, const double latB, const double lonB, double mRot[][3], double* lonBR); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica una matriz de rotación a un punto en coordenadas cartesianas tridimensionales geocéntricas. \param[in] sentido Identificador para realizar la rotación directa o la inversa. Dos posibilidades: - Mayor o igual que 0: Se realiza la transformación directa. - Menor que 0: Re realiza la transformación inversa. \param[in] x Coordenada X del punto. \param[in] y Coordenada Y del punto. \param[in] z Coordenada Z del punto. \param[in] mRot Matriz de rotación de 3x3, almacenada en el formato de C. \param[out] xR Coordenada X rotada. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \param[out] yR Coordenada Y rotada. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \param[out] zR Coordenada Z rotada. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \note El argumento \em mRot ha de ser pasado como una matriz en formato de C; esto es, se accederá a sus elementos como mRot[fil][com]. \date 13 de agosto de 2013: Creación de la función. \todo Esta función no está probada. */ void AplicaMatrizRotacionCoorCart(const int sentido, const double x, const double y, const double z, double mRot[][3], double* xR, double* yR, double* zR); /******************************************************************************/ /******************************************************************************/ /** \brief Aplica una matriz de rotación a un punto en coordenadas geodésicas. \param[in] sentido Identificador para realizar la rotación directa o la inversa. Dos posibilidades: - Mayor o igual que 0: Se realiza la transformación directa. - Menor que 0: Re realiza la transformación inversa. \param[in] lat Latitud del punto, en radianes. \param[in] lon Longitud del punto, en radianes. \param[in] mRot Matriz de rotación de 3x3, almacenada en el formato de C. \param[out] latR Latitud del punto en el sistema rotado, en radianes. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \param[out] lonR Longitud del punto en el sistema rotado, en radianes. Este argumento sólo es tenido en cuenta si se pasa un puntero distinto de \p NULL. \note El argumento \em mRot ha de ser pasado como una matriz en formato de C; esto es, se accederá a sus elementos como mRot[fil][com]. \note El dominio de la variable de salida \em lat1 es \f$[-\frac{\pi}{2},\frac{\pi}{2}]\f$. \note El dominio de la variable de salida \em lon1 es \f$]-\pi,\pi]\f$. \date 13 de agosto de 2013: Creación de la función. \todo Esta función no está probada. */ void AplicaMatrizRotacionCoorGeod(const int sentido, const double lat, const double lon, double mRot[][3], double* latR, double* lonR); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula los puntos de intersección de dos círculos máximos sobre la superfice de la esfera, estando uno de ellos, que se omite, contenido en el ecuador. \param[in] tol Tolerancia. Indica el valor por debajo del cual la componente de un vector se considera igual a 0.0. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] xC Coordenada X cartesiana geocéntrica del primer extremo del arco. \param[in] yC Coordenada Y cartesiana geocéntrica del primer extremo del arco. \param[in] zC Coordenada Z cartesiana geocéntrica del primer extremo del arco. \param[in] xD Coordenada X cartesiana geocéntrica del segundo extremo del arco. \param[in] yD Coordenada Y cartesiana geocéntrica del segundo extremo del arco. \param[in] zD Coordenada Z cartesiana geocéntrica del segundo extremo del arco. \param[out] xP Coordenada X cartesiana geocéntrica de uno de los puntos de intersección, sobre la esfera de radio unidad. La coordenada del otro punto será -\em xP. \param[out] yP Coordenada Y cartesiana geocéntrica de uno de los puntos de intersección, sobre la esfera de radio unidad. La coordenada del otro punto será -\em yP. \param[out] zP Coordenada Z cartesiana geocéntrica de uno de los puntos de intersección, sobre la esfera de radio unidad. La coordenada del otro punto será -\em zP. \return Dos posibilidades: - #GEOC_ARC_INTERSEC: Hay intersección. - #GEOC_ARC_NO_INTERSEC: No se ha podido calcular intersección, por lo que \em xP, \em yP y \em zP no se utilizan internamente. Las razones pueden ser: - El arco CD es coindidente con el ecuador. - Los vectores OC y OD forman un ángulo de \f$0\f$ o \f$\pi\f$, y no se puede calcular su vector normal. \note Esta función no es robusta, es decir, puede dar resultados incorrectos debido a errores de redondeo. \note Aunque los puntos C y D pertenezcan a una esfera de radio arbitrario, las coordenadas de los puntos de intersección de los círculos máximos se dan sobre la esfera de radio unidad. \note Para que se devuelvan las coordnadas del punto intersección, los argumentos \em xP, \em yP y \em zP han de ser, \b TODOS, distintos de \p NULL. \date 13 de agosto de 2013: Creación de la función. \date 22 de septirmbre de 2013: Adición del argumento \em tol. */ int IntersecCircMaxEsfAux(const double tol, const double xC, const double yC, const double zC, const double xD, const double yD, const double zD, double* xP, double* yP, double* zP); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos arcos de círculo máximo sobre la superfice de la esfera que tienen, al menos, un extremo común. Uno de los arcos, que se omite, está en el ecuador, con su extremo inicial en el punto \f$(\varphi=0,\lambda=0)\f$. \param[in] tol Tolerancia, en radianes. Indica el valor por debajo del cual la diferencia entre dos ángulos se considera igual a 0.0. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] lonB Longitud, en radianes, del segundo extremo del arco AB, en el dominio \f$]-\pi,\pi]\f$. \param[in] latC Latitud, en radianes, del primer extremo del arco CD. \param[in] lonC Longitud, en radianes, del primer extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[in] latD Latitud, en radianes, del segundo extremo del arco CD. \param[in] lonD Longitud, en radianes, del segundo extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[out] latP Latitud, en radianes, del punto de intersección. Siempre 0.0. \param[out] lonP Longitud, en radianes, del punto de intersección, en el dominio \f$]-\pi,\pi]\f$. \return Cinco posibilidades: - #GEOC_ARC_NO_INTERSEC: Los arcos no tienen ningún punto en común. - #GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN: Los arcos tienen un extremo común, pero no son colineales. - #GEOC_ARC_INTERSEC_EXTREMOS_COLIN: Los arcos tienen un extremo común y son colineales. - #GEOC_ARC_INTERSEC_COLIN: Los arcos tienen más de un punto en común. - #GEOC_ARC_INTERSEC_MISMO_ARC: Los dos arcos son idénticos. \note Para que se devuelvan las coordnadas del punto intersección, los argumentos \em latP y \em lonP han de ser, \b TODOS, distintos de \p NULL. \note Si los arcos no se tocan, las variables devueltos en \em latP y \em lonP almacenan 0.0. \note Los arcos implicados no pueden subtender un ángulo mayor o igual que \f$\pi\f$. Esta condición no se comprueba internamente, por lo que \b NO se informa de su posible inclumplimiento, y la función se ejecutará normalmente. \note Esta función no es robusta, es decir, puede dar resultados incorrectos debido a errores de redondeo. \note Si hay intersección, las coordenadas devueltas coinciden exactamente con las del vértice implicado, A, B, C o D. \note Si los arcos se tocan en los dos extremos (son el mismo arco), las coordenadas devueltas son siempre las del vértice A. \note Un buen valor para \em tol puede ser #GEOC_ARC_RES_ANG. \note Las longitudes de trabajo han de estar, obligatoriamente, en el dominio \f$]-\pi,\pi]\f$. \date 22 de septiembre de 2013: Creación de la función. */ int IntersecArcCirMaxEsferaVertComunAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos arcos de círculo máximo sobre la superfice de la esfera que tienen partes en común (se solapan parcialmente o el vértice de uno está apoyado en el otro arco-pero no en un vértice del segundo-). Uno de los arcos, que se omite, está en el ecuador, con su extremo inicial en el punto \f$(\varphi=0,\lambda=0)\f$. \param[in] tol Tolerancia, en radianes. Indica el valor por debajo del cual la diferencia entre dos ángulos se considera igual a 0.0. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] lonB Longitud, en radianes, del segundo extremo del arco AB, en el dominio \f$]-\pi,\pi]\f$. \param[in] latC Latitud, en radianes, del primer extremo del arco CD. \param[in] lonC Longitud, en radianes, del primer extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[in] latD Latitud, en radianes, del segundo extremo del arco CD. \param[in] lonD Longitud, en radianes, del segundo extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[out] latP Latitud, en radianes, del punto de intersección. Siempre 0.0. \param[out] lonP Longitud, en radianes, del punto de intersección, en el dominio \f$]-\pi,\pi]\f$. \return Tres posibilidades: - #GEOC_ARC_NO_INTERSEC: Los arcos no tienen ningún punto en común. - #GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN: El extremo de un arco toca al otro arco en un punto (excluidos los extremos del segundo), pero los arcos no son colineales. - #GEOC_ARC_INTERSEC_COLIN: Los arcos tienen más de un punto en común. \note Esta función considera los casos de arcos colineales que sólo coincidan en un vértice como #GEOC_ARC_INTERSEC_COLIN. Para tratar correctamente esos casos especiales, se recomienda ejecutar antes la función \ref IntersecArcCirMaxEsferaVertComunAux. \note Para que se devuelvan las coordnadas del punto intersección, los argumentos \em latP y \em lonP han de ser, \b TODOS, distintos de \p NULL. \note Si los arcos no se tocan, las variables devueltos en \em latP y \em lonP almacenan 0.0. \note Los arcos implicados no pueden subtender un ángulo mayor o igual que \f$\pi\f$. Esta condición no se comprueba internamente, por lo que \b NO se informa de su posible inclumplimiento, y la función se ejecutará normalmente. \note Esta función no es robusta, es decir, puede dar resultados incorrectos debido a errores de redondeo. \note Si hay intersección, las coordenadas devueltas coinciden exactamente con las del vértice implicado, A, B, C o D. \note Un buen valor para \em tol puede ser #GEOC_ARC_RES_ANG. \note Las longitudes de trabajo han de estar, obligatoriamente, en el dominio \f$]-\pi,\pi]\f$. \date 22 de septiembre de 2013: Creación de la función. */ int IntersecArcCirMaxEsferaVertApoyadoAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos arcos de círculo máximo sobre la superfice de la esfera, uno de los cuales, que se omite, está en el ecuador, con su extremo inicial en el punto \f$(\varphi=0,\lambda=0)\f$. \param[in] tol Tolerancia, en radianes. Indica el valor por debajo del cual la diferencia entre dos ángulos se considera igual a 0.0. Este argumento ha de ser un número \b POSITIVO (no se comprueba internamente). \param[in] lonB Longitud, en radianes, del segundo extremo del arco AB, en el dominio \f$]-\pi,\pi]\f$. \param[in] latC Latitud, en radianes, del primer extremo del arco CD. \param[in] lonC Longitud, en radianes, del primer extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[in] latD Latitud, en radianes, del segundo extremo del arco CD. \param[in] lonD Longitud, en radianes, del segundo extremo del arco CD, en el dominio \f$]-\pi,\pi]\f$. \param[in] xGC Coordenada X cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] yGC Coordenada Y cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] zGC Coordenada Z cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] xGD Coordenada X cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] yGD Coordenada Y cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[in] zGD Coordenada Z cartesiana geocéntrica para esfera de radio unidad, en el sistema original, correspondiente al punto C. Este argumento sólo se tiene en cuenta si es distinto del valor devuelto por \ref GeocNan. \param[out] latP Latitud, en radianes, del punto de intersección. Siempre 0.0. \param[out] lonP Longitud, en radianes, del punto de intersección, en el dominio \f$]-\pi,\pi]\f$. \return Siete posibilidades: - #GEOC_ARC_NO_INTERSEC: Los arcos no tienen ningún punto en común. - #GEOC_ARC_INTERSEC: Los arcos se cortan en un punto. - #GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN: El extremo de un arco toca al otro arco en un punto (excluidos los extremos del segungo), pero los arcos no son colineales. - #GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN: Los arcos tienen un extremo común, pero no son colineales. - #GEOC_ARC_INTERSEC_EXTREMOS_COLIN: Los arcos tienen un extremo común y son colineales. - #GEOC_ARC_INTERSEC_MISMO_ARC: Los dos arcos son idénticos. - #GEOC_ARC_INTERSEC_COLIN: Los arcos tienen más de un punto en común. \note Para que se devuelvan las coordnadas del punto intersección, los argumentos \em latP y \em lonP han de ser, \b TODOS, distintos de \p NULL. \note Si los arcos no se tocan, las variables devueltos en \em latP y \em lonP almacenan 0.0. \note Los arcos implicados no pueden subtender un ángulo mayor o igual que \f$\pi\f$. Esta condición no se comprueba internamente, por lo que \b NO se informa de su posible inclumplimiento, y la función se ejecutará normalmente. \note Esta función no es robusta, es decir, puede dar resultados incorrectos debido a errores de redondeo. \note Un buen valor para \em tol puede ser #GEOC_ARC_RES_ANG. \note Las longitudes de trabajo han de estar, obligatoriamente, en el dominio \f$]-\pi,\pi]\f$. \note Los argumentos \em xGC, \em yGC, \em zGC, \em xGD, \em yGD y \em zGD sólo son tenidos en cuenta si se trabaja sobre la esfera y cada tríada es distinta de \ref GeocNan, en cuyo caso las coordenadas cartesianas tridimensionales geocéntricas, necesarias para los cálculos llevados a cabo por la función, son calculadas internamente a partir de los argumentos \em latC, \em lonC, \em latD y \em latD. \date 22 de septiembre de 2013: Creación de la función. \date 28 de marzo de 2014: Adición de los argumentos \em xGC, \em yGC, \em zGC, \em xGD, \em yGD y \em zGD. */ int IntersecArcCircMaxEsferaAux(const double tol, const double lonB, const double latC, const double lonC, const double latD, const double lonD, const double xGC, const double yGC, const double zGC, const double xGD, const double yGD, const double zGD, double* latP, double* lonP); /******************************************************************************/ /******************************************************************************/ /** \brief Calcula la intersección de dos arcos de círculo máximo sobre la superfice de la esfera. \param[in] latA Latitud, en radianes, del primer extremo del arco AB. \param[in] lonA Longitud, en radianes, del primer extremo del arco AB. \param[in] latB Latitud, en radianes, del segundo extremo del arco AB. \param[in] lonB Longitud, en radianes, del segundo extremo del arco AB. \param[in] latC Latitud, en radianes, del primer extremo del arco CD. \param[in] lonC Longitud, en radianes, del primer extremo del arco CD. \param[in] latD Latitud, en radianes, del segundo extremo del arco CD. \param[in] lonD Longitud, en radianes, del segundo extremo del arco CD. \param[out] latP Latitud, en radianes, del punto de intersección. El dominio de la latitud utilizado es, independientemente del usado en las variables de entrada, \f$[-\frac{\pi}{2},\frac{\pi}{2}]\f$. \param[out] lonP Longitud, en radianes, del punto de intersección. El dominio de la longitud utilizado es, independientemente del usado en las variables de entrada, \f$]-\pi,\pi]\f$. \return Siete posibilidades: - #GEOC_ARC_NO_INTERSEC: Los arcos no tienen ningún punto en común. - #GEOC_ARC_INTERSEC: Los arcos se cortan en un punto. - #GEOC_ARC_INTERSEC_EXTREMO_NO_COLIN: El extremo de un arco toca al otro arco en un punto (excluidos los extremos del segungo), pero los arcos no son colineales. - #GEOC_ARC_INTERSEC_EXTREMOS_NO_COLIN: Los arcos tienen un extremo común, pero no son colineales. - #GEOC_ARC_INTERSEC_EXTREMOS_COLIN: Los arcos tienen un extremo común y son colineales. - #GEOC_ARC_INTERSEC_MISMO_ARC: Los dos arcos son idénticos. - #GEOC_ARC_INTERSEC_COLIN: Los arcos tienen más de un punto en común. \note Para que se devuelvan las coordnadas del punto intersección, los argumentos \em latP y \em lonP han de ser, \b TODOS, distintos de \p NULL. \note Si los arcos no se tocan, las variables devueltos en \em latP y \em lonP almacenan 0.0. \note Los arcos implicados no pueden subtender un ángulo mayor o igual que \f$\pi\f$. Esta condición no se comprueba internamente, por lo que \b NO se informa de su posible inclumplimiento, y la función se ejecutará normalmente. \note Esta función no es robusta, es decir, puede dar resultados incorrectos debido a errores de redondeo. \note Esta función considera dos puntos iguales a aquellos que estén en un entorno de #GEOC_ARC_RES_ANG radianes. \note Si los arcos se tocan en los dos extremos (son el mismo arco), las coordenadas devueltas son siempre las del vértice A. \note Si los arcos tienen más de un punto en común, pero no son el mismo arco, las coordenadas de salida siempre son las de un punto extremo de un arco. Este punto extremo se intentará que sea uno de los puntos iniciales de algún arco, anque no se puede asegurar. \date 13 de agosto de 2013: Creación de la función. */ int IntersecArcCircMaxEsfera(const double latA, const double lonA, const double latB, const double lonB, const double latC, const double lonC, const double latD, const double lonD, double* latP, double* lonP); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/libgeoc/ventorno.h000755 001750 001750 00000011746 13655033577 017425 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup anespec general @{ \file ventorno.h \brief Definición de variables de entorno y declaración de funciones para su control. \author José Luis García Pallero, jgpallero@gmail.com \date 31 de marzo de 2011 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #ifndef _VENTORNO_H_ #define _VENTORNO_H_ /******************************************************************************/ /******************************************************************************/ #include #include /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ENV_NOM_VAR_PILOMBS \brief Nombre de la variable de entorno para imprimir o no pasos intermedios en la ejecución de la función \ref AnalisisLombSig. \date 31 de marzo de 2011: Creación de la constante. */ #define GEOC_ENV_NOM_VAR_PILOMBS "GEOC_ENV_PILOMBS" /******************************************************************************/ /******************************************************************************/ /** \def GEOC_ENV_VAL_REF_PILOMBS \brief Valor de referencia de la variable de entorno #GEOC_ENV_NOM_VAR_PILOMBS. \date 31 de marzo de 2011: Creación de la constante. */ #define GEOC_ENV_VAL_REF_PILOMBS "0" /******************************************************************************/ /******************************************************************************/ /** \brief Comprueba si una variable de entorno está definida y es igual a un valor. \param[in] var Nombre de la variable de entorno a comprobar. \param[in] valRef Valor de referencia de la variable de entorno. \return Tres posibilidades: - Menor que 0: La variable de entorno no está definida. - 0: La variable de entorno existe, pero tiene un valor distinto a \em valRef. - Mayor que 0: La variable de entorno existe y tiene el mismo valor que \em valRef. \date 31 de marzo de 2011: Creación de la función. \todo Esta función todavía no está probada. */ int VarEnvValRef(const char* var, const char* valRef); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus } #endif /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/calctopo.c000644 001750 001750 00000007027 13655033577 015740 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geodesia geom @{ \file calctopo.c \brief Definición de funciones para cálculos de topografía. \author José Luis García Pallero, jgpallero@gmail.com \date 05 de julio de 2011 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/calctopo.h" /******************************************************************************/ /******************************************************************************/ double AcimutTopografico(const double x1, const double y1, const double x2, const double y2) { //acimut calculado double acimut=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el acimut en el dominio [-pi pi] acimut = atan2(x2-x1,y2-y1); //comprobamos si ha salido un valor negativo if(acimut<0.0) { //metemos el valor en dominio acimut += 2.0*GEOC_CONST_PI; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return acimut; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/recpolil.c000755 001750 001750 00000172525 12463476337 015757 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom gshhs @{ \file recpolil.c \brief Definición funciones para el recorte de polilíneas por medio de polígonos. \author José Luis García Pallero, jgpallero@gmail.com \date 05 de junio de 2011 \copyright Copyright (c) 2011, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/recpolil.h" /******************************************************************************/ /******************************************************************************/ vertPolilClip* CreaVertPolilClip(const double x, const double y, vertPolilClip* anterior, vertPolilClip* siguiente, const char orig, const char pos, const double alfa) { //variable de salida (nuevo vértice) vertPolilClip* nuevoVert=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos memoria para el nuevo vértice nuevoVert = (vertPolilClip*)malloc(sizeof(vertPolilClip)); //comprobamos los posibles errores if(nuevoVert==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos los vértices anterior y posterior nuevoVert->anterior = anterior; nuevoVert->siguiente = siguiente; //si anterior es un vértice bueno if(anterior!=NULL) { //lo apuntamos al vértice creado nuevoVert->anterior->siguiente = nuevoVert; } //si siguiente es un vértice bueno if(siguiente!=NULL) { //indicamos que el vértice creado es el anterior nuevoVert->siguiente->anterior = nuevoVert; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el resto de campos nuevoVert->x = x; nuevoVert->y = y; nuevoVert->orig = orig; nuevoVert->pos = pos; nuevoVert->alfa = alfa; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return nuevoVert; } /******************************************************************************/ /******************************************************************************/ vertPolilClip* CreaPolilClip(const double* x, const double* y, const size_t nCoor, const size_t incX, const size_t incY) { //índice para recorrer bucles size_t i=0; //variable auxiliar de posición size_t posIni=0; //otra variable auxiliar int hayVert=0; //estructura auxiliar vertPolilClip* aux=NULL; //variable de salida vertPolilClip* poli=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //buscamos el primer punto que sea distinto de NaN for(i=0;isiguiente; //liberamos la memoria free(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ vertPolilClip* ReiniciaPolilClip(vertPolilClip* poli) { //estructura que apunta al espacio en memoria a liberar vertPolilClip* borra=NULL; //estructura auxiliar vertPolilClip* aux=NULL; //estructura de salida vertPolilClip* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar aux = poli; //comprobamos una posible salida rápida if(aux==NULL) { //salimos de la función return NULL; } //buscamos para la estructura de salida el primer vértice original while(aux!=NULL) { //comprobamos si estamos ante un vértice bueno if(aux->orig) { //asignamos la variable de salida sal = aux; //salimos del bucle break; } //siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //volvemos a inicializar la variable auxiliar aux = poli; //mientras la variable de trabajo no apunte a NULL while(aux!=NULL) { //comprobamos si estamos ante un vértice a borrar if(aux->orig==0) { //lo almacenamos en la estructura de borrado borra = aux; //actualizamos el puntero de vértice siguiente if(aux->anterior!=NULL) { //cuando el vértice a borrar no es el primero de la lista aux->anterior->siguiente = aux->siguiente; } else if(aux->siguiente!=NULL) { //cuando el vértice a borrar es el primero de la lista aux->siguiente->anterior = NULL; } //actualizamos el puntero de vértice anterior if(aux->siguiente!=NULL) { //cuando el vértice a borrar no es el último de la lista aux->siguiente->anterior = aux->anterior; } else if(aux->anterior!=NULL) { //cuando el vértice a borrar es el último de la lista aux->anterior->siguiente = NULL; } //apuntamos al siguiente elemento aux = aux->siguiente; //liberamos la memoria free(borra); } else { //reinicializamos el resto de miembros, menos las coordenadas //originales y el identificador de vértice original aux->pos = GEOC_PTO_FUERA_POLIG; aux->alfa = 0.0; //siguiente elemento aux = aux->siguiente; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ vertPolilClip* SiguienteVertOrigPolilClip(vertPolilClip* vert) { //variable de salida, que inicializamos con la dirección de entrada vertPolilClip* sal=vert; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si estamos ante un vértice original, pasamos al siguiente if((sal!=NULL)&&sal->orig) { //apuntamos al siguiente vértice sal = sal->siguiente; } //vamos rechazando vérties no originales (el bucle se para cuando llegamos //al final o a un vértice que no es original) while((sal!=NULL)&&(sal->orig==0)) { //pasamos al siguiente vértice sal = sal->siguiente; } //si hemos llegado a un vértice que no es original, apuntamos a NULL if((sal!=NULL)&&(sal->orig==0)) { //asignamos NULL sal = NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ /******************************************************************************/ void InsertaVertPolilClip(vertPolilClip* ins, vertPolilClip* extremoIni, vertPolilClip* extremoFin) { //estructura auxiliar vertPolilClip* aux=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el vértice auxiliar como el extremo inicial pasado aux = extremoIni; //mientras no lleguemos al extremo final y el punto a insertar esté más //lejos del origen que el punto de trabajo while((aux!=extremoFin)&&((aux->alfa)<=(ins->alfa))) { //avanzamos al siguiente vértice aux = aux->siguiente; } //insertamos el punto y ordenamos los punteros de vértices anterior y //posterior ins->siguiente = aux; ins->anterior = aux->anterior; ins->anterior->siguiente = ins; ins->siguiente->anterior = ins; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ size_t NumeroVertOrigPolilClip(vertPolilClip* poli) { //estructura auxiliar vertPolilClip* aux=NULL; //variable de salida size_t num=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //comprobamos si estamos ante un vértice original if(aux->orig) { //si no es un vértice original, nos posicionamos en el siguiente que sí //lo sea aux = SiguienteVertOrigPolilClip(aux); } //mientras no lleguemos al final while(aux!=NULL) { //aumentamos el contador de vértices originales num++; //nos posicionamos en el siguiente vértice original aux = SiguienteVertOrigPolilClip(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return num; } /******************************************************************************/ /******************************************************************************/ size_t NumeroVertPolilClip(vertPolilClip* poli) { //estructura auxiliar vertPolilClip* aux=NULL; //variable de salida size_t num=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //mientras no lleguemos al final while(aux!=NULL) { //aumentamos el contador de vértices num++; //nos posicionamos en el siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return num; } /******************************************************************************/ /******************************************************************************/ int Paso1Recpolil(vertPolilClip* poli, vertPoliClip* poliRec, size_t* nIntersec) { //estructuras auxiliares que apuntan a los elementos pasados vertPolilClip* auxA=NULL; vertPoliClip* auxC=NULL; //estructuras auxiliares para trabajar con el siguiente vértice vertPolilClip* auxB=NULL; vertPoliClip* auxD=NULL; //vértices de intersección a insertar vertPolilClip* insPolil=NULL; //coordenadas de la intersección de dos segmentos double xI=0.0,yI=0.0; //longitud de segmento y parámetro alfa double lon=0.0,alfa=0.0; //código de intersección de segmentos int intersec=0; //variable auxiliar int nuevoPunto=0; //variable de salida int salida=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el número de intersecciones a 0 *nIntersec = 0; //EL PRIMER PASO DEL ALGORITMO DE RECORTE DE POLILÍNEAS ES EL CÁLCULO DE //TODOS LOS PUNTOS DE INTERSECCIÓN ENTRE LOS POLÍGONOS //recorremos los vértices de la polilínea for(auxA=poli;auxA->siguiente!=NULL;auxA=auxA->siguiente) { //sólo trabajamos si el vértice es original if(auxA->orig) { //recorremos los vértices del polígono de recorte for(auxC=poliRec;auxC->siguiente!=NULL;auxC=auxC->siguiente) { //sólo trabajamos si el vértice es original (esto hace que //podamos trabajar con un polígono proveniente de una operación //booleana previa entre polígonos if(auxC->interseccion==0) { //siguiente vértice de los segmentos auxB = SiguienteVertOrigPolilClip(auxA); auxD = SiguienteVertOrigPoliClip(auxC); //calculamos la intersección de los segmentos intersec = IntersecSegmentos2D(auxA->x,auxA->y,auxB->x, auxB->y,auxC->x,auxC->y, auxD->x,auxD->y,&xI,&yI); //comprobamos la posición relativa del primer punto del //segmento de la polilínea con respecto al polígono //esta función sólo marca dentro o fuera auxA->pos = (char)PtoEnPoliClip(auxA->x,auxA->y,poliRec); //comprobamos si el segmento de la polilínea contiene al //último punto de ésta, por lo que el bucle se acabará aquí if(auxB->siguiente==NULL) { //comprobamos la posición relativa del último punto auxB->pos = (char)PtoEnPoliClip(auxB->x,auxB->y, poliRec); } //comprobamos si hay que aumentar el contador de //intersecciones if(intersec!=GEOC_SEG_NO_INTERSEC) { //aumentamos el contador de intersecciones (*nIntersec)++; } //comprobamos el tipo de intersección if(intersec==GEOC_SEG_INTERSEC) { //INTERSECCIÓN LIMPIA //calculamos la longitud del segmento de la polilínea lon = Dist2D(auxA->x,auxA->y,auxB->x,auxB->y); //calculamos los parámetros alfa alfa = Dist2D(auxA->x,auxA->y,xI,yI)/lon; //creamos el nuevo vértice a insertar insPolil = CreaVertPolilClip(xI,yI,NULL,NULL,0, (char)GEOC_PTO_BORDE_POLIG, alfa); //comprobamos los posibles errores if(insPolil==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //añadimos el punto de intersección InsertaVertPolilClip(insPolil,auxA,auxB); } else if((intersec==GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN)|| (intersec==GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN)) { //EL EXTREMO DE UN SEGMENTO TOCA AL OTRO SEGMENTO, PERO //LOS SEGMENTOS NO SON COLINEALES //comprobamos si el extremo que toca es el inicial del //segmento de la polilínea if((xI==auxA->x)&&(yI==auxA->y)) { //el primer punto del segmento está en el borde auxA->pos = (char)GEOC_PTO_BORDE_POLIG; } else if((xI!=auxB->x)||(yI!=auxB->y)) { //el extremo que toca es del segmento del polígono y //no toca al punto final del segmento de la //polilínea //calculamos la longitud del segmento de la //polilínea lon = Dist2D(auxA->x,auxA->y,auxB->x,auxB->y); //calculamos los parámetros alfa alfa = Dist2D(auxA->x,auxA->y,xI,yI)/lon; //creamos el nuevo vértice a insertar insPolil = CreaVertPolilClip(xI,yI,NULL,NULL,0, (char)GEOC_PTO_BORDE_POLIG, alfa); //comprobamos los posibles errores if(insPolil==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //añadimos el punto de intersección InsertaVertPolilClip(insPolil,auxA,auxB); } else { //comprobamos si estamos ante el segmento que //contiene al último punto de la polilínea if(auxB->siguiente==NULL) { //el último punto del segmento está en el borde auxB->pos = (char)GEOC_PTO_BORDE_POLIG; } else { //disminuimos el contador de intersecciones, ya //que esta se detectará en la siguiente vuelta //del bucle (*nIntersec)--; } } } else if(intersec==GEOC_SEG_INTERSEC_EXTREMOS_COLIN) { //LOS SEGMENTOS SON COLINEALES PERO SÓLO SE TOCAN EN EL //EXTREMO //comprobamos si el extremo que toca es el primero if((xI==auxA->x)&&(yI==auxA->y)) { //el primer punto del segmento está en el borde auxA->pos = (char)GEOC_PTO_BORDE_POLIG; } else { //comprobamos si estamos ante el segmento que //contiene al último punto de la polilínea if(auxB->siguiente==NULL) { //el último punto del segmento está en el borde auxB->pos = (char)GEOC_PTO_BORDE_POLIG; } else { //disminuimos el contador de intersecciones, ya //que esta se detectará en la siguiente vuelta //del bucle (*nIntersec)--; } } } else if(intersec==GEOC_SEG_INTERSEC_MISMO_SEG) { //AMBOS SEGMENTOS SON EL MISMO //el primer punto del segmento está en el borde auxA->pos = (char)GEOC_PTO_BORDE_POLIG; //comprobamos si estamos ante el segmento que contiene //al último punto de la polilínea if(auxB->siguiente==NULL) { //aumentamos el contador de intersecciones (*nIntersec)++; //el último punto del segmento está en el borde auxB->pos = (char)GEOC_PTO_BORDE_POLIG; } } else if(intersec==GEOC_SEG_INTERSEC_COLIN) { //LOS SEGMENTOS TIENEN MÁS DE UN PUNTO EN COMÚN, PERO NO //SON EL MISMO //comprobamos si el extremo inicial está tocando el //polígono o no if((xI==auxA->x)&&(yI==auxA->y)) { //el primer punto del segmento está en el borde auxA->pos = (char)GEOC_PTO_BORDE_POLIG; //identificador de nuevo punto nuevoPunto = 0; //comprobamos si alguno de los extremos del segmento //del polígono está dentro del segmento de la //polilínea if(PuntoEntreDosPuntos2DColin(auxC->x,auxC->y, auxA->x,auxA->y, auxB->x,auxB->y)) { //nuevo punto nuevoPunto = 1; //coordenadas del punto intersección xI = auxC->x; yI = auxC->y; } else if(PuntoEntreDosPuntos2DColin(auxD->x,auxD->y, auxA->x,auxA->y, auxB->x,auxB->y)) { //nuevo punto nuevoPunto = 1; //coordenadas del punto intersección xI = auxD->x; yI = auxD->y; } //comprobamos si hay que añadir el nuevo punto if(nuevoPunto) { //aumentamos el contador de intersecciones (*nIntersec)++; //calculamos la longitud del segmento de la //polilínea lon = Dist2D(auxA->x,auxA->y,auxB->x,auxB->y); //calculamos los parámetros alfa alfa = Dist2D(auxA->x,auxA->y,xI,yI)/lon; //creamos el nuevo vértice a insertar insPolil = CreaVertPolilClip(xI,yI,NULL,NULL,0, (char)GEOC_PTO_BORDE_POLIG, alfa); //comprobamos los posibles errores if(insPolil==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //añadimos el punto de intersección InsertaVertPolilClip(insPolil,auxA,auxB); } //comprobamos si estamos ante el segmento que //contiene al último punto de la polilínea if(auxB->siguiente==NULL) { //comprobamos si el último punto del segmento //de la polilínea está contenido en el segmento //del polígono if(PuntoEntreDosPuntos2DColin(auxB->x,auxB->y, auxC->x,auxC->y, auxD->x,auxD->y)) { //aumentamos el contador de intersecciones (*nIntersec)++; //indicamos que el último punto del segmento //de la polilínea está en el borde auxB->pos = (char)GEOC_PTO_BORDE_POLIG; } } } else { //comprobamos si el vértice a añadir es el extremo //final del segmento del polígono (la función //devuelve las coordenadas del extremo final del //segmento de la polilínea if((xI==auxB->x)&&(yI==auxB->y)) { //asignamos las coordenadas de salida correctas xI = auxD->x; yI = auxD->y; } //calculamos la longitud del segmento de la //polilínea lon = Dist2D(auxA->x,auxA->y,auxB->x,auxB->y); //calculamos los parámetros alfa alfa = Dist2D(auxA->x,auxA->y,xI,yI)/lon; //creamos el nuevo vértice a insertar insPolil = CreaVertPolilClip(xI,yI,NULL,NULL,0, (char)GEOC_PTO_BORDE_POLIG, alfa); //comprobamos los posibles errores if(insPolil==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //añadimos el punto de intersección InsertaVertPolilClip(insPolil,auxA,auxB); //comprobamos si estamos ante el segmento que //contiene al último punto de la polilínea if(auxB->siguiente==NULL) { //aumentamos el contador de intersecciones (*nIntersec)++; //indicamos que el último punto del segmento de //la polilínea está en el borde auxB->pos = (char)GEOC_PTO_BORDE_POLIG; } } } } } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ polil* Paso2Recpolil(vertPolilClip* poli, const enum GEOC_OP_BOOL_POLIL op) { //estructura auxiliar vertPolilClip* aux=NULL; //vectores de coordenadas de los vértices del resultado double* x=NULL; double* y=NULL; //número de elementos de los vectores x e y size_t nPtos=0; //número de elementos para los que ha sido asignada memoria size_t nElem=0; //variable de estado int estado=GEOC_ERR_NO_ERROR; //polilínea de salida polil* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //chequeamos una posible salida rápida porque la polilínea sea NULL if(poli==NULL) { //creamos la estructura vacía resultado = IniciaPolilVacia(); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //salimos de la función return resultado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //distinguimos entre las dos operaciones //por defecto, recorte if(op!=GeocOpBoolFuera) { //vamos recorriendo vértices de la polilínea do { //comprobamos si el vértice es del borde o de dentro del polígono if(aux->pos==GEOC_PTO_DENTRO_POLIG) { //un punto de dentro del polígono siempre pertenece a la //polilínea recortada //no hace falta asignar los elementos NaN de separación de //polilíneas, que ya se añaden cuando de trabaja con un punto de //borde //aumentamos el número de elementos almacenados en los vectores //de coordenadas nPtos++; //comprobamos si hay que reasignar memoria if(nPtos>nElem) { //aumentamos el número de elementos nElem += GEOC_RECPOLIL_BUFFER_PTOS; //reasignamos memoria x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos los posibles errores if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos las coordenadas del vértice x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } else if(aux->pos==GEOC_PTO_BORDE_POLIG) { //comprobamos la situación de los vértices anterior y siguiente //para la posible reasignación de memoria if((aux->anterior==NULL)||(aux->siguiente==NULL)|| (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)|| (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //este es un vértice de comienzo o fin de una polilínea, por //lo que necesitamos memoria para las coordenadas y el //marcador NaN nPtos += 2; } else { //este vértice pertenece al interior del polígono nPtos++; } //comprobamos si hay que reasignar memoria if(nPtos>nElem) { //aumentamos el número de elementos nElem += GEOC_RECPOLIL_BUFFER_PTOS; //reasignamos memoria x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos los posibles errores if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //comprobamos de nuevo la situación de los vértices anterior y //posterior if((aux->anterior==NULL)|| (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)) { //el vértice es inicio de polilínea //asignamos los valores NaN de separación x[nPtos-2] = GeocNan(); y[nPtos-2] = GeocNan(); //asignamos las coordenadas del vértice x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } else if((aux->siguiente==NULL)|| (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //el vértice es final de polilínea //asignamos las coordenadas del vértice x[nPtos-2] = aux->x; y[nPtos-2] = aux->y; //asignamos los valores NaN de separación x[nPtos-1] = GeocNan(); y[nPtos-1] = GeocNan(); } else { //el vértice pertenece a la polilínea recortada x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } } //avanzamos al siguiente vértice aux = aux->siguiente; }while(aux!=NULL); } else { //vamos recorriendo vértices de la polilínea do { //comprobamos si el vértice es del borde o de fuera del polígono if(aux->pos==GEOC_PTO_FUERA_POLIG) { //un punto de fuera del polígono siempre pertenece a la //polilínea exterior //no hace falta asignar los elementos NaN de separación de //polilíneas, que ya se añaden cuando de trabaja con un punto de //borde //aumentamos el número de elementos almacenados en los vectores //de coordenadas nPtos++; //comprobamos si hay que reasignar memoria if(nPtos>nElem) { //aumentamos el número de elementos nElem += GEOC_RECPOLIL_BUFFER_PTOS; //reasignamos memoria x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos los posibles errores if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos las coordenadas del vértice x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } else if(aux->pos==GEOC_PTO_BORDE_POLIG) { //comprobamos la situación de los vértices anterior y siguiente //para la posible reasignación de memoria if((aux->anterior!=NULL)&&(aux->siguiente!=NULL)&& (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)&& (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //este vértice pertenece al exterior del polígono nPtos++; } else if(((aux->anterior==NULL)|| (aux->anterior->pos!=GEOC_PTO_FUERA_POLIG))&& (aux->siguiente!=NULL)&& (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //este es un vértice de comienzo de una polilínea, por lo //que necesitamos memoria para las coordenadas y el marcador //NaN nPtos += 2; } else if(((aux->siguiente==NULL)|| (aux->siguiente->pos!=GEOC_PTO_FUERA_POLIG))&& (aux->anterior!=NULL)&& (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)) { //este es un vértice de fin de una polilínea, por lo que //necesitamos memoria para las coordenadas y el marcador NaN nPtos += 2; } //comprobamos si hay que reasignar memoria if(nPtos>nElem) { //aumentamos el número de elementos nElem += GEOC_RECPOLIL_BUFFER_PTOS; //reasignamos memoria x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos los posibles errores if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //comprobamos de nuevo la situación de los vértices anterior y //posterior if((aux->anterior!=NULL)&&(aux->siguiente!=NULL)&& (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)&& (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //el vértice pertenece a la polilínea recortada x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } else if(((aux->anterior==NULL)|| (aux->anterior->pos!=GEOC_PTO_FUERA_POLIG))&& (aux->siguiente!=NULL)&& (aux->siguiente->pos==GEOC_PTO_FUERA_POLIG)) { //el vértice es inicio de polilínea //asignamos los valores NaN de separación x[nPtos-2] = GeocNan(); y[nPtos-2] = GeocNan(); //asignamos las coordenadas del vértice x[nPtos-1] = aux->x; y[nPtos-1] = aux->y; } else if(((aux->siguiente==NULL)|| (aux->siguiente->pos!=GEOC_PTO_FUERA_POLIG))&& (aux->anterior!=NULL)&& (aux->anterior->pos==GEOC_PTO_FUERA_POLIG)) { //el vértice es final de polilínea //asignamos las coordenadas del vértice x[nPtos-2] = aux->x; y[nPtos-2] = aux->y; //asignamos los valores NaN de separación x[nPtos-1] = GeocNan(); y[nPtos-1] = GeocNan(); } } //avanzamos al siguiente vértice aux = aux->siguiente; }while(aux!=NULL); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la estructura de salida resultado = CreaPolil(x,y,nPtos,1,1,&estado); //comprobamos los posibles errores if(resultado==NULL) { //liberamos la memoria asignada free(x); free(y); //comprobamos el error if(estado==GEOC_ERR_ASIG_MEMORIA) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); } else { //mensaje de error GEOC_ERROR("Error en la llamada a 'CreaPolil()'\nEste error no " "puede producirse aquí porque los NaN deben estar " "bien puestos"); } //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria utilizada free(x); free(y); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polil* RecortaPolil(vertPolilClip* poli, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIL op, size_t* nIntersec) { //identificador de error int idError=GEOC_ERR_NO_ERROR; //polilínea de salida de salida polil* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //PRIMER PASO DEL ALGORITMO: CÁLCULO DE TODOS LOS PUNTOS DE INTERSECCIÓN //ENTRE LA POLILÍNEA Y EL POLÍGONO //calculamos los puntos de intersección idError = Paso1Recpolil(poli,poliRec,nIntersec); //comprobamos los posibles errores if(idError==GEOC_ERR_ASIG_MEMORIA) { //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso1Recpolil'"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si no hay intersecciones if(!(*nIntersec)) { //comprobamos las posibles situaciones relativas entre la polilínea y el //polígono que pueden producir cero intersecciones if(PtoEnPoliClip(poli->x,poli->y,poliRec)==GEOC_PTO_FUERA_POLIG) { //LA POLILÍNEA ESTÁ FUERA DEL POLÍGONO DE RECORTE //distinguimos las operaciones (por defecto, dentro) if(op!=GeocOpBoolFuera) { //el resultado es una polilínea vacía resultado = CreaPolilPolilClip(NULL); } else { //el resultado es la polilínea original resultado = CreaPolilPolilClip(poli); } } else { //LA POLILÍNEA ESTÁ DENTRO DEL POLÍGONO DE RECORTE //distinguimos las operaciones (por defecto, dentro) if(op!=GeocOpBoolFuera) { //el resultado es la polilínea original resultado = CreaPolilPolilClip(poli); } else { //el resultado es una polilínea vacía resultado = CreaPolilPolilClip(NULL); } } //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //salimos de la función return resultado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //realizamos la operación si hay alguna intersección resultado = Paso2Recpolil(poli,op); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso2Recpolil'"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polil* RecortaPolilMult(const polil* poli, const polig* poliRec, const enum GEOC_OP_BOOL_POLIL op, size_t* nIntersec) { //índices para recorrer bucles size_t i=0,j=0; //variable de posición size_t pos=0; //posición de un rectángulo con respecto a otro int pr=0; //número de intersecciones auxiliar size_t nInt=0; //variable de error int estado=GEOC_ERR_NO_ERROR; //listas de trabajo vertPolilClip* polilClip=NULL; vertPoliClip* poligClip=NULL; //polilínea auxiliar polil* polilAux=NULL; //variable de salida polil* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el número total de intersecciones *nIntersec = 0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la variable de salida resultado = IniciaPolilVacia(); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos las polilíneas a recortar for(i=0;inPolil;i++) { //dirección de inicio de los vértices de la polilínea pos = poli->posIni[i]; //creamos la polilínea a recortar de trabajo polilClip = CreaPolilClip(&(poli->x[pos]),&(poli->y[pos]), poli->nVert[i],1,1); //comprobamos los posibles errores if(polilClip==NULL) { //liberamos la memoria asignada hasta ahora LibMemPolil(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //recorremos los polígonos de recorte for(j=0;jnPolig;j++) { //comprobamos si la polilínea y el polígono tienen definidos sus //límites if((poli->hayLim)&&(poliRec->hayLim)) { //comprobamos si los restángulos que encierran a la polilínea y //al polígono son disjuntos o no pr = GEOC_RECT_DISJUNTOS(poli->xMin[i],poli->xMax[i], poli->yMin[i],poli->yMax[i], poliRec->xMin[j],poliRec->xMax[j], poliRec->yMin[j],poliRec->yMax[j]); //comprobamos los casos particulares si los rectángulos son //disjuntos if(pr&&(op==GeocOpBoolDentro)) { //si buscamos la parte de la polilínea que cae dentro del //polígono, no se añade nada //vamos a la siguiente vuelta del bucle continue; } else if(pr&&(op==GeocOpBoolFuera)) { //si buscamos la parte de la polilínea que cae fuera del //polígono, se añade la polilínea entera estado = AnyadeDatosPolil(resultado,&(poli->x[pos]), &(poli->y[pos]),poli->nVert[i],1, 1); //comprobamos los posibles errores, que sólo pueden ser de //asignación de memoria if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la posible memoria asignada hasta ahora LibMemPolilClip(polilClip); LibMemPolil(resultado); //lanzamos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //vamos a la siguiente vuelta del bucle continue; } } //dirección de inicio de los vértices del polígono de recorte pos = poliRec->posIni[j]; //creamos el polígono de recorte de trabajo poligClip = CreaPoliClip(&(poliRec->x[pos]),&(poliRec->y[pos]), poliRec->nVert[j],1,1); //comprobamos los posibles errores if(poligClip==NULL) { //liberamos la memoria asignada hasta ahora LibMemPolilClip(polilClip); LibMemPolil(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //recortamos polilAux = RecortaPolil(polilClip,poligClip,op,&nInt); //comprobamos los posibles errores if(polilAux==NULL) { //liberamos la posible memoria asignada hasta ahora LibMemPolilClip(polilClip); LibMemPoliClip(poligClip); LibMemPolil(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //sumamos el número de intersecciones (*nIntersec) += nInt; //añadimos la polilínea recortada a la variable de salida if(AnyadePolilPolil(resultado,polilAux)==GEOC_ERR_ASIG_MEMORIA) { //liberamos la posible memoria asignada hasta ahora LibMemPolilClip(polilClip); LibMemPoliClip(poligClip); LibMemPolil(polilAux); LibMemPolil(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //liberamos la memoria asignada al polígono de esta vuelta del bucle LibMemPoliClip(poligClip); //liberamos la memoria asignada a la polilínea auxiliar LibMemPolil(polilAux); //reinicializamos la polilínea a recortar polilClip = ReiniciaPolilClip(polilClip); } //liberamos la memoria asignada a la polilínea de esta vuelta del bucle LibMemPolilClip(polilClip); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polil* CreaPolilPolilClip(vertPolilClip* poli) { //índice para recorrer bucles size_t i=0; //número de elementos size_t nVert=0,nElem=0; //estructura auxiliar vertPolilClip* aux=poli; //variable de salida polil* result=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la estructura vacía result = IniciaPolilVacia(); //comprobamos los posibles errores if(result==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //contamos todos los vértices de la polilínea nVert = NumeroVertPolilClip(poli); //contemplamos una posible salida rápida if(nVert==0) { //devolvemos la estructura vacía return result; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //número de elementos de los vectores de coordenadas nElem = nVert+2; //asignamos memoria para los vectores de coordenadas de la estructura result->x = (double*)malloc(nElem*sizeof(double)); result->y = (double*)malloc(nElem*sizeof(double)); //asignamos memoria para los vectores de posición result->posIni = (size_t*)malloc(sizeof(size_t)); result->nVert = (size_t*)malloc(sizeof(size_t)); //comprobamos los posibles errores de asignación de memoria if((result->x==NULL)||(result->y==NULL)||(result->posIni==NULL)|| (result->nVert==NULL)) { //liberamos la posible memoria asignada LibMemPolil(result); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el número de elementos de los vectores de coordenadas y de //polilíneas result->nElem = nElem; result->nPolil = 1; //asignamos la posición de inicio y el número de vértices result->posIni[0] = 1; result->nVert[0] = nVert; //asignamos los separadores de polilínea al principio y al final result->x[0] = GeocNan(); result->y[0] = GeocNan(); result->x[nElem-1] = GeocNan(); result->y[nElem-1] = GeocNan(); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los vértices de la polilínea for(i=1;i<=nVert;i++) { //copio las coordenadas del vértice result->x[i] = aux->x; result->y[i] = aux->y; //siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return result; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/dpeuckere.c000644 001750 001750 00000175576 13655510024 016105 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeuckere.c \brief Definición de funciones auxiliares para el aligerado de polilíneas sobre la superficie de la esfera, basadas en el algoritmo de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 15 de agosto de 2013 \copyright Copyright (c) 2013-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/dpeuckere.h" /******************************************************************************/ /******************************************************************************/ int GeocParOmpDpeuckere(char version[]) { //comprobamos si hay paralelización #if defined(_OPENMP) //comprobamos si hay que extraer versión if(version!=NULL) { //calculamos la versión VersionOpenMP(_OPENMP,version); } //salimos de la función return 1; #else if(version!=NULL) { //utilizamos la variable version para que no dé warming al compilar strcpy(version,""); } //salimos de la función return 0; #endif } /******************************************************************************/ /******************************************************************************/ void DouglasPeuckerOriginalEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const size_t posIni, const size_t posFin, char* usados) { //índice para recorrer bucles size_t i=0; //seno de la distancia angular de los puntos al segmento base double dist=0.0; //valor absoluto del seno de la tolerancia, excepto en el caso en que ésta //sea mayor que pi/2, que hacemos 1-cos(tol) para que quede un valor mayor //que 1 double stol=(tol<=(2.0*GEOC_CONST_PI)) ? fabs(sin(tol)) : 1.0-cos(tol); //posición de la distancia máxima size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos casos especiales if((nPtos<=2)||(stol==0.0)) { //se usan todos los puntos for(i=0;istol) { //indicamos que el punto se usa usados[pos] = 1; //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(incY,y,incX,x,nPtos,tol,posIni,posFin,pos,usados) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos el algoritmo a la parte anterior al punto de trabajo DouglasPeuckerOriginalEsfera(x,y,nPtos,incX,incY,tol,posIni,pos, usados); #if defined(_OPENMP) #pragma omp section #endif //aplicamos el algoritmo a la parte posterior al punto de trabajo DouglasPeuckerOriginalEsfera(x,y,nPtos,incX,incY,tol,pos,posFin, usados); } // --> fin del #pragma omp parallel sections } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ size_t* DouglasPeuckerRobustoEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, size_t* nPtosSal) { //índices para recorrer bucles size_t i=0,j=0; //valor absoluto de la tolerancia double atol=fabs(tol); //tolerancia angular double tolAng=fabs(GEOC_ARC_RES_ANG); //coordenadas de trabajo double lonFinR=0.0; //matriz de rotación double mRot[3][3]; //variable indicadora de punto en tolerancia int entol=0; //identificador de caso especial int hayCasoEspecial=0; //identificadores de utilización de algoritmos semi robustos int robOrig=0,robAuto=0; //número de elementos de trabajo internos del vector de salida size_t nElem=0; //identificador de paralelización int paraleliza=0; //vectores para almacenar coordenadas cartesianas geocéntricas double* xG=NULL; double* yG=NULL; double* zG=NULL; //variable auxiliar double cLat=0.0,latVert=0.0,lonVert=0.0; //vector de salida size_t* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos casos especiales sal = CasosEspecialesAligeraPolilinea(x,y,nPtos,incX,incY,atol,nPtosSal, &hayCasoEspecial); //comprobamos si ha habido algún caso especial if(hayCasoEspecial) { //comprobamos si ha ocurrido algún error de asignación de memoria if(nPtos&&(sal==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } else { //salimos de la función return sal; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos memoria para las coordenadas cartesianas geocéntricas xG = (double*)malloc(nPtos*sizeof(double)); yG = (double*)malloc(nPtos*sizeof(double)); zG = (double*)malloc(nPtos*sizeof(double)); //comprobamos los posibles errores if((xG==NULL)||(yG==NULL)||(zG==NULL)) { //liberamos la posible memoeia asignada free(xG); free(yG); free(zG); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(nPtos,incY,y,incX,x,xG,yG,zG) \ private(i,latVert,lonVert,cLat) #endif //recorremos los puntos de trabajo for(i=0;i1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el indicador interno de tamaño del vector nElem = GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)malloc(nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //liberamos la posible memoria asignada free(xG); free(yG); free(zG); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //indicamos que el primer punto siempre se usa *nPtosSal = 1; sal[0] = 0; //puntos de trabajo para iniciar los cálculos i = 0; j = 2; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //entramos en un bucle mientras no hayamos llegado hasta el último punto while(j1)) { //aplicamos el algoritmo en paralelo entol = DouglasPeuckerPuntosEnTolEsferaOMP(x,y,incX,incY,xG,yG,zG, atol,i,j,i+1,j-1,lonFinR, mRot); } else { //aplicamos el algoritmo en serie entol = DouglasPeuckerPuntosEnTolEsferaSerie(x,y,incX,incY,xG,yG,zG, atol,i,j,i+1,j-1, lonFinR,mRot); } //comprobamos si todos los puntos están en tolerancia if(entol) { //pasamos al siguiente punto como extremo del segmento j++; } else { //el punto final será el anterior al actual, ya que con el actual //hay al menos un vértice fuera de tolerancia y con el anterior se //comprobó en el paso previo del bucle que no había ningún vértice //fuera j--; //aplicación del algoritmo de intersección con puntos originales if(robOrig) { //aplicamos el algoritmo DouglasPeuckerRobIntersecOrigEsfera(x,y,nPtos,incX,incY,xG,yG, zG,nSegRobOrig,i,&j); } //aplicación del algoritmo de auto intersección if(robAuto) { //aplicamos el algoritmo DouglasPeuckerRobAutoIntersecEsfera(x,y,incX,incY,xG,yG,zG,i,&j, sal,*nPtosSal,nSegRobAuto); } //añadimos al contador el nuevo punto (*nPtosSal)++; //comprobamos si hay que reasignar memoria if((*nPtosSal)>nElem) { //añadimos otro grupo de puntos nElem += GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //liberamos la posible memoria asignada free(xG); free(yG); free(zG); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //añadimos el punto al vector de salida sal[(*nPtosSal)-1] = j; //actualizamos los índices de los puntos de trabajo i = j; j = i+2; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que añadir el último punto if((sal[(*nPtosSal)-1]!=(nPtos-1))&& ((x[sal[(*nPtosSal)-1]*incX]!=x[(nPtos-1)*incX])|| (y[sal[(*nPtosSal)-1]*incY]!=y[(nPtos-1)*incY]))) { //añadimos al contador el último punto (*nPtosSal)++; //comprobamos si hay que reasignar memoria if((*nPtosSal)>nElem) { //añadimos otro grupo de puntos nElem += GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //liberamos la posible memoria asignada free(xG); free(yG); free(zG); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos el último punto sal[(*nPtosSal)-1] = nPtos-1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si el vector de salida tiene demasiada memoria asignada if(nElem>(*nPtosSal)) { //ajustamos el tamaño del vector de salida sal = (size_t*)realloc(sal,(*nPtosSal)*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //liberamos la posible memoria asignada free(xG); free(yG); free(zG); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la posible memoria asignada free(xG); free(yG); free(zG); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerPuntosEnTolEsferaOMP(const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin, const double lonFinR, double mRot[][3]) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //identificador de punto fuera de tolerancia int ftol=0; //coordenadas de los vértices de trabajo double xTrab=0.0,yTrab=0.0,xGTrab=0.0,yGTrab=0.0,zGTrab=0.0; //distancia calculada double dist=0.0; //identificador de existencia de coordenadas cartesianas geocéntricas int ccart=0; //variable de salida int entol=1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((posBaseIni+1)>=posBaseFin) { //salimos de la función return entol; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //valor absoluto del seno de la tolerancia, excepto en el caso en que ésta //sea mayor que pi/2, que hacemos 1-cos(tol) para que quede un valor > 1 atol = (atol<=(2.0*GEOC_CONST_PI)) ? sin(atol) : 1.0-cos(atol); //comprobamos si se han pasado coordenadas cartesianas geocénticas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //indicamos que sí existen ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posPtoIni,posPtoFin,incX,x,incY,y,ccart,xG,yG,zG,mRot,lonFinR,atol) \ private(i,xTrab,yTrab,xGTrab,yGTrab,zGTrab,dist) \ reduction(+:ftol) #endif //recorremos los puntos de trabajo for(i=posPtoIni;i<=posPtoFin;i++) { //sólo calculo si no se ha encontrado ningún punto fuera de tolerancia //en este hilo if(!ftol) { //extraemos las coordenadas del vértice de trabajo xTrab = x[i*incX]; yTrab = y[i*incY]; //comprobamos si hay coordenadas cartesianas if(ccart) { //extraigo las coordenadas cartesianas del vértice de trabajo xGTrab = xG[i]; yGTrab = yG[i]; zGTrab = zG[i]; } else { //como no hay coordenadas cartesianas, asigno NaN xGTrab = GeocNan(); yGTrab = xGTrab; zGTrab = xGTrab; } //calculamos la distancia sobre la esfera de radio unidad dist = DouglasPeuckerSenDistMaxEsferaAux(yTrab,xTrab,xGTrab,yGTrab, zGTrab,lonFinR,mRot); //comprobamos si está fuera de tolerancia if(dist>atol) { //aumentamos el indicador de fuera de tolerancia ftol++; } } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay algún punto fuera de tolerancia if(ftol) { //indicamos que hay algún punto que no está en tolerancia entol = 0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return entol; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerPuntosEnTolEsferaSerie(const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin, const double lonFinR, double mRot[][3]) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //coordenadas de los vértices double xTrab=0.0,yTrab=0.0; double xGTrab=GeocNan(),yGTrab=GeocNan(),zGTrab=GeocNan(); //distancia calculada double dist=0.0; //identificador de existencia de coordenadas cartesianas geocéntricas int ccart=0; //variable de salida int entol=1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((posBaseIni+1)>=posBaseFin) { //salimos de la función return entol; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //valor absoluto del seno de la tolerancia, excepto en el caso en que ésta //sea mayor que pi/2, que hacemos 1-cos(tol) para que quede un valor > 1 atol = (atol<=(2.0*GEOC_CONST_PI)) ? sin(atol) : 1.0-cos(atol); //comprobamos si se han pasado coordenadas cartesianas geocénticas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //indicamos que sí existen ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos a chequear for(i=posPtoIni;i<=posPtoFin;i++) { //extraemos las coordenadas del vértice de trabajo xTrab = x[i*incX]; yTrab = y[i*incY]; //extraemos las coordenadas cartesianas del vértice de trabajo if(ccart) { xGTrab = xG[i]; yGTrab = yG[i]; zGTrab = zG[i]; } //calculamos la distancia sobre la esfera de radio unidad dist = DouglasPeuckerSenDistMaxEsferaAux(yTrab,xTrab,xGTrab,yGTrab, zGTrab,lonFinR,mRot); //comprobamos si está fuera de tolerancia if(dist>atol) { //indicamos que estamos fuera de tolerancia entol = 0; //salimos del bucle break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return entol; } /******************************************************************************/ /******************************************************************************/ void DouglasPeuckerRobIntersecOrigEsfera(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t segAUsar, const size_t posIni, size_t* posFin) { //índice para recorrer bucles size_t i=0; //coordenadas del arco base double xA=0.0,yA=0.0,xB=0.0,yB=0.0; //posición de parada para comprobar la intersección de arcos size_t posParada=0; //identificación de paralelización int paraleliza=0; //variable identificadora de existencia de corte de segmentos int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si los puntos de inicio y fin son contiguos, hay salida rápida if((posIni+1)>=(*posFin)) { //salimos de la función return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if defined(_OPENMP) //comprobamos si hay más de un procesador if(omp_get_num_procs()>1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //posición de parada para el chequeo de segmentos/arcos posParada = ((segAUsar==0)||(segAUsar>=(nPtos-(*posFin)))) ? nPtos-1 : (*posFin)+segAUsar; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas del punto inicial del segmento/arco base (no cambian) xA = x[posIni*incX]; yA = y[posIni*incY]; //construimos todos los segmentos/arcos base posibles for(i=(*posFin);i>posIni;i--) { //comprobamos si estamos ante el punto posterior al inicial if(i==(posIni+1)) { //este punto es el siguiente al punto inicial del segmento/arco base *posFin = i; //salimos del bucle break; } //coordenadas del punto final del segmento/arco base xB = x[i*incX]; yB = y[i*incY]; //comprobamos si hay que paralelizar if(paraleliza) { //calculamos en paralelo corte = DouglasPeuckerRobIntersecOrigEsferaOMP(xA,yA,xB,yB,x,y,incX, incY,xG,yG,zG,i, posParada); } else { //calculamos en serie corte = DouglasPeuckerRobIntersecOrigEsferaSerie(xA,yA,xB,yB,x,y, incX,incY,xG,yG,zG, i,posParada); } //comprobamos si no ha habido ninguna intersección if(!corte) { //indicamos el índice del vértice final *posFin = i; //salimos del bucle de segmentos base break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecOrigEsferaOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas de los arcos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; double xBR=0.0,xCR=0.0,yCR=0.0,xDR=0.0,yDR=0.0; double xGC=0.0,yGC=0.0,zGC=0.0,xGD=0.0,yGD=0.0,zGD=0.0; double xGCR=0.0,yGCR=0.0,zGCR=0.0,xGDR=0.0,yGDR=0.0,zGDR=0.0; //matriz de rotación double mRot[3][3]; //identificador de haber pasado coordenadas cartesianas int ccart=0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //llevamos AB al ecuador, con A en (lat=0,lon=0) RotaArco00Ecuador(tol,yA,xA,yB,xB,mRot,&xBR); //comprobamos si se han pasado coordenadas cartesianas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //se han pasado ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posIni,posFin,incX,x,incY,y,tol,xA,xB,ccart,xG,yG,zG,mRot,xBR) \ private(i,xGC,yGC,zGC,xGD,yGD,zGD,xGCR,yGCR,zGCR,xGDR,yGDR,zGDR, \ xC,yC,xD,yD,xCR,yCR,xDR,yDR) \ reduction(+:corte) #endif //recorremos los puntos de trabajo for(i=posIni;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecOrigEsferaSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; double xBR=0.0,xCR=0.0,yCR=0.0,xDR=0.0,yDR=0.0; double xGC=0.0,yGC=0.0,zGC=0.0,xGD=0.0,yGD=0.0,zGD=0.0; double xGCR=GeocNan(),yGCR=GeocNan(),zGCR=GeocNan(); double xGDR=GeocNan(),yGDR=GeocNan(),zGDR=GeocNan(); //matriz de rotación double mRot[3][3]; //identificador de haber pasado coordenadas cartesianas int ccart=0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //llevamos AB al ecuador, con A en (lat=0,lon=0) RotaArco00Ecuador(tol,yA,xA,yB,xB,mRot,&xBR); //comprobamos si se han pasado coordenadas cartesianas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //se han pasado ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos de trabajo for(i=posIni;i=(*posFin)) { //salimos de la función return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if defined(_OPENMP) //comprobamos si hay más de un procesador if(omp_get_num_procs()>1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //posición de parada en el vector posAlig para el chequeo de segmentos/arcos posParada = ((segAUsar==0)||(segAUsar>=(nPosAlig-1))) ? 0 : nPosAlig-1-segAUsar; //coordenadas del punto inicial del arco base (no cambian) xA = x[posIni*incX]; yA = y[posIni*incY]; //construimos todos los arcos base posibles for(i=(*posFin);i>posIni;i--) { //comprobamos si estamos ante el punto posterior al inicial if(i==(posIni+1)) { //este punto es el siguiente al punto inicial del segmento/arco base *posFin = i; //salimos del bucle break; } //coordenadas del punto final del segmento/arco base xB = x[i*incX]; yB = y[i*incY]; //comprobamos si hay que paralelizar if(paraleliza) { //calculamos en paralelo corte = DouglasPeuckerRobAutoIntersecEsferaOMP(xA,yA,xB,yB,x,y,incX, incY,xG,yG,zG, posAlig,nPosAlig, nPosAlig-1, posParada); } else { //calculamos en serie corte = DouglasPeuckerRobAutoIntersecEsferaSerie(xA,yA,xB,yB,x,y, incX,incY,xG,yG,zG, posAlig,nPosAlig, nPosAlig-1, posParada); } //comprobamos si no ha habido ninguna intersección if(!corte) { //indicamos el índice del vértice final *posFin = i; //salimos del bucle de segmentos base break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobAutoIntersecEsferaOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; double xBR=0.0,xCR=0.0,yCR=0.0,xDR=0.0,yDR=0.0; double xGC=0.0,yGC=0.0,zGC=0.0,xGD=0.0,yGD=0.0,zGD=0.0; double xGCR=0.0,yGCR=0.0,zGCR=0.0,xGDR=0.0,yGDR=0.0,zGDR=0.0; //matriz de rotación double mRot[3][3]; //identificador de haber pasado coordenadas cartesianas int ccart=0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //llevamos AB al ecuador, con A en (lat=0,lon=0) RotaArco00Ecuador(tol,yA,xA,yB,xB,mRot,&xBR); //comprobamos si se han pasado coordenadas cartesianas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //se han pasado ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posIni,posFin,incX,x,posAlig,incY,y,tol,xA,xB,ccart,xG,yG,zG,mRot,xBR, \ nPosAlig) \ private(i,xGC,yGC,zGC,xGD,yGD,zGD,xGCR,yGCR,zGCR,xGDR,yGDR,zGDR, \ xC,yC,xD,yD,xCR,yCR,xDR,yDR) \ reduction(+:corte) #endif //recorremos los puntos de trabajo for(i=posIni;i>posFin;i--) { //sólo realizo cálculos si no se ha encontrado ningún corte en este hilo if(!corte) { //puntos inicial y final del siguiente segmento/arco de trabajo xC = x[posAlig[i]*incX]; yC = y[posAlig[i]*incY]; xD = x[posAlig[i-1]*incX]; yD = y[posAlig[i-1]*incY]; //sigo si los rectángulos que encierran a los segmentos se cortan if(!ArcosCircMaxDisjuntos(tol, GEOC_MIN(xA,xB),GEOC_MAX(xA,xB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD))) { //comprobamos si hay coordenadas cartesianas if(ccart) { //extraigo las coordenadas cartesianas xGC = xG[posAlig[i]]; yGC = yG[posAlig[i]]; zGC = zG[posAlig[i]]; xGD = xG[posAlig[i-1]]; yGD = yG[posAlig[i-1]]; zGD = zG[posAlig[i-1]]; //aplico la rotación a las coordenadas cartesianas AplicaMatrizRotacionCoorCart(1,xGC,yGC,zGC,mRot,&xGCR,&yGCR, &zGCR); AplicaMatrizRotacionCoorCart(1,xGD,yGD,zGD,mRot,&xGDR,&yGDR, &zGDR); //coordenadas geodésicas de los puntos rotados yCR = asin(zGCR); xCR = atan2(yGCR,xGCR); yDR = asin(zGDR); xDR = atan2(yGDR,xGDR); } else { //como no hay coordenadas cartesianas, asigno NaN xGCR = GeocNan(); yGCR = xGCR; zGCR = xGCR; xGDR = xGCR; yGDR = xGCR; zGDR = xGCR; //rotamos las coordenadas de C y D AplicaMatrizRotacionCoorGeod(1,yC,xC,mRot,&yCR,&xCR); AplicaMatrizRotacionCoorGeod(1,yD,xD,mRot,&yDR,&xDR); } //comprobamos si hay intersección corte += DouglasPeuckerRobIntersecEsfera(xBR,xCR,yCR,xDR,yDR, xGCR,yGCR,zGCR,xGDR, yGDR,zGDR, posAlig[nPosAlig-1], posAlig[i]); } } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobAutoIntersecEsferaSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const double* xG, const double* yG, const double* zG, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; double xBR=0.0,xCR=0.0,yCR=0.0,xDR=0.0,yDR=0.0; double xGC=0.0,yGC=0.0,zGC=0.0,xGD=0.0,yGD=0.0,zGD=0.0; double xGCR=GeocNan(),yGCR=GeocNan(),zGCR=GeocNan(); double xGDR=GeocNan(),yGDR=GeocNan(),zGDR=GeocNan(); //matriz de rotación double mRot[3][3]; //identificador de haber pasado coordenadas cartesianas int ccart=0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //llevamos AB al ecuador, con A en (lat=0,lon=0) RotaArco00Ecuador(tol,yA,xA,yB,xB,mRot,&xBR); //comprobamos si se han pasado coordenadas cartesianas if((xG!=NULL)&&(yG!=NULL)&&(zG!=NULL)) { //se han pasado ccart = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos de trabajo for(i=posIni;i>posFin;i--) { //puntos inicial y final del siguiente segmento/arco de trabajo xC = x[posAlig[i]*incX]; yC = y[posAlig[i]*incY]; xD = x[posAlig[i-1]*incX]; yD = y[posAlig[i-1]*incY]; //seguimos si los rectángulos que encierran a los segmentos se cortan if(!ArcosCircMaxDisjuntos(tol, GEOC_MIN(xA,xB),GEOC_MAX(xA,xB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD))) { //comprobamos si hay coordenadas cartesianas if(ccart) { //extraigo las coordenadas cartesianas xGC = xG[posAlig[i]]; yGC = yG[posAlig[i]]; zGC = zG[posAlig[i]]; xGD = xG[posAlig[i-1]]; yGD = yG[posAlig[i-1]]; zGD = zG[posAlig[i-1]]; //aplico la rotación a las coordenadas cartesianas AplicaMatrizRotacionCoorCart(1,xGC,yGC,zGC,mRot,&xGCR,&yGCR, &zGCR); AplicaMatrizRotacionCoorCart(1,xGD,yGD,zGD,mRot,&xGDR,&yGDR, &zGDR); //coordenadas geodésicas de los puntos rotados yCR = asin(zGCR); xCR = atan2(yGCR,xGCR); yDR = asin(zGDR); xDR = atan2(yGDR,xGDR); } else { //rotamos las coordenadas de C y D AplicaMatrizRotacionCoorGeod(1,yC,xC,mRot,&yCR,&xCR); AplicaMatrizRotacionCoorGeod(1,yD,xD,mRot,&yDR,&xDR); } //comprobamos si hay intersección corte = DouglasPeuckerRobIntersecEsfera(xBR,xCR,yCR,xDR,yDR,xGCR, yGCR,zGCR,xGDR,yGDR,zGDR, posAlig[nPosAlig-1], posAlig[i]); } //si ha habido intersección de segmentos/arcos, salimos del bucle if(corte) { //salimos del bucle break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecEsfera(const double xB, const double xC, const double yC, const double xD, const double yD, const double xGC, const double yGC, const double zGC, const double xGD, const double yGD, const double zGD, const size_t posFinAB, const size_t posIniCD) { //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //variables auxiliares double xAux=0.0,yAux=0.0; //identificador de intersección int inter=GEOC_DPEUCKER_NO_INTERSEC; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //seguimos si los rectángulos que encierran a los arcos se cortan if(!ArcosCircMaxDisjuntos(tol, GEOC_MIN(0.0,xB),GEOC_MAX(0.0,xB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD))) { //comprobamos la posible intersección de los arcos inter = IntersecArcCircMaxEsferaAux(tol,xB,yC,xC,yD,xD,xGC,yGC,zGC,xGD, yGD,zGD,&yAux,&xAux); //compruebo si los dos arcos son contiguos if(posFinAB==posIniCD) { //compruebo si es la sucesión de arco inicial+final if((inter!=GEOC_ARC_INTERSEC_MISMO_ARC)&& (inter!=GEOC_ARC_INTERSEC_COLIN)) { //en este caso, no hay intersección inter = GEOC_DPEUCKER_NO_INTERSEC; } } //unificamos los identificadores de intersección if(!((inter==GEOC_ARC_NO_INTERSEC)||(inter==GEOC_DPEUCKER_NO_INTERSEC))) { //hay intersección corte = 1; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ double DouglasPeuckerSenDistMaxEsfera(const double* lat, const double* lon, const size_t incLat, const size_t incLon, const size_t posIni, const size_t posFin, size_t* pos) { //índice para recorrer bucles size_t i=0; //tolerancia angular double tol=fabs(GEOC_ARC_RES_ANG); //coordenadas del punto de trabajo double latP=0.0,lonP=0.0; //matriz de rotación double mRot[3][3]; //longitud del extremo final de la base en el sistema rotado double lonFinR=0.0; //variable auxiliar double distAux=0.0; //variable de salida double dist=-1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los dos puntos están seguidos if((posIni+1)==posFin) { //la posición que devolvemos es la del punto inicial *pos = posIni; //la distancia devuelta es -1.0 return dist; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la matriz de rotación para llevar la base al ecuador RotaArco00Ecuador(tol, lat[posIni*incLat],lon[posIni*incLon], lat[posFin*incLat],lon[posFin*incLon],mRot,&lonFinR); //recorremos los puntos entre los extremos for(i=posIni+1;idist) { //actualizamos la distancia máxima dist = distAux; //guardamos la posición del punto *pos = i; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return dist; } /******************************************************************************/ /******************************************************************************/ double DouglasPeuckerSenDistMaxEsferaAux(const double latVert, const double lonVert, const double xVert, const double yVert, const double zVert, const double lonBase2R, double mRot[][3]) { //coordenadas cartesianas tridimensionales geocéntricas double x=0.0,y=0.0,z=0.0,xR=0.0,yR=0.0,zR=0.0,xB2R=0.0,yB2R=0.0; //longitud del vértice en el sistema rotado double lonVR=0.0; //variables auxiliares double cLat=0.0,alfa=0.0,cAlfa=0.0; //variable de salida double dist=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si se han pasado las coordenadas cartesianas del vértice if((!EsGeocNan(xVert))&&(!EsGeocNan(yVert))&&(!EsGeocNan(zVert))) { //asignamos las coordenadas a las variables de trabajo x = xVert; y = yVert; z = zVert; } else { //calculamos las coordenadas tridimensionales del vértice de trabajo cLat = cos(latVert); x = cLat*cos(lonVert); y = cLat*sin(lonVert); z = sin(latVert); } //aplicamos la rotación AplicaMatrizRotacionCoorCart(1,x,y,z,mRot,&xR,&yR,&zR); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //distinguimos todos los casos de trabajo if((xR==0.0)&&(yR==0.0)) { //el vértice queda en el polo dist = 1.0; } else { //distinguimos casos especiales if(((lonBase2R>0.0)&&(yR<0.0))||((lonBase2R<0.0)&&(yR>0.0))) { //vértice fuera de la base: izquierda de AB o derecha de BA //coseno del ángulo en el espacio que forma el eje X con el vector //OV, es decir, entre los vectores (1,0,0) y (xR,yR,zR) cAlfa = xR/sqrt(xR*xR+yR*yR+zR*zR); //ángulo alfa = acos(cAlfa); //comprobamos si el ángulo es mayor o menor de pi/2 if(alfa<=(2.0*GEOC_CONST_PI)) { //la variable de salida es el seno del ángulo dist = sin(alfa); } else { //la variable de salida es 1 menos el coseno del ángulo, para //quede un valor mayor que 1 dist = 1.0-cos(alfa); } } else { //longitud del vértice en el sistema rotado lonVR = atan2(yR,xR); //distinguimos casos especiales if(((lonBase2R>0.0)&&(lonVR>lonBase2R))|| ((lonBase2R<0.0)&&(lonVRanterior = anterior; nuevoVert->siguiente = siguiente; //si anterior es un vértice bueno if(anterior!=NULL) { //lo apuntamos al vértice creado nuevoVert->anterior->siguiente = nuevoVert; } //si siguiente es un vértice bueno if(siguiente!=NULL) { //indicamos que el vértice creado es el anterior nuevoVert->siguiente->anterior = nuevoVert; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el resto de campos nuevoVert->x = x; nuevoVert->y = y; nuevoVert->xP = x; nuevoVert->yP = y; nuevoVert->vecino = vecino; nuevoVert->ini = ini; nuevoVert->interseccion = interseccion; nuevoVert->entrada = entrada; nuevoVert->visitado = visitado; nuevoVert->alfa = alfa; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return nuevoVert; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* CreaPoliClip(const double* x, const double* y, const size_t nCoor, const size_t incX, const size_t incY) { //índice para recorrer bucles size_t i=0; //variables auxiliares de posición size_t posIni=0,posFin=0; //otra variable auxiliar int hayVert=0; //estructura auxiliar vertPoliClip* aux=NULL; //variable de salida vertPoliClip* poli=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //buscamos el primer punto que sea distinto de NaN for(i=0;isiguiente; //liberamos la memoria free(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* ReiniciaPoliClip(vertPoliClip* poli) { //estructura que apunta al espacio en memoria a liberar vertPoliClip* borra=NULL; //estructura auxiliar vertPoliClip* aux=NULL; //estructura de salida vertPoliClip* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar aux = poli; //comprobamos una posible salida rápida if(aux==NULL) { //salimos de la función return NULL; } //buscamos para la estructura de salida el primer vértice que no sea una //intersección while(aux!=NULL) { //comprobamos si estamos ante un vértice bueno if(aux->interseccion==0) { //asignamos la variable de salida sal = aux; //salimos del bucle break; } //siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //volvemos a inicializar la variable auxiliar aux = poli; //mientras la variable de trabajo no apunte a NULL while(aux!=NULL) { //comprobamos si estamos ante un vértice a borrar if(aux->interseccion) { //lo almacenamos en la estructura de borrado borra = aux; //actualizamos el puntero de vértice siguiente if(aux->anterior!=NULL) { //cuando el vértice a borrar no es el primero de la lista aux->anterior->siguiente = aux->siguiente; } else if(aux->siguiente!=NULL) { //cuando el vértice a borrar es el primero de la lista aux->siguiente->anterior = NULL; } //actualizamos el puntero de vértice anterior if(aux->siguiente!=NULL) { //cuando el vértice a borrar no es el último de la lista aux->siguiente->anterior = aux->anterior; } else if(aux->anterior!=NULL) { //cuando el vértice a borrar es el último de la lista aux->anterior->siguiente = NULL; } //apuntamos al siguiente elemento aux = aux->siguiente; //liberamos la memoria free(borra); } else { //reinicializamos el resto de miembros, menos las coordenadas //originales y el identificador de primer elemento aux->xP = aux->x; aux->yP = aux->y; aux->vecino = NULL; aux->interseccion = 0; aux->entrada = 0; aux->visitado = 0; aux->alfa = 0.0; //siguiente elemento aux = aux->siguiente; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* ReiniciaVerticesPoliClip(vertPoliClip* poli) { //estructura auxiliar vertPoliClip* aux=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura de auxiliar con la dirección de entrada aux = poli; //mientras no lleguemos al final while(aux!=NULL) { //vamos poniendo a 0 el campo 'visitado' aux->visitado = 0; //vamos poniendo a 0 el campo 'entrada' aux->entrada = 0; //nos posicionamos en el siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return poli; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* SiguienteVertOrigPoliClip(vertPoliClip* vert) { //variable de salida, que inicializamos con la dirección de entrada vertPoliClip* sal=vert; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si estamos ante un vértice original, pasamos al siguiente if((sal!=NULL)&&(sal->interseccion==0)) { //apuntamos al siguiente vértice sal = sal->siguiente; } //vamos rechazando intersecciones (el bucle se para cuando llegamos al final //o a un vértice que no es intersección) while((sal!=NULL)&&(sal->interseccion!=0)) { //pasamos al siguiente vértice sal = sal->siguiente; } //si hemos llegado a un vértice que no es original, apuntamos a NULL if((sal!=NULL)&&(sal->interseccion!=0)) { //asignamos NULL sal = NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* SiguienteIntersecNoVisitadaPoliClip(vertPoliClip* vert) { //variable de salida, que inicializamos con la dirección de entrada vertPoliClip* sal=vert; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si estamos ante una intersección no visitada o ante el vértice original //del polígono, pasamos al siguiente vértice if((sal!=NULL)&& (((sal->interseccion!=0)&&(sal->visitado==0))||(sal->ini!=0))) { //apuntamos al siguiente vértice sal = sal->siguiente; } //vamos rechazando vértices originales e intersecciones visitadas: el bucle //se para cuando llegamos al final (si la lista no es circular), cuando //volvamos al principio (si la lista es circular) o cuando lleguemos a una //intersección no visitada while(((sal!=NULL)&&(sal->ini==0))&& ((sal->interseccion==0)|| ((sal->interseccion!=0)&&(sal->visitado!=0)))) { //pasamos al siguiente vértice sal = sal->siguiente; } //si hemos llegado a un vértice que no es una intersección no visitada o es //de nuevo el punto inicial (lista circular), apuntamos a NULL if((sal!=NULL)&& (((sal->interseccion!=0)&&(sal->visitado!=0))||(sal->ini!=0))) { //asignamos NULL sal = NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* UltimoVertPoliClip(vertPoliClip* poli) { //variable de salida, que inicializamos con la dirección de entrada vertPoliClip* sal=poli; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //sólo trabajamos si la entrada es distinta de NULL if(sal!=NULL) { //mientras el siguiente vértice sea distinto de NULL while(sal->siguiente!=NULL) { //avanzamos un vértice sal = sal->siguiente; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ void InsertaVertPoliClip(vertPoliClip* ins, vertPoliClip* extremoIni, vertPoliClip* extremoFin) { //estructura auxiliar vertPoliClip* aux=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el vértice auxiliar como el extremo inicial pasado aux = extremoIni; //mientras no lleguemos al extremo final y el punto a insertar esté más //lejos del origen que el punto de trabajo while((aux!=extremoFin)&&((aux->alfa)<=(ins->alfa))) { //avanzamos al siguiente vértice aux = aux->siguiente; } //insertamos el punto y ordenamos los punteros de vértices anterior y //posterior ins->siguiente = aux; ins->anterior = aux->anterior; ins->anterior->siguiente = ins; ins->siguiente->anterior = ins; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ vertPoliClip* CierraPoliClip(vertPoliClip* poli) { //estructura auxiliar vertPoliClip* aux=NULL; //variable de salida: último vértice de la lista original vertPoliClip* ultimo=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si se ha pasado NULL if(poli==NULL) { //salimos de la función return NULL; } //buscamos el último vértice de la lista original ultimo = UltimoVertPoliClip(poli); //almacenamos el penúltimo vértice en la estructura auxiliar aux = ultimo->anterior; //apuntamos el penúltimo vértice al primero aux->siguiente = poli; //le decimos al primer vértice cuál es el anterior aux->siguiente->anterior = aux; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return ultimo; } /******************************************************************************/ /******************************************************************************/ void AbrePoliClip(vertPoliClip* poli, vertPoliClip* ultimo) { //estructuras auxiliares vertPoliClip* aux=poli; vertPoliClip* ult=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //buscamos el vértice inicial while((aux!=NULL)&&(aux->ini==0)) { //pasamos al siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //último vértice ult = aux->anterior; //le decimos al falso último vértice cuál es el último verdadero ult->siguiente = ultimo; //ajustamos los parámetros del nuevo último vértice ultimo->anterior = ult; ultimo->siguiente = NULL; //le decimos al primer vértice que el anterior es NULL aux->anterior = NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int PtoEnPoliClip(const double x, const double y, vertPoliClip* poli) { //estructuras auxiliares vertPoliClip* aux=NULL; vertPoliClip* aux1=NULL; //coordenadas auxiliares double x1=0.0,y1=0.0,x2=0.0,y2=0.0; //variable de salida int c=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //comprobamos si no es un vértice original if(aux->interseccion!=0) { //nos posicionamos en el siguiente vértice original aux = SiguienteVertOrigPoliClip(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //entramos en un bucle infinito while(1) { //nos posicionamos en el siguiente vértice original aux1 = SiguienteVertOrigPoliClip(aux); //sólo continuamos si el siguiente vértice no es NULL if(aux1!=NULL) { //extraemos las coordenadas de trabajo x1 = aux->xP; y1 = aux->yP; x2 = aux1->xP; y2 = aux1->yP; //actalizamos el vértice inicial de trabajo para la siguiente vuelta aux = aux1; //calculamos if(((y1>y)!=(y2>y))&&(x<(x2-x1)*(y-y1)/(y2-y1)+x1)) { c = !c; } } else { //salimos del bucle break; } } //asignamos el elemento de salida if(c) { //el punto está dentro del polígono c = GEOC_PTO_DENTRO_POLIG; } else { //el punto está fuera del polígono c = GEOC_PTO_FUERA_POLIG; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return c; } /******************************************************************************/ /******************************************************************************/ int PtoEnPoliClipVertice(const double x, const double y, vertPoliClip* poli) { //estructura auxiliar vertPoliClip* aux=NULL; //variable de salida, que inicializamos fuera del polígono int pos=GEOC_PTO_FUERA_POLIG; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //comprobamos si no es un vértice original if(aux->interseccion!=0) { //nos posicionamos en el siguiente vértice original aux = SiguienteVertOrigPoliClip(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si el punto es un vértice while(aux!=NULL) { //comprobamos si las coordenadas coinciden if((aux->xP==x)&&(aux->yP==y)) { //indicamos que el punto es un vértice pos = GEOC_PTO_VERTICE_POLIG; //salimos del bucle break; } //nos posicionamos en el siguiente vértice original aux = SiguienteVertOrigPoliClip(aux); } //sólo continuamos si el punto no es un vértice if(pos!=GEOC_PTO_VERTICE_POLIG) { //calculamos la posición sin tener en cuenta el borde pos = PtoEnPoliClip(x,y,poli); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return pos; } /******************************************************************************/ /******************************************************************************/ size_t NumeroVertOrigPoliClip(vertPoliClip* poli) { //estructura auxiliar vertPoliClip* aux=NULL; //variable de salida size_t num=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //comprobamos si estamos ante un vértice original if(aux->interseccion!=0) { //si no es un vértice original, nos posicionamos en el siguiente que sí //lo sea aux = SiguienteVertOrigPoliClip(aux); } //mientras no lleguemos al final while(aux!=NULL) { //aumentamos el contador de vértices originales num++; //nos posicionamos en el siguiente vértice original aux = SiguienteVertOrigPoliClip(aux); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return num; } /******************************************************************************/ /******************************************************************************/ size_t NumeroVertPoliClip(vertPoliClip* poli) { //estructura auxiliar vertPoliClip* aux=NULL; //variable de salida size_t num=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la estructura auxiliar con la dirección de entrada aux = poli; //mientras no lleguemos al final while(aux!=NULL) { //aumentamos el contador de vértices num++; //nos posicionamos en el siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return num; } /******************************************************************************/ /******************************************************************************/ double CantPerturbMin(const double x, const double factor) { //valor absoluto del argumento de entrada double xAbs=fabs(x); //variable auxiliar double aux=0.0; //variable de salida, que inicializamos como el épsilon para el tipo de dato double sal=fabs(DBL_EPSILON); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //mientras la variable auxiliar sea igual a la de antrada (la primera vuelta //del bucle se ejecuta siempre) do { //escalamos la variable de salida sal *= factor; //sumamos el nuevo valor a la coordenada de entrada //esta suma es necesario realizarla aquí, en lugar de en la propia //comparación del while, para obligar al resultado a almacenarse en una //variable y evitar errores porque las variables intermedias de la //comparación puede que se almacenen en registros de más precisión que //el tipo de dato aux = xAbs+sal; }while(aux==xAbs); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ double PerturbaPuntoMin(const double x, const double factor) { //variable para almacenar un número seudoaleatorio int aleat=0; //cantidad perturbadora double perturb=0.0; //signo para multiplicar por la cantidad perturbadora double signo=0.0; //variable de salida double sal=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //plantamos la semilla para la función rand() srand((unsigned int)time(NULL)); //generamos el número seudoaleatorio aleat = rand(); //calculamos el signo para la multiplicación, basándonos en la paridad del //número seudoaleatorio generado: si es par vale 1 y si es impar -1 signo = (aleat%2) ? -1.0 : 1.0; //calculamos la cantidad perturbadora perturb = CantPerturbMin(x,factor); //perturbamos la coordenada sal = x+signo*perturb; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int Paso1Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const double facPer, size_t* nIntersec, size_t* nPerturb) { //estructuras auxiliares que apuntan a los polígonos pasados vertPoliClip* auxA=NULL; vertPoliClip* auxC=NULL; //estructuras auxiliares para trabajar con el siguiente vértice vertPoliClip* auxB=NULL; vertPoliClip* auxD=NULL; //vértices de intersección a insertar vertPoliClip* insBas=NULL; vertPoliClip* insRec=NULL; //coordenadas de la intersección de dos segmentos double xI=0.0,yI=0.0; //longitudes de segmentos y parámetros alfa double lonAB=0.0,lonCD=0.0,alfaAB=0.0,alfaCD=0.0; //código de intersección de segmentos int intersec=0; //variable de salida int salida=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el número de intersecciones a 0 *nIntersec = 0; //inicializamos el número de puntos perturbados a 0 *nPerturb = 0; //EL PRIMER PASO DEL ALGORITMO DE GREINER-HORMANN ES EL CÁLCULO DE TODOS LOS //PUNTOS DE INTERSECCIÓN ENTRE LOS POLÍGONOS //recorremos los vértices del polígono base for(auxA=poliBas;auxA->siguiente!=NULL;auxA=auxA->siguiente) { //sólo trabajamos si el vértice es original if(auxA->interseccion==0) { //recorremos los vértices del polígono de recorte for(auxC=poliRec;auxC->siguiente!=NULL;auxC=auxC->siguiente) { //sólo trabajamos si el vértice es original if(auxC->interseccion==0) { //siguiente vértice de los segmentos auxB = SiguienteVertOrigPoliClip(auxA); auxD = SiguienteVertOrigPoliClip(auxC); //calculamos la intersección de los segmentos intersec = IntersecSegmentos2D(auxA->xP,auxA->yP,auxB->xP, auxB->yP,auxC->xP,auxC->yP, auxD->xP,auxD->yP,&xI,&yI); //perturbamos las coordenadas de los extremos de los //segmentos mientras haya una intersección no limpia while((intersec!=GEOC_SEG_NO_INTERSEC)&& (intersec!=GEOC_SEG_INTERSEC)) { //distinguimos entre intersecciones donde sólo se toca //un extremo e intersecciones colineales donde se //comparte más de un punto if((intersec==GEOC_SEG_INTERSEC_EXTREMO_NO_COLIN)|| (intersec==GEOC_SEG_INTERSEC_EXTREMOS_NO_COLIN)|| (intersec==GEOC_SEG_INTERSEC_EXTREMOS_COLIN)) { if((xI==auxC->xP)&&(yI==auxC->yP)) { //perturbamos el extremo C auxC->xP = PerturbaPuntoMin(auxC->x,facPer); auxC->yP = PerturbaPuntoMin(auxC->y,facPer); //aumentamos el contador de puntos perturbados (*nPerturb)++; } else if((xI==auxD->xP)&&(yI==auxD->yP)) { //perturbamos el extremo D auxD->xP = PerturbaPuntoMin(auxD->x,facPer); auxD->yP = PerturbaPuntoMin(auxD->y,facPer); //aumentamos el contador de puntos perturbados (*nPerturb)++; } else { //si el punto de contacto es un extremo de AB y //los segmentos no son paralelos, perturbamos //todo el segmento CD auxC->xP = PerturbaPuntoMin(auxC->x,facPer); auxC->yP = PerturbaPuntoMin(auxC->y,facPer); auxD->xP = PerturbaPuntoMin(auxD->x,facPer); auxD->yP = PerturbaPuntoMin(auxD->y,facPer); //aumentamos el contador de puntos perturbados (*nPerturb) += 2; } } else if((intersec==GEOC_SEG_INTERSEC_MISMO_SEG)|| (intersec==GEOC_SEG_INTERSEC_COLIN)) { //perturbamos todo el segmento CD auxC->xP = PerturbaPuntoMin(auxC->x,facPer); auxC->yP = PerturbaPuntoMin(auxC->y,facPer); auxD->xP = PerturbaPuntoMin(auxD->x,facPer); auxD->yP = PerturbaPuntoMin(auxD->y,facPer); //aumentamos el contador de puntos perturbados (*nPerturb) += 2; } //volvemos a calcular la intersección de los segmentos intersec = IntersecSegmentos2D(auxA->xP,auxA->yP, auxB->xP,auxB->yP, auxC->xP,auxC->yP, auxD->xP,auxD->yP, &xI,&yI); } //comprobamos si los segmentos se cortan limpiamente if(intersec==GEOC_SEG_INTERSEC) { //aumentamos el contador de intersecciones (*nIntersec)++; //calculamos las longitudes de los segmentos lonAB = Dist2D(auxA->xP,auxA->yP,auxB->xP,auxB->yP); lonCD = Dist2D(auxC->xP,auxC->yP,auxD->xP,auxD->yP); //calculamos los parámetros alfa alfaAB = Dist2D(auxA->xP,auxA->yP,xI,yI)/lonAB; alfaCD = Dist2D(auxC->xP,auxC->yP,xI,yI)/lonCD; //creamos los nuevos vértices a insertar insBas = CreaVertPoliClip(xI,yI,NULL,NULL,NULL,0,1,0,0, alfaAB); insRec = CreaVertPoliClip(xI,yI,NULL,NULL,NULL,0,1,0,0, alfaCD); //comprobamos los posibles errores if((insBas==NULL)||(insRec==NULL)) { //liberamos la memoria previamente asignada free(insBas); free(insRec); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //asignamos el código de error salida = GEOC_ERR_ASIG_MEMORIA; //salimos de la función return salida; } //enlazamos los vértices mediante el campo 'vecino' insBas->vecino = insRec; insRec->vecino = insBas; //los insertamos en los polígonos InsertaVertPoliClip(insBas,auxA,auxB); InsertaVertPoliClip(insRec,auxC,auxD); } } } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ void Paso2Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIG op) { //estructuras auxiliares que apuntan a los polígonos pasados vertPoliClip* auxA=NULL; vertPoliClip* auxC=NULL; //identificador de si una intersección es de entrada o salida char entrada=0; //variables auxiliares char entA=0,entC=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos los valores iniciales a los identificadores de intersección switch(op) { //distinguimos los tipos de operación case GeocOpBoolInter: //intersección entA = 1; entC = 1; break; case GeocOpBoolUnion: //unión entA = 0; entC = 0; break; case GeocOpBoolAB: //A-B entA = 0; entC = 1; break; case GeocOpBoolBA: //B-A entA = 1; entC = 0; break; default: //por defecto, intersección entA = 1; entC = 1; break; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //EL SEGUNDO PASO DEL ALGORITMO DE GREINER-HORMANN ES LA IDENTIFICACIÓN DE //INTERSECCIONES COMO ENTRADA-SALIDA //comprobamos si el primer punto del polígono base está fuera del polígono //de recorte if(PtoEnPoliClipVertice(poliBas->xP,poliBas->yP,poliRec)) { //si el punto está fuera, la siguiente intersección es de entrada entrada = !entA; } else { entrada = entA; } //recorremos los vértices del polígono de recorte for(auxA=poliBas;auxA->siguiente!=NULL;auxA=auxA->siguiente) { //sólo trabajamos si el vértice es intersección if(auxA->interseccion!=0) { //indicamos la dirección auxA->entrada = entrada; //actualizamos la variable de entrada para la siguiente vuelta entrada = !entrada; } } //comprobamos si el primer punto del polígono de recorte está fuera del //polígono base if(PtoEnPoliClipVertice(poliRec->xP,poliRec->yP,poliBas)) { //si el punto está fuera, la siguiente intersección es de entrada entrada = !entC; } else { entrada = entC; } //recorremos los vértices del polígono base for(auxC=poliRec;auxC->siguiente!=NULL;auxC=auxC->siguiente) { //sólo trabajamos si el vértice es intersección if(auxC->interseccion!=0) { //indicamos la dirección auxC->entrada = entrada; //actualizamos la variable de entrada para la siguiente vuelta entrada = !entrada; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ polig* Paso3Greiner(vertPoliClip* poliBas, vertPoliClip* poliRec) { //vértices colgados al cerrar los polígonos vertPoliClip* ultBas=NULL; vertPoliClip* ultRec=NULL; //estructura auxiliar vertPoliClip* aux=NULL; //vectores de coordenadas de los vértices del resultado double* x=NULL; double* y=NULL; //número de elementos de los vectores x e y size_t nPtos=0; //número de elementos para los que ha sido asignada memoria size_t nElem=0; //variable de estado int estado=GEOC_ERR_NO_ERROR; //polígono de salida polig* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //cerramos los polígonos, convirtiéndolos en listas circulares ultBas = CierraPoliClip(poliBas); ultRec = CierraPoliClip(poliRec); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //mientras queden intersecciones sin visitar while((aux = SiguienteIntersecNoVisitadaPoliClip(poliBas))!=NULL) { //aumentamos el contador de elementos para los vectores x e y en 2 //unidades: una para el marcador de inicio de polígono y la otra para //las coordenadas del primer vértice nPtos+=2; //comprobamos si hay que reasignar memoria a los vectores de coordenadas if(nPtos>nElem) { //actualizamos el número de elementos de los vectores de puntos nElem += GEOC_GREINER_BUFFER_PTOS; //reasignamos memoria para los vectores x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos si ha ocurrido algún error if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //reabrimos los polígonos AbrePoliClip(poliBas,ultBas); AbrePoliClip(poliRec,ultRec); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos el marcador NaN como identificador de comienzo de polígono x[nPtos-2] = GeocNan(); y[nPtos-2] = GeocNan(); //asignamos las coordenadas del punto de intersección x[nPtos-1] = aux->xP; y[nPtos-1] = aux->yP; //EN ESTE NIVEL SIEMPRE ESTAMOS ANTE UN PUNTO DE INTERSECCIÓN //mientras el punto no haya sido visitado con anterioridad do { //lo marcamos como visitado aux->visitado = 1; aux->vecino->visitado = 1; //comprobamos si el punto es de entrada o no if(aux->entrada!=0) { //mientras no encontremos otra intersección do { //caminamos en la lista hacia adelante aux = aux->siguiente; //aumentamos el contador de elementos para x e y nPtos++; //comprobamos si hay que reasignar memoria a los vectores de //coordenadas if(nPtos>nElem) { //actualizamos el número de elementos de los vectores de //puntos nElem += GEOC_GREINER_BUFFER_PTOS; //reasignamos memoria para los vectores x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos si ha ocurrido algún error if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //reabrimos los polígonos AbrePoliClip(poliBas,ultBas); AbrePoliClip(poliRec,ultRec); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos las coordenadas del punto de intersección x[nPtos-1] = aux->xP; y[nPtos-1] = aux->yP; } while(aux->interseccion==0); //mientras no sea intersección } else { ////mientras no encontremos otra intersección do { //caminamos hacia atrás aux = aux->anterior; //aumentamos el contador de elementos para x e y nPtos++; //comprobamos si hay que reasignar memoria a los vectores de //coordenadas if(nPtos>nElem) { //actualizamos el número de elementos de los vectores de //puntos nElem += GEOC_GREINER_BUFFER_PTOS; //reasignamos memoria para los vectores x = (double*)realloc(x,nElem*sizeof(double)); y = (double*)realloc(y,nElem*sizeof(double)); //comprobamos si ha ocurrido algún error if((x==NULL)||(y==NULL)) { //liberamos la posible memoria asignada free(x); free(y); //reabrimos los polígonos AbrePoliClip(poliBas,ultBas); AbrePoliClip(poliRec,ultRec); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos las coordenadas del punto de intersección x[nPtos-1] = aux->xP; y[nPtos-1] = aux->yP; } while(aux->interseccion==0); //mientras no sea intersección } //saltamos al otro polígono aux = aux->vecino; }while(aux->visitado==0); //mientras el punto no haya sido visitado } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la estructura de salida resultado = CreaPolig(x,y,nPtos,1,1,&estado); //comprobamos los posibles errores if(resultado==NULL) { //liberamos la memoria asignada free(x); free(y); //reabrimos los polígonos AbrePoliClip(poliBas,ultBas); AbrePoliClip(poliRec,ultRec); //comprobamos el error if(estado==GEOC_ERR_ASIG_MEMORIA) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); } else { //mensaje de error GEOC_ERROR("Error en la llamada a 'CreaPolig()'\nEste error no " "puede producirse aquí porque los NaN deben estar " "bien puestos"); } //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //reabrimos los polígonos AbrePoliClip(poliBas,ultBas); AbrePoliClip(poliRec,ultRec); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria asignada free(x); free(y); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polig* PoliBoolGreiner(vertPoliClip* poliBas, vertPoliClip* poliRec, const enum GEOC_OP_BOOL_POLIG op, const double facPer, const int compruebaHuecosUnion, size_t* nIntersec, size_t* nPerturb) { //índice para recorrer bucles size_t i=0; //factor de perturbación double factor=0.0; //variables de posición int posBas=0,posRec=0; //identificador de error int idError=GEOC_ERR_NO_ERROR; //variables auxiliares int enPol1=GEOC_PTO_FUERA_POLIG,enPol2=GEOC_PTO_FUERA_POLIG; size_t posIni=0; double xAux=0.0,yAux=0.0; //polígonos auxiliares polig* ba=NULL; polig* aux1=NULL; polig* aux2=NULL; //polígono de salida polig* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si se ha pasado factor de perturbación if(facPer<=1.0) { //utilizamos el valor por defecto factor = GEOC_GREINER_FAC_EPS_PERTURB; } else { //utilizamos el valor pasado factor = facPer; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //PRIMER PASO DEL ALGORITMO DE GREINER-HORMANN: CÁLCULO DE TODOS LOS PUNTOS //DE INTERSECCIÓN ENTRE LOS POLÍGONOS //calculamos los puntos de intersección idError = Paso1Greiner(poliBas,poliRec,factor,nIntersec,nPerturb); //comprobamos los posibles errores if(idError==GEOC_ERR_ASIG_MEMORIA) { //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso1Greiner'"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si no hay intersecciones if(!(*nIntersec)) { //calculo la situación relativa entre los polígonos posBas = PtoEnPoliClipVertice(poliBas->xP,poliBas->yP,poliRec); posRec = PtoEnPoliClipVertice(poliRec->xP,poliRec->yP,poliBas); //comprobamos las posibles situaciones relativas entre los polígonos que //pueden producir cero intersecciones if((posBas==GEOC_PTO_DENTRO_POLIG)||(posBas==GEOC_PTO_VERTICE_POLIG)) { //EL POLÍGONO BASE ESTÁ DENTRO DEL POLÍGONO DE RECORTE //distinguimos las operaciones (por defecto, intersección) if(op==GeocOpBoolUnion) { //el resultado es el polígono de recorte resultado = CreaPoligPoliClip(poliRec,0); } else if(op==GeocOpBoolAB) { //el resultado es un polígono vacío resultado = CreaPoligPoliClip(NULL,0); } else if((op==GeocOpBoolBA)||(op==GeocOpBoolXor)) { //el resultado son los dos polígonos //polígono base resultado = CreaPoligPoliClip(poliBas,0); //añadimos el polígono de recorte AnyadePoligClipPolig(resultado,poliRec,0); } else { //el resultado es el polígono base resultado = CreaPoligPoliClip(poliBas,0); } } else if((posRec==GEOC_PTO_DENTRO_POLIG)|| (posRec==GEOC_PTO_VERTICE_POLIG)) { //EL POLÍGONO DE RECORTE ESTÁ DENTRO DEL POLÍGONO BASE //distinguimos las operaciones (por defecto, intersección) if(op==GeocOpBoolUnion) { //el resultado es el polígono base resultado = CreaPoligPoliClip(poliBas,0); } else if((op==GeocOpBoolAB)||(op==GeocOpBoolXor)) { //el resultado son los dos polígonos //polígono base resultado = CreaPoligPoliClip(poliBas,0); //añadimos el polígono de recorte AnyadePoligClipPolig(resultado,poliRec,0); } else if(op==GeocOpBoolBA) { //el resultado es un polígono vacío resultado = CreaPoligPoliClip(NULL,0); } else { //el resultado es el polígono de recorte resultado = CreaPoligPoliClip(poliRec,0); } } else { //NINGÚN POLÍGONO ESTÁ DENTRO DEL OTRO //distinguimos las operaciones (por defecto, intersección) if((op==GeocOpBoolUnion)||(op==GeocOpBoolXor)) { //el resultado son los dos polígonos //polígono base resultado = CreaPoligPoliClip(poliBas,0); //añadimos el polígono de recorte AnyadePoligClipPolig(resultado,poliRec,0); } else if(op==GeocOpBoolAB) { //el resultado es el polígono base resultado = CreaPoligPoliClip(poliBas,0); } else if(op==GeocOpBoolBA) { //el resultado es el polígono de recorte resultado = CreaPoligPoliClip(poliRec,0); } else { //el resultado es un polígono vacío resultado = CreaPoligPoliClip(NULL,0); } } //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //salimos de la función return resultado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //distinguimos entre XOR y el resto de operaciones if(op!=GeocOpBoolXor) { //SEGUNDO PASO DEL ALGORITMO DE GREINER-HORMANN: IDENTIFICACIÓN DE //INTERSECCIONES COMO ENTRADA-SALIDA //marcamos los puntos como entrada o salida Paso2Greiner(poliBas,poliRec,op); //TERCER PASO DEL ALGORITMO DE GREINER-HORMANN: EXTRACCIÓN DE LOS POLÍGONOS //RESULTADO DE LA OPERACIÓN //extraemos los polígonos resultado = Paso3Greiner(poliBas,poliRec); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso3Greiner'"); //salimos de la función return NULL; } } else { //LA OPERCIÓN XOR LA HACEMOS COMO LA UNIÓN DE LA OPERACIÓN A-B CON B-A //marcamos los puntos como entrada o salida para la operación A-B Paso2Greiner(poliBas,poliRec,GeocOpBoolAB); //extraemos los polígonos resultado = Paso3Greiner(poliBas,poliRec); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso3Greiner'"); //salimos de la función return NULL; } //reinicializamos los polígonos, pero manteniendo las intersecciones poliBas = ReiniciaVerticesPoliClip(poliBas); poliRec = ReiniciaVerticesPoliClip(poliRec); //marcamos los puntos como entrada o salida para la operación B-A Paso2Greiner(poliBas,poliRec,GeocOpBoolBA); //extraemos los polígonos ba = Paso3Greiner(poliBas,poliRec); //comprobamos los posibles errores if(ba==NULL) { //liberamos la memoria asignada LibMemPolig(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'Paso3Greiner'"); //salimos de la función return NULL; } //añadimos el resultado de la operación B-A al anterior de A-B idError = AnyadePoligPolig(resultado,ba); //comprobamos los posibles errores if(idError==GEOC_ERR_ASIG_MEMORIA) { //liberamos la memoria asignada LibMemPolig(resultado); LibMemPolig(ba); //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'AnyadePoligPolig' para la operación XOR"); //salimos de la función return NULL; } //liberamos la memoria asociada a la estructura auxiliar ba LibMemPolig(ba); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializo los atributos a 1 for(i=0;inPolig;i++) { resultado->atr[i] = 1; } //compruebo si hemos trabajado con unión if(compruebaHuecosUnion&&(op==GeocOpBoolUnion)) { //convierto los polígonos de trabajo en estructuras polig aux1 = CreaPoligPoliClip(poliBas,1); aux2 = CreaPoligPoliClip(poliRec,1); //comprobamos los posibles errores if((aux1==NULL)||(aux2==NULL)) { //liberamos la memoria asignada LibMemPolig(resultado); LibMemPolig(aux1); LibMemPolig(aux2); //mensaje de error GEOC_ERROR("Error de asignación de memoria en la llamada a " "'CreaPoligPoliClip' para la comprobación de huecos en " "la operación OR"); //salimos de la función return NULL; } //recorro todos los polígonos generados en la unión for(i=0;inPolig;i++) { //posición de inicio del polígono posIni = resultado->posIni[i]; //genero un punto dentro del polígono GeneraPtoEnPoligono(&(resultado->x[posIni]),&(resultado->y[posIni]), resultado->nVert[i],1,1,0.0,1,&xAux,&yAux); //comprobamos las coordenadas de salida if (EsGeocNan(xAux)||EsGeocNan(yAux)) { //digo que es un hueco resultado->atr[i] = 0; } else { //compruebo si el punto está dentro de alguno de los dos //polígonos de trabajo posIni = aux1->posIni[0]; enPol1 = PtoEnPoligonoVerticeBordeDouble(xAux,yAux, &(aux1->x[posIni]), &(aux1->y[posIni]), aux1->nVert[0],1,1, 0.0,1); posIni = aux2->posIni[0]; enPol2 = PtoEnPoligonoVerticeBordeDouble(xAux,yAux, &(aux2->x[posIni]), &(aux2->y[posIni]), aux2->nVert[0],1,1, 0.0,1); //si el polígono no pertenece a ninguno de los dos originales es //un hueco if((!enPol1)&&(!enPol2)) { //lo marco como hueco resultado->atr[i] = 0; } } } //liberamos la memoria asignada LibMemPolig(aux1); LibMemPolig(aux2); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polig* PoliBoolGreinerMult(const polig* poliBas, const polig* poliRec, const enum GEOC_OP_BOOL_POLIG op, const double facPer, const int compruebaHuecosUnion, size_t* nIntersec, size_t* nPerturb) { //índices para recorrer bucles size_t i=0,j=0; //variable de posición size_t pos=0; //número de intersecciones y de puntos perturbados auxiliar size_t nInt=0,nPer=0; //posición de un rectángulo con respecto a otro int pr=0; //variables de error int estado1=GEOC_ERR_NO_ERROR,estado2=GEOC_ERR_NO_ERROR; //listas de trabajo vertPoliClip* poligBas=NULL; vertPoliClip* poligRec=NULL; //polígono auxiliar polig* poligAux=NULL; //variable de salida polig* resultado=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el número total de intersecciones y de puntos perturbados *nIntersec = 0; *nPerturb = 0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la variable de salida resultado = IniciaPoligVacio(); //comprobamos los posibles errores if(resultado==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los polígonos base for(i=0;inPolig;i++) { //dirección de inicio de los vértices del polígono base pos = poliBas->posIni[i]; //creamos el polígono base de trabajo poligBas = CreaPoliClip(&(poliBas->x[pos]),&(poliBas->y[pos]), poliBas->nVert[i],1,1); //comprobamos los posibles errores if(poligBas==NULL) { //liberamos la memoria asignada hasta ahora LibMemPolig(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //recorremos los polígonos de recorte for(j=0;jnPolig;j++) { //comprobamos si los polígonos tienen definidos sus límites if((poliBas->hayLim)&&(poliRec->hayLim)) { //comprobamos si los restángulos que encierran a los polígonos //son disjuntos o no pr = GEOC_RECT_DISJUNTOS(poliBas->xMin[i],poliBas->xMax[i], poliBas->yMin[i],poliBas->yMax[i], poliRec->xMin[j],poliRec->xMax[j], poliRec->yMin[j],poliRec->yMax[j]); //comprobamos los casos particulares si los rectángulos son //disjuntos if(pr&&(op==GeocOpBoolInter)) { //EN CASO DE INTERSECCIÓN, NO SE AÑADE NADA //vamos a la siguiente vuelta del bucle continue; } else if(pr&&((op==GeocOpBoolUnion)||(op==GeocOpBoolXor))) { //EN CASO DE UNIÓN O UNIÓN EXCLUSIVA, SE AÑADEN LOS DOS //POLÍGONOS //añadimos el polígono base estado1 = AnyadeDatosPolig(resultado,&(poliBas->x[pos]), &(poliBas->y[pos]), poliBas->nVert[i],1,1); //añadimos el polígono de recorte pos = poliRec->posIni[j]; estado2 = AnyadeDatosPolig(resultado,&(poliRec->x[pos]), &(poliRec->y[pos]), poliRec->nVert[j],1,1); //comprobamos los posibles errores, que sólo pueden ser de //asignación de memoria if((estado1!=GEOC_ERR_NO_ERROR)|| (estado2!=GEOC_ERR_NO_ERROR)) { //liberamos la posible memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPolig(resultado); //lanzamos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //vamos a la siguiente vuelta del bucle continue; } else if(pr&&(op==GeocOpBoolAB)) { //EN CASO DE OPERACIÓN A-B, SE AÑADE EL POLÍGONO BASE //añadimos el polígono base estado1 = AnyadeDatosPolig(resultado,&(poliBas->x[pos]), &(poliBas->y[pos]), poliBas->nVert[i],1,1); //comprobamos los posibles errores, que sólo pueden ser de //asignación de memoria if(estado1!=GEOC_ERR_NO_ERROR) { //liberamos la posible memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPolig(resultado); //lanzamos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //vamos a la siguiente vuelta del bucle continue; } else if(pr&&(op==GeocOpBoolBA)) { //EN CASO DE OPERACIÓN B-A, SE AÑADE EL POLÍGONO DE RECORTE //añadimos el polígono de recorte pos = poliRec->posIni[j]; estado1 = AnyadeDatosPolig(resultado,&(poliRec->x[pos]), &(poliRec->y[pos]), poliRec->nVert[j],1,1); //comprobamos los posibles errores, que sólo pueden ser de //asignación de memoria if(estado1!=GEOC_ERR_NO_ERROR) { //liberamos la posible memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPolig(resultado); //lanzamos el mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //vamos a la siguiente vuelta del bucle continue; } } //dirección de inicio de los vértices del polígono de recorte pos = poliRec->posIni[j]; //creamos el polígono de recorte de trabajo poligRec = CreaPoliClip(&(poliRec->x[pos]),&(poliRec->y[pos]), poliRec->nVert[j],1,1); //comprobamos los posibles errores if(poligRec==NULL) { //liberamos la memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPolig(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //recortamos poligAux = PoliBoolGreiner(poligBas,poligRec,op,facPer, compruebaHuecosUnion,&nInt,&nPer); //comprobamos los posibles errores if(poligAux==NULL) { //liberamos la posible memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPoliClip(poligRec); LibMemPolig(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //sumamos el número de intersecciones y de puntos perturbados (*nIntersec) += nInt; (*nPerturb) += nPer; //añadimos los polígonos recortados a la variable de salida if(AnyadePoligPolig(resultado,poligAux)==GEOC_ERR_ASIG_MEMORIA) { //liberamos la posible memoria asignada hasta ahora LibMemPoliClip(poligBas); LibMemPoliClip(poligRec); LibMemPolig(poligAux); LibMemPolig(resultado); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //liberamos la memoria asignada al polígono de esta vuelta del bucle LibMemPoliClip(poligRec); //liberamos la memoria asignada al polígono auxiliar LibMemPolig(poligAux); //reinicializamos el polígono base poligBas = ReiniciaPoliClip(poligBas); } //liberamos la memoria asignada al polígono de esta vuelta del bucle LibMemPoliClip(poligBas); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ polig* CreaPoligPoliClip(vertPoliClip* poli, const int coorOrig) { //índice para recorrer bucles size_t i=0; //número de elementos size_t nVert=0,nElem=0; //estructura auxiliar vertPoliClip* aux=poli; //variable de salida polig* result=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos la estructura vacía result = IniciaPoligVacio(); //comprobamos los posibles errores if(result==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //contamos todos los vértices del polígono nVert = NumeroVertPoliClip(poli); //contemplamos una posible salida rápida if(nVert==0) { //devolvemos la estructura vacía return result; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //número de elementos de los vectores de coordenadas nElem = nVert+2; //asignamos memoria para los vectores de coordenadas de la estructura result->x = (double*)malloc(nElem*sizeof(double)); result->y = (double*)malloc(nElem*sizeof(double)); //asignamos memoria para los vectores de posición y de atributos result->posIni = (size_t*)malloc(sizeof(size_t)); result->nVert = (size_t*)malloc(sizeof(size_t)); result->atr = (int*)malloc(sizeof(size_t)); //comprobamos los posibles errores de asignación de memoria if((result->x==NULL)||(result->y==NULL)||(result->posIni==NULL)|| (result->nVert==NULL)||(result->atr==NULL)) { //liberamos la posible memoria asignada LibMemPolig(result); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos el número de elementos de los vectores de coordenadas y de //polígonos result->nElem = nElem; result->nPolig = 1; //asignamos la posición de inicio y el número de vértices result->posIni[0] = 1; result->nVert[0] = nVert; //inicializamos el atributo a cero result->atr[0] = 0; //asignamos los separadores de polígono al principio y al final result->x[0] = GeocNan(); result->y[0] = GeocNan(); result->x[nElem-1] = GeocNan(); result->y[nElem-1] = GeocNan(); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los vértices del polígono for(i=1;i<=nVert;i++) { //distinguimos el tipo de coordenadas a copiar if(coorOrig) { //coordenadas originales result->x[i] = aux->x; result->y[i] = aux->y; } else { //coordenadas perturbadas result->x[i] = aux->xP; result->y[i] = aux->yP; } //siguiente vértice aux = aux->siguiente; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return result; } /******************************************************************************/ /******************************************************************************/ int AnyadePoligClipPolig(polig* poli, vertPoliClip* anyade, const int coorOrig) { //número de elementos a añadir size_t nVert=0; //polígono auxiliar polig* aux=NULL; //variable de estado (salida) int estado=GEOC_ERR_NO_ERROR; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //contamos todos los vértices del polígono a añadir nVert = NumeroVertPoliClip(anyade); //contemplamos una posible salida rápida if(nVert==0) { //devolvemos la estructura vacía return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //creamos un nuevo polígono con los datos a añadir aux = CreaPoligPoliClip(anyade,coorOrig); //comprobamos los posibles errores if(aux==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return GEOC_ERR_ASIG_MEMORIA; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //añadimos la nueva estructura estado = AnyadePoligPolig(poli,aux); //comprobamos los posibles errores if(estado!=GEOC_ERR_NO_ERROR) { //liberamos la memoria asignada LibMemPolig(aux); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return estado; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //liberamos la memoria utilizada LibMemPolig(aux); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return estado; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/dpeuckera.c000644 001750 001750 00000020042 12463476247 016070 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeuckera.c \brief Declaración de funciones auxiliares para el uso de la familia de algoritmos de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \date 01 de abril de 2014 \copyright Copyright (c) 2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/dpeuckera.h" /******************************************************************************/ /******************************************************************************/ size_t* CasosEspecialesAligeraPolilinea(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, size_t* nPtosSal, int* hayCasoEspecial) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //vector de salida size_t* salida=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //en principio, el número de puntos de salida es el mismo que el de entrada *nPtosSal = nPtos; //inicializamos la variable indicadora de caso especial a 0 *hayCasoEspecial = 0; //vamos comprobando casos especiales if(nPtos==0) { //indicamos que estamos anteun caso especial *hayCasoEspecial = 1; //actualizamos la variable de número de puntos de salida *nPtosSal = 0; //salimos de la función return NULL; } else if(nPtos==1) { //indicamos que estamos anteun caso especial *hayCasoEspecial = 1; //asignamos memoria para el vector de salida salida = (size_t*)malloc(sizeof(size_t)); //comprobamos si ha ocurrido algún error if(salida==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //la entrada sólo es un punto *nPtosSal = 1; salida[0] = 0; } else if(nPtos==2) { //indicamos que estamos ante un caso especial *hayCasoEspecial = 1; //en principio, los dos puntos son válidos *nPtosSal = 2; //comprobamos si los puntos son o no el mismo if((x[0]==x[incX])&&(y[0]==y[incY])) { //sólo vale el primer punto *nPtosSal = 1; } //asignamos memoria para el vector de salida salida = (size_t*)malloc((*nPtosSal)*sizeof(size_t)); //comprobamos si ha ocurrido algún error if(salida==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //copiamos los puntos válidos for(i=0;i<(*nPtosSal);i++) { salida[i] = i; } } else if((nPtos==3)&&(x[0]==x[2*incX])&&(y[0]==y[2*incY])) { //indicamos que estamos ante un caso especial *hayCasoEspecial = 1; //en principio, hay dos puntos válidos *nPtosSal = 2; //comprobamos también si el segundo punto es el mismo que el primero if((x[0]==x[incX])&&(y[0]==y[incY])) { //sólo vale el primer punto *nPtosSal = 1; } //asignamos memoria para el vector de salida salida = (size_t*)malloc((*nPtosSal)*sizeof(size_t)); //comprobamos si ha ocurrido algún error if(salida==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //copiamos los puntos válidos for(i=0;i<(*nPtosSal);i++) { salida[i] = i; } } else if(atol==0.0) { //indicamos que estamos anteun caso especial *hayCasoEspecial = 1; //asignamos memoria para el vector de salida salida = (size_t*)malloc(nPtos*sizeof(size_t)); //comprobamos si ha ocurrido algún error if(salida==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //inicializamos el número de puntos de salida y la posición del primero *nPtosSal = 1; salida[0] = 0; //recorremos el resto de puntos for(i=1;iatol) { //indicamos que el punto se usa usados[pos] = 1; //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel sections default(none) \ shared(nPtos,incX,x,incY,y,posIni,posFin,pos,tol,usados) #endif { #if defined(_OPENMP) #pragma omp section #endif //aplicamos el algoritmo a la parte anterior al punto de trabajo DouglasPeuckerOriginalPlano(x,y,nPtos,incX,incY,tol,posIni,pos, usados); #if defined(_OPENMP) #pragma omp section #endif //aplicamos el algoritmo a la parte posterior al punto de trabajo DouglasPeuckerOriginalPlano(x,y,nPtos,incX,incY,tol,pos,posFin, usados); } // --> fin del #pragma omp parallel sections } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ size_t* DouglasPeuckerRobustoPlano(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, size_t* nPtosSal) { //índices para recorrer bucles size_t i=0,j=0; //valor absoluto de la tolerancia double atol=fabs(tol); //variable indicadora de punto en tolerancia int entol=0; //identificador de caso especial int hayCasoEspecial=0; //identificadores de utilización de algoritmos semi robustos int robOrig=0,robAuto=0; //número de elementos de trabajo internos del vector de salida size_t nElem=0; //identificador de paralelización int paraleliza=0; //vector de salida size_t* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos casos especiales sal = CasosEspecialesAligeraPolilinea(x,y,nPtos,incX,incY,atol,nPtosSal, &hayCasoEspecial); //comprobamos si ha habido algún caso especial if(hayCasoEspecial) { //comprobamos si ha ocurrido algún error de asignación de memoria if(nPtos&&(sal==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } else { //salimos de la función return sal; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si se utiliza algoritmo de intersección con línea original if((robusto==GeocDPeuckerRobSi)||(robusto==GeocDPeuckerRobOrig)) { robOrig = 1; } //comprobamos si se utiliza algoritmo de intersección con línea generada if((robusto==GeocDPeuckerRobSi)||(robusto==GeocDPeuckerRobAuto)) { robAuto = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if defined(_OPENMP) //comprobamos si hay más de un procesador if(omp_get_num_procs()>1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos el indicador interno de tamaño del vector nElem = GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)malloc(nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //indicamos que el primer punto siempre se usa *nPtosSal = 1; sal[0] = 0; //puntos de trabajo para iniciar los cálculos i = 0; j = 2; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //entramos en un bucle mientras no hayamos llegado hasta el último punto while(j1)) { //aplicamos el algoritmo en paralelo entol = DouglasPeuckerPuntosEnTolPlanoOMP(x,y,incX,incY,atol,i,j, i+1,j-1); } else { //aplicamos el algoritmo en serie entol = DouglasPeuckerPuntosEnTolPlanoSerie(x,y,incX,incY,atol,i,j, i+1,j-1); } //comprobamos si todos los puntos están en tolerancia if(entol) { //pasamos al siguiente punto como extremo del segmento j++; } else { //el punto final será el anterior al actual, ya que con el actual //hay al menos un vértice fuera de tolerancia y con el anterior se //comprobó en el paso previo del bucle que no había ningún vértice //fuera j--; //aplicación del algoritmo de intersección con puntos originales if(robOrig) { //aplicamos el algoritmo DouglasPeuckerRobIntersecOrigPlano(x,y,nPtos,incX,incY, nSegRobOrig,i,&j); } //aplicación del algoritmo de auto intersección if(robAuto) { //aplicamos el algoritmo DouglasPeuckerRobAutoIntersecPlano(x,y,incX,incY,i,&j,sal, *nPtosSal,nSegRobAuto); } //añadimos al contador el nuevo punto (*nPtosSal)++; //comprobamos si hay que reasignar memoria if((*nPtosSal)>nElem) { //añadimos otro grupo de puntos nElem += GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //añadimos el punto al vector de salida sal[(*nPtosSal)-1] = j; //actualizamos los índices de los puntos de trabajo i = j; j = i+2; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay que añadir el último punto if((sal[(*nPtosSal)-1]!=(nPtos-1))&& ((x[sal[(*nPtosSal)-1]*incX]!=x[(nPtos-1)*incX])|| (y[sal[(*nPtosSal)-1]*incY]!=y[(nPtos-1)*incY]))) { //añadimos al contador el último punto (*nPtosSal)++; //comprobamos si hay que reasignar memoria if((*nPtosSal)>nElem) { //añadimos otro grupo de puntos nElem += GEOC_DPEUCKER_BUFFER_PTOS; //asignamos memoria para el vector de salida sal = (size_t*)realloc(sal,nElem*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //asignamos el último punto sal[(*nPtosSal)-1] = nPtos-1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si el vector de salida tiene demasiada memoria asignada if(nElem>(*nPtosSal)) { //ajustamos el tamaño del vector de salida sal = (size_t*)realloc(sal,(*nPtosSal)*sizeof(size_t)); //comprobamos los posibles errores if(sal==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerPuntosEnTolPlanoOMP(const double* x, const double* y, const size_t incX, const size_t incY, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //identificador de punto fuera de tolerancia int ftol=0; //coordenadas de los vértices de trabajo double xIni=0.0,yIni=0.0,xFin=0.0,yFin=0.0,xTrab=0.0,yTrab=0.0; //longitud de la base y parámetros de rotación para el plano double dx=0.0,sA=0.0,cA=0.0; //distancia calculada double dist=0.0; //variable de salida int entol=1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((posBaseIni+1)>=posBaseFin) { //salimos de la función return entol; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas del primer punto de la base xIni = x[posBaseIni*incX]; yIni = y[posBaseIni*incY]; //coordenadas del segundo punto de la base, referidas al primero xFin = x[posBaseFin*incX]-xIni; yFin = y[posBaseFin*incY]-yIni; //calculamos la longitud de la base y la rotación DouglasPeuckerParamRotaBase(xFin,yFin,&sA,&cA,&dx); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posPtoIni,posPtoFin,incX,x,incY,y,xIni,yIni,dx,sA,cA,atol) \ private(i,xTrab,yTrab,dist) \ reduction(+:ftol) #endif //recorremos los puntos de trabajo for(i=posPtoIni;i<=posPtoFin;i++) { //sólo calculo si no se ha encontrado ningún punto fuera de tolerancia //en este hilo if(!ftol) { //extraemos las coordenadas del vértice de trabajo y las referimos //al punto inicial de la base xTrab = x[i*incX]-xIni; yTrab = y[i*incY]-yIni; //calculamos la distancia del punto a la base dist = DouglasPeuckerDistMaxPlanoAux(dx,sA,cA,xTrab,yTrab); //comprobamos si está fuera de tolerancia if(dist>atol) { //aumentamos el indicador de fuera de tolerancia ftol++; } } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si hay algún punto fuera de tolerancia if(ftol) { //indicamos que hay algún punto que no está en tolerancia entol = 0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return entol; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerPuntosEnTolPlanoSerie(const double* x, const double* y, const size_t incX, const size_t incY, const double tol, const size_t posBaseIni, const size_t posBaseFin, const size_t posPtoIni, const size_t posPtoFin) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //coordenadas de los vértices double xIni=0.0,yIni=0.0,xFin=0.0,yFin=0.0,xTrab=0.0,yTrab=0.0; //longitud de la base y parámetros de rotación para el plano double dx=0.0,sA=0.0,cA=0.0; //distancia calculada double dist=0.0; //variable de salida int entol=1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos salida rápida if((posBaseIni+1)>=posBaseFin) { //salimos de la función return entol; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas del primer punto de la base xIni = x[posBaseIni*incX]; yIni = y[posBaseIni*incY]; //coordenadas del segundo punto de la base, referidas al primero xFin = x[posBaseFin*incX]-xIni; yFin = y[posBaseFin*incY]-yIni; //calculamos la longitud de la base y la rotación DouglasPeuckerParamRotaBase(xFin,yFin,&sA,&cA,&dx); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos a chequear for(i=posPtoIni;i<=posPtoFin;i++) { //extraemos las coordenadas del vértice de trabajo y las referimos al //punto inicial de la base xTrab = x[i*incX]-xIni; yTrab = y[i*incY]-yIni; //calculamos la distancia del punto a la base dist = DouglasPeuckerDistMaxPlanoAux(dx,sA,cA,xTrab,yTrab); //comprobamos si está fuera de tolerancia if(dist>atol) { //indicamos que estamos fuera de tolerancia entol = 0; //salimos del bucle break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return entol; } /******************************************************************************/ /******************************************************************************/ void DouglasPeuckerRobIntersecOrigPlano(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const size_t segAUsar, const size_t posIni, size_t* posFin) { //índice para recorrer bucles size_t i=0; //coordenadas del segmento base double xA=0.0,yA=0.0,xB=0.0,yB=0.0; //posición de parada para comprobar la intersección de segmentos/arcos size_t posParada=0; //identificación de paralelización int paraleliza=0; //variable identificadora de existencia de corte de segmentos int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //si los puntos de inicio y fin son contiguos, hay salida rápida if((posIni+1)>=(*posFin)) { //salimos de la función return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if defined(_OPENMP) //comprobamos si hay más de un procesador if(omp_get_num_procs()>1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //posición de parada para el chequeo de segmentos/arcos posParada = ((segAUsar==0)||(segAUsar>=(nPtos-(*posFin)))) ? nPtos-1 : (*posFin)+segAUsar; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas del punto inicial del segmento/arco base (no cambian) xA = x[posIni*incX]; yA = y[posIni*incY]; //construimos todos los segmentos/arcos base posibles for(i=(*posFin);i>posIni;i--) { //comprobamos si estamos ante el punto posterior al inicial if(i==(posIni+1)) { //este punto es el siguiente al punto inicial del segmento/arco base *posFin = i; //salimos del bucle break; } //coordenadas del punto final del segmento base xB = x[i*incX]; yB = y[i*incY]; //comprobamos si hay que paralelizar if(paraleliza) { //calculamos en paralelo corte = DouglasPeuckerRobIntersecOrigPlanoOMP(xA,yA,xB,yB,x,y,incX, incY,i,posParada); } else { //calculamos en serie corte = DouglasPeuckerRobIntersecOrigPlanoSerie(xA,yA,xB,yB,x,y, incX,incY,i, posParada); } //comprobamos si no ha habido ninguna intersección if(!corte) { //indicamos el índice del vértice final *posFin = i; //salimos del bucle de segmentos base break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecOrigPlanoOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posIni,posFin,incX,x,incY,y,xA,xB,yA,yB) \ private(i,xC,yC,xD,yD) \ reduction(+:corte) #endif //recorremos los puntos de trabajo for(i=posIni;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecOrigPlanoSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos de trabajo for(i=posIni;i=(*posFin)) { //salimos de la función return; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #if defined(_OPENMP) //comprobamos si hay más de un procesador if(omp_get_num_procs()>1) { //indicamos que hay paralelización paraleliza = 1; } #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //posición de parada en el vector posAlig para el chequeo de segmentos/arcos posParada = ((segAUsar==0)||(segAUsar>=(nPosAlig-1))) ? 0 : nPosAlig-1-segAUsar; //coordenadas del punto inicial del segmento base (no cambian) xA = x[posIni*incX]; yA = y[posIni*incY]; //construimos todos los segmentos base posibles for(i=(*posFin);i>posIni;i--) { //comprobamos si estamos ante el punto posterior al inicial if(i==(posIni+1)) { //este punto es el siguiente al punto inicial del segmento base *posFin = i; //salimos del bucle break; } //coordenadas del punto final del segmento base xB = x[i*incX]; yB = y[i*incY]; //comprobamos si hay que paralelizar if(paraleliza) { //calculamos en paralelo corte = DouglasPeuckerRobAutoIntersecPlanoOMP(xA,yA,xB,yB,x,y,incX, incY,posAlig,nPosAlig, nPosAlig-1,posParada); } else { //calculamos en serie corte = DouglasPeuckerRobAutoIntersecPlanoSerie(xA,yA,xB,yB,x,y, incX,incY,posAlig, nPosAlig,nPosAlig-1, posParada); } //comprobamos si no ha habido ninguna intersección if(!corte) { //indicamos el índice del vértice final *posFin = i; //salimos del bucle de segmentos base break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobAutoIntersecPlanoOMP(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP #if defined(_OPENMP) #pragma omp parallel for default(none) \ shared(posIni,posFin,incX,x,posAlig,incY,y,xA,xB,yA,yB,nPosAlig) \ private(i,xC,yC,xD,yD) \ reduction(+:corte) #endif //recorremos los puntos de trabajo for(i=posIni;i>posFin;i--) { //sólo realizo cálculos si no se ha encontrado ningún corte en este hilo if(!corte) { //puntos inicial y final del siguiente segmento/arco de trabajo xC = x[posAlig[i]*incX]; yC = y[posAlig[i]*incY]; xD = x[posAlig[i-1]*incX]; yD = y[posAlig[i-1]*incY]; //seguimos si los rectángulos que encierran a los segmentos se cortan if(!GEOC_RECT_DISJUNTOS(GEOC_MIN(xA,xB),GEOC_MAX(xA,xB), GEOC_MIN(yA,yB),GEOC_MAX(yA,yB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD), GEOC_MIN(yC,yD),GEOC_MAX(yC,yD))) { //comprobamos si hay intersección corte += DouglasPeuckerRobIntersecPlano(xB,yB,xA,yA,xC,yC,xD,yD, posAlig[nPosAlig-1], posAlig[i]); } } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobAutoIntersecPlanoSerie(const double xA, const double yA, const double xB, const double yB, const double* x, const double* y, const size_t incX, const size_t incY, const size_t* posAlig, const size_t nPosAlig, const size_t posIni, const size_t posFin) { //índice para recorrer bucles size_t i=0; //coordenadas de los segmentos de trabajo double xC=0.0,yC=0.0,xD=0.0,yD=0.0; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //recorremos los puntos de trabajo for(i=posIni;i>posFin;i--) { //puntos inicial y final del siguiente segmento/arco de trabajo xC = x[posAlig[i]*incX]; yC = y[posAlig[i]*incY]; xD = x[posAlig[i-1]*incX]; yD = y[posAlig[i-1]*incY]; //seguimos si los rectángulos que encierran a los segmentos se cortan if(!GEOC_RECT_DISJUNTOS(GEOC_MIN(xA,xB),GEOC_MAX(xA,xB), GEOC_MIN(yA,yB),GEOC_MAX(yA,yB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD), GEOC_MIN(yC,yD),GEOC_MAX(yC,yD))) { //comprobamos si hay intersección corte = DouglasPeuckerRobIntersecPlano(xB,yB,xA,yA,xC,yC,xD,yD, posAlig[nPosAlig-1], posAlig[i]); } //si ha habido intersección de segmentos/arcos, salimos del bucle if(corte) { //salimos del bucle break; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ int DouglasPeuckerRobIntersecPlano(const double xA, const double yA, const double xB, const double yB, const double xC, const double yC, const double xD, const double yD, const size_t posFinAB, const size_t posIniCD) { //variables auxiliares double xAux=0.0,yAux=0.0; //identificador de intersección int inter=GEOC_DPEUCKER_NO_INTERSEC; //variable de salida int corte=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //seguimos si los rectángulos que encierran a los segmentos se cortan if(!GEOC_RECT_DISJUNTOS(GEOC_MIN(xA,xB),GEOC_MAX(xA,xB), GEOC_MIN(yA,yB),GEOC_MAX(yA,yB), GEOC_MIN(xC,xD),GEOC_MAX(xC,xD), GEOC_MIN(yC,yD),GEOC_MAX(yC,yD))) { //compruebo si los dos segmentos son contiguos if(posFinAB==posIniCD) { //compruebo intersección con la función completa (lenta) inter = IntersecSegmentos2D(xA,yA,xB,yB,xC,yC,xD,yD, &xAux,&yAux); //compruebo si es la sucesión de segmento inicial+final if((inter!=GEOC_SEG_INTERSEC_MISMO_SEG)&& (inter!=GEOC_SEG_INTERSEC_COLIN)) { //en este caso, no hay intersección inter = GEOC_DPEUCKER_NO_INTERSEC; } } else { //compruebo intersección con la función simple (rápida) inter = IntersecSegmentos2DSimple(xA,yA,xB,yB,xC,yC,xD,yD); } //unificamos los identificadores de intersección if(!((inter==GEOC_SEG_NO_INTERSEC)||(inter==GEOC_DPEUCKER_NO_INTERSEC))) { //hay intersección corte = 1; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return corte; } /******************************************************************************/ /******************************************************************************/ double DouglasPeuckerDistMaxPlano(const double* x, const double* y, const size_t incX, const size_t incY, const size_t posIni, const size_t posFin, size_t* pos) { //índice para recorrer bucles size_t i=0; //coordenadas de los extremos del segmento base y del punto de trabajo double xIni=0.0,yIni=0.0,xFin=0.0,yFin=0.0,xP=0.0,yP=0.0; //razones trigonométricas del ángulo de giro del sistema de coordenadas double sA=0.0,cA=0.0; //longitudes auxiliares double dx=0.0,lonAux=0.0; //variable de salida double lon=-1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si los dos puntos están seguidos if((posIni+1)==posFin) { //la posición que devolvemos es la del punto inicial *pos = posIni; //la distancia devuelta es -1.0 return lon; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //coordenadas del primer punto de la base xIni = x[posIni*incX]; yIni = y[posIni*incY]; //coordenadas del segundo punto de la base, referidas al primero xFin = x[posFin*incX]-xIni; yFin = y[posFin*incY]-yIni; //calculamos la longitud de la base y la rotación DouglasPeuckerParamRotaBase(xFin,yFin,&sA,&cA,&dx); //recorremos los puntos entre los extremos for(i=posIni+1;ilon) { //actualizamos la distancia máxima lon = lonAux; //guardamos la posición del punto *pos = i; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return lon; } /******************************************************************************/ /******************************************************************************/ void DouglasPeuckerParamRotaBase(const double xBase2RB1, const double yBase2RB1, double* sAlfa, double* cAlfa, double* lonBase) { //álgulo de rotación double alfa=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //ángulo a rotar el sistema de coordenadas para llevar el eje X a coincidir //con el segmento base alfa = atan2(yBase2RB1,xBase2RB1); //calculamos las razones trigonométricas del ángulo de rotación *sAlfa = sin(alfa); *cAlfa = cos(alfa); //la longitud del segmento base será el valor absoluto de la coordenada X //del extremo final del segmento base en el sistema de coordenadas rotado *lonBase = fabs((*cAlfa)*xBase2RB1+(*sAlfa)*yBase2RB1); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ double DouglasPeuckerDistMaxPlanoAux(const double lonBase, const double sAlfa, const double cAlfa, const double xVertRB1, const double yVertRB1) { //coordenadas del vértice de trabajo en el sistema rotado double xVert1=0.0,yVert1=0.0; //variable de salida double lon=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //transformamos el vértice de trabajo al nuevo sistema de coordenadas xVert1 = cAlfa*xVertRB1+sAlfa*yVertRB1; yVert1 = -sAlfa*xVertRB1+cAlfa*yVertRB1; //comprobamos la posición del punto con respecto al segmento base if((xVert1>=0.0)&&(xVert1<=lonBase)) { //el punto de trabajo está entre los extremos del segmento base //su distancia hasta él es el valor absoluto de su coordenada Y en //el sistema rotado lon = fabs(yVert1); } else if(xVert1<0.0) { //el punto de trabajo está a la izquierda del punto inicial de la //base, luego su distancia hasta el segmento será la distancia //hasta dicho punto inicial //Konrad Ebisch (2002), A correction to the Douglas-Peucker line //generalization algorithm, Computers and Geosciences, vol. 28, //págs. 995 a 997 lon = sqrt(xVert1*xVert1+yVert1*yVert1); } else { //el punto de trabajo está a la derecha del punto final de la base, //luego su distancia hasta el segmento será la distancia hasta dicho //punto final //Konrad Ebisch (2002), A correction to the Douglas-Peucker line //generalization algorithm, Computers and Geosciences, vol. 28, //págs. 995 a 997 lon = sqrt((xVert1-lonBase)*(xVert1-lonBase)+yVert1*yVert1); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return lon; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/octclip.h000644 001750 001750 00000002773 13656302353 015571 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /* Copyright (C) 2011 José Luis García Pallero, * * This file is part of OctCLIP. * * OctCLIP 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 software; see the file COPYING. If not, see * . */ /******************************************************************************/ /******************************************************************************/ #ifndef _OCTCLIP_H_ #define _OCTCLIP_H_ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/geom.h" /******************************************************************************/ /******************************************************************************/ #endif /******************************************************************************/ /******************************************************************************/ octclip-2.0.3/src/compilador.c000755 001750 001750 00000007441 13655033577 016270 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup general geopot @{ \file compilador.c \brief Definición de funciones para la detección de compiladores. \author José Luis García Pallero, jgpallero@gmail.com \date 28 de abril de 2011 \version 1.0 \section Licencia Licencia Copyright (c) 2011, José Luis García Pallero. 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 copyright holders 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/compilador.h" /******************************************************************************/ /******************************************************************************/ int EsCompiladorGNU(int* noGnu) { //variable de salida int salida=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //inicializamos la variable noGnu, si ha lugar if(noGnu!=NULL) { //inicializamos la variable a 0 *noGnu = 0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //para que sea GCC, la constante __GNUC__ ha de estar definida #if defined(__GNUC__) //el compilador es GCC salida = 1; //comprobamos si es el compilador de intel #if defined(__INTEL_COMPILER) if(noGnu!=NULL) { //el compilador es de intel *noGnu = 1; } #endif #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ /** @} */ /******************************************************************************/ /******************************************************************************/ /* kate: encoding utf-8; end-of-line unix; syntax c; indent-mode cstyle; */ /* kate: replace-tabs on; space-indent on; tab-indents off; indent-width 4; */ /* kate: line-numbers on; folding-markers on; remove-trailing-space on; */ /* kate: backspace-indents on; show-tabs on; */ /* kate: word-wrap-column 80; word-wrap-marker-color #D2D2D2; word-wrap off; */ octclip-2.0.3/src/fgeneral.c000755 001750 001750 00000103302 13655502503 015701 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup eop general geom geopot matriz @{ \file fgeneral.c \brief Definición de funciones de utilidad general. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 10 de octubre de 2009 \version 1.0 \copyright Copyright (c) 2009-2020, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/fgeneral.h" /******************************************************************************/ /******************************************************************************/ int GeocParOmpFgeneral(char version[]) { //comprobamos si hay paralelización #if defined(_OPENMP) //comprobamos si hay que extraer versión if(version!=NULL) { //calculamos la versión VersionOpenMP(_OPENMP,version); } //salimos de la función return 1; #else if(version!=NULL) { //utilizamos la variable version para que no dé warming al compilar strcpy(version,""); } //salimos de la función return 0; #endif } /******************************************************************************/ /******************************************************************************/ double PonAnguloDominio(const double angulo) { //signo del ángulo de trabajo double signo=0.0; //2.0*pi double dosPi=2.0*GEOC_CONST_PI; //variable auxiliar double aux=angulo; //variable de salida double sal=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //sólo trabajamos si el valor de entrada está fuera de los límites if((angulo<=-dosPi)||(angulo>=dosPi)) { //extraemos el signo del ángulo pasado signo = GEOC_SIGNO(angulo); //valor absoluto del ángulo pasado aux = fabs(angulo); //metemos el ángulo en dominio eliminando la cantidad que se pase de //2.0*pi sal = signo*(aux-floor(aux/dosPi)*dosPi); } else { //el valor de entrada no cambia sal = angulo; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ void BuscaSegmento1DInc(const double valor, const double* lista, const size_t nDatos, const size_t incDatos, size_t* posInicio, size_t* posFin) { //variable para recorrer bucles size_t i=0; //variable indicadora de búsqueda secuencial int busca=0; //variables para calcular posiciones size_t pos1=0,pos2=0; //posiciones en memoria size_t posm=0,pos1m=0,pos2m=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //CONSIDERAMOS QUE LA LISTA CONTIENE ENTEROS EQUIESPACIADOS UNA UNIDAD //posición del valor anterior al de trabajo pos1 = (size_t)(floor(valor)-lista[0]); //posición del valor posterior al de trabajo pos2 = (size_t)(ceil(valor)-lista[0]); //si pos1==pos2, valor puede ser un extremo de la lista if(pos1==pos2) { if(pos1!=(nDatos-1)) { //calculamos el punto final del segmento pos2++; } else { //calculamos el punto inicial del segmento pos1--; } } //calculamos las posiciones en memoria pos1m = pos1*incDatos; pos2m = pos2*incDatos; //comprobamos si el segmento detectado es válido if((lista[pos1m]!=round(lista[pos1m]))|| (lista[pos2m]!=round(lista[pos2m]))|| ((lista[pos2m]-lista[pos1m])!=1.0)|| (valorlista[pos2m])) { //indicamos que se ha de hacer una búsqueda secuencial busca = 1; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //LA LISTA CONTIENE REALES NO EQUIESPACIADOS if(busca) { //recorremos todos los elementos de la lista for(i=0;i=valor) { //comprobamos el tipo de límite if(lista[posm]>valor) { //extraemos las posiciones pos1 = i-1; pos2 = i; } else { //comprobamos si estamos trabajando con el último elemento if(i==(nDatos-1)) { //extraemos las posiciones pos1 = i-1; pos2 = i; } else { //extraemos las posiciones pos1 = i; pos2 = i+1; } } //salimos del bucle break; } } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos las variables de salida *posInicio = pos1; *posFin = pos2; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void BuscaSegmento1D(const double valor, const double* lista, const size_t nDatos, size_t* posInicio, size_t* posFin) { //realizamos la búsqueda con incremento igual a 1 BuscaSegmento1DInc(valor,lista,nDatos,1,posInicio,posFin); } /******************************************************************************/ /******************************************************************************/ void BuscaPosNWEnMalla(const double xPto, const double yPto, const double xMin, const double xMax, const double yMin, const double yMax, const double pasoX, const double pasoY, size_t* fil, size_t* col) { //dimensiones de la matriz size_t f=0,c=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos las dimensiones de la matriz de trabajo f = (size_t)(round((yMax-yMin)/pasoY)+1.0); c = (size_t)(round((xMax-xMin)/pasoX)+1.0); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la fila y comprobamos si es el extremo S *fil = (size_t)(fabs(yPto-yMax)/pasoY); if(*fil==(f-1)) { //retrasamos una fila (*fil)--; } //calculamos la columna y comprobamos si es el extremo E *col = (size_t)((xPto-xMin)/pasoX); if(*col==(c-1)) { //retrasamos una columna (*col)--; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ double Minimo(const double* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como el máximo valor para un double double salida=DBL_MAX; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(min:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(min:salida) #endif //recorremos el resto de elementos de la lista for(i=0;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ double Maximo(const double* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como el mínimo valor para un double double salida=DBL_MIN; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(max:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(max:salida) #endif //recorremos el resto de elementos de la lista for(i=0;isalida) { //asignamos el nuevo valor menor salida = lista[pos]; } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ double MinimoAbs(const double* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como el máximo valor para un double double salida=DBL_MAX; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(min:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(min:salida) #endif //recorremos el resto de elementos de la lista for(i=0;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ double MaximoAbs(const double* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como 0.0 (trabajamos en valor absoluto) double salida=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(max:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(max:salida) #endif //recorremos el resto de elementos de la lista for(i=0;isalida) { //asignamos el nuevo valor menor salida = fabs(lista[pos]); } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ size_t MinimoSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como el máximo valor para un size_t #if defined(SIZE_MAX) size_t salida=SIZE_MAX; #else size_t salida=(size_t)ULONG_MAX; #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(min:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(min:salida) #endif //recorremos el resto de elementos de la lista for(i=0;i fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ size_t MaximoSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //variable de salida, inicializada como 0 (size_t es sólo positivo) size_t salida=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //paralelización con OpenMP, sólo si la versión es superior a la 3.0 //en versiones anteriores no existe la posibilidad de usar reduction(max:) #if defined(_OPENMP)&&(_OPENMP>=GEOC_OMP_F_3_1) #pragma omp parallel for default(none) \ shared(nDatos,incDatos,lista) \ private(i,pos) \ reduction(max:salida) #endif //recorremos el resto de elementos de la lista for(i=0;isalida) { //asignamos el nuevo valor menor salida = lista[pos]; } } // --> fin del #pragma omp parallel for //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return salida; } /******************************************************************************/ /******************************************************************************/ void MinMax(const double* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor *posMin = 0; *posMax = 0; //recorremos el resto de elementos de la lista for(i=1;ilista[(*posMax)*incDatos]) { //asignamos la nueva posición *posMax = i; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void MinMaxAbs(const double* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor *posMin = 0; *posMax = 0; //recorremos el resto de elementos de la lista for(i=1;ifabs(lista[(*posMax)*incDatos])) { //asignamos la nueva posición *posMax = i; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void MinMaxSizeT(const size_t* lista, const size_t nDatos, const size_t incDatos, size_t* posMin, size_t* posMax) { //índice para recorrer bucles size_t i=0; //variable de posición size_t pos=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //consideramos que el primer elemento es el mayor y el menor *posMin = 0; *posMax = 0; //recorremos el resto de elementos de la lista for(i=1;ilista[(*posMax)*incDatos]) { //asignamos la nueva posición *posMax = i; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ double** AsigMemMatrizC(const size_t fil, const size_t col) { //índices para recorrer bucles size_t i=0; //matriz de salida double** matriz=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos memoria para el array principal matriz = (double**)malloc(fil*sizeof(double*)); //comprobamos los errores if(matriz==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //asignamos toda la memoria al primer puntero matriz[0] = (double*)malloc(fil*col*sizeof(double)); //comprobamos los errores if(matriz[0]==NULL) { //liberamos la memoria previamente asignada free(matriz); //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //recorremos el resto de filas for(i=1;i * * This file is part of OctCLIP. * * OctCLIP 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 software; see the file COPYING. If not, see * . */ /******************************************************************************/ /******************************************************************************/ #define HELPTEXT "\ -*- texinfo -*-\n\ @deftypefn {Function file}{[@var{p},@var{pp},@var{ni},@var{np}] =}_oc_polybool(@var{sub},@var{clip},@var{op},@var{hor})\n\ \n\ @cindex Performs boolean operations between two polygons.\n\ \n\ This function performs boolean operations between two polygons using the\n\ Greiner-Hormann algorithm (http://davis.wpi.edu/~matt/courses/clipping/).\n\ \n\ @var{sub} is a two column matrix containing the X and Y coordinates of the\n\ vertices for the subject polygon (it must be unique, although\n\ self-intersections are permitted).\n\n\ @var{clip} is a two column matrix containing the X and Y coordinates of the\n\ vertices for the clipper polygon(it must be unique, although\n\ self-intersections are permitted).\n\n\ @var{op} is a text string containing the operation to perform between\n\ @var{sub} and @var{clip}. Possible values are:\n\ \n\ @itemize @bullet\n\ @item @var{'AND'}\n\ Intersection of @var{sub} and @var{clip}.\n\n\ @item @var{'OR'}\n\ Union of @var{sub} and @var{clip}.\n\n\ @item @var{'AB'}\n\ Operation @var{sub} - @var{clip}.\n\n\ @item @var{'BA'}\n\ Operation of @var{clip} - @var{sub}.\n\n\ @item @var{'XOR'}\n\ Exclusive disjunction between @var{clip} and @var{sub}. This operation is\n\ performed as the joining of 'AB' and 'BA' consecutively applied\n\ @end itemize\n\ \n\ @var{hor} is an identifier for performing (value 1) or not (value 0) the\n\ searching for holes in the result of the operation OR. When OR is applied\n\ with non convex entities some of the resulting polygons can be actually\n\ holes. Activating this argument the possible holes are identified. If the\n\ operation is other than OR the value of this argument is irrelevant\n\ \n\ For the matrices @var{sub} and @var{clip}, the first point is not needed to\n\ be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in\n\ @var{sub} and/or @var{clip} are omitted, so they are treated as if each one\n\ stored a single polygon, i.e., this function does not admit boolean\n\ operations between multiple polygons of between polygons with holes, although\n\ polygons containing self-intersections are permitted\n\ \n\ The output arguments are:\n\ \n\ @var{p} is a two column matrix containing the X and Y coordinates of the\n\ vertices of the resultant polygon(s). If the result consist of multiple\n\ polygons they are separated by rows os (NaN,NaN) values.\n\n\ @var{pp} is a three-column matrix with a number of rows equal to the number\n\ of polygons stored in the matrix @var{p}. The first column stores the row of\n\ @var{p} where the corresponding polygon starts, the second column the row of\n\ @var{p} where the polygon end, and the third column is a mark identifying if\n\ the polygon is a hole (value 0) or not (value 1). The values of the third\n\ column are relevant only in the case of the OR operation\n\n\ @var{ni} is the number of intersections between @var{sub} and @var{clip}.\n\n\ @var{np} is the number of perturbed points of the @var{clip} polygon if any\n\ particular case (points in the border of the other polygon) occurs see\n\ http://davis.wpi.edu/~matt/courses/clipping/ for details.\n\ \n\ This function do not check if the dimensions of @var{sub} and @var{clip} are\n\ correct.\n\ \n\ @end deftypefn" /******************************************************************************/ /******************************************************************************/ #include #include #include #include #include #include"octclip.h" /******************************************************************************/ /******************************************************************************/ #define ERRORTEXT 1000 /******************************************************************************/ /******************************************************************************/ DEFUN_DLD(_oc_polybool,args,,HELPTEXT) { //error message char errorText[ERRORTEXT+1]="_oc_polybool:\n\t"; //output list octave_value_list outputList; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //checking input arguments if(args.length()!=4) { //error text sprintf(&errorText[strlen(errorText)], "Incorrect number of input arguments\n\t" "See help _oc_polybool"); //error message error("%s",errorText); } else { //loop index size_t i=0; //polygons and operation ColumnVector xSubj=args(0).matrix_value().column(0); ColumnVector ySubj=args(0).matrix_value().column(1); ColumnVector xClip=args(1).matrix_value().column(0); ColumnVector yClip=args(1).matrix_value().column(1); std::string opchar=args(2).string_value(); int sfh=args(3).int_value(); //computation vectors double* xA=NULL; double* yA=NULL; double* xB=NULL; double* yB=NULL; //double linked lists vertPoliClip* polA=NULL; vertPoliClip* polB=NULL; //operation identifier enum GEOC_OP_BOOL_POLIG op=GeocOpBoolInter; //output struct polig* result=NULL; //number of polygons, intersections and perturbations size_t nPol=0,nInter=0,nPert=0; //number of elements for the output vectors size_t nElem=0,posStart=0,posEnd=0,pos=0; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //pointers to data xA = xSubj.fortran_vec(); yA = ySubj.fortran_vec(); xB = xClip.fortran_vec(); yB = yClip.fortran_vec(); //create double linked lists for subject and clipper polygons polA = CreaPoliClip(xA,yA,static_cast(xSubj.numel()),1,1); polB = CreaPoliClip(xB,yB,static_cast(xClip.numel()),1,1); //error checking if((polB==NULL)||(polB==NULL)) { //free peviously allocated memory LibMemPoliClip(polA); LibMemPoliClip(polB); //error text sprintf(&errorText[strlen(errorText)],"Error in memory allocation"); //error message error("%s",errorText); //exit return outputList; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //select operation if((!strcmp(opchar.c_str(),"AND"))||(!strcmp(opchar.c_str(),"and"))) { op = GeocOpBoolInter; } else if((!strcmp(opchar.c_str(),"OR"))||(!strcmp(opchar.c_str(),"or"))) { op = GeocOpBoolUnion; } else if((!strcmp(opchar.c_str(),"AB"))||(!strcmp(opchar.c_str(),"ab"))) { op = GeocOpBoolAB; } else if((!strcmp(opchar.c_str(),"BA"))||(!strcmp(opchar.c_str(),"ba"))) { op = GeocOpBoolBA; } else if((!strcmp(opchar.c_str(),"XOR"))|| (!strcmp(opchar.c_str(),"xor"))) { op = GeocOpBoolXor; } else { //free peviously allocated memory LibMemPoliClip(polA); LibMemPoliClip(polB); //error text sprintf(&errorText[strlen(errorText)], "The third input argument (op=%s) is not correct", opchar.c_str()); //error message error("%s",errorText); //exit return outputList; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //clipping result = PoliBoolGreiner(polA,polB,op,GEOC_GREINER_FAC_EPS_PERTURB,sfh, &nInter,&nPert); //error checking if(result==NULL) { //free peviously allocated memory LibMemPoliClip(polA); LibMemPoliClip(polB); //error text sprintf(&errorText[strlen(errorText)],"Error in memory allocation"); //error message error("%s",errorText); //exit return outputList; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //number or output polygons nPol = result->nPolig; //output matrix Matrix pp(nPol,3); //dimensions for the output vectors if(nPol) { //Number of elements nElem = result->nElem; posStart = 0; posEnd = nElem-1; if(EsGeocNan(result->x[0])) { nElem--; posStart = 1; } if(EsGeocNan(result->x[posEnd])) { nElem--; posEnd = result->nElem-2; } //output polygons data for(i=0;iposIni[i]+1-posStart; pp(i,1) = pp(i,0)+result->nVert[i]-1; pp(i,2) = result->atr[i]; } } else { nElem = 0; } //output matrix Matrix p(nElem,2); //copy output data if(nElem!=0) { pos = 0; for(i=posStart;i<=posEnd;i++) { p(pos,0) = result->x[i]; p(pos,1) = result->y[i]; pos++; } } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //output parameters list outputList(0) = p; outputList(1) = pp; outputList(2) = nInter; outputList(3) = nPert; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //free memory LibMemPoliClip(polA); LibMemPoliClip(polB); LibMemPolig(result); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //exit return outputList; } octclip-2.0.3/src/Makefile000644 001750 001750 00000003302 14332167637 015416 0ustar00topotopo000000 000000 # -*- coding: utf-8 -*- #Compiler MKOCTFILE?=mkoctfile #Common warning flags for C and C++ FLAGSCOMW=-Wall -Wextra -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings #Common optimization flags for C and C++ FLAGSCOMO=-O2 -funroll-loops -fno-common -fshort-enums #Flags for C CFLAGS+=-std=c99 -pedantic $(FLAGSCOMW) -Wconversion -Wmissing-prototypes CFLAGS+=-Wstrict-prototypes -Wnested-externs $(FLAGSCOMO) #Flags for C++ CXXFLAGS+=$(FLAGSCOMW) $(FLAGSCOMO) #Export flags for compilers and linker export CFLAGS CXXFLAGS .PHONY: all all: compile .PHONY: compile compile: $(MKOCTFILE) -c -I. calctopo.c -o calctopo.o $(MKOCTFILE) -c -I. compilador.c -o compilador.o $(MKOCTFILE) -c -I. dpeuckera.c -o dpeuckera.o $(MKOCTFILE) -c -I. dpeuckere.c -o dpeuckere.o $(MKOCTFILE) -c -I. dpeuckerp.c -o dpeuckerp.o $(MKOCTFILE) -c -I. dpeucker.c -o dpeucker.o $(MKOCTFILE) -c -I. errores.c -o errores.o $(MKOCTFILE) -c -I. eucli.c -o eucli.o $(MKOCTFILE) -c -I. fgeneral.c -o fgeneral.o $(MKOCTFILE) -c -I. geocnan.c -o geocnan.o $(MKOCTFILE) -c -I. geocomp.c -o geocomp.o $(MKOCTFILE) -c -I. -DCOLUMN_MAJOR_ORDER_MATVEC posmatvec.c -o posmatvec.o $(MKOCTFILE) -c -I. -DCALCULO_PRODUCTO_MULT mate.c -o mate.o $(MKOCTFILE) -c -I. arco.c -o arco.o $(MKOCTFILE) -c -I. greiner.c -o greiner.o $(MKOCTFILE) -c -I. polig.c -o polig.o $(MKOCTFILE) -c -I. polil.c -o polil.o $(MKOCTFILE) -c -I. ptopol.c -o ptopol.o $(MKOCTFILE) -c -I. recpolil.c -o recpolil.o $(MKOCTFILE) -c -I. segmento.c -o segmento.o $(MKOCTFILE) -c -I. ventorno.c -o ventorno.o $(MKOCTFILE) -c -I. proyecaux.c -o proyecaux.o $(MKOCTFILE) -s -I. _oc_polybool.cc *.o .PHONY: clean clean: rm -rf *.o *~ .PHONY: cleanall cleanall: rm -rf *~ *.o *.oct octclip-2.0.3/src/dpeucker.c000644 001750 001750 00000030753 12463476241 015733 0ustar00topotopo000000 000000 /* -*- coding: utf-8 -*- */ /** \ingroup geom @{ \file dpeucker.c \brief Definición de funciones para el aligerado de polilíneas, basadas en el algoritmo de Douglas-Peucker. \author José Luis García Pallero, jgpallero@gmail.com \note Este fichero contiene funciones paralelizadas con OpenMP. \date 17 de agosto de 2013 \copyright Copyright (c) 2013-2014, José Luis García Pallero. All rights reserved. \par Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \par - 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 copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \par 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 COPYRIGHT HOLDER 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. */ /******************************************************************************/ /******************************************************************************/ #include"libgeoc/dpeucker.h" /******************************************************************************/ /******************************************************************************/ size_t* AligeraPolilinea(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int paralelizaTol, const enum GEOC_DPEUCKER_ROBUSTO robusto, const size_t nSegRobOrig, const size_t nSegRobAuto, const int esf, size_t* nPtosSal) { //identificador de caso especial int hayCasoEspecial=0; //valor absoluto de la tolerancia double atol=fabs(tol); //vector de salida size_t* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos casos especiales sal = CasosEspecialesAligeraPolilinea(x,y,nPtos,incX,incY,atol,nPtosSal, &hayCasoEspecial); //comprobamos si ha habido algún caso especial if(hayCasoEspecial) { //comprobamos si ha ocurrido algún error de asignación de memoria if(nPtos&&(sal==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } else { //salimos de la función return sal; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si trabajamos con el algoritmo original o con el robusto if(robusto==GeocDPeuckerOriginal) { //versión original del algoritmo sal = DouglasPeuckerOriginal(x,y,nPtos,incX,incY,atol,esf,nPtosSal); } else { //utilizamos la variación robusta del algoritmo sal = DouglasPeuckerRobusto(x,y,nPtos,incX,incY,atol,paralelizaTol, robusto,nSegRobOrig,nSegRobAuto,esf, nPtosSal); } //comprobamos los posibles errores if(nPtos&&(sal==NULL)) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return sal; } /******************************************************************************/ /******************************************************************************/ size_t* DouglasPeuckerOriginal(const double* x, const double* y, const size_t nPtos, const size_t incX, const size_t incY, const double tol, const int esf, size_t* nPtosSal) { //índice para recorrer bucles size_t i=0; //valor absoluto de la tolerancia double atol=fabs(tol); //variables auxiliares int aux=0; size_t pos=0; //vector de identificadores de elementos usados char* usados=NULL; //vector de salida size_t* sal=NULL; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //iniciamos la variable de salida de número de puntos a 0 *nPtosSal = 0; //asigno memoria para los puntos usados y la inicializo a ceros (calloc) usados = (char*)calloc(nPtos,sizeof(char)); //comprobamos los posibles errores if(usados==NULL) { //mensaje de error GEOC_ERROR("Error de asignación de memoria"); //salimos de la función return NULL; } //indico el primer punto y el último como usados usados[0] = 1; usados[nPtos-1] = 1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //comprobamos si trabajamos sobre la esfera o sobre el plano if(esf) { //aplico el algoritmo original sobre la esfera DouglasPeuckerOriginalEsfera(x,y,nPtos,incX,incY,atol,0,nPtos-1,usados); } else { //aplico el algoritmo original sobre el plano DouglasPeuckerOriginalPlano(x,y,nPtos,incX,incY,atol,0,nPtos-1,usados); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //cuento los puntos usados for(i=0;i0 ? pos+(size_t)inc : pos-(size_t)abs(inc); } //calculamos la media resultado /= (double)nDatos; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double Varianza(const double* datos, const size_t nDatos, const int inc, const double media) { //índice para recorrer un bucle size_t i=0; //posición del elemento de trabajo size_t pos=0; //residuo double res=0.0; //variable para almacenar el resultado double resultado=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posición del elemento inicial del vector pos = GEOC_INICIO_VEC(nDatos,inc); //recorremos el vector for(i=0;i0 ? pos+(size_t)inc : pos-(size_t)abs(inc); } //calculamos la varianza resultado /= (double)(nDatos-1); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double MediaPonderada(const double* datos, const size_t nDatos, const int incDatos, const double* pesos, const int incPesos) { //índice para recorrer un bucle size_t i=0; //posiciones de los elementos de trabajo size_t posDatos=0,posPesos; //variable auxiliar double sumaPesos=0.0; //variable para almacenar el resultado double resultado=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posición del elemento inicial de los vectores posDatos = GEOC_INICIO_VEC(nDatos,incDatos); posPesos = GEOC_INICIO_VEC(nDatos,incPesos); //recorremos el vector for(i=0;i0 ? posDatos+(size_t)incDatos : posDatos-(size_t)abs(incDatos); posPesos = incPesos>0 ? posPesos+(size_t)incPesos : posPesos-(size_t)abs(incPesos); //vamos sumando los pesos sumaPesos += pesos[posPesos]; } //calculamos la media resultado /= sumaPesos; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double Mediana(const double* datos, const size_t nDatos, const int inc) { //posición del elemento central size_t pos=0; //posición de inicio del vector size_t posInicio; //variable auxiliar size_t posAux=0; //variable para almacenar el resultado double resultado=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos la posición del elemento inicial del vector posInicio = GEOC_INICIO_VEC(nDatos,inc); //distinguimos entre número par o impar de datos if(nDatos%2) { //el número de datos es impar, calculamos la posición del punto medio pos = (size_t)ceil((double)nDatos/2.0)-1; //calculamos la posición en memoria pos = inc>0 ? posInicio+pos*(size_t)inc : posInicio-pos*(size_t)abs(inc); //extraemos el dato resultado = datos[pos]; } else { //el número de datos es par, calculamos la posición de los puntos medios pos = (size_t)((double)nDatos/2.0)-1; //calculamos la posición en memoria pos = inc>0 ? posInicio+pos*(size_t)inc : posInicio-pos*(size_t)abs(inc); //calculamos la posición del siguiente elemento del vector posAux = inc>0 ? pos+(size_t)inc : pos-(size_t)abs(inc); //calculamos la mediana resultado = (datos[pos]+datos[posAux])/2.0; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double ProductoMult(size_t inicio, size_t fin) { //variables intermedias size_t menor=0.0,mayor=0.0; //variable para almacenar el resultado double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema de forma iterativa if((inicio==0)||(fin==0)) { resultado = 0.0; } else { //seleccionamos los elementos mayor y menor menor = inicio<=fin ? inicio : fin; mayor = inicio>fin ? inicio : fin; //multiplicamos while(menor<=mayor) { resultado *= (double)menor; menor++; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ long double ProductoMultLD(size_t inicio, size_t fin) { //variables intermedias size_t menor=0.0,mayor=0.0; //variable para almacenar el resultado long double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema de forma iterativa if((inicio==0)||(fin==0)) { resultado = 0.0; } else { //seleccionamos los elementos mayor y menor menor = inicio<=fin ? inicio : fin; mayor = inicio>fin ? inicio : fin; //multiplicamos while(menor<=mayor) { resultado *= (long double)menor; menor++; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double ProductoLog(size_t inicio, size_t fin) { //variables intermedias size_t menor=0.0,mayor=0.0; //variable para almacenar el resultado double resultado=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema de forma iterativa if((inicio==0)||(fin==0)) { resultado = 0.0; } else { //seleccionamos los elementos mayor y menor menor = inicio<=fin ? inicio : fin; mayor = inicio>fin ? inicio : fin; //multiplicamos while(menor<=mayor) { resultado += log((double)menor); menor++; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return round(pow(GEOC_CONST_E,resultado)); } /******************************************************************************/ /******************************************************************************/ long double ProductoLogLD(size_t inicio, size_t fin) { //variables intermedias size_t menor=0.0,mayor=0.0; //variable para almacenar el resultado long double resultado=0.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema de forma iterativa if((inicio==0)||(fin==0)) { resultado = 0.0; } else { //seleccionamos los elementos mayor y menor menor = inicio<=fin ? inicio : fin; mayor = inicio>fin ? inicio : fin; //multiplicamos while(menor<=mayor) { resultado += (long double)log((double)menor); menor++; } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return roundl(powl((long double)GEOC_CONST_E,resultado)); } /******************************************************************************/ /******************************************************************************/ double Producto(size_t inicio, size_t fin) { //variable para almacenar el resultado double resultado=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //método de cálculo para números mayores que GEOC_MATE_CONST_NMAXFAC #if defined(CALCULO_PRODUCTO_MULT) resultado = ProductoMult(inicio,fin); #elif defined(CALCULO_PRODUCTO_LOG) resultado = ProductoLog(inicio,fin); #else #error *****No se ha definido el método de cálculo de la función Producto() #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ long double ProductoLD(size_t inicio, size_t fin) { //variable para almacenar el resultado long double resultado=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //método de cálculo para números mayores que GEOC_MATE_CONST_NMAXFAC #if defined(CALCULO_PRODUCTO_MULT) resultado = ProductoMultLD(inicio,fin); #elif defined(CALCULO_PRODUCTO_LOG) resultado = ProductoLogLD(inicio,fin); #else #error *****No se ha definido el método de cálculo de la función Producto() #endif //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double FactorialMult(size_t numero) { //variable para almacenar el resultado double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema if(numero) { resultado = ProductoMult((size_t)1,numero); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ long double FactorialMultLD(size_t numero) { //variable para almacenar el resultado long double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema if(numero) { resultado = ProductoMultLD((size_t)1,numero); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double FactorialLog(size_t numero) { //variable para almacenar el resultado double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema if(numero) { resultado = ProductoLog((size_t)1,numero); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ long double FactorialLogLD(size_t numero) { //variable para almacenar el resultado long double resultado=1.0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //resolvemos el problema if(numero) { resultado = ProductoLogLD((size_t)1,numero); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ double Factorial(size_t numero) { //variable para almacenar el resultado double resultado=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el factorial if(numero<=GEOC_MATE_CONST_DBL_NMAXFAC) { resultado = (double)__tablaFacExpl[numero].valor; } else { //método de cálculo para números mayores que GEOC_MATE_CONST_DBL_NMAXFAC #if defined(CALCULO_PRODUCTO_MULT) resultado = FactorialMult(numero); #elif defined(CALCULO_PRODUCTO_LOG) resultado = FactorialLog(numero); #else #error *****No se ha definido el método de cálculo de la función Factorial() #endif } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ long double FactorialLD(size_t numero) { //variable para almacenar el resultado long double resultado=0; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //calculamos el factorial if(numero<=GEOC_MATE_CONST_LDBL_NMAXFAC) { resultado = __tablaFacExpl[numero].valor; } else { //cálculo para números mayores que GEOC_MATE_CONST_LDBL_NMAXFAC #if defined(CALCULO_PRODUCTO_MULT) resultado = FactorialMultLD(numero); #elif defined(CALCULO_PRODUCTO_LOG) resultado = FactorialLogLD(numero); #else #error *****No se ha definido el método de cálculo de la función Factorial() #endif } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return resultado; } /******************************************************************************/ /******************************************************************************/ void ProductoVectorial(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, double* x, double* y, double* z) { //calculamos las componentes *x = y1*z2-y2*z1; *y = x2*z1-x1*z2; *z = x1*y2-x2*y1; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //salimos de la función return; } /******************************************************************************/ /******************************************************************************/ void SinCosRecurrencia(const double anguloIni, const double incAngulo, const size_t numValores, double* seno, const size_t incSeno, double* coseno, const size_t incCoseno) { //índice para recorrer bucles size_t i=0; //posiciones en los vectores de trabajo size_t pS=0,pC=0; //variables auxiliares double aux=sin(incAngulo/2.0); double alfa=2.0*aux*aux,beta=sin(incAngulo); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //seno y coseno del primero elemento de la serie seno[pS] = sin(anguloIni); coseno[pC] = cos(anguloIni); //recorremos el resto de valores for(i=1;i ## ## This file is part of OctCLIP. ## ## OctCLIP 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 Octave; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function file}{[@var{p},@var{details}] =}oc_polybool(@var{sub},@var{clip}) ## @deftypefnx {Function file}{[@var{p},@var{details}] =}oc_polybool(@var{sub},@var{clip},@var{op}) ## @deftypefnx {Function file}{[@var{p},@var{details}] =}oc_polybool(@var{sub},@var{clip},@var{op},@var{hor}) ## ## @cindex Performs boolean operations between two polygons. ## ## This function performs boolean operations between two polygons using the ## Greiner-Hormann algorithm as it is presented in ## http://davis.wpi.edu/~matt/courses/clipping/ ## ## @var{sub} is a two column matrix containing the X and Y coordinates of the ## vertices for the subject polygon (it must be unique, although ## self-intersections are permitted). ## ## @var{clip} is a two column matrix containing the X and Y coordinates of the ## vertices for the clipper polygon(it must be unique, although ## self-intersections are permitted). ## ## @var{op} is a text string containing the operation to perform between ## @var{sub} and @var{clip}. Possible values are: ## ## @itemize @bullet ## @item @var{'AND'} ## Intersection of @var{sub} and @var{clip}. This value is set by default. ## @item @var{'OR'} ## Union of @var{sub} and @var{clip}. ## @item @var{'AB'} ## Operation @var{sub} - @var{clip}. ## @item @var{'BA'} ## Operation of @var{clip} - @var{sub}. ## @item @var{'XOR'} ## Exclusive disjunction between @var{clip} and @var{sub}. This operation is ## performed as the joining of 'AB' and 'BA' consecutively applied ## @end itemize ## ## @var{hor} is an identifier for performing (value 1, by default) or not ## (value 0) the searching for holes in the result of the operation OR. When OR ## is applied with non convex entities some of the resulting polygons can be ## actually holes. Activating this argument the possible holes are identified. ## If the operation is other than OR the value of this argument is irrelevant ## ## For the matrices @var{sub} and @var{clip}, the first point is not needed to ## be repeated at the end (but is permitted). Pairs of (NaN,NaN) coordinates in ## @var{sub} and/or @var{clip} are omitted, so they are treated as if each one ## stored a single polygon, i.e., this function does not admit boolean ## operations between multiple polygons of between polygons with holes, although ## polygons containing self-intersections are permitted ## ## @var{p} is a two column matrix containing the X and Y coordinates of the ## vertices of the resultant polygon(s). If the result consist of multiple ## polygons they are separated by rows os (NaN,NaN) values. ## ## @var{details} is a struct containing details of the computation. Its fields ## (IN LOWERCASE!) are: ## ## @itemize @bullet ## @item @var{poly} ## Three-column matrix with a number of rows equal to the number of polygons ## stored in the matrix @var{p}. The first column stores the row of @var{p} ## where the corresponding polygon starts, the second column the row of @var{p} ## where the polygon end, and the third column is a mark identifying if the ## polygon is a hole (value 0) or not (value 1). The values of the third column ## are relevant only in the case of the OR operation ## @item @var{nint} ## Number of intersections between @var{sub} and @var{clip}. ## @item @var{npert} ## Number of perturbed points of the @var{clip} polygon if any particular case ## (points in the border of the other polygon) occurs see ## http://davis.wpi.edu/~matt/courses/clipping/ for details. ## @end itemize ## ## This function does not check if the dimensions of @var{sub} and @var{clip} ## are correct. ## ## @end deftypefn function [p,details] = oc_polybool(sub,clip,op,hor) try functionName = 'oc_polybool'; minArg = 2; maxArg = 4; %******************************************************************************* %NUMBER OF INPUT ARGUMENTS CHECKING %******************************************************************************* %number of input arguments checking if (narginmaxArg) error(['Incorrect number of input arguments (%d)\n\t ',... 'Correct number of input arguments = %d or %d'],... nargin,minArg,maxArg); end %values by default opDef = 'AND'; horDef = 1; %check if we omit some input arguments if nargin> endobj xref 543 145 0000000044 00000 n 0000004003 00000 n 0000004328 00000 n 0000004357 00000 n 0000004455 00000 n 0000005298 00000 n 0000029767 00000 n 0000029824 00000 n 0000029874 00000 n 0000029941 00000 n 0000030062 00000 n 0000030581 00000 n 0000030710 00000 n 0000031249 00000 n 0000031290 00000 n 0000057374 00000 n 0000057517 00000 n 0000058046 00000 n 0000058586 00000 n 0000058969 00000 n 0000059267 00000 n 0000059669 00000 n 0000064726 00000 n 0000065835 00000 n 0000066234 00000 n 0000066651 00000 n 0000067143 00000 n 0000074255 00000 n 0000074415 00000 n 0000074478 00000 n 0000074698 00000 n 0000075045 00000 n 0000075225 00000 n 0000075513 00000 n 0000075575 00000 n 0000075791 00000 n 0000076317 00000 n 0000077345 00000 n 0000077717 00000 n 0000078008 00000 n 0000078407 00000 n 0000079759 00000 n 0000080882 00000 n 0000081289 00000 n 0000081871 00000 n 0000082488 00000 n 0000090455 00000 n 0000090946 00000 n 0000091308 00000 n 0000091497 00000 n 0000091815 00000 n 0000094372 00000 n 0000094636 00000 n 0000094973 00000 n 0000095088 00000 n 0000095355 00000 n 0000096905 00000 n 0000097323 00000 n 0000097656 00000 n 0000097802 00000 n 0000098086 00000 n 0000099064 00000 n 0000099293 00000 n 0000099599 00000 n 0000099673 00000 n 0000099941 00000 n 0000100952 00000 n 0000101127 00000 n 0000101340 00000 n 0000101540 00000 n 0000102201 00000 n 0000102254 00000 n 0000102701 00000 n 0000138330 00000 n 0000154202 00000 n 0000203344 00000 n 0000218953 00000 n 0000219042 00000 n 0000219132 00000 n 0000219220 00000 n 0000219309 00000 n 0000219397 00000 n 0000219486 00000 n 0000219574 00000 n 0000219663 00000 n 0000219751 00000 n 0000219839 00000 n 0000219926 00000 n 0000220014 00000 n 0000220101 00000 n 0000220189 00000 n 0000220276 00000 n 0000220364 00000 n 0000220451 00000 n 0000220538 00000 n 0000220624 00000 n 0000220713 00000 n 0000220910 00000 n 0000221093 00000 n 0000221283 00000 n 0000221517 00000 n 0000221662 00000 n 0000221808 00000 n 0000221954 00000 n 0000222100 00000 n 0000222246 00000 n 0000222450 00000 n 0000222594 00000 n 0000222740 00000 n 0000222884 00000 n 0000223030 00000 n 0000223174 00000 n 0000223317 00000 n 0000223463 00000 n 0000223607 00000 n 0000223752 00000 n 0000223897 00000 n 0000224075 00000 n 0000224221 00000 n 0000224367 00000 n 0000224508 00000 n 0000224654 00000 n 0000224800 00000 n 0000224944 00000 n 0000225090 00000 n 0000225235 00000 n 0000225379 00000 n 0000225572 00000 n 0000225773 00000 n 0000225835 00000 n 0000225996 00000 n 0000226088 00000 n 0000226206 00000 n 0000226335 00000 n 0000226473 00000 n 0000226593 00000 n 0000226792 00000 n 0000226929 00000 n 0000227061 00000 n 0000227195 00000 n 0000227318 00000 n 0000227500 00000 n 0000227603 00000 n 0000227731 00000 n 0000003256 00000 n trailer << /Size 688 /Prev 990907 /Info 540 0 R /ID [ <39d7289c71f0ab2d6059e81b0abd0689> ] /Root 544 0 R >> startxref 0 %%EOF 687 0 obj << /C 1179 /S 736 /L 1147 /Filter /FlateDecode /E 1131 /I 1163 /Length 626 /O 1115 >> stream x[HqǿgI*59CSkNfu#6 jMz2p.:${zIb"K|衳ԭ ǹ~w>D@v+gʀ??y/-iD?'şDWX8Ҥu|fU=1_tJGݳJ N'))iuY6jw,.ٲu[}2r}Xi2[5:{@HoC7#h [81:oƉVUbXe W[{XoRMr?yj S`11Zc 3,T#2+yF0Že8fX8rNYQ'!'иҏSH(mB+A;4-#~3F%-cT.+=] EkLP*03MI& 0FqHǔp~I3VUZWGX/HaE. xSCsGY.AX0շ`3*a!яF8pVxP: OS@ϐNm ix@ q>|/ɅCp\Ž&Sd@v)y=Ar6)Hԁ7cǭ> dB_)w endstream endobj 544 0 obj << /Names 542 0 R /Type /Catalog /Outlines 671 0 R /PageLayout /SinglePage /Threads 545 0 R /PageLabels 419 0 R /OpenAction [ 547 0 R /FitH -32768 ] /Metadata 541 0 R /StructTreeRoot 421 0 R /MarkInfo << /Marked true >> /PageMode /UseOutlines /Pages 539 0 R /ViewerPreferences << /DisplayDocTitle true >> >> endobj 545 0 obj [ 546 0 R ] endobj 546 0 obj << /I << /Title (Main Text) /Author () /Subject () /Keywords () >> /F 619 0 R >> endobj 547 0 obj << /Type /Page /Contents 548 0 R /Resources << /ExtGState << /GS3 549 0 R /GS4 550 0 R /GS2 551 0 R >> /ProcSet [ /PDF /Text /ImageC /ImageI /ImageB ] /Properties << /MC2 552 0 R /MC5 554 0 R /MC6 556 0 R /MC4 558 0 R >> /Font << /F8 560 0 R /F6 565 0 R /F4 570 0 R /F11 574 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F7 594 0 R /F10 599 0 R /F9 604 0 R /F2 609 0 R >> /XObject << /Im3 612 0 R /Im2 615 0 R /Im1 617 0 R >> >> /MediaBox [ 0 0 595.245 793.92 ] /B [ 619 0 R 638 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 1 /Annots [ 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 548 0 obj << /Length 24393 /Filter /FlateDecode >> stream xɒ$Ir%xӐ9BMUf!YMdL<<<# K/UeNM,jn*j^M-LXXEXx^7߹O̙F)dzO~=}û 5Ċ;gޥɞ-6E6_~y~:n7zd@r\:ѧP~wy<1o7Ok`^ù_l.|]=n+1Ms o6xކmM޻3/wݚlQi;{@?n9ޞ=M\'[g1K)-!6dF%o`#m8WBqu]5yvmY:s&+W9OoOg7g>3o޽?~}|{}3+:)nLA=}ww7w4=9U"/RB4uLOɾ.@Z^bQv"ռMcqo b'fi0w{C g,I-ۚMV>:oak 35v$')m:w{Y,39<˟/w7nLtuxR^"L"pSYȕm~ s³l Fﮮ=\_i̕M^LxKrn ZqPDoJy$=}ǭwj{'|*eo^35n(cEm_K. Uh9lrZlmp.o{I>A`|{ӵRtŁwIdfα]dpa[_pf{}xf{u?)u%:6A6 7fڴ&Kjk?lïE:֚rFJ6mDā8ѩُ:eԿ|@‰ߌ>:0Ֆ# M{xV L@!|֘R\u˨;T&D0%u6%b:T,مa|#9T'ϑ8a}dջWd0aev8GZ=>߀ɨ=tnBP9x0y^Ā@?ԃ'yy/2tF"kçw/xuX?8|13l Toi$|!/MB>.qD=vDKM_aSm]# ~٢JKU$eXUV *.Y~rY#o?(ŝ :oLfzHmL ZD7| 巵8-)P>)6al4!^b[1Zxe<_PqJ1^I*,όYl+ o&ߒ!P7opbあ#Iο4򾼶lAykLo-'31t֐uLRyY1h6z(V~h,R]S f?5 dӣDA?Z9; z %A ʦCkRi\y {[&IRkZIjbw&9;eRmdWWqBKmz5dn GtϏ®yPeBl'"ā[adAD'-o<vn^cB &, P>5fJ|cfʑJanKST;^#PV ;g|,ι,?,YX|FAȏx-PTW{FVp@ ǻx䇶5xF3o6әMg0geŒ邬n&_h)x8>SxHfJ,c0g‰X,TJaaM(Q_;Y~&[R_G&)"gR{IIaiI: Y5 _gxVDoI5#Hf%B堥ቷKZk7qmxMJ`44iBɊ@ d"՞D:\ƈM@ZpƍM6'rځ;2&)6֙DEy=/h&Wd/E#4Gbk sMtD{&F8>;1)ᅹ=t&$AďM| ^pPlmVYDQ|˼Yy`apPxBq؜Mw<" %OŔ@V۲E"=gIe3Q8MJg|VL A7s5 )źTvQq` X1_m,W&{SEMr|Уpv9!jf .z]nB+~aq{39~ <L x`-j)7ANIŦmL{MDZZ:kG yp"ЅݖhƠX~Kf,ҡAMVCU#'0+@7EjM)*CmkZxEn>}_,˺[nXJʙw"kFK72SIcvƮEzII1h{9 e&P$X)I rVv%::Փu8K:z68ǖ0dE*jc{* /≬LfGT'TKp&I6| {rdYsٱ'WJbl˓@h1 B Od4`XqÏuoԆѷPْ6ZoD-b xf OmAD`%Q>w }h[I pp4v !M_ dwNRnC""=J3^lxTOY6"\RC,8fEtdE[>8y ҋ"r5gs\3XOu&:fe u /8gҜ_[~aVb[63T/AM;Q+e/zPec. .8xA;{Cl n sHua`0ÌP,rCXچ%\8iP7R{5QEi1Ct'me`۵yxdy=<gOQW#~^4s̋ubxcU&` vO{{-qŸ({əkr%izm#t2v*ǜqJ] ! 9 ֦|2ʬA+J4⚫0rPjS5ֲ)cNx+틻VXԞį#c`E| Cׅ]Y_7Tʀ'ḛ{~Si:܃)A )眜0z"oݠ|4_[cL_",qOfgBH"·Evf+F<#GQ=DoH0(ȍ^oXdjT /rll 5k!1Ip.q1i/YnY6aT3s"7u͙ݖ5֋tp@FcVVlx%9VXY& z?g( OOn0JKW8lЗ1cbb_тX<="|. FȆ4/t-U0˃,`34/[֦v^؛mjH8lkMDA {;< $p6Hrݺh fhX0Ka,+!` pg ^>@T░G,GD\\"ͧx.qw-h-˝b# "L(p/h'j\Njp9"彰}D+7-PD ҩE4Gw,*KH@ k!#! bD qux" tv,q,A8o —L|Eb+Ycda9?Dpec $ǣNy Ub2b7بgĖe/E$*Mm 6ݺenq1/mZ}n^xSElPv`yK< <+36'~Yݵ.&/"/=AwB9/ڥOÅp .fbq (gpִ)֡jl5|hA 'O^]?1m.Fz\H8&<jx\q9H- ى4:2w]BPdHCG{(BB00x 'r`_bX)hBl᳴ύ*n^sL["y-8#$h෋euf> v'.zvcw96O)oɓ8M=%?ZkBc,"R}xA酓aA֮[пRL5;G=+0ejE~˗w&XVNݶ# U&|/R]fhS f;^95CH..i](GŪHOr6oq:+E6!|Ü HABbU9f*Q&܆.1!Cg廧s@5UrQ@R{&ervOO>}V" gf}_)рgRVv;z!{8D\Ii/ğ@0,Fc;v^h+E=r *#+GF~@Wrn%Ȏ v<_bQv֞^!a,?D)ti;{[aqa,:,7)I  +r-n9iKF'qxj9MGkODeswNB}-{/|F!77J Fԯ-enF~n ; ~-Zk/NHJtvO瑤 ݗjTgY^PJּQ cԾ-9G|{~E t!ۈԍg6B/PxJ9c}HE@܉}~ 7`ʷ-S]q>{YiC0[ޑ2MF1T ʥ$JBH[hOq>c{"psy:}@VdqeiMl`,^ yI'@*K'[% Rc+䱭l?Dee1__m>K˃E!cرy7RYVOu ()+S, DcŢcE}ĠsGo4: $T1+;6O|E;)R[.[ ȲA ¥k/ւ1Up2Nؚņ*b; P+I?+K5~͛xKE@LeY7s\DZ1F(x(Ӗ1EnB80#lv}+B}=/CCIZT1w}rMQьDwH:ģ. - AsdTZ%Nݵˣ~@\<Hn^Bb* oVnEj5gqaq*gN3 #y]{zЙ&) ,xDYrYH'< y~[eS O06.z8Pwv4 &XKo86Q?z>8WRY-{q@WRy";?_EQań:Kf힖C\"*k7nb"\9n\a"-EJ@SDW9(_N站|]}|rg$=" !kh/3D~Ɵ3VTxŌļ=~yF_QafNx i3s٨ҞE~]R : zx]iVmE%~bG>ßσ(ߡ,^NVtyf[u t+dE"NvWH Ɏ'Ч*ȠLiT./;˨,41 mS9dXDh?g(HqGp~a>!Z"v1A1>!TT9@ TΉ: \a{nUQ{W/e FBF$McrhKtF+cDh{ 7/ RzCUF&bP/ C7lh% TT<K?_9To֩m]7Ś&dE6o:Wr#=rYd< CZIK<GJZt30pdӦK[f !'QOi'|rGee7+ ^JeЀaQjw)Z1;,rxkE)d ְ?"R]^C61rVzK譞X!) =$m##r;:'w֡w;oȡ4Je` AnYX>AD(MrfOy3d3X'r\Bj_FbqO`(Xvdl'?5)'QPb4Nq n7cPO$;-lﴁ91'zҼ"esR6dگ~t+Sg A/Mj;< PycKet/."HAɕ.icǐPn Q2ۍj@:(:'&+w+puVr[ѻ( $և> gUDH%ۋj*#_LI 7'4sLm&jT_8r~~JG'HbG4Ҍ_//JA`+id\BѕmGP)@#9էWP"A|MǕ`TU^c9ML8&,R}K@~:xmVY)*ye+¥g;jNIp#wDŽkqe:-Ot|ﮮLoM^XBBb{VAA]+k@Qq*&M@US|lIޑvK1Y/ۜOnȒfwQ.&Vшʏ+u7?j G|E80P(t{`%!C)U];!IttJHF]aB_acO답:˧vgQvqeLX*QJp-gH!U@yA$[S}#c_ZGv:7}0XȞܓÇݐFjMu$NlQlUJa*ZjwЉrpp95m%P.gj(io#g}-?eڿ:n9qu.7?]2y(P+A) UϏ!4C G1rV_zI&w z}ɧg6dʟp>\?*UwBbqE9SqQޟ[Efsm<4$9?b't{z69JGh0`ڂ!mBIq*n!ߠ zޙ@=Nﯕ':T(6!o4^bYs7E;:IdZ:z1j92nlO)zkJzЌ݅^(|PA*%.hBm@Ih:踯E0/ΧUiN OV#MXnuuo&oK% ۭB ʩ3ӘTXS73d"rh F F4|z @(p* ݅PRŽfD)Y<⒆+ΜkO$P/WW (,\GscOd ysVsb[#qIڢHJA$W "9H* q #uE n?;ie%AUKB}i\8 ڧn  'ArT{WQj8wWXG#pŚ6!-7-=;|?=}9~ڝ;?۲{?i\.25] ] Ly/h4;^sŜu(&Ql -9LcexŊ0LyE8O pSU@ b4ˊ}E,vs{{,kq$ \;lу}|菰 Lޡ4:yZ"uys""*q/^=~1u>' !N1|{}[I*T&՗7#~zI?^GRWcF؁niqu J;3Ԏٽ6g2-y5q8=1hMB7>#m/{Wjӹ;qhTP V'i pAlGgi C~Gd2A'\DSөyih5uF,㈢4<(s~ fF¬Vĥ)-&(ee[60MD标 A.#ni"4=TT5 UI NzI#@}QEFU~q ˩u yBX+ߛTbG0cHg }nm؊C>|skf' B;yrS }F|.k+ INU*}%d-ScIP5}6#vz=tCXƣ() t6w,bB&ZceBtB#t춰^Ny0Ѯ`XX."6lCYX_@'Oc"BWdv隕JSKxʋ\Jۢ;#KG 3:kY:ΩCI(Sy'=>~Z%8͟I$:<2@WB—݇6 N"sR ԭdA_/W+Ѳ}CLH,2вv t!AoՋǥw{9-n@)h wwGj9kE@JJ2~If+tJ?˅rYG&3Gԭ@ WvAa%JSOj D=o07m?e^[Vß1JMviF3t?CV:Nq <|B֫]!n?_ES>)|"*^gp*[ƵE-gXduȩ)!20Ii)67"|sy@ֲ?)y ʵV1C&!1itS-G낒 ,VLAU%щY]#04gH(-l%n}PjgHUKhdMi $Q1}ztz3{2S(e>^_rԹٳO 5"Eܠ;7fۢ hGq>^Hjzc5 C5 `~z~xrpUA GԳ%Ac}ܦAױlb*9bcfE+oMN> j]GzqBFeߖC`U%xCnn)BG?Xmn@4of:=i(Œ>滯&Bu1T2 r#Rnnרa"V"=ĢpXWlL1<qFR]ump:ҷH*[E_ky}!V4G Kq2j.'= GH=6Ȫ)N_EJ$!KpLy 7⎃`ZUP΂*H&l7ݙEMv{ *.XR&:1yu=#LVz1Hn=O!rY@W)&W$Cu@V^ePQqrQ(2rMEN|lP[hsn't6AY eȒψ/y8EvX> x;dxjqF}VǏ^f6y;r{MoDf.c(mHEp9 _(s4nJ\8\}_ZmF8U(Bj;gcu 1oZY0:M&1B%KSP wo$YnMO+ML˲,q+͗)W$~"9z*i">Lܓ!=gF4-̠46L!7p+fKh@=ԉ "CSRn¨"\]MK4k"c7$,eTqx2JU_%Y±({aAp!|hDdGrl2^[Xx a\r6L1難m=wk-YD- }?Hy-.Oc5/fPF0~"7;q(I*f/}4FHuЈ;C[w÷G;tŋ`Ӌº.?'i=]<>:8㞳nQt~LÁDw~xz~uHJ8**\3=o ِ&)PkN (jJeT7V΋_\d$d?ʵI +;`xղ|ڗF{KM Zds40-nƮnL|}(=7tm+z<VJUcT82̽ y4kM0^beS+; )16 Hxe~M4A>dwI-/Cx'GյGAg%Np'; yq*#ϐ6gN<ñ/_Jߴ9kaIwvCR#H>$RK{|^[_ezZO_O@  T}D1`B`DƶH;nY<( Oַ/+2D0$u-\7fnh@/1UqQ`C3HdqYT\izw}fN2ꬷ춱~྾2WE|H!EŸ zGP~? P%ԃG2ƉŲKDXt@<Hi!ڣy>+RYΠ?OJ^"h|PE1xȝE9K֫/x^nY[P<5{,B (u\RHb_?pIR}T;P)#hoqAcD#t8ٕTh` dYSX0,.H'PC)7+N&XKLYT) .?~|h!Wq>DkJYu{nYnn{%=F!n8yOW+SpҮ>NYCT'QQ.*ܿNsKxfp8d$Kdo״3ok&8d\. J{2bAkChsH /hM~FL ^h,08WݢkyWؤe u_ UPЯiS",ujGOG7um#0͏Zyo'MT\YU N[-EXD<ޒJA)\BPP# m,I4hՓ*SDw\|OS"E rܽߵmBb PІDR3%-'G/i=qv}/naJ┵d:o#c@YӹcUFIW(h ,#kڠ(UtyR=߫1 d Ux} `Ay5Lc$bej>(<Яۢ`BL[Z U@\qɢOi^N1)8qHBcɵS:b>owwyu_I%]DqHn.NE#jX1 ::~N!w׫:%3sD)\t4DmiJܓ,^kC F t(22_-~-^l}6: Ꟗ|jMM;ﷆ#ARЅiybFUjTQqrh}ksp?r(ut'੬܆G'J ނÞ[8s|s/ : |C J|8+#$9E*s]+'m-ѽa)n u[ -HDS4 Yy*;M\`t@56$GI[RSp#NRJ!G#ˏ+8P~#AdoWjUBXB#Cڔ7v >*Hc0ZY<"(HjB˜>p\rH}}K*L1ۢcۈH>}|R9SXdqc^_X?[G؎Y>`S뱉3VqRЦd`87{D5&1ߔvkLW 6 (4-q͚%M]F2Uw'QM-w8 m==nRd;r07k@wF9ٝ}E8?jb(Ϧqijh@6Dz6_=;  \1A-J+atss/X:O A'N], \Oѿyg@~ckᠱXWY}-]U 7kc)Q8'V (ۡq;YpRF kx;ZZi6 n,+ d9sE(6gG L GueFcCz4r,o]= L  *ILN^x ԫ/qja~J]ddN/2(.(&ґ.O#vs>E؅$s!r OYmW3ř]e}LWG}) ]C\hӼ'BkbGeӗkBG[Q:{WzL$paj_.|1edrPA0]˫+ Il n7+&[{v yR Sdm뢣6rgXGp9: +2QGb# wtsg{ =@Y r{CK   i\rտ$OŠ_] c𣏕R#Hb pjV9jnoq5?qeI ŘGZ`w_ v}Dn\C^kJ˪TE):&ѫB YPtbbOݩAGq @Zղuק3EѵwA94ᮣˇݿC ~o>z85;Zk&ecݲ)r˃ipseι飱Ya}#-ޔR_g'1@U4܀,cq#pء'zqyĝLB+?px-p,cj̎h&:E9w2\ W8#l@?>׬(Mx,+$yHGHY#`1i+<ڱͳqTs'Y<.muxzу99TU #R?1Ux]iVQko#3/@*Hhaw(lf+u!؂sG ,b3y|!\d=.$~ϕl<&s+CZO뢧D'_hLA4njt ^ȢkwDFq*E֗vUZ˳"9q:QeC80CfO.}dxx2,T|FŀʷFMdf ^ZɰJ=R^ڋ6(S եm4prǡpXw W~\"!?ILn@\{sf4Y=]!&Hgѝ@C ~7bBmE[S(,*n+G n.ws@02 hMթ5(aM=;23x_ԙ hrāvE WH2e氬 :qv>,5QuY4r.m7?l_!UF6'fB褾.:1̭#|*tcnt  0}ɉĚg'";M^ˍɘ_1!FO(uGf4 I,t;FC[l2~sD/s &_Qx,Uq&Y .O{ǫpaA6kn4}[uX{:50 D7jݍLH(>kЉBEO/N0'FXQ'N2 >`^CnyEJEa "ycOꢰp$swϷif a*'X@'Tk[J;t͟aU\ʗu#Z^B;qWq AzG-A3i}mdyˆ\:; 49(v]!bg/ݪ MBդx'p=ߵ*xT~Z:uӪ XQ?*M:;_.Q }Opf@7XpוSrh2F%빍PMF^@<$th,ot) ?k8x*70?,R껹l.6'VLW{bz|&7e+ $V5nK:bDBaF߱&ڀ'>ד&^ |1#μzPJ\}=iTv?Y7mLis'-nqG[MA7VlXBCO\n~stKu#ԒGg G{󨑼pBX3! vs}eq Ă+͓-ո(TzQ:1g8aBi8%S]Һjq.ί"俠{lB_= 饐 Ylȅ AhMHT~txwXNbrR};+۫v&tYXGܓ0e!+a/,B;^;Ed|Ԫ(K)D=sRf4=6fK4nv03sgg7竨L>3[ s@V{E~eṖ"\`[M0=H/%>eUa*G_&4!ؓ_)&dY'[$Ki†Nv`&m~]JQ͂:.zA=܂!tH$ 0_1!5kX?!x +zMi0u|7Wodtg"$/gg_p8v>Qdu$]fx<8<]Dm{uO[7ڏTњqngjr$kǙ1nQkl"lK.S1;-vaLZh\ބ(5rhr˔E(7Dɉs-VsA68!_pPjIzf_;FM%̯"׾` 9qW~Gu=wC?[$C"鈿Gmak쩗P@A027]-E|2ܢBmȏah -D#3$SplG_y>N n[b&UMۧJB [څ8Ͷ|3u(2@nGF@"Nqj^i ТF/͎?AKq˔҃rT:2`J݆Mm0@u<pBұ*۸G-sQd`7Bnk+ptBqS0A+%Ԥ~ P<`$X~Z2L VN5oA쮮%__gVNBoDo tK\@\J@ϥ \&BZ![ hLKvB [4e[ȉ-DN[0wQ{csqwuq}ؚJ~:S`t@a%lEԭwezb2-{#1{ܬ["G78}t4g7ۏ2g %%_"N߀ endstream endobj 549 0 obj << /SM 0.002 /Type /ExtGState /OPM 1 >> endobj 550 0 obj << /Type /ExtGState /SA false >> endobj 551 0 obj << /SM 0.002 /Type /ExtGState /OPM 1 /SA false >> endobj 552 0 obj << /Title (RGB_TREE_Article_28.5mm.eps) /Metadata 553 0 R /Creator (Adobe Photoshop Version 9.0x196) >> endobj 553 0 obj << /Length 445 /Filter /FlateDecode >> stream hKn0>l+R IEMwM1`J$(R},z^Bd@ ķf|#,XU^&/,Oé?οx}݆ ަM ah YVI RPߦ1#vq~LD(` "#~c "]pӁ&{G[%pmu)!!Cϝ𪟥eWVW":w&6W%hl6pBwB{7Lwf+%Ӄ󇵲Z+ SP& _^82+?z5rHBBrs6Rgرӆ[\%2̶tb>_͹  ] _sb|)9d]]wOCzH!dw(P[; endstream endobj 554 0 obj << /Title (CM-logo_10mm.eps) /Author (Vibhor Singh) /Metadata 555 0 R /Creator (Adobe Illustrator\(R\) 16.0) >> endobj 555 0 obj << /Length 465 /Filter /FlateDecode >> stream hj0BPKl†lh{+^Y%Wbw_->R_1qP(`5f/*c{nB%DgkV|' ?ܰE9HqK۲*@[JU6Y.!S>Vppe0zFA@|IsixN%8 .76-z{¹YwViP"m GQIs^]٬Tb׹53B+ͳ>x0PFNu0 sKl}QegVt"׃74z EIlwڀP.ƧT?ֈΆV'L\J'ݦTmv'u,M{wCփma\oQ51]6\Uȴ*.SZCKP[E_^!] <މGO !3d̐2C+"_\t̿8 endstream endobj 556 0 obj << /Metadata 557 0 R >> endobj 557 0 obj << /Length 25999 /Subtype /XML /Type /Metadata >> stream Acrobat Distiller 7.0 (Windows) Adobe Illustrator CS6 (Windows) 2017-11-17T17:46:05+05:30 2017-11-17T17:46:05+05:30 2017-11-17T17:46:05+05:30 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7nomiW/mu3bW9baS4huZ HFlZB3SKKJHKDZCp5VXc1xSmP/KuPJn/AFbv+S0//VTFbd/yrjyZ/wBW7/ktP/1UxW3f8q48mf8A Vu/5LT/9VMVt3/KuPJn/AFbv+S0//VTFbd/yrjyZ/wBW7/ktP/1UxW3f8q48mf8AVu/5LT/9VMVt 3/KuPJn/AFbv+S0//VTFbd/yrjyZ/wBW7/ktP/1UxW3f8q48mf8AVu/5LT/9VMVt3/KuPJn/AFbv +S0//VTFbd/yrjyZ/wBW7/ktP/1UxW3f8q48mf8AVu/5LT/9VMVt3/KuPJn/AFbv+S0//VTFbd/y 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 /IYqg/Kfkny9r3kzTJr2ErcgTL9Yibg5AuJNj1B+kYqn+hflz5Y0e5W6hjkubmM1jluWDlT4qqhV r70xVk7qkiMjgMjAqysKgg7EEHFWHXv5UeUbmcyok1tU1McMgCfc6vT6MVV5fyx8oSW0Nv8AVnRY Szc1dg7F+NS7GpP2duwxVO7zQtKvdKTSruETWUaoioxNQIxRSGFCCPEYqxxPym8oLLzKTsta+kZT x+WwDfjiqvqn5ZeU78xEQvaekoQC2YIGVf5gytU77nriqc3/AJd0jUNJj0q8h9W0hVFiBJDL6a8V YMKGtMVQGgeRNB0K/a+sBKJmQx0kfkoViCaCg8MVXeYfI/l3XZfXvIWS6pQ3MLcHIHSuxVvpGKpf pn5WeU7GdZmSW8ZTVVuXDID7qioD/sq4qy2WGGaF4JUV4ZFKPGwBUqRQqR4UxVht5+UnlK4lMkZu bUE19OGReP0eosh/HFU68v8Ak/QNB5NYQUnccXuJDzkI8KnYD5DFU7rirq4q6uKurirq4q6uKrLY /wDOxaL/AMxJ/wCTbYqlnls/7hbf/Z/8nGxUpnyxQ7liruWKu5Yq7liruWKu5Yq7liqB1fR9N1i0 FpqMPr24YPw5OnxLUA1Qqe+KqmmadZaXYx2NjF6NrDy9OPkzU5MWO7Fm+0x74qiuWKu5Yq7liruW Ku5Yq7liruWKu5Yq7liruWKu5Yq7liruWKu5Yq7liruWKu5Yq7liruWKu5Yq1aGvmLRf+Yk/8m2x Slfl0/7hrf8A2f8AxNsVKZVxQ6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6 uKurirq4q6uKurirq4q6uKurirq4q6uKurirq4q6uKurirrI/wDOxaN/zEH/AJNtil0vlnzDpVzP BbWDXenGR2tHjdOSozEhWUnFWvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x 98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A 6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqP mP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVi rvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x 98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A 6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqPmP8A6s1x98f/ADVirvqP mP8A6s1x98f/ADViqP8ALnl3XZdettQ1C1NpZ2fNoomdWd3ZSoZgpNAK4q//2Q== 1 True False 32.014583 32.014583 Millimeters Cyan Magenta Yellow Black Default Swatch Group 0 application/postscript CROSSMARK_Color_txt_100x100.eps Rakesh Masih xmp.did:9CC21C1691CBE711A2D1A544EA6CD4C5 xmp.iid:9CC21C1691CBE711A2D1A544EA6CD4C5 uuid:3d06d59a-b8c0-4d72-9d2d-9d778c160cc4 xmp.iid:c9e3282a-5173-c243-80b5-64480c96b046 xmp.did:c9e3282a-5173-c243-80b5-64480c96b046 uuid:3d06d59a-b8c0-4d72-9d2d-9d778c160cc4 saved xmp.iid:c9e3282a-5173-c243-80b5-64480c96b046 2017-09-14T12:19:21+05:30 Adobe Illustrator CC 2015 (Windows) / converted from application/postscript to application/vnd.adobe.illustrator saved xmp.iid:9CC21C1691CBE711A2D1A544EA6CD4C5 2017-11-17T17:46:05+05:30 Adobe Illustrator CS6 (Windows) / converted from application/postscript to application/vnd.adobe.illustrator endstream endobj 558 0 obj << /Title (CAG_Cover_RGB.eps) /Metadata 559 0 R /Creator (Adobe Photoshop Version 13.0 20120315.r.428 2012/03/15:21:00:00) >> endobj 559 0 obj << /Length 455 /Filter /FlateDecode >> stream hn0{[-PTn2U]"&([,=^a$hIw5i.9>~sq›VZXˢ? (~\'bU|y)ۮ 7$ly[RjF0BpĮ#8$0EG.0B &fW%/O?4ǹ(+k5ǸiH%A`0coM[v";QgжPt66p~[{_@Uz(S%nS)"xP]5OH2OJxaWJgaJ}D:όt `}3 q_O.g;1> endobj 561 0 obj << /Length 309 /Filter /FlateDecode >> stream hTQn0 StU@ @>ФN Բ ;C`t{Ϡh8C{q/"{H3pom6&:8}71J4+vc5:?~|qhp)ynK; hqk@Ȗsz<:Bk1`2׀лw*ũ_mT&T$Q(Lµ072YEnEmIgs!.!v<+\qE.EBvWdK*YbHA h/1R֖ 9}a ?G endstream endobj 562 0 obj << /Differences [ 45 /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine 66 /B /C /D /E /F /G /H /I 76 /L 79 /O /P 82 /R /S /T 86 /V 88 /X 97 /a /b /c /d /e /f /g /h /i 108 /l /m /n /o /p 114 /r /s /t /u /v 120 /x /y 133 /endash ] /Type /Encoding >> endobj 563 0 obj << /Type /FontDescriptor /Flags 262150 /StemV 174 /FontName /HIPIJJ+Gulliver-Bold /XHeight 563 /FontBBox [ -150 -211 1131 789 ] /ItalicAngle 0 /Descent -214 /CapHeight 747 /FontFile3 564 0 R /Ascent 802 /StemH 73 /CharSet (/space/one/period/I/n/t/r/o/d/u/c/i/two/P/l/y/g/p/F/three/G/e/endash/H/m/a/h/four/five/E/x/s/f/six/seven/X/hyphen/T/V/v/L/S/R/eight/nine/zero/C/B/slash/O/D/b) >> endobj 564 0 obj << /Length 4965 /Subtype /Type1C /Filter /FlateDecode >> stream hޜW TSgN7-FK7j[J-↨@% n-jZ:Nv^翱SΙΙ3'prwy\.K[rOr\\#URE:\fHUW M$߆1捱qLˇ_}эsF].YHLSejG SFJ6&Ȥ-7KNLFJ$k0uZt$L)UrED%$W%)dXI4":A~OL,If9s̒$*E:%L)4r$AfKVG+rdTR+4IR-ѿ &Q+"aX' Ԓ4IT*T'⥒d6Q$-F5K򾿿$7p${w&fȖ-'FsppLg3wg!r0(81LW/ܟ0b'7R92kpzpx>Gp8w#6m塑 ?sYr`ԔQ=FGRTǬ) 36j쑱?;ʗnnIn?}'OXIL F@ g!>>Y `*2FqS•ӱ]GjSoG26x9Ì$\| "+yVƈ@KQ9)QTSw8߄bom9Bj&{RêhKa9 4D2,M .4La>3d|]B+p߈+5Kd!?^*TdQpg|{M7 V uO!q'8aۮrlDŽ3}ye{ ^AvTąհӯ.nSoK*GCE3yYrUݐb'YSp2{Tİ-Xs! |tc)P1wutDɈwXu`;q;*U{ӟ ,A=[nP1)6n#F;; Of %FW2D[;2ħ;Z.&oyls#=}@ā{.f*Ox<0J.SQ?pO{ k),lzUL9ӰsxXTfRLIw0颭$->Ǚb!B XVZM=U"ވ&,~Ae;k#։Ekmc>{@雤m$Z.@z̑|/a\GBD"Uln勴\Kn1/0Jj߇HEYĔ!- _ݼL_ he;KKs/wKS{s[ JnBM0t1J@a*UVV ֢:ڬ7wæT`;fDLMQ")+>ka@v|f{&<\h#C??>/J+$5!dOFǩL~iQaiYĊgEȈfCAt Y ߮nEkf%7~WWOMB^EX]YnTxMVN$ 3cpU yLb7dUbX_.rwSy]].ͱ@ekIx9+}jڠ-MQm΍)Z TiiI8mWtj;(M/H%&>B+*TT {̫O@½ KŻ# Samۤ/`%OИ!>j37`نbX2C0] {Y& ]fȠZ6v3iLՓ>s\m Պb#I$ivlEmDŽ״Uf} hA ='p6* | ʹQ$<(y^{^88G/!ւ0E_/u7Fs2 5Gt?+EZ7#6 :ybWtg? {b^:5: 왱KVcdx%lh̄m,~>kt]mauu69?TWh>/OKqS]c<՚UIWdQ071Jeϳu#Ff@ Lጿjxq+4?X_Xy^gnAg>~syfJ۟0Ql%nsS7HK95l_PrZEzwqVvC#yIVs~%y< [)SLK_dHJ3,yMgn\slDs)h 9lbsh-'wug&a1oSo ^8 `sq`:wazfAK ,q{9^2M23~3f.Jƒw)Fܞ}l̊0{xǰ8~(Vkm zeuY⽻{fS-* Rrw"{;;Y""{8,!eUxLmR90"b,ԩ$̹w\GA½,SKN)J&eI,:оW a cgUڄ,e*%<= $Jt4<7U]&v˥ jp繰*M5%PD.%y>کcc;:IϨ59 2TP,(> UBI\ڦJNQ-Y5dLbsZŊ ;=S1 Q*u6վ(5zAz6} /0T[D6+G[3<}.nTXe+YeeɖeնWw$JD؄kk|c,6W*)j$:g+0fׄ`pY HQ'L:4dh\tqtCMwtYk{K"ΒX*uхPQAo=R(t/Zb $5$= p_33'ͰGjX7QfWWsS*`gL(?u endstream endobj 565 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 566 0 R /Encoding 567 0 R /FontDescriptor 568 0 R /BaseFont /HIPIHI+Gulliver-Italic /LastChar 232 /Widths [ 861 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 768 500 373 377 500 500 227 408 229 313 553 553 553 553 553 553 553 553 500 553 316 500 500 500 500 500 500 607 575 577 694 539 486 658 715 301 500 616 474 890 700 682 539 682 587 490 518 687 609 500 605 500 500 500 500 500 500 500 500 533 543 450 556 480 300 514 564 286 289 520 274 864 578 533 556 500 397 408 354 578 517 806 491 524 448 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 227 500 500 572 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 135 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 549 500 500 500 500 500 500 500 479 ] /FirstChar 2 >> endobj 566 0 obj << /Length 325 /Filter /FlateDecode >> stream hTQn0+!HCj,)R1!}w4UgMgHh8C4^Ah[HovP:8l7"yiWXGɫo SI7hgPUb's^!?tu*ӛjg-UWm߉Uh:U{*UAXJڄ^M$dfE}J kP##oNo:: Hl2wcI27D(c%^ ׽= 5;[ݍʟ`-< endstream endobj 567 0 obj << /Differences [ 2 /ffi 38 /ampersand 40 /parenleft /parenright 44 /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven 57 /nine /colon 65 /A /B /C /D /E /F /G /H /I 75 /K /L /M /N /O /P /Q /R /S /T /U /V 88 /X 97 /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p 114 /r /s /t /u /v /w /x /y /z 144 /quoteright 147 /fi 184 /cedilla 224 /agrave 232 /egrave ] /Type /Encoding >> endobj 568 0 obj << /Type /FontDescriptor /Flags 70 /StemV 96 /FontName /HIPIHI+Gulliver-Italic /XHeight 560 /FontBBox [ -141 -211 1053 789 ] /ItalicAngle -8.5 /Descent -214 /CapHeight 747 /FontFile3 569 0 R /Ascent 802 /StemH 50 /CharSet (/space/C/a/r/n/e/g/i/R/o/b/t/c/s/comma/L/four/five/zero/one/H/fi/l/d/S/P/u/h/A/two/U/F/y/f/I/m/v/agrave/z/V/G/p/B/ffi/three/six/nine/w/M/E/cedilla/colon/K/hyphen/period/T/slash/ampersand/X/parenleft/parenright/seven/x/j/Q/D/k/N/egrave/quoteright/O) >> endobj 569 0 obj << /Length 7020 /Subtype /Type1C /Filter /FlateDecode >> stream h޴yy\Sgv">\xSωvujQ[k.u_@@BXYHd]D\PݺZmf֎9}=Aۙygyu_}_O ,\p—g$&Ji,LLD|.d sᗡgܘX$yOo3&㢞}gF^Ɵ,#MQI"شȴdqliӦVIc2ccDQJ2<2];A)%24Y$KdRdhUlt|W^+EQ W'M**^"ɤqȴX~ML%K71dFz4M?ebE4ItzR&DIcAE&EmDD颤H(*V+cӰaI2v+Jb},T4kQ V]97,|\M-<>~yA|SCx7.7ao7{oe/+xI<_ {?a4C"9xx_nx pqx<_w'>6 PC()()AA 0D>硫^yjtpF<=H;d(%h!u[T gc`Er`~~.C#:G4$17@6:8ߜM)֦ej3TRyR 1) onCSueC>beyJaBpf-D.ڦ:u\d+@Uaw7n?V$l4xz?=g6JQfipum$@QbLNzĸ,fD72Sq邃\a6P#+pŀHL~W!g)lɽ͛+L@c)4( a"_Y2wB#6ҌɡM"tjϮQ5q1RiLE[aZ`ӛu*1'B^a6 &)WA2z6y.yxSJqb+@+:ysO4{a\ WD© ?E>nTD)ŷਿ\w)qWG"6- eF's} }ǞnE |^}u/Uf0s$bW$jC!>] LvAzmaqaٗ^ˑ s r儠:_G\YRpӉSp,H!"YSRRd*OGb[Bƾ$\G;a[n?߂׹$T{4=BSWsZJPQj?7 ZB*U#>e$B󖡐J0Q "| dnzW ̮jR@B Ca%T<*5UX|"#p`FFn_!q.@ t¾pg|nrH=ݣ^BԜwаe,:!5-qQk*1hȏg;a43 ):iCgo>^b)8ZK׶y8M\Ǧ3>Bp22>oc-LaYNݱi" ^<鵷ÀvYaVP&}~ AC}1(|,~0j2b=Ffh38]9082Vf=}&«UM!зQ:a7`wܫ[%/}s>5Jg˦ZIҝ~pa*- > LEdD^ _:XuԐHv =iˁoXl:OvA jv]FrH ɃqmB2򓏥vO;Np/`,>g 岔ʘ[p#DZ Lb]Se~bʪP ‰AGѱ{s9yBy6>E$ZFg Z H Q4Qp3OwLݎ~~Z܁&1h+Q(o.=//T3rՋi¤,c8lR*ݳW.GXyWwhh"cj.:Kw"zp__Fߍ]#z]vx(RݡdڨYC?[O7nif0wP;u/SG;nFbήy4jrAڪUPƬ be\aj.I X|58/849ǣ&Ki2+Y!YOvcRG}ie =5[F!?LuD=|I ]HLz춵A?P7ßRs\K\*SA^0TK\=Pqs%&u`WNO~ І;\wמc|qo.w @Wg# M1 ܦIfZ$/H8{G ~w鷵7~[Ih@WfYnZڟ&sjP; ʩRs%ι*BHRR&gLGY fXe/(-g Zw2^O^ann.wה ;l*`[:*OHcPro)9pI 7wQ~ qwH* TL-y2w5J aCORO}; nuqzu65r\+8Os77}kH 6<][l  X!EpkkOpxPpLvdCz-؉|ω k2ff? E}q&%%7hlH*b}ח_p'@^6DĬX/6gBo_yW{"iBB_jh'3-GN}e$8 .}y˘wE"!G7. 4fU8v:;ؾ5P?s\YM%6Us%L՗QRlF~-R-.FVr?n7SuM_حIbJl+(=<&Q$&jW҂\|Wk8k!mo<ߩkN ](_&K6EPs7|y#^Fb=-2Y;P dwԞ?>v~خw;eYMǨsGZ^8cYU% "Ԝ|ʡKW_p'qbۨv]gӶ y*K#+*]fc'7Njh(j|5zg)7ة+F?5CV0.!2k b--V7'<} q 'Z][YG! 4xBV{qSyE.p .TrTW&E%EN;u]" eOx:2OYI'OTL7Dq'+2ŒǓ/l;8΅&*fYIOa* o^1.Yr\~9U\- 2< VdQNkU?LΩVz+⅂myfň}wï1.{'J޶t ms̕:ɩ 7ySLa Cۗ|s.PN6-f'-Αq k(WnnP1-'{4>PY J y9(0/}]vlk`(TAOO J'"O@o.o$SQ ltr=-YrVZs[~M7$ @zKN4=c| q W2:B-v z 4јPX~'çV*w>OUXٻ=IOO1= *$ &P(RK<,'ՃIyW  Qy+X eF?2qk0Wg s6MP4bzA5o &pt{mqg)BYQmAa]0Bqi.csղ$Z]`hXUQ5ޚДy~oSqr|rpta[k 7%|떃[a9fΤ,ʪ ܐu6\H| =}Gsk _ WdYTE*X8R龁fg$7Yk/WĥJ|fֵ1˩nt'>B^FTlZ9ϒ?o|jiϞc4Rrq h&&vlO}ˉtYe\7s1wgDoIk}pB{S\\Qky`+WS;4\3Bg϶:PCuo_tQ0\&N)駩OSU{g\j*-vɫ6Ǧ.”[RF:0ːƮB7q(8ǁ3/dbe֎=M͊ʭ2t6 q%n̡ ۷P^RkTr:QT-h QyGv;+BCeR+Z%F| B!2!?o?{zAuY愃?ik&qUUQ͙q1ibYϘuxd TV+L_bW]@K)胻Oe1i9tQF_$=;)L޻#U3&]Fbbwަ3&N\GھGaR9;tR--Q+嫮t1EJ] 8ϱM9g[7g_lj;;馊< g'E/,)ϽFs} #nYxūKX4w'qs-8Gf:)lni^ ۟]ſ:FvoC. c~%ѳf@ A^ܶ @#ɇz/LvɿT0yvۋoZjmҵXfgEXl;AqyO^VhJ%a(}Nh\Wh mx|VXd)`vjgfdKdг]V\¦Ji9YΥ5EBJշ|uů5GC By3rד_BFu8S ѝ-'*SlNC9!OEs^pf#{b H(͌bHm^-5{pNK N ]LTa HY/gB i$LcV6u멞&34RZVj*Tk+ +T^ D,{D,Y,&G .ufovClF%@lL͠VL|/.1:̨aO\>+p?,^-EU& J=NX{o (/prBfV%ħ'iL\ƪVEW@*7FZD؜Gjڬ :&IQŘE`P~I 6k6:sTZ5h =DSE }L87L#>*?MR ]Yp??_U@HҖGF[2ւ{9ᄞkYX.=ǔm1^Ky54׸U]gs@\le߁˜s=m5+q"`v &,1pNWQ %l) GV^X.|s051ORw쪯n[VlE UUkS[_6,V=HPx9MJVU $ZezJPYU?7d]ߞfwt 8&ܯ[Z`uHS/Y?Sзd@*6BB$G\`U,9ō{_:ǂZ{Tf늴zX B-ӘLN`ƛԌ[* /7Snâ9zM>K;civG>-C b7k-t 1137Ve;e4gy"fG]HGO,vxm29Wua:ZMVkS5b5cmTղ}o, ?=QƫSt4|'_b~ˏV%pi X"qW]8?pܮ^3Ya}{ؙyqlf&U;",࿙:HZ] ۄ."?UOP_UD1hJ!ZZkv&Ti9Fuaj@S6E2iѿ 9NoΡOq#9B1 endstream endobj 570 0 obj << /Type /Font /Subtype /Type1 /Encoding 571 0 R /FontDescriptor 572 0 R /BaseFont /HIPIGG+PiCUP10 /LastChar 2 /Widths [ 771 ] /FirstChar 2 >> endobj 571 0 obj << /Differences [ 2 /p82 ] /Type /Encoding >> endobj 572 0 obj << /Type /FontDescriptor /Flags 4 /StemV 1 /FontName /HIPIGG+PiCUP10 /FontBBox [ -23 -324 1045 835 ] /ItalicAngle 0 /Descent 0 /CapHeight 0 /FontFile3 573 0 R /Ascent 0 /StemH 1 /CharSet (/space/p82) >> endobj 573 0 obj << /Length 277 /Subtype /Type1C >> stream HIPIGG+PiCUP10  t16:GRYp82Copyright (c) 1990 Adobe Systems Incorporated. All rights reservedxNot definedPiCUP10 sX {I1y>4{7{93wAxka>W= B]?h\\\ endstream endobj 574 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 575 0 R /Encoding 576 0 R /FontDescriptor 577 0 R /BaseFont /HIPINL+MSBM10 /LastChar 82 /Widths [ 722 ] /FirstChar 82 >> endobj 575 0 obj << /Length 214 /Filter /FlateDecode >> stream hTP1n0 22𒢀6EtW$PS-}$Mс$x᎔#A~7=FY/ln8:Uu&n]fd"qh4B~yݫRj~%_B )Bm !Oo: AxYB]zI{sYӈ/6oYUy:0 s2W..#|>%r h endstream endobj 576 0 obj << /Differences [ 82 /R ] /Type /Encoding >> endobj 577 0 obj << /Type /FontDescriptor /Flags 4 /StemV 40 /FontName /HIPINL+MSBM10 /FontBBox [ 15 0 703 685 ] /ItalicAngle 0 /Descent 0 /CapHeight 696 /FontFile3 578 0 R /Ascent 0 /StemH 40 /CharSet (/space/R) >> endobj 578 0 obj << /Length 456 /Subtype /Type1C >> stream HIPINL+MSBM10! T8 ',"'+=FLCopyright (C) 1997 American Mathematical Society. All Rights ReservedMSBM103R8䋮Q|!{d|fZsYH ' y{yzĐYYRxzyzRUkl&JmX$xU}h lx2~{w|pysF8*wAbCy endstream endobj 579 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 580 0 R /Encoding 581 0 R /FontDescriptor 582 0 R /BaseFont /HIPIHH+MTSY /LastChar 215 /Widths [ 521 754 629 668 668 754 367 367 0 270 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 780 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 780 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 485 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 370 333 370 333 333 333 333 333 333 333 333 333 333 333 333 780 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 278 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 784 ] /FirstChar 2 >> endobj 580 0 obj << /Length 298 /Filter /FlateDecode >> stream hT?o0w>ō:ؘbHP &n#E*2dȷ٦:~{=l?{> ]oiz⥷ 0S|A9`4|M3ۍPU4Gp:852QU ,N7 9_'4ze/5TFրed;R>KR!rY7eud ,S}M,ZbŎ0ԑ=L42idlU%[뻰$n,|W MxZ2DL_,BXхl“0㐵 endstream endobj 581 0 obj << /Differences [ 2 /asteriskmath /greaterequal /element /intersection /union /lessequal /angbracketleft /angbracketright /negationslash /prime 43 /plus 61 /equal 92 /backslash 123 /braceleft 125 /braceright 138 /minus 183 /periodcentered 215 /multiply ] /Type /Encoding >> endobj 582 0 obj << /Type /FontDescriptor /Flags 4 /StemV 50 /FontName /HIPIHH+MTSY /FontBBox [ 0 -954 1043 796 ] /ItalicAngle 0 /Descent 0 /CapHeight 0 /FontFile3 583 0 R /Ascent 0 /StemH 50 /CharSet (/space/asteriskmath/equal/greaterequal/element/minus/braceleft/braceright/intersection/union/backslash/plus/lessequal/angbracketleft/angbracketright/periodcentered/negationslash/prime/multiply) >> endobj 583 0 obj << /Length 1260 /Subtype /Type1C /Filter /FlateDecode >> stream h|S[LWԺ:-,dv4h1(YZAHEe݋ (..Y2ŤIE!􅇂miZ싩O65lv6}iɜ}3;D%(dIqqƾm AF~3w2!}єnUg$dTc586PQ#1ju|;!ylqϿ;W]MVuv&IV㒬jy48bz:1k˖3G,rikpY= .XrjX}huTbXѼyNֆ͛2ŝ6Xy2-NIՙAPD]2PP:OQAOP/Chʦ6Q :N;h}DTh*rP=mjv 艎ӽtt+=JrGxnB# } ם錳] ||%?A[D?+4 ʒ\$B *$OO3ń7( g'?1'2ұ^Em#ՂW $ L8G1Fa>Kߑ˓JIIN|K*`'l*Ң.Guxd,R)1c!$Cү$_+DqNklh%<;w92:k\vZ=;$ٴ}>Df[Q08d+5],1L!i<3TO/SCͷ>9MhcgeHrHikj. E>Yeg*>^OJ*MaH]\0/CưHWX!{bOUe> endobj 585 0 obj << /Length 333 /Filter /FlateDecode >> stream hTn0E|,SuMBBjCMڽcːE36m}!MqqzpKgAftfWmz m?v6`ߠ'Ah'P`'urٟv9,|AAM h{ܚOh?e*\09q&${*b# ~:=y8#??yb>ILBB<C> endobj 587 0 obj << /Type /FontDescriptor /Flags 6 /StemV 96 /FontName /HIPHGK+Gulliver /XHeight 551 /FontBBox [ -115 -211 1042 789 ] /ItalicAngle 0 /Descent -214 /CapHeight 747 /FontFile3 588 0 R /Ascent 802 /StemH 56 /CharSet (/space/C/o/m/p/u/t/e/r/s/ampersand/G/a/h/i/c/colon/X/two/parenleft/zero/one/nine/parenright/seven/T/n/l/S/g/y/w/d/E/L/F/comma/K/H/b/R/P/v/A/M/three/J/six/eight/U/five/D/f/q/fi/I/period/ffi/hyphen/endash/W/x/copyright/B/Y/N/slash/four/bracketleft/bracketright/V/j/k/quoteright/at/z/fl/O/braceleft/braceright/quotedblleft/quotedblright/semicolon/percent/iacute/Q/Z/scaron/Zcaron/eacute) >> endobj 588 0 obj << /Length 7875 /Subtype /Type1C /Filter /FlateDecode >> stream h޼Y XSgN7KJF]\mjwPqa'@IB K%컈 (nնN:Em3@3uf<=r9p\蕫6\fR"_{0;qxÀ_{0v(vhV5fK^Ϋ/ Ib [' 9w p(_'FVDHf~RT. JQ!`70,}"^*K>fzY<5P**oDH}%ar qX sF2).KrLG>R$noB'  DVCc>L +$2dX܅JAQȑ;]+޴jJM6/۴uR7ovEaIE83,p,H9ép.q8q8\ (1g*5QRo21:q,:Ώ?s8;qx>'[sxa:o2/mذa`SU ~%8K1{D _6ݑ_^ |1jۨGǍ>=fʱ~-*, CL MNH2N'Vt@T,Kk_L5QN }F-wʤݓMS4S>~9{SD8h%hS:_N59% xc:7ϭvh]=Hݼ%ǍݍkPxIe*`Lu< J;>p ׄzdV\Z579o %[Xiˬ.ԅ~3wȟWup56yvme}LՕ#=t &KFv3O eKhY'fQܾ $ } ='a3]ֶ NU܃x MVY]rG#Egt1᪖򆺚S`t@PAp\OBFH\AJ5G; +6 $ 0n]:ſQZ*tޱvcr䔤U%tvG"8R ktj*mixN# )Mpd@kk:wYT`t06'ayI{T_r&a5|J \qlu^ Mv-s?[6zMN Oq46 0?e'xJI$̺ ?Qk dt)HO?lY1X1i`<* RC0ZS(XFNNd'2}R|MJ|x-UcJ\~ˎ<6JDjEbt(MN[;;Ewv¹YpPkLs9ۘMWʋS{:Wy)}݌/CMfv .]Ʋ /%%ԥ&3]U>H NٴlJ+G o<D`3pxXyGp?<i`oi)lKlԕf9B"piv9<-WHGl<OmWȏW h0pZmέ t'Xy&}:! 2$z҆U`3݄?wŸ11 81NLT5fJeQeV<eE:x ؽ XA涋Ł`r`I9T \a?bpt8/ 2 8v:g $xVaQvhW\qҕYOS [=#`)?y e#q8E@+jEnuN/7t| B1吿ث>.RUU;mSiT[nIq xLu_B;XNlVF'?9|˯K[)\wKB.,Gx7-Zsu(|Rq%1}$z=(姷et5c+:U;)|\c<4{I먐=2t]ŏWW1lkIMgv?V0_}yx8f$Bq狪'+n؍iv(:G׏[mrƔli#E`;@e((lwe΢`sC[~v9#+^E+j?b=3O*ÑOp )H'NI6.DAAI}~{n*B?"G%vR++K[>OT mCɨzzMEYN|QV/ԔN)d SIX`#Qze+' 7hvc{ HG,-420߃opݳB1p(|_q4~.8óʾ7u$ 1YaJ9eVbVj |Hd% ;UaWHe'ّ}Wα?P پxbCJ~8Jݏk .{;9ӐE<6ZyX'!!kI^ &^ iA:Jk]Taö]z XDAs69N<Z(HBnpxLrzF?c3tA >Iۨ++0A2E#0!ȧzC>w~ )0'nt?{Mmi>̴Tt]$m(G sA4:H]];2y$N/Q%L^.Pq}r׻v mqtXoZjk)MDϣF/XYSqT]|^u9n =HwF%J"3'g'&i )+ R,0-?3vFQeSu ߭'s Eb/+X,WoZG }Ia )}9\žvZɇQ"C}Z~R z:R Ldn}ݽ+8sLl~>[f,,ieejrn_w|˵+- g*ǖF 8EU%"|WLԧ 4a)9iF#iΦeh/UWDEU\ WRlLR,JavDA5 ރXVAr>%V]BP;?yKx 1d&T= -p3LFҜiɢkN%^6s 9tғ#Xid}wQEYHp, \Xkr٘SDut|Vbrom7E9^*V3 e|'-ȇD M=&XVB?m\7\ [/s[wy(MX)|8$kh[6jm&/{tn ,`Ё ᒴwRċBvoG{8<R# _Z5a!`j˭60l%{0"n;hЃh*XebƕU߫Ƣ[P`ٸ0S5t!I5MfꯝDF̮9mcG}=|)8v%*w~uU(e2,ɘVH5WZ۶U8_<fzLE{#J)q`F먰˔\LRMN oU?^^lBf:߻2=Y~OM$I"gNMf3_fhI[΁wq|}h[ J*l.,)3S%eQښ*mut[``7p6p%JEx%=n a1ؗ8\J!&҆/\|]]ar7*GK6 ?]ytvtt5YȤe9ŖRw+.^~ n9l#e>W@Yug-f#K_(WE>E#kڈ/e|N\Wrfǻ}CS3S ZTƨأGUK}F<:!Qʀ@fK?5Ϫ RF{<miՙ` *F9s.{\XOV(S`::Tl}uPc7LƂq U֒3q]7m{X+h$wz7'p7`5gy6c0 yҽoтQ{wunQn;'|\'QCD>m'̏\~Dŝ#2`7!9WQgNGyOF_46hxiizSxXFZ 23d6S `2 ?}Ŗ%;:Z$ tI}.(_c3\c)SAG~n,cA4u]9ɺ n0JŽHǕ%}0ʍ$jqǰs>)'DAG?L3͙FQ#IQgo > ՙY=00oӷhg5V'G졲Di8p{R^$!'O"u>^ iؾrZcb+w3hPRʼnѨX"Lc{9)gXаOv((!ĕ`yڔ=*u&[Ze :p[PQX(K?.;e}B5iڸ GpD~VZVN |xo.Rp f94 fǑ0w1ok CDL݂M2&nwi# 6}sdMd8VU`+ޘYYVA7T՛;уDH64qTb!q>q-/lEYhs E$>R>xgCRP%c ͈"VRI[Ԗ$uZ"a0;:*'>PZĴ5G=%/.0у3E%pSv_G',_VZ--e@&6w?W_){eټǾ%J քiMi25N4c,%]+CT7pJZiN5k%+ﳯD>@=1Cb]B.(2-r_r\7 iG@MzkǹM'6;7 N@yAlBYEoew)t @ c p.\KFMu``ޏZR'1l)[!rz`vk˾'u%V΄p>v[ W$;ytWxYdp0 h0jk׀^V Z ?.+[.S9i%nCzZ)'Ek-/k,L6ւw(8ep#wb֢Uf1{*xF>T$ayC&!<9`)OfVXQ^MW7ZJ-L߅g);vHʬ'ȘV$ŸPrZ&M!+QݵQLp6Sh ɒR;_,Q%K}Q)Cwr4~x7h+1`72u?^YYGU̎9eVJ3fq:#wBwȑwM#_d# endstream endobj 589 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 590 0 R /Encoding 591 0 R /FontDescriptor 592 0 R /BaseFont /HIPHPI+UniversLTStd /LastChar 121 /Widths [ 333 278 278 500 500 500 500 500 500 500 500 500 500 278 500 500 500 500 500 500 500 500 667 722 500 500 500 500 500 500 500 500 500 500 500 500 500 500 667 500 500 500 500 500 500 500 500 500 500 500 500 500 556 611 500 500 556 500 611 611 278 278 500 278 944 611 611 611 500 389 500 333 611 556 833 556 556 ] /FirstChar 45 >> endobj 590 0 obj << /Length 288 /Filter /FlateDecode >> stream hTQn -/J_S$d))<_sv,ag0ܘa&`yZBb?H3ЃZ](-pۼؘn!yq~|Ѯ~f 4vҾ{w,Bn> endobj 592 0 obj << /Type /FontDescriptor /Flags 4 /StemV 100 /FontName /HIPHPI+UniversLTStd /XHeight 510 /FontBBox [ -168 -250 992 947 ] /ItalicAngle 0 /Descent -204 /CapHeight 734 /FontFile3 593 0 R /Ascent 733 /StemH 86 /CharSet (/space/C/o/n/t/e/s/l/i/a/v/b/S/c/D/r/j/u/h/m/p/g/colon/w/period/slash/x/y/hyphen) >> endobj 593 0 obj << /Length 2465 /Subtype /Type1C /Filter /FlateDecode >> stream htU XWNHfh3ڌLEWP['VYRP|A(Q((+(nAj _-P[奠=C/nwof3{{Ϲs"H, =/l1 :3/o3<%Ih, 7Q6ݦ{g7OKItI&6($=?A qr ceC5)˴ I7 )\j 6i5lhr2;dd9Q˙'_Az+LhiD-NW$Ak`Cg?wꌬ5qjVV) lΐbH !T#Q'Vg`MIZvav@`b ?Α x^ |;^˙7EiΨśt) jH)' VYeadL$MDDbxhhH&EHEe"Zȗ(B4W/JDe_uKtV2^E:BLj^>`._* eˊerQw֊]+qHyk>+y>mEI:|1ב)%4\ W8CI'HIpx=IgqXݫ>r"p7 `.jkߊ/*uHFޕ(T0Ybk a0 >anܘ2E"Y6B!qfT`vp.F2GyW*i8_f.gܳ9趉wRHw\Z}9ʼnVL:1f;G|ww=H&FU.~(!na%.4|;n߷m{p[&(m19'pIf ʻkYTMZkYwo]Uo5?*s~c9!{QV)}.CSEרAgMs\k+7piӰ*HO2"jdU75WӄiӘDZNdJL޳\({# a:n(\97^UW!ޢliψ7ljU/=d N8ڑYtT ߹BxB)( 1 뀠ce0ZL+ze3ll'ykei))4$iG.*Mb?9N0V_bKHp/*0<I~(W݄a q]+yM69@ J V] 3i%d :|>wWea?>mÒs)8uΝwO^@'. o߂oXuPFt>Ԑ\[!ZmU\|D}&vĒP6vfVu}Y|Am~hXc4D2W ^;}*30sxpUTJZoZaY@)\;`æ~>%tѮӷ(9|2nr&[D͈/JfଟL!`-@P~wJtÿ${0h-x!x?@oǚ{X@գlܫM(&8QQ~N 1YrČ( Fh%H>d@$H׫96BÈܗd߻wG=a4 endstream endobj 594 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 595 0 R /Encoding 596 0 R /FontDescriptor 597 0 R /BaseFont /HIPIIJ+GulliverSCOsF /LastChar 116 /Widths [ 550 541 528 500 510 476 500 500 316 500 500 455 500 652 611 500 500 562 464 479 ] /FirstChar 97 >> endobj 595 0 obj << /Length 263 /Filter /FlateDecode >> stream hT=o0 WuwJC?TsJBuC_6oڇ֚O<-^!\p0Dڨ{ۭF逓[ck w px*o^7vY||qD =ͳt/rDQΫC7_Og'zi5TIq՗*)3![%o~]QuHF'Hnrj񞶰mv6i,^&0  endstream endobj 596 0 obj << /Differences [ 97 /a /b /c 101 /e /f 105 /i 108 /l 110 /n /o 114 /r /s /t ] /Type /Encoding >> endobj 597 0 obj << /Type /FontDescriptor /Flags 6 /StemV 96 /FontName /HIPIIJ+GulliverSCOsF /XHeight 575 /FontBBox [ -115 -211 1407 789 ] /ItalicAngle 0 /Descent -7 /CapHeight 747 /FontFile3 598 0 R /Ascent 575 /StemH 49 /CharSet (/space/a/r/t/i/c/l/e/n/f/o/b/s) >> endobj 598 0 obj << /Length 1458 /Subtype /Type1C /Filter /FlateDecode >> stream hތ}Lg(ck&@gѹYu*(qN ^bߨЪXL4&PE4tfν%1yd;t.d<$$ӒSn,79++d&mlܘ$GJ4'r6qa,B@+ߺ+oI&ɥ^ěmWX$tl7B 1q <5 Vh3q@ p  |!W"/m`>XZB[ŋ`ZVg@ ,F.5YXC0c4h%}]X [X`._4ڀY8='ҩi/Obt@tT'LE:l@-,"+H`$ɕ\2H|)E n27n3gd_]!3K [j)=aH!$20!#‰R2"oŇ ![&soU(\A+4[$v H ֢zar)4~k^bM?sMBV$* ӊ_ڹ -C]VqTىȗ045˟tmKQ?HnmQT0J^y >1&/ƫ0qp1\$a:3ϡ ;R0#B0|0RQJ'[IPHin, oY#?Pa2.M+^k_?a;gYҷ+}\UPdÝ#u'_Wi Gi \ -ZY[;J۷Egq#mg/JI'hmhTv"{@npXb].*UoZË -6dԴ^4olߠ!O*ŊȔ&{1n5{b|ar1]Z6{Fsz5b?RxZЅ\tLL017B:9r:<4 T-g"] endstream endobj 599 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 600 0 R /Encoding 601 0 R /FontDescriptor 602 0 R /BaseFont /HIPINK+RMTMI /LastChar 62 /Widths [ 571 564 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 373 373 333 333 331 333 275 470 333 333 333 333 333 333 333 333 333 333 333 333 780 333 780 ] /FirstChar 2 >> endobj 600 0 obj << /Length 259 /Filter /FlateDecode >> stream hTPN0[4d A7q,)(}̬gi>o~Vy ኣPqF=QMݶZ; ﱹbt>>c[ mRƁw/@3xy5.W{;"%%{.렾zOWq1H"댱GI>}pTY]> endobj 602 0 obj << /Type /FontDescriptor /Flags 68 /StemV 73 /FontName /HIPINK+RMTMI /FontBBox [ 0 -213 987 680 ] /ItalicAngle -14.036 /Descent 0 /CapHeight 0 /FontFile3 603 0 R /Ascent 0 /StemH 34 /CharSet (/space/comma/period/parenleft/alpha/parenright/beta/less/greater/slash) >> endobj 603 0 obj << /Length 908 /Subtype /Type1C >> stream  HIPINK+RMTMI'Jo  io<Tis rwalphabetaCopyright (C) 1992, 1993 The TeXplorators Corporation and Y&Y, Inc. (508) 371-3286. All Rights Reserved.RMTMI  .: :q 24hZE84,4/:E>oE[E4/6{>o%*=AP UrllrrlmrX$) g*z~eL^wbu{aTfiyiFstcڟ 74YyiI]ts[ZQZu^Ko|xv~z~z͊7A|p[F_&#3(Fң{te4vXbUEIMݥt<J[;#P rm^]PpMneM[VkR|Ęǐ!%idNpJPXmptqgjIȫIF'GBn"ёMG8Ciy!vG   endstream endobj 604 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 605 0 R /Encoding 606 0 R /FontDescriptor 607 0 R /BaseFont /HIPINJ+Gulliver-BoldItalic /LastChar 82 /Widths [ 345 500 500 500 500 500 500 615 706 661 ] /FirstChar 73 >> endobj 605 0 obj << /Length 232 /Filter /FlateDecode >> stream hTPn e[ yIUC*N8H53q{~?#YE f{'q3 ڵdC vo d][f {tTl?_TxW=ϲ?6r΋78˩y,+@gמ{)DzXY$(3 syͫjf٧um/m Xu endstream endobj 606 0 obj << /Differences [ 73 /I 80 /P /Q /R ] /Type /Encoding >> endobj 607 0 obj << /Type /FontDescriptor /Flags 262214 /StemV 174 /FontName /HIPINJ+Gulliver-BoldItalic /XHeight 572 /FontBBox [ -175 -211 1138 789 ] /ItalicAngle -8.5 /Descent -214 /CapHeight 747 /FontFile3 608 0 R /Ascent 802 /StemH 72 /CharSet (/space/P/R/I/Q) >> endobj 608 0 obj << /Length 920 /Subtype /Type1C /Filter /FlateDecode >> stream hބQmLe۠֌(=lM\d+ed%0ܲd{zwZrt5F]qfMnQ_θDLD?FM4d>5ay۟J(斎MPHA- I¸`icKkEFjiT[oY&1s99Ϯ=mAcHU㽬9)T`{iΚ}HlKJ[ endstream endobj 609 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /FontDescriptor 610 0 R /BaseFont /HIPHGL+dummy-space /LastChar 32 /Widths [ 525 ] /FirstChar 32 >> endobj 610 0 obj << /Type /FontDescriptor /Flags 32 /StemV 69 /FontName /HIPHGL+dummy-space /FontBBox [ 0 0 0 0 ] /ItalicAngle 0 /Descent 0 /CapHeight 0 /FontFile3 611 0 R /Ascent 0 /StemH 61 /CharSet (/space) >> endobj 611 0 obj << /Length 109 /Subtype /Type1C /Filter /FlateDecode >> stream hbd`ad`dd pN)ͭ-.HLN f!CG;B L¡yyyj@2L|| ~|;x Ir ܧΜ E Uw" endstream endobj 612 0 obj << /Type /XObject /Subtype /Image /ColorSpace 613 0 R /Filter /FlateDecode /BitsPerComponent 8 /Length 493 /Height 118 /Width 118 >> stream hV &TNf QiVjmZPdEaaeKmә |p8Kp a@\EUojՋ6oAF>|&|A_A/6 | 4m7׼CR݉V-ڼhhۃΘWPn_(zMUt]}a#GO7h`KIAQ NѝUGΜ]*PTGHэתtQ isM$թ Hwi$+e!Q5CPUt׮1M7QUoj7o6].ۄ]~qެtQ+lE5?"ݣZ1]in%'OnUTQ,=U_н|*.-"X[YPUWV_EU7eUʨн}{:ݧq|-t?*U?t׫a O endstream endobj 613 0 obj [ /Indexed /DeviceRGB 152 614 0 R ] endobj 614 0 obj << /Length 373 /Filter /FlateDecode >> stream h璂@}TĄ")"IH6p_UOTw~~_-ǣiUUu]EY׳(Y@ein$I8<$0hn A.ǣh8RdS${}HwZ ^GEQ];A;E1 `Zz endstream endobj 615 0 obj << /Type /XObject /Subtype /Image /ColorSpace /DeviceRGB /Filter /DCTDecode /Metadata 616 0 R /BitsPerComponent 8 /Length 35440 /Height 297 /Width 223 >> stream Adobed      )  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ??o3eG_z2I y5I x8{7OwWp,o;^*&X/vyѯ3(zDUF?~yjYg-ɱȷ.ޜbBiAѓN-<^gk ZS:K$yB^8P UJU!FeAh ( 5_Z??1yC[wqzX$1DlEFlzW]v*UثWb]v*UثWb]v*U_r'*g/f?z\U{u/1>kt3Odִidծǁabb ?>h|Gk;1n3"N LDoUqUZͧEuMw[jMIAl/߂̇gM/Jj/y3˺fN=/˶ZiAno`yVu4>R$Zܕ"8PPwb[ U%OY&w~ HZR,A%Sv*ʇ Vyk/H[JED@u*EyD.Vo-:k\yK)wmަEb*P0 *W凜ɧ[˚ƥ^LM:TG[wckiI ,ⵉ"HpCI+>\=Fo/ڋmT,y5Z{b^\miDhaGB  -zS*O""8<6pB}TH%P#9P:4qWiFVҼck xyV(:6>8&^TջΓu([ &YȊ ^.K!&Yu붷iu8ՈZt⬳v*UثWb]v*UثW_چݞ*ȿ ??Y_aqWXW~y~vqZCZ( ֻnђ+l 2fePNoۏ~GwT7Zil7wbkYd*I4Ge·կC&\XL ^;́ăϗjN>eTdm4 V^lbn,5Pӓq;r~M;#?yn+u󿕛xu<.lޥıp6-#ih'w5Ϛ_Kn1A|̑3״#|߮ALu?Vmqo#58G"0(sjJ"fӀ},_swrrrAuE.(&u$i ˱`3ۏ%<90(Oyyn:FzʊCld{ؚ,ZOC>4.'?"? :kռmmFMFhhANҹ9GͧU< K?O,EcMZGtcGo I%~Ks/爏OO͞/1fRo>o_ʝwrs^ouo] _]]kZ2zb9R7ZpΜ >\BXf995Fj76zj'?J]^ef_Z];+)P6O3}87?7//6yUE XU:zV^J-n_]/wjvx"(`sgɅ_Yb_}oR<vhFYQK#Cinʪ<_i{ܜ4e+}M 53-3iZf眲DS ~&5&v_1٫$̋yR{Zo9yJu٧zѓ; >"_Z1 zD~cm@Q>_,c~wYtw#rm;OatWUq<,Hk'<F~ͪy[r7ev[k+sXd76,Q;]>-#9JY`1OK w*.'C(WTFrYKW>Lcܿ\+9{wHV|^Njzfgk+'[M6{)&rkK\WtR~@yV.91~6xĚ:C˖rVݴP45դvI#ħS3qX焿&LYiOI&/.4fMm(P6ƌAZNB,bhb.; Uu] ^p~[\bTIBh+7rL3)BYhE&ţ0x͗ge$| g#D~D~vyzϐo'6}MKBi"FYF D]rݢmGwGo < nxմ]Jڱu M!(cb"<Y-f|LG˗ǫv^pHϊݟ[~uo6y]䯝|yK 7y)> ]Jesx<[Ntb~E[}S.Z緙w%CJ5 \jW2B={=DPD5znOSvcYDH6,NM/hzzϚ3|sL(ѫHB ]IYJf;|Oqm˕n?c.䔅~O>1ʿ6_iqi%kWUsĬND\9Lx ߛ р31hhz:έjwD%j~mgRˈBb7}>$cf$0ɏ"yrK_7ZA#ԥ2}\q^ާ;)Zy!|maOC8>j#έslŦe3IV)Yлjl-,NCY'Cϔ,9h?2t=Li-Jm.-ZUB*)WSJE4y8O[pah5?WT_]/_3y&_*~}yb5f2D'p e؝9dA2:W~y?̞M`tw_PΓs=z$+LAVzs@5Ϟ8HO/;iuGҮ~~yqH> v4pBO/s=4"lFY? ݅זkmnFg^*IfFQ #G .,GƗM??wߙ!ovf[UiO3oHkF8&7ӝןYKc/"?7<8_)TIi =#PLpa;5h p@||wD0bэG!$}_:7_?:=.Nt̾]'R8$F惏%`qZ<ӑ83wh?ٟ?v_~~@o淕<גHf=)+Awhn* P!$PǴ;S&@̚a,,@'rsBqZo ZJtַ%yy3h,k@3M]mO#靊+_7WVE8Q8B ](?򥇒<_yRMFBԷwX"*PP >J!Gy٘"Fw1kx1vm z%gm_OMou]M.l\X#,"ŀ"2@{#qw5]e\uc: = ˻Zs{r?TI rX0J˓F@A_IZhٶM;X1bY8jeK.㟖?>`Zz. i-&(dHfT'SJw9eGs$xg{ާ99=6zιjwDt-"6@ɈRGN#ı>iϫݻ$~ytyoζmף-㺶ӽH.a SDN'RAie)[3Xxw4Gu͏ȯ1iߘ>WnXj wE80]z7$b>$47 ,-zs7z oq9kxki@bionLٽU/ ;z<s7 @'͑zs&qhjHdcv˂%@W'^Q>tYU7fbmVAHCsQDi2#d3Ŀ7t ~oZֱhqsNC%TerFG 3Wz͟疯nט5X=xL^ Ts;9-+pz9_H4O<[^j^M: 8/%ݯ8dic!BP$zHU9ssK :|K-`oSɷ^Y)57_WNB`rAsa㭮KOTr?OmՌΛw=sKv,W |=JSgAG'8Wd_~[ּ?2i+hIcqG %\֠S&)b"+]n dlfc3?-o(h6kEդz7G(f Ju|iM7O0 sq2t_ɭ2gPT<da2‡Ł',;4;{gLN3޵8i\+Y8A ᬖ\)iUo/^z4ZI;_z.yvy_KGc VdFR{3q22 OUh|۠~Tv?rMosu0&6qpG< B) zgC 4Mc =SQE ~sr2"3 yu>{5{VoʞWƏwwkVnܵ" xFB+L@МB3t ~yc[41]ݵr?̓k+l Y*5Q@™~Os=kд{Dмsi`hum+\~ѻ f!ӒeA<Fȟ=^~iI`W5?*yegӮ $(PE 9oneem~ь,Vdu_Zմ GRs{˫/ TAFk+n7ʲ =pC4<꺖ycvګZa^ ӒU,pk n< 2{Zy7!? V_h/2i%ϫu!K&ҜŞ-Np wmNg5BE.zsrDDn윍@vCO۝'>[cе_3]ڪuo!y^A2- GP+=8?_-Z~P3R.{meq'i^F:Ȗ9?Klo: kp/k:D6w뺲!p*@cfO$#MsqX"+~h/-_ɚn~aIxvx,Fdž0=?*w~p>iz&9;޷]_Zb0` (zdy=̵=7r{ ?zu< Z C u5U^ _!SN_6z,q0~Ot柮~FIaxޜQ$mC K,5nlfԦXMq R0Wv1$BWsyJ򏒴=s^VGj7Q V/ځ^g$ .X2Cʟ_\ygSkVo3hUeVAƆ 3$IqNr&v]F;DDW*Lcq:楗?1iV'D丂نPpUBF˶OÌU ܳ]n9ǡFoiKZ#Ags)>0H=DŽc̯ſ$1jڶ0L W`FCr{8E>Vտ31n?4u+HZeŌ)g]OwjVc3Jl5EFξM8C41׈󯹏Kr KWK?54MR[+[ՁjW9KFOz7 FSLE6֟&k$kK[)V72$sj31O>"KrJʞCHE^؋ ϩ.QAMu9c:-v8 ϴ_7~[3ʺ>m}c}n1WFݤ%uhtr<3Lg$9)rW'y?\m//jtXzs$1xdbKSL`^U*Rü شY T4=(h`qU~Ko,]"=oUoE̾K~ mM&skOfU1~_y[˾w]/%4=}nlm.!ԠKQm3YpmxnYG {@| sVڰԺKkDE*7{ˮfp2w] <珞.1o<-ږk-0u ;nGCQ{ƳAMRO/ί5VC򵿙NnN)pR;hxeARj ͧiruN1˫2 so:'󘿛K嫍^gmv;X^/Y@Bh7ZEr@q83륟Q~tr12`XXip[C7Úl=>{/?8:Ǫkvҏ%̋,Gp!5']1_27.Y|49Đ]d4e4̼S8 ¾vHd`?8ľ<'e7b.; Uuӏ>[dM,s䤡kUw(qb ΣR5219j"懯'h طgnmNHgQEs$xmA<)7fxB!iC{Ɨ/U W3CNr.N#ǚZj[y⌛Go Mp4sLꏰl*|XKRc= c{wf!洦v.q~vv_O3`߮{E%㱲|-s2*f2}&6=fz/Uп_O5=#-啇8TVŬd7l? & o5̔%/P-@Pn9"EW/Q-8emiK9>3OACH pl }]5 mgFaZZ 1f7HkHQFf`vNz}6eczg..`d!Y|;db~vX%aɿPIHv4d>Ì ZZS/g1 mclX6##)#j3#Qh3I*bw  )]P*;.~_>a>X~~ټ;ysrX], ,pN¹9Y8KII#}ߢ8cu8˺ռrfR]>unӞ\P<~/;G9q{ ;Nl^VԑHց|>󱇶za qbf={ZƩvw%C'sԒg'ԙG9ov,~) ԴRX; "Tw&(|J8h4єyS^]Lh~yw&Ar5ˎVew3 V+ fhu2;@צDP >2V?]琯ԟߛ$T'gXtf8"iCoo7VB+uڬ!Cܝaǂ{ m~xOk^dҵZMk+7@rs 5 Gɦ~sȺ$+$sgJ蛞ND+?->=F-K)~F=wZ/"U.ABჵ=k1H?}~Yõ7R)`o1KJ)d}25\tg c5ν_fAcm7kT Gi/NhPgmپӝ?$$ucot;?&MOȳM{heA$mߦM;[_=٥.`{%.tynۈF=O8 n>wcQ?n^:,:8~)4i̚$Lr۵]uR-dw]4`_"7:7{b−Y %O0F#H{sZR}2|^7g=ч#g:a!?eϖrݖ˕YBZg;}7m DC݊+_7WVE8Q8B ]^ekFb`2ؤ%C8 6UOؚa33חSR~q}Ծwmf:WR#)̏je aK>#]cZ]iޡe*oU?'"=bLp}fE4au}fWշsv@ l6=e?3'-h1Gs/2y -龳ĽF֫ZnX~1Ŗ|h@`rpY$;}2LIqN[ɮҡOOi+!6nDփcb7dP>eFfat5J(Rj+BwxD9;!sHXC ,XӥI6!wD}Zw-eOK6mA ߸ZnηW2W9 R 43y;H5G'l"݅]D+TL?/;;-FCI&ZͤK~cy_Sv?)Gqs„GŠ݂1s2Gvu50F *Dv^LR~K?5ykZ_\=Σw; ȡ)♘⋴|sD?]E  @'1?'u Qg:8tg /4)؋m.fN)K$|F=뷀<g6dD{=PJvZ^7*NcC]fZLA~\TCX#5{cEj+=fKQ8 0dЬ!iða"ZXMn&vc3s?k.>k:VRafp!˔\?{o5yɷpZ]$Q.c>~O3`sfҞd6~Ϫ"4?0aϡ=R=ON;t'j24D(H=W~dW_چݞ*ȿ ??Y_aqWXW?ZM?/ݸu[\1J4BjvLy^j Ɣ혐{.ˑقyz<6KYԢ#!!~$.T9:<#\BscZi0q7KF+C;3=>_{@zЊ=q& 0S_a=-8k]>e5 $wyfid7\9szo~`u81TKce(fƖ,؄E9El#!-^ W3OO餸\D*c`qSJgDwghOzWu;zJ9Y-VCV+ZT؏;_f$y:">.vͪ)2Q\kJh`,z(a륋Ij#=(bENl.5iX2AS4aCZZPg?RslN/W+6zuhd- fJ瞣(#{n?yo*GX6 JmKO2PVNuڰӘ]iIߗ41ZVk_[>Yh>ӀFO ,͋8=|Kɞ<@4sw3]ƇN0]Lgxȫ('jTtf㰣QCwQn91S:Nm_[bچHgnR=Il@6x"fY&4ydTmHϦ}a)䑨eF#P<455]K\ƞAu9Ó4& Y^d]~K+U5$SQG8I؍\ǢS30wrW~YyG@1Q2rwe"-tFÃqbRFh;3^ڦ[k̏m6~8ӯ3ip<-(?A? tweC.w螣ݸ2FfQz9_/jx"{˚kE,\i!~-g<]|016;4 H=+t"yf5rR񸶱XB,§.ǚxM㔇&OD~ ?PaJ qA8_rFSTμۤ /HɺN/{mt+hTUHB>yEr)Q)h M1d#1QDPXN.pfX˫yjXl|n. G&4|{GWTrν>e^O$kmvV w!>J~Dإ\F<"O?z?+,u9".Y[גLCb-]XNyWZ?uˍZ XCF{ (O_sx# 8t|gDA+|45i<$٭U(XWj5zÆyW:s+8EZ..i Hy( `@e#š?Quoʯ+XXϭjaa#7F YN^"9[ٸR |Ah +P>f>Y8iWquge BVu&ioEWX䈲٩^٬&\Yr^:;Mxx!#9G~ϧ4$ pn"Ba|xptݶ%|߰kv*r9Pߕ_[YGk= L.*v*Ga=efm)uNaiW8{;W,X(r A)ⅇaٺH:ahfޙ͐9LjWV"6oP}jz+2aj\ 2il2~^N/a4ϑE}3:뻯F_ Fo䟖mM8Y'oz/=VZ3js i6yGm-/WNs ( THj=t!?K<(yv,gBm8y:7c[lUV`y-ܳriz\uV<bO#O@b^b ߛF\ 1Sdv=O& `^j52"d~WdiGVhC6Xዹv|>"4XYxTnHwRm4'8\6FZ^,lצ|[;4#Ta2Lr'0OS#Jtrc${kWEcu✱Id15%X{ڨ87U/OG|ih-I]:|n6v<dyA/Ν4ǧjdX@r@P'6}g,A&"뾹}8\1&h}|X<}F;*z:^q:[/Fq#Ffn%T>yt!q@.S-DO MIhhߎQlG6&cwe1Dr~ϡuKMsCS];OحGբA%ARze/x}WHb_?~v̷BU_r'*g/f?z\U*U۴qw#|,SUc?VlJAԹx%'8Y4SKuXً%=Zm6'UpJ({3 8lkgr1+T>٪va܏#9u΋(jnOjsgX&)`H2HB=AγGsqˈ2_:y6{QyaPj79Sv*r9Pߕ_[YGk= L.*v*z?Wm6;'#Y#A=Tdc1 h?Mf~o[ͷ]w/_}(sݨTg_~CxsD>&,H?jy4>mGsiU& +Gi{gqGwʺ^CuIb X$׳=۴oJwZQ13[Py;Z+Iw >U<[Yu&17[=K.#tW;i8 hWI!8r;l2 /PҼs5f,w o=/dy~+4~=Gk2{KKpjT蠧ߜn{Z57 w;vcז@~<-m?!!XnBmAސȂdqQ=ߡWnث˯NC~Und_/0,Uث'~_=? 8<+G+hsVj=v&hb33v~*^y~m NMv֛e+D>%ѕ1>\oR?/sQt߇#9Def,9_3fI5V{j(" (}Nf\s;cփ\w>_I|2Z4տe- Oo$c0)_Vi+evBGCIq[N>ʢmGN? yhx]"2nMk?A:֡K=+P^4(nbUy]* Q6sɮ/#Ӆ^s%u @܏3<~`cu&ܰH?_ec͔]?O||jWw:Θ(~N hrr2QjFqo{M̳J&:8ܲb9RpvYùa#,s}g^jN4Z]֋+mck!N ̜] ȭ ] NLc?IHQwgjV7cCZ$iN.1bR^8]ɛպk02+{Խ"Eyv 10ܳ,mP@vZXP)r"FݮՌP'{RҏHFU_f&mht4򋔤~%i6F/j:Θ .4۹ %!𡧈˰j8c$wVmZs^/T$WAFLrq: q@y7BU_r'*g/f?z\U*U#Ͽ÷ޝ~_ni8NnT {Zb!S|[Lny6Hߘx.-˓c#f:g״OH65b3t&1 $ TȍfXt% 244L#%Am~y=J eBB[GݔdPr:yQ$VxCI4WX~uy\2׿lxG`M$gt K3P:˩P ݑ<6kb{O}]QE])n˵CAPy?|ߨ^J\i&&]@Izmͦ,Ђ:NIXr AKl+HYHmx\iwzn(`iaDܟju~f͒ءIsw#ȴ$o.UĖگu]W~MmΫyap-MqӌM[4C0v7ǫfmd{Ao*$V޴l4]/.aNz!pH,GT-G$x_,s#vX2uy1W[!M=ΆO9SPϙ)%,RcKAGq'|BQf&];5!㛝Ndds|5ڎq΄|yog#7iR_jv@F@y6ҕ͇) ryMP*HVԇjq3t(:;X)gGMY'\߲?r-؍ g;C w?n2ZU_r'*g/f?z\U*UE?U ?:-'}F{K$C+_3wޣ||ehF6A?#/m|(<ժ^j7; x*T:]^})S1y> 4 BH\uXqq2BŖ- rZc<Ə@='0JXCn<Zn+NH]BU֕iQ^= c_cNY_/)+- ݵCw61?( "l-XbA7ۣ٘)HnMoQ>%1p /hW~f1'xi{Gm| ?1^.d GR Fh3 2`Cwlp0y5G+ZXYW~!P1r-SKQ#hUMJPJ +xۉ#`P`kz}^m5s#~m>Amy>TMRƿ5B)5=*YH&Z\Z,F6ڍ6/dM 7Nf~'s,uGЗjߕ:o6y拋=6,n%H"q,*6/:콙##^%6:νBX6r36t#C!륤?K%|3Y뗖Yl! #d,OFH !_!cݟUbjRCsKx7>U57ȵKS#kԴ/,y.zjɧ[*&ٕˋOuX!霉=ԀMwWC e2u=f5#ha e~?u].+\[GQbtšw,/WNh=OFW%ŝRFD@,G콙3"rZ޹"-cyd3{-vVe2oҝw>S5X&}cT[ۤfBHG`|iٵ se27.xd{K}7IG bF z A'!66{o&^߰sv*r9Pߕ_[YGk= L.*v* Bo{{)]u4}Jx-hVH3Y$|Ii0X/=H?@b^f%ϛL@aLZ}vGjNmpiӃK?,qCw$H<[pJj@/ԇ/򖈲pH;}?صx݃F+y:to-ĊTMi}OC&湼F#7~;1xg8gZ^tqĂFΗKd?aZNO];˗A Nٸ>`&wr>}Mկo>[UsLB]2G W$T2SY668]];ov1k1\ӃV\2l :~ٜ:lfxsmm\}On¡fB}@G4nG>*GCŕb:fC"#b>oi|s}3AN*6;O f Gr;rX/3؛K։گȃOg^Foth!p䢪kH =#-aE|ye`+zO幁``J@ kNaR>kΞVugj.e_Hji9ǦgsmlY<dTIZqscmi\Ŕʬ9/PHߨ t@W!lJaf@ 9 .d;b5 )xӲ=Ŋ<94gHN[5i` A MT]nb1L UC?[[KQLƂ=ץ3͵:캼DPo饠ť/JY-f[ky$/Ë+'Bxq{}-C?H^637i?qP{ Dr2:2;{URyٙ/LIyVos^ɨ]":T|M@v׵"47>oG,cqli%lym-ORi_gvZ#2IAغ-4ح3!8="Oݞu,؏ G!,MI.)|?YBZwkq{i#~؆VYB;ev^8/? w{^m9)7FR{P:=ǑNN9zb^m,ܷ Fn_dwڙv׵X#)@z}qe<16[XdK0U'5%B'dMS^{I&]$ :OיLh~Flh2#.~D:NJ[Gi۩{gS.GgS&^rgGKJ}꺖~@%+)(|t9%oX|iF+K|m/#x?:ىض5ε#mjw +xz4o_1evoO/|~ϝ-㷲Hԁ.|D_^rYJ@51Q?G~f[v*r9Pߕ_[YGk= L.*v*:(y#Bhn&M!*i( khNeIy|Jl Ձ6N/|;zv܇e< BNОqȷZ_ѱ[T+Y4Unuc&l84FRߟNk/]i:w‹{ ZM CZ %WX I*FjP .jEvxd'ʿM~IAc=2/;kGU 8U5Vyѕh Jqo3>#NWL\_LP1I~ΟmIgLosOw~g *Ns:WU%Im4L*܊ʂ^Aك@#МU~ީ$"Q`MMx4x<,mAs-{4ȁ8"Bekm6/veNW2 e2*Ըŵ7ZHx!F?̰#ƹbrH%h:m52:y+Ij7mvBKH#)Q%پ.1)cN].d&nC͊I{q{ʗ)tAF wA J!{V&pJ,H,*/{a|Y8іz27y<ӆ ; #3VyL&vLo.f{OXu}Qm^k{k]-^;@MOS@j℀.!BQ'3_]/wjvx"(`sgɅ_Yb^s]K0Yyi^ CǠ&x"Ye&%AJ_/IIߧ^g~Jmz7YKI)FH^IOvd埚5 ٿ5u&Ck?ikB\+p ^FTccl<c!9 R̋{zh:"B *EXv9wxF(w*w=իM/!L s2cƭru(l0k8,8)j$x&&s%ibtE0Hb.廻mw&ɿ'쿱RCWκ]uDlHv(Ud!MjV$pQ0V?͒O%Կ~e{ZJ EP}`CTC$gKWy+|*i2i5/7\p jaJ/Z/%,r PS05YXV]+W_چݞ*ȿ ??Y_aqWXWb]v*UثWb]v*UثWb]v*UثW_چݞ*ȿ ??Y_aqWXWb]v*UثWb]v*UثWb]v*UثW_چݞ*ȿ ??Y_aqWXWb]v*UثWb]v*Uث V͗r{cnfD.gMO?31EKW1+E}'c&M.*Bb,/*WE=2)P*vC*r9Pߕ_[YGk= L.*v*UثWb]v*UثWb]v*UG78%KzvdyfY%X^[Ǝ> M EX9b׷ ?jw4ַ Ps,PZ*%ݜJYߑVr;rFΏ6ښZW2Y(sna-$X.Qc |gR/*~tc2^Uvߢ5 ;ToӋ!,]nOVĨQ*&~qLߗ^Qq士G$/eKD[#mެh`)DB_s_]/wjvxῙ0: b$Lb!*jT8/k]<_~ǞOwby?{LU'o銻y1W<W_*k]<_~ǞOwby?{LU'o銻y1W<W_*k]<_~ǞOwby?{LU'o銻y1W<W_*k]<_~?17:/|Dhd~!hji'3?lUثWb]v*UثWb]v*UثWb]v*Uثg_ endstream endobj 616 0 obj << /Length 15787 /Subtype /XML /Type /Metadata >> stream E9A9D893D509395D8100503A9FE4BEF4 xmp.iid:A8ECCAF2497DE911AC4BB7CF06C12E68 E9A9D893D509395D8100503A9FE4BEF4 saved xmp.iid:A5ECCAF2497DE911AC4BB7CF06C12E68 2019-05-23T16:53:23+05:30 Adobe Photoshop CS6 (Windows) / saved xmp.iid:A7ECCAF2497DE911AC4BB7CF06C12E68 2019-05-23T16:53:24+05:30 Adobe Photoshop CS6 (Windows) / converted from image/jpeg to image/epsf derived converted from image/jpeg to image/epsf saved xmp.iid:A8ECCAF2497DE911AC4BB7CF06C12E68 2019-05-23T16:53:24+05:30 Adobe Photoshop CS6 (Windows) / xmp.iid:A7ECCAF2497DE911AC4BB7CF06C12E68 E9A9D893D509395D8100503A9FE4BEF4 E9A9D893D509395D8100503A9FE4BEF4 image/epsf 3 2019-05-23T16:52:12+05:30 2019-05-23T16:53:24+05:30 2019-05-23T16:53:24+05:30 Adobe Photoshop CS6 (Windows) endstream endobj 617 0 obj << /Type /XObject /Subtype /Image /ColorSpace /DeviceRGB /Filter /DCTDecode /Metadata 618 0 R /BitsPerComponent 8 /Length 48953 /Height 273 /Width 249 >> stream Adobed        s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?HPYU}wo#yN~hO yPһr/& C*>W഑LI)T;EQ+#  (o-]𾕮-&m7V%vxZi HlbWx??|wOA5'T,|u.&~ӦAiZ-K4[HVKmOvzX%c{v%YRUqm"K7^O)C.5]"H|Ǣ>vz\[V6ca"YUk/6fCzU/tcG̷>c,nj (z0ic%;?D[A58eSAv)?GT O{ *kV'n[L>MNq'TƘ&_>n:*6swh0+뙝\.nJX,_5m7ʐk-4~aog m6040QO!5gW(6Gq?FּZƆI]:H7_EĚu֭8]b/Y*)~y?1jfm+Qմ}GUǔ9hյ]ynFYtlR}_5YyLՍŏ/j^u;dYdhIe(Ac!Jگ;oOVpLvy&5+- 泘%G'a,zluO:yoE'jIa+|.KJGPzBɅxC}m3D['CL7Wù+B҅e0Nzj> ZG̯,r{W1/W"y% Pjv*hS!OMثV]ɺBX|;HAYUwיd*Ti0 T-AiߛJM󦛪2>gkk=U(~KGw?X9ˍc7/ט/&c. WD +fT{m:.,.c.:}R93{3KBo3;y{R@%< ƓwcbQB$-~cs72-;}c[Ym.::l\iO$eo,ı<%g!~lQ~Xj"M#U1CO|Ik$Ѽ~d^T򿙇52q<z\IBhnK {g!iUc?Nώ/<~ZX/ޓ|),h鳲^gyyK1ty2/+~\˖VΚgA4|6DG.fFt^X&2d@cA]FךHouPiŚ_ͥZXGu+(d(oŚEqcSK$wޢ 2Q<ݤ.(Mcy}i|)Sw>鶾_ҒDb)MU&%y2CO5+_8g 2x|`ީ+tbn}e|uW0kQ\KFՔU|C7ܙM'Tcy{B򇖓|,y_K :O֣[iuW)IY*Ē5;~bycM-}sC d&n䒻ʬR+LvXP/O&[ʚ>=2D\^ܸڬ1>>nmA.‡~iY}''yZ O^ӼLK]O,*Zv? ') _%_KkY-ʖqS G{2y_@mǩsf?B[Djy`g/4Z{^l&h^N7>@WV׆+;y᳕b WM)# /Y_J< zv]Aw}TYYj/B^A RI$:/.|p&F" RMPJ~Sպ7յ(K) $ض/,?0+w.?.c 2#խR8.T3!he78ڞy+Vy[̶zt;}+ʐ^d1M%opY].1:Ϧ!du$Hpoh%/̳ɟzW:o.9yr7|áΫx#"\MėTi⹎PվvmhRwol&F!RWO~byF^4+HVO]ʗzm3-X#tI)Xdͱ~ZkU%omY5-CJ{r&gW{^_Sȑ;\\ǩ Bjfs ɖq~Hy3\Yw,|6GtJUQC"GkhWo؏N]SN|٥2&44\5N9C :=\IAݚe?~wyG̛]Cʗ:ŭiwZy:3q8'  P>дO&ZRA|ʏ/M<,hm=g^m3PvyoVBG My/1y˒yW@fN-T}WWz/Uy_4l"~vw Ʋ"={Q/<'~\jߙ>WV*jk$1*v[`Y.̅ӏ;Xnߒc5k/GiW:%nO1^[&݁t vG֫*|'{htmgcPu+;,ZYDu{"I/-7.UPw2$~QyXy>sԥA@dO̾LXti@[It>֮ !gDz,Չgs0궚e6K<Aqp>biVI8eTM'zOz;jAixO~CVuǧYYqբ/ _*vд̿%iqRMF IeU=lz)ׅr::08yOV|m'%ߗWIבe6:QM&Oi)/'+)ǔ|qMii.~64ݵLWP[ HP/P=֟oO-AOg{̽7O +qIi֓-^_YuKiiM-ϗ5fﴏ̅_Cy./4rkyE5"r",WG_y6Ѽ~e_yW厑W~a GKKIH-H i=9W][޺_u3Z/i>mW妒,&N~VN+d DUdͿv3ir_y_?/ϕ<ˠy@YꖶYZS;y%Hڢ7bފ[P˿yWFmQZɂDȈ h9Kv<<+_W5sE4Tyzޒھ/zr -dX&I.Ay#>S5o i?e ^lО9Bv':Q*[T"iѨT)Tt#3ZȐjdʚ yj"dh)VHߔJ-ܚyֽC^D4],sawyK+HC(x~.m$qezqTlR{0̺6]P_3y.DC^7C]]F@88O_%SS75̍\Rk+ⷖkY5 $1T;id@݇y_z?.?,<}[F&ksrOn{ϗn5k/&Rt Vx%nnn#&UG5XoX"ogF[<]ohY|#oRi%}BT LUU'3'|/o%au?7Y4֢N'UJpxmU>AH4U$VvN]嵾 .?,.cmesXWrMcXܗpU~b/!,e/" vO}=:x&v;FFCuV7Vdmc~fy/~h*?:s~\]\^뾍ecӐUG׽,nyh_s_/mW-zXQZ8EM'2q;V/Ji:^~Ry6W7$^6fW2n`6lU>\yb,i'L2j~w<ץJеOC-b}RJ JLi𪟈܆|}~YԼzȏ'it=O$x_PUb&z&#G|ߜξd_YP i%Zmn b6r=?ːEi?Zw>B[tiiri:\qƪA`Ɵ,1ڧg]:mif5/1jWW i>z>S#Mww^2Ffo6[22W˚<^cm_M;˖1\ m7H,f&).1!,Lw>|%^PnilEonh*iIDd59+`A >ug`F|6yy<˿/yK&U[_bLƪ$tK#t4^bDn[M>]2I%l,:ۈFF #LFyTyCoũjVl?mɃSekhItV}HeUh"<ζA>r+Yascgeiu/~aMv Pڥ05̈́0|-hϙ/u?0y4_֥gG>ym Ք$L,MϦ-yF~OZVhAFs H3 ?~Lܪd>CGxuo;ڏmdϝ4[V(ſCk5Vcz1oHgF~u!I;<ǢI7/.7NM_~)2k3Ũ4>jxK"Ȭy/@<| +̎JLX[8ҦfAb70DWީGu U>%c[iڞܻ ~`VY]BT,ۙd^]=ssxBmXZ7qE\Sl^iE_yvךǔ~MyokqY4Fh}JdU8+ VO+g?5MYE ͓^ۘta:q=I(ʼn 0=Zo3yc^Io)n<}u~x WRyl`[I,t[{81Ldi 6UǼ?$ZFyOJmi^fӼb\2j9YOZXd5^3M6ȞץԼcK cg^ )I8Woa-6:}6}{h(PkFb_=~zywi|<忯^A,@OmQ%kXfHuJ ,@yLj4åir]yqMie$jc/B(W8 wfwsHOU>qaoy:ΓZyJ cH׮',7z]RZOVH>j:"K$~`yO9 @E[i.k_0u闔Zk|5tQXԯ\\FO8A!{'G|oO0O*~g6Zc zCjodګ (fWkB|b]^][]-|h Z%4<,Y%ܷY^uRE?+֏m^ y+Xn5\-#Oь(rT^si^F|1k`>p/tI[QԵ #I{zu4"X;78mWipҴXћϺ/|iwZ%Z1s/ [:='FhwZ 17n?-c.nq*rw77b 7>- O=6Ț_pru_'yIViVu+Ac? iO=y\m򮙨#PԼq] "PnEqҖ[I;J/?,ky2#_[k[[Vzfg47V*#jȕRT=ukɾ\,<ѠyKMݴkIBR ءhu9~\Po7z^Xk_ˉ .|' 1F;XPfD-IH)z ]Tt?ߔ^QmİyAmk;Ch:۹Kt!hЗZ>IuO_'O|N;dOѲbNL-X$)0c$ ^lU^e$mD>l-lBm1`st#3V$fBX[_Ѽ̞ZMݭZՅΉ?F5ˑgga<\7,K!YաƱm?[䮐$Oki7EKY@i7QyD/;3E׼{aE{A06[()ռ}^ PNwm]\dqIsqlymY-!-f횴cz_?mO7g}w͚'OӼz ֙0y&: rHc!ORCZνkvzYmb g,ԖeB'xm?^]ʖ^Y,+6Inu˽ͺW ź&n-dSZbx$aEӞ^u{D-b{Xx>k֨U-57kvʧ;t}uiהˍ;ޥכ[֮ r[DdaąQB7޹&C:?It+6ijpHybNZa}3Sӧ`W2Nt( (Gx^c/q_M>]ʷEkOg p!DJbm! s/O+hRl][9uYb n&6y1 ^qe{"y:w#~cjvu眼KY?4GqgU9`Qϛ??tjj1GX46 +ƟiQROU #2Dī-sZG歽_W_Z,z X]217 Y'B"0:2?*8M6y7W\Сʶ\Yio,=Ofv+GUU4NJl<ѠyB/MזD ֗Z.lOmw$߭ڵ:*nTMo.ky˿cVҢ򤳻gLv:k$DeI* 'l:^_-m ߚnY9yRү$ #u zG.J6f/g<6m_GWu-2j_}rjUF+C^SFm\iV}޳5ma ZKmjYT^_j嫋-T.sֵ5i\K=L[jBVKשAy6gWzޭywj9c bɽkUrR(#}47|xޡP~j0[L/_yҚ%K@B-cp$ Ƀ~KygP5}\_)E!MS[ӑ7~VYmo9JC`c*|y̑yOvkY٥ޫN&[ x^2P"Fq7-o#LR-C^^eIjϨMrOUEFv<ӭ U y/PV>kɴk ׇPK\r$ U`ᵮyGE򍭯䧟$:eΛo]E 4+RִbLK/,SW:yV~W&t(מfɚjr5&Rl$w$*[#048[1z}Sk?42#B&{>[wVk{ȄeY}87+^QuxGa{ wͱͪk^_X+C[kwmusr,YTjR}CO ߙ4t2^-ֹcKu&i$K3HGT,0L(.jj|{\ie/Ziv:t9/tJkW䎟d;abv}M䋟(ycLO#Qk=> iLс-L e>|'1t?L:,[ro]$VQ͐نKt;ߙoԯO4157ʖ׷1c':\NI∕Xph;I'5Ě _&ZǗ: sJKFvwvQ4$n_Vg4 mV8Z*ʮ (`BBӋMWZ7ߙ'l.-o8[2^G?1Z;)4NM C4I7\j;KF&`摷Dʺ?5yS'/y_]VX lX%w6%IeT7_O-;:ws=} 7|Yn~epIrJy0WVxM-|me~r_ŪL|]giX}\cK-aEV "hǓxWɿ_E_uqZǚ.9~ 9즲 R֐HZ++L,7ͯ{BFȱJyy\EPIE!4@ [Togg+\_:eγhawkyoi#X㽎h~GF-&I0rR sNѴۋ{y^;nW2;kSuZ?&G7ZDB0v8*y ~n]N>E{Ks.nd_IE7QB$(y)t95!3XEei r+Qϴm"̚Ɖ__9b+Xdգ>ͤlyB,8q-&μ F)Y]D`yjZy텱V 4ÅG7tmr}^z34)?-shPIm[;"-z}()oqJTt!y2jkFכה48aH]+NS ,pB$M#G7ͦ]Ei Ia ԯ͑u$>Yk!ccK5-#HY3=7˚w&ojھ#K5vq]D->!dF rG)Iar2PP[j`Ś.-ū[c,l[wZ/o0hךP[MXՆ$eBfQV}DP0o]>kKV\Ňf֮"2E5&h#xx8Db" {H9hwzMއQwZީlmYMtl##/ 9Q<,]iտ'<=_6B5 ~ay'N(-mGb--j)3}kOԼ4˟4~^hZkg/G}NBo-n#6eZEo-[y/ ?$t$.O}vJ\~f?'2q ;%NaeKvs7Lv24Od<(QJ) N#'2yF/̨/l'.H:.^hmխZ z%)S  >fg殈ߙe;rTYtMz[y@uKtqk}m!a<.`aGj؉x]֬<1T?:垝O׮XM6ޕNaLъ ȏ=ǒ^y=ǛLZM+˖q22$r=4h/!ysT5~O0:ޘ^ya}3i.- 26ߞXu77|pz̈́mKI7˦@%(:IeoG_ 0^WHEk M'h$H Eoo2Eơ_hӉ.QKr=В]'j seKi:W>\s4p4.$Idr ې0Q?gڮo8kZ/SV͐iA<ťIZ[-ӂA, ,S|ic䒾XoW48!oA}jiH^lG= M}%<5>O"[giuzsw.{HM,i scH\7zg|9M瘮|iP'vgmϠ1MVXkm|˿>T5;Մw:kYZ@wP2ޜy_}R̚gϜuCz*&[3~Ӯ$H}te8S4B({*jچ{H}RMzFiQ/?.[6i% 1q.>o(kk&-sWiKH$q;2YQƤ7Hz<['˿X$y'不if&iV6~\B (L~?0zgm+KOj~JbI'&'vrIƗט..5)63\]Cp02 hLqF77dj/#NC<2[ikV@DiX`Ƽ'kZj/~[^YI66mev-k1 RQY)B~|io-i烩[~k#T Գ=?cJ /?Z4yVM_N a_U/bn.#+SbLS]SɞBdտ1"ӼcVwsi֡*;?%>Ud|/0^ϝ< vq [6coLK l^K/4/wkiY\[{WQfkR Jj0I| yUtX4鯼٣ʱǧY!$֌29 Ti%އ"\]λ4:I2Y[YM2lIZ~vk~c|ѡkEy-Vjnt6IԋrUm s?秗u?^Ҽޚ@qe{K&gD(#+E MXof]ʗ>A?o#yCQռӖ;44܄RG,HJmc/Z0tgZl,qgܛEm. cJgn qC~LO:mG:T_Kgϒjnd62YCb!#deۊR)[k^LVyo_ 7ߖD72{*Oc0S銯Mi&6g+ִzGf] fr9$&$Vrv^d5si~ 'q(Z &0;/[>iNYw8qi+I f`.GYcF@nhž>~Vhp_cm,i,I,kv0+9p ay{ʞcvϦyw"VǗzƟY,: dI@~dտ5}GC6<Ϙ$e;-UIeG$(92ҸZ W5. K6O%iq\Xu3n[ ȰvO$$ƃ>oK-GT$`-ݭ]ux-ucr*;Q AEG$%_t/^Vɮ\A8Y{%ť%ܨ6ZQ07;a)@XʗݬvPZy}BCyJC(*Nϭ_˟3u\zmBc>ljP})%@ dPLϿ?/?N'<Xv>dգiS4s375n#T%AmYd%4Xu]|epbBok;ߤ6WJ$|8yjF捨&'<a*[bHNjpʮ0GZ<Š[~aYJlj{t5ۃe%׉"?&y.:6Hy'qU򆁫y~@򯚵-;yT5İ] t 3F9ˑPI%{R?SB|^n/u'nzJIck\\?`HORŇ/mF-咑um淴K/#NJ*:ҋ;c7Z=ϱ~ֵ}GW5~PF/XdT`qɔM#pF]N廯/jb]YjcMX,%zҼFrxLWGj6dWY&b]v*U~eyo1y+T-t_ӎ{ۉ'WD { 1_/[Z7<ѧyK]O#\'󆠍N[ Ձ)=5T8!z}ĚS_4i3o.ꚅџڎ$+PpG2X^Ͼb>LU_W4]Bm:Q]QDG$Xg-=ߤ6p߿05(ɩ$jzԶsKoȢ2ES?koo#3ɿU5OJ*LsF68ROW~dٽ/h/bKqs- b> lpQH.4"_yu8[CBxH$WgQ8J οct{{,E247 ?VOy=FKϨ_̟/Z m{:[y *0 䘘Jm#{ȹ2M4+yo(i:fVG*^iP5PSye"~ekߚ$t,mTyeH ;ur٦yxMO*Z?.%-58]9 Nn&h#$F$Q@xGl‹lNǔ-`|-4?_jF}i.#jJOʨ#v 8~~cXO&#}CB3rY[XL#kH&bO}kgy$I YcMK%wh˲P^Ao;i~B?5k,|Mq x," 夓(e 4GɾNo6#ɶVzyV}vKMM4;KQ-XNJG24MsO3}':jِj7O]1L>ܦ4n\ }i}yK{'KG.m5潨jf{wp4kcm$BU9!k$[?5$5YyNK umWTԄIHd^H.'wE㌲yfPt~e3Wb]v*ȏ$o'"t ӕkvn4޾K|yzVi~C\,*Z{i>ArrE<RaXrVs~^Ť~X~\+2:4rZH!*2JPe~kB/-|拙 A5ç[[Rxlu *+cY`ഘo潶_;y-*m#^@lUW KSr s+$rTN?ƽ/1晴o&bX/+V9_҇Qp'( 92F}ݶhQ/4-?Qf4<-(H oY9MWCnEukWes<_[-tYX=WАN-*]iyJW4IX}f}=:K]Q1q\Z Iv"Z➑y?|j/7F*)ԡ sH~uiߕߕ7?Eռwsy~H^w7{#D=rwE_Tjc^]tOV}QL/KA\i6葶{XZY(B8a/^]^I稸-:1m' HɆ͘bb]v*UU޽0kNO33K~][{9Y8I&^h&PB|wtƑ*-PYOѺ I i2I Òn _RzEw>Ni~AF%H(˱ H/50j_rOɋoFS{m60V?hu37>X=kAo/< B+JRhZ4P$(:"i|  HOO4˄יlEiW#ŅH`AWRQՕSi5h:yI|3~lQV5ƫKp EfEfQ4ԯ7YyO_>yϞQoO9c#zE$sGo41F#POZ]ҵM]ֵ+˧[iKmf1G7 (cӰ{J#Y׵K˝[IounjkvRDMn-/Hrd$dHQd_{5<ן^j_P|ǢCwgaZ0]I[Yi[,8;;2w$V~DOGkgmzKluѠK[K9.# s9UzO <̍/5O)~j9%rɥybO_Fa"JZ87WS$y+ WwM> >W'寕||-bXם5 +y5͜a}g3BÒB3w_sGVusnL"K;< +P|ɨ˭ZZj/j'4"V밼EȜxFXD I"_M ̯_m{?VOFDڪ }k^<76vyLc hǦŠPv2_ 5O>>yмݪK&ku?+}/U[9 8Λ: : iԖV9~]Sy>n剓X֑.*YgJ#3qS##+DS%󑿔Zy7֤_jr{ӦvwzMq4szMn"1;3!$/ʭ'Q\{˚?,:,vw3krhwYkX@}!&2?M6|ۋo7:n peҩݢy)rɪiO={q RJP" I`x0I˿^ y+m".}iug`';wh!%aĽM/ѧ&QϒkzVko2Y]^\E*ܛ) i&s=lof kyWZFzOIjzvw:EI-u-졊ۑ>pb)I27 Jtvo-ב̰o%ߦ+iZ-'}SWb]xG_9y˒Amipw1<$I UAR9S\( /{9+o&c7]ڶWzKV8R6& "b>V"lAq?7OɼƋ快\sjRi|?%սʳۗ ɞQѼ+ʺJnH帐<^Yy$v,AXMPUثW~t~Cy H9$;L>f[ *$T21c?3j=LثWb4o=B^H6oUf׀, J=B#K֖5!Z6,|uieЭ?ysT4hWO*HorjBB%ʾ c~|%ê~tkQioΚm %#H}M@pߔAa+M#>_UƝs,3Km[;I 5.K~==&#soHW·eyEعL0Mg9]{km98EFG%s|:k~l|YaFr=2V2$i#̖Fv`E|u噼3i?TZw nn:gѶ{Bʲ=8ÿ$W펝]jz⾂]]ażc3V/KAU!:(Gg_~WElh֖%KVZ D&GX$9゙qr%gvhzwv[ZX|5ƥ&@-͌ڞKaAqf+˘wRsļ5O i^K?yh%͂sQtfcw +q15ͻ3mR=,D\ٹij77zY4hFJ-3/$UثWb_6ry^W[?= WԼݭyYcG(&ϵ$_LPg_4yMŬsDQ2[3̲')(gA;j,<^gmg1z+EHT?-,#2ե6VvR$$ PI;$ֈ]v*UثWb]L򕱹[ Raw462u<17$wV I=YAMZ妢TGas4xfTI,+i&?k WSү4>tKQ펝.ki֥=b(PLO1CV|R9>@ҤuOX C %>lyޫz6l2%dጲ8C^NrMn]v*Uybhz2)=Xm5;dX܊% Tm$9'6sK .DѴ:~c [ߌqFTobv*UثWb]v*Uث?^pMC,JG7]~]?_^O'63HmRH9 Zuq:20V̮c?t[U:{3k=ڄS\\^IoqE@ 6Yof{-K[kP˺wb/)u}B &.J&3eS%91RP:O~jӼkqiu&j:^O*( 'O峿&M:Ȍ Đ6{ǘ|.o3Nc k0,-u_鶦 [`!>o7|l5>hʵ{<ڭiUG |(7ȶeWeeϯFKM+J.y z9]E."-^y}U1s{zZb+lo{Ǩ.4n,C͡"mV%W(\G\o4yrw~g|Qn#-ɨ5P3b`1G* h0ty?ʞE>[o,뺍ޭw6j"bm%"K :AYēk};7FT/|j ''%ij40spI-.:;garwqsW*]n}  <.mwqXuO+M92i|WRXj$y OCrArE,o-6sB͠O[[ki8qRa˝pI3LH~cw K _ϾaDAdR YmlhKGS؆AALl~^aE~fyKG|5œ$:wz)vH%5FbbqriY(̌4h+J; \U <<q/淝$}Aa#IӒx` ōPMǨîZmz yVa3[\ cL9cߝߓ.|2yq?M/Urchd(B$`"2+h-ZFMյI5Q4{}R,my]UI."E*UFᰇ7N~IRͪaHa(V5QF oS%M9y5v*UثWb]v*Uƣד1"-49ymWZl/.- MzB['čHeO'vN3>[,+I|m'ZWvZ]6YLKÉ0)?1 }OM%iia򎗢~ԮH/,/A ЗQ+Ey(0/6Y6Ey״4EO :}w1H Q:?+ݥSNARb7]z OMSIYk;)KOnlIȱCT-iqjWidb$Yr@'y/:_̿$uVb&mOOO[CP*GpdWd-\boɻ-l2%?>@mf]X6"ТF}\,"ߊj)nO;#py@22WIуN2p4 $42JAP-;X7o-=n`ͅ톯>8ټ\K7sEjBmL}es_/>y͚n]j-%$/t#OFRA8<"n?75ۋ ;M\^iSmm^Hie$#9:$zh:\1h gZFX-wؕ {U+DmڼN^_|EH -V%Y٣UxOXKo1jz~nOzz,N`Q1!fV?J[ŋ z:/̔/OW̮9jm`)d򿜼Oo-w6~zԠk]F]7Nns;1@$c+b3sQ|oy>hK]7WU.ma>9.nuIWXD-M"Khmy2$yI|._i?V6i_o%G †e! _j1igu Ϟk6y' ַVK ":WGʵ2Aov*U }{kXjW {-> .o.$Q)wcJ?dn*ZzkP_h˭ң0]5P@TfTXOg|?Qa^*2ܵ𬰤aȍ\0AE9jϘ5/4iX'ID&r?UNt-Ey\5m+D|4+]!|%Z%]^0U"h^f 1ȖPK,q\K=>]KTjXKbb#hʀ0s^AC;ɾWM|qby=wqD0Χn0#o&-5[/?/i~Qe\M[ 74OhXܱ5i-ʯ-G/-y\0j ɫ2 5֣}T*H?0=%NyrO[E>_ԅYξuubi"}78yX2|?,Eֳ{cgG:mӓ= }Rs$L#1h$9[ZyOҴ,^jQqܺ]j6EcUhb`e5wK?_7y姜l/.$Xѭ,R)hVݞ{Ƃ5H]>R0Lߪko1~\ʶz徯qjDcnVL'K{K{ZKV+bCR i$zߝLiדĺv/M+V"(4u%ԗyDQ|Lx䁝i~RuK__Z\&zޝ%tɵTsXbVg`.rsgB״0]E[[ NCTt-;C%&oIEepu~$X$̺nN>Hm͢*\ڄݮb#,nfWe͘yhWl묶yo@FGڙVf,䍁Hܐ V$]>:}5&IuWZzzM^8 ]4ڎ45ל}b2-iktXT~@;Aqjkwa@!"!Vw_kӴ~#QG׵?6^KqR]?VwF M}+&3YGPY!bEfh Ʊ(<\P"ΡyV]vuy5]WQe&9&*Xh#Ototk9+inƟH|4uK6q]~FR}r_L&^^_8xYj?>Ȫ]ADqO+OƳ9o}C\=ϛ5-qVG죊{BZ[V$)]a:|*WVџWm'WtG*Il"["RIIk#WKX,H#I^ʲ¥q&>hˏ r~{P: =AIX굌Y+B5B*ƘH12K=)_Xѧ > NM龰řwg^K? LIRG%qM?iu'/)yHKȤ^9L\ E,7yjuN8bo*4`3 *:֒b<)k"Z>u ې+KX OVJ.TG=Zϔ"յ-"0Z7oj ipZhVdn?wK?_#yz1kZkqI+KxMzPa%)mGUO0MU^==^8$u \m<,OϿ~Mּwo7kwWXVjZN)5= [pH?hu@ʟ/ʽgGW|k}5u{r oPcs$R$> b) y#^qx_/̉Ƒm$5 .J[ .Q!&e [,~ff o>Nn/ĖrKeZujstZy x%'m5ϙfqͧkPSw kKM kmyVZօg7CRּa,jY`kq246Sԕ-z4Cl/B-^ÚEYmp \D~HLo=zMAkOS>^K" 9|ŢȃQ$ߛrI?aitj?1j^GP#5ET[K}p''yC󝍝֑ȋ?^{`綟wr2uZ 1&CD~t6^N[_jZD]Z\[Y;[2I/E9A<?~A&ZO?*%yDօK-gV"ٽJ  ٯt={>MZMG)ɥj+gdG{X\ԁ$g1;j+EwHظZRKBIeӦJ,zBG!_\66o1k֧V9E]=1stSFKj} bε.kO|~LtSq/3yxKX̉DU/SW_'&yCF_kb=wOhQ{/Q㑊7 p,a AW ?{y<,x?,i}Ķ~j/tB"=EE0/4ZWFO̟4ddx[|bo_+?*c¾1hϭ+_̟4aT1_?/FUPDž|b.WUPDž|b%\4ȫ >}+,=?#>̏4T1_ߕdGO[?+' PDž|biY'O]Dˏ xW+}q`/W{E`?F<+?'*g?V-+)N xW.?oJdq?c¾1lϭ+q?^i# 6V-?+?DC薟q"t rϭ+d~P K%y_xW+薿dy>T1_.,GO5ȫ K/kVCC}q`6~j1X xW-!WXWLc¾1q\~XQp=+ <+-+VWxR= WDc¾1Z_VC栮 "_.oNh=6!vhX4Q]M)*UثWb]v*UثWb]v*UثWb]v*UثWb]v*j:mn96f! FƹO(cC|~Qmi$`+ސKo iYZ9X"WG?C,Yph?:1(`hMGO72M=ʿd&?N?Ql{%1Y'OS)uϒ4p'`W^W,5\r6A0G֧ 6Ibˇ4gDW&<Ȃhzoq$qWGZPX# 8+* ETg_=>_ɎXEl$e=vfGFL|hN@51YfnSWꟚK*hwt֭ ؔIpJZ& 9cpP};~oU[!ӍN$pc<^w@8[px7!}}.\ Ώ_*mNQ1%,\Ӽˣh:k-dXӓ d|\zN{B5Z(jg3$Yy!ߗOM,!(犍hp;rʖ2\hzJaHġ_VW'qa h=!d'Hlw)+p5CP_B_OV \_;VF ?0`M.18|mVlᆣp#'ҠZ4ԢHdh_zM= uc_Hj^y Kcc$~x~dM3B޹_:=QffF]/hft3Nutywncseϻ{-\[A >cs14h\cs<յ?/)< )rӘ9 ; :坭> j١?2> ;;<s G/ͧSop^q#]PM7%>c[44M@3!;GI}~c>(\?^y>RK+z]S6hI =`hIZf϶JM>Yc9D,@0͌L򌸁s_" ld㙚oG}.:;qp{Pkps$揓<85N)dn3f$۱}֟%O2^KOfu<:'|{!Y:b_ ~sɨs:a}(*~7~_cESϤY!#JywvȊ<\o)yb/*ZIa}_[pLt(N7bvD{29q¸%S%^ו;N#9Wh5%^"CzƠ.@x_"?}oةqf(P 8 m*|i>KFdJiUnֹUKٚF9nQÎI/Ŀtr.oXK~ +r>%i/#=>`|sx|>Vo+#YL5[eϤRahK% 0mv5)"bDn@|-':cGm[K]#Qң4-.&`RJМikg&W TIOć>[KKm>S%P~vC錸${ϔ\2>8ݏŌo(Gq/A As0V\5Mrm< ӑQc@>yڝ59>D!;9 `9?oÛ?&<.|è\EG+>\[,=i'U~Q#^b>F/C펼fՍ>3B>$_󑈧ȖTM^߃wPi*{*?t!/"G/ݖ>&7_c< ^ߛ?#^WQ2xOCǷ"%ß=Ha#t)3KT{a1?$bf{CξYn6GLT42++Uچhv5 D.۱J}ED~nU^V)A.;>?1\`{|q0{}/9QXde`v >D84C7K?ڌz6Qoރȫ/@ghi"&3 JfR>ˁ2~YvxRGO };!Ɏ2< #!|%?{V4X1 =|#] {w6}}g1?=Sk蛨֗S13wǢ]Wv^890W톳.iΏ&AUy^AZlyaSH;o>d|Mctן97n+13}џF"UB%')f Ж9w j@=>Ǚ+a/\\ 5r}[@OwvȎ,:|f^7g_.϶'ZN}@!R\Gr;F}#bsz'|?e#h r?=>`艔~S^~(*$9TGPsc! 6 򉉣0.+i/ecəiϛ=q{O9xG9Pv1#DA1g-ϐ}'+?_iYF&>A5?2z皿>HӞy}MGGqڍOZ=7?FTƹ_}#y1%o#|m=vG~y$wOA5?23|.MZ"[[7 5»4 : Pgsnf9q\DD%P$aݓc2q$}'T=yo՞>7ט4o,]O^#,>seǛ_|ji;mL!!gϻ{aϮ CcNf57;dUEOўGc.;yϛ=,Ҭȍ^E~Yy3y{hzUe6KtۤgU jmW8~G{!c21?Q2sk}>i4S&#@@r'7do@3_#v*UGMgL%o;1G/s/2h6fot[1x Ȏ 5ٰ,4%[AC471Q"#ʉ$Ĉcf Z ́b@$Yp o&:wϝ? o{ϣ_v*zi_Go$@2jD13(U8?G58XRF2 ADLX<ÉA$o~Lv~k>2"Mv=!?%{/o>Rg?ʋO O#W0ϲHƃldo3+}7lt5`5QGx\L,~>1o4Rt"$1P RNWfJqeA82/!-o0e+G]2,Q$t4`Eso`ǛrDHxs؀G1g9gDH.3 DzD׼yc=9&WL#$q(6?_ZGMC(?bzȀm]l7K(`{kux2}#ӱTiDZu m6طqu*D$(g Vڭf ,8N0|[lp⁑>.c_kZTN{D>̿VUREAϙlٞ 0f;76(ۻYe$h̋u#""v>=y%{kg'y**"{c/a$#+Cخ֑ ̣ϔˋ 2{[ٚHh>S>O:ՒoO6<˥Wp(Sm,P,۵kbyK9u{>fvdp2U|inmkZvuZu1s Zu=͇~~E,˗$Lc-* /y f5Pɒ8HJRMо~Nyn˟/qo!!hۑb@z>ɇ9ju)"5 $t}vΦ84q9#\ϗAT]=eךl7TŭrHLAA3gpfk12@6G{ػ:Y!2}r?;?,HN6?g!,_(>(/;x^T( i˷>7a㉐#+@' *2}/ kfto.Z9 ʄdb6ӭ:LG'ڼݡ(LKuʩNχdihG?&|;_ $G1];2>C7Zi]EzvmvLjiSݡ bpj3Y'$'2rB{]NMB;RUc$pK%ME 6ď y2o]ê|Y$rr'^ZZ麕ҤR^sq*\w oӷX{<2 R"6%TEjyu>%vy^m+:V?~އ{ާ{Ϳ endstream endobj 618 0 obj << /Length 15524 /Subtype /XML /Type /Metadata >> stream uuid:A1F804C184D511E380FAE1B5FB09FC8D uuid:A1F804C284D511E380FAE1B5FB09FC8D adobe:docid:photoshop:96a93af5-30c0-11da-a8e0-a4fb52fcb197 adobe:docid:photoshop:96a93af5-30c0-11da-a8e0-a4fb52fcb197 1228 1346 8 8 8 5 2 3 1 12000000/10000 12000000/10000 2 1 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;DC9B87BD0E044CFA5BBA12955CB8203C 2014-01-22T09:01:55+05:30 Adobe Photoshop CS2 Macintosh 2014-01-22T09:01:55+05:30 2014-01-22T09:01:55+05:30 -1 992 1087 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;1B5BD65AE70CED280DD4F75E8B695C33 image/epsf 3 endstream endobj 619 0 obj << /T 546 0 R /R [ 43 134 294 383 ] /V 620 0 R /P 547 0 R /N 638 0 R >> endobj 620 0 obj << /T 546 0 R /R [ 302 182 553 641 ] /V 621 0 R /P 187 0 R /N 619 0 R >> endobj 621 0 obj << /T 546 0 R /R [ 33 50 284 641 ] /V 622 0 R /P 187 0 R /N 620 0 R >> endobj 622 0 obj << /T 546 0 R /R [ 312 51 563 268 ] /V 623 0 R /P 169 0 R /N 621 0 R >> endobj 623 0 obj << /T 546 0 R /R [ 43 48 294 268 ] /V 624 0 R /P 169 0 R /N 622 0 R >> endobj 624 0 obj << /T 546 0 R /R [ 302 51 553 206 ] /V 625 0 R /P 144 0 R /N 623 0 R >> endobj 625 0 obj << /T 546 0 R /R [ 33 51 284 206 ] /V 626 0 R /P 144 0 R /N 624 0 R >> endobj 626 0 obj << /T 546 0 R /R [ 312 48 563 526 ] /V 627 0 R /P 119 0 R /N 625 0 R >> endobj 627 0 obj << /T 546 0 R /R [ 43 48 294 526 ] /V 628 0 R /P 119 0 R /N 626 0 R >> endobj 628 0 obj << /T 546 0 R /R [ 302 48 553 318 ] /V 629 0 R /P 86 0 R /N 627 0 R >> endobj 629 0 obj << /T 546 0 R /R [ 33 48 284 318 ] /V 630 0 R /P 86 0 R /N 628 0 R >> endobj 630 0 obj << /T 546 0 R /R [ 312 48 563 340 ] /V 631 0 R /P 66 0 R /N 629 0 R >> endobj 631 0 obj << /T 546 0 R /R [ 43 48 294 340 ] /V 632 0 R /P 66 0 R /N 630 0 R >> endobj 632 0 obj << /T 546 0 R /R [ 302 48 553 499 ] /V 633 0 R /P 48 0 R /N 631 0 R >> endobj 633 0 obj << /T 546 0 R /R [ 33 48 284 499 ] /V 634 0 R /P 48 0 R /N 632 0 R >> endobj 634 0 obj << /T 546 0 R /R [ 312 49 563 477 ] /V 635 0 R /P 28 0 R /N 633 0 R >> endobj 635 0 obj << /T 546 0 R /R [ 43 48 294 477 ] /V 636 0 R /P 28 0 R /N 634 0 R >> endobj 636 0 obj << /T 546 0 R /R [ 302 48 553 310 ] /V 637 0 R /P 1 0 R /N 635 0 R >> endobj 637 0 obj << /T 546 0 R /R [ 33 50 284 310 ] /V 638 0 R /P 1 0 R /N 636 0 R >> endobj 638 0 obj << /T 546 0 R /R [ 312 83 563 383 ] /V 619 0 R /P 547 0 R /N 637 0 R >> endobj 639 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 237.903 749.307 368.064 758.265 ] /Border [ 0 0 0 ] /A << /S /URI /URI (https://doi.org/10.1016/j.cagx.2019.100007) >> /H /I >> endobj 640 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 327.777 720.488 380.997 731.428 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://www.ScienceDirect.com) >> /H /I >> endobj 641 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 283.875 665.508 399.969 676.447 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://www.elsevier.com/locate/cagx) >> /H /I >> endobj 642 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 508.299 593.883 538.632 604.869 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://crossmark.crossref.org/dialog/?doi=10.1016/j.cagx.2019.100007&domain=pdf) >> /H /I >> endobj 643 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (np0001) /Rect [ 393.342 616.842 402.624 629.115 ] /Border [ 0 0 0 ] /H /I >> endobj 644 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (aff0001) /Rect [ 110.598 587.917 116.919 601.444 ] /Border [ 0 0 0 ] /H /I >> endobj 645 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (aff0002) /Rect [ 187.305 587.917 194.076 601.443 ] /Border [ 0 0 0 ] /H /I >> endobj 646 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (cor0001) /Rect [ 193.317 587.917 199.656 601.439 ] /Border [ 0 0 0 ] /H /I >> endobj 647 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (aff0003) /Rect [ 299.859 587.917 305.892 601.444 ] /Border [ 0 0 0 ] /H /I >> endobj 648 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 390.561 412.545 561.402 422.368 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://creativecommons.org/licenses/by-nc-nd/4.0/) >> /H /I >> endobj 649 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0002) /Rect [ 55.509 342.516 67.905 353.507 ] /Border [ 0 0 0 ] /H /I >> endobj 650 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0003) /Rect [ 188.871 342.516 201.267 353.507 ] /Border [ 0 0 0 ] /H /I >> endobj 651 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0004) /Rect [ 99.564 332.058 111.96 343.049 ] /Border [ 0 0 0 ] /H /I >> endobj 652 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0005) /Rect [ 229.929 332.058 242.325 343.049 ] /Border [ 0 0 0 ] /H /I >> endobj 653 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0006) /Rect [ 150.792 321.6 163.188 332.582 ] /Border [ 0 0 0 ] /H /I >> endobj 654 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0007) /Rect [ 73.347 279.75 85.743 290.741 ] /Border [ 0 0 0 ] /H /I >> endobj 655 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0008) /Rect [ 133.935 258.834 146.331 269.825 ] /Border [ 0 0 0 ] /H /I >> endobj 656 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 239.253 237.909 251.649 248.9 ] /Border [ 0 0 0 ] /H /I >> endobj 657 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0009) /Rect [ 223.44 216.993 235.836 227.975 ] /Border [ 0 0 0 ] /H /I >> endobj 658 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0010) /Rect [ 238.506 185.61 254.979 196.592 ] /Border [ 0 0 0 ] /H /I >> endobj 659 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 100.347 83.102 161.586 92.058 ] /Border [ 0 0 0 ] /A << /S /URI /URI (mailto:kai.hormann@usi.ch) >> /H /I >> endobj 660 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0003) /Rect [ 375.288 342.516 387.684 353.507 ] /Border [ 0 0 0 ] /H /I >> endobj 661 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0011) /Rect [ 388.356 248.376 404.496 259.358 ] /Border [ 0 0 0 ] /H /I >> endobj 662 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0002) /Rect [ 506.13 237.907 543.6 248.9 ] /Border [ 0 0 0 ] /H /I >> endobj 663 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0003) /Rect [ 313.791 216.991 350.424 227.975 ] /Border [ 0 0 0 ] /H /I >> endobj 664 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0005) /Rect [ 522.744 216.991 559.377 227.975 ] /Border [ 0 0 0 ] /H /I >> endobj 665 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0006) /Rect [ 387.24 196.066 430.434 207.06 ] /Border [ 0 0 0 ] /H /I >> endobj 666 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0007) /Rect [ 313.791 185.608 357.102 196.592 ] /Border [ 0 0 0 ] /H /I >> endobj 667 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0010) /Rect [ 351.96 175.141 388.872 186.135 ] /Border [ 0 0 0 ] /H /I >> endobj 668 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0011) /Rect [ 477.51 164.683 514.08 175.677 ] /Border [ 0 0 0 ] /H /I >> endobj 669 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 41.82 66.117 168.111 75.075 ] /Border [ 0 0 0 ] /A << /S /URI /URI (https://doi.org/10.1016/j.cagx.2019.100007) >> /H /I >> endobj 670 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 44.205 48.981 196.236 57.939 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://creativecommons.org/licenses/by-nc-nd/4.0/) >> /H /I >> endobj 671 0 obj << /First 672 0 R /Last 672 0 R /Count 15 >> endobj 672 0 obj << /Parent 671 0 R /Dest (chapter..1) /Last 673 0 R /Title (Clipping simple polygons with degenerate intersections) /First 686 0 R /Count 14 >> endobj 673 0 obj << /Parent 672 0 R /Title (References) /Dest (section..9) /Prev 674 0 R >> endobj 674 0 obj << /Parent 672 0 R /Dest (section..8) /Next 673 0 R /Prev 675 0 R /Title (Supplementary material) >> endobj 675 0 obj << /Parent 672 0 R /Dest (section..7) /Next 674 0 R /Prev 676 0 R /Title (Declaration of competing interest) >> endobj 676 0 obj << /Parent 672 0 R /Dest (section..6) /Next 675 0 R /Prev 677 0 R /Title (\\numberline {6}Discussion and conclusions) >> endobj 677 0 obj << /Parent 672 0 R /Dest (section..5) /Next 676 0 R /Prev 678 0 R /Title (\\numberline {5}Examples) >> endobj 678 0 obj << /Dest (section..4) /Parent 672 0 R /Next 677 0 R /Last 679 0 R /Prev 683 0 R /Title (\\numberline {4}Extension of the Greiner–Hormann algorithm) /First 682 0 R /Count 4 >> endobj 679 0 obj << /Parent 678 0 R /Title (\\numberline {4.4}Improvements and generalizations) /Dest (subsection..4.4) /Prev 680 0 R >> endobj 680 0 obj << /Parent 678 0 R /Dest (subsection..4.3) /Next 679 0 R /Prev 681 0 R /Title (\\numberline {4.3}Tracing phase) >> endobj 681 0 obj << /Parent 678 0 R /Dest (subsection..4.2) /Next 680 0 R /Prev 682 0 R /Title (\\numberline {4.2}Labelling phase) >> endobj 682 0 obj << /Next 681 0 R /Parent 678 0 R /Title (\\numberline {4.1}Intersection phase) /Dest (subsection..4.1) >> endobj 683 0 obj << /Dest (section..3) /Parent 672 0 R /Next 678 0 R /Last 684 0 R /Prev 685 0 R /Title (\\numberline {3}Greiner–Hormann algorithm) /First 684 0 R /Count 1 >> endobj 684 0 obj << /Parent 683 0 R /Title (\\numberline {3.1}Degeneracies) /Dest (subsection..3.1) >> endobj 685 0 obj << /Parent 672 0 R /Dest (section..2) /Next 683 0 R /Prev 686 0 R /Title (\\numberline {2}Polygon clipping) >> endobj 686 0 obj << /Next 685 0 R /Parent 672 0 R /Title (\\numberline {1}Introduction) /Dest (section..1) >> endobj 1 0 obj << /Type /Page /Contents 2 0 R /Resources 3 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 637 0 R 636 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 2 /Annots [ 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 2 0 obj << /Length 28849 /Filter /FlateDecode >> stream h{[oG;E=4R/ 93{ p2EK%%I^YUVKZUˣdξ8{lwY}N367&u9ھ]ܜwq<۸N'c.Yx|I'N&3X̱y~6C6m .GЪ7;[y'}+h7oC?9ﻥ\_LG*~\ d;:Ƿ/!X~WiBokN3=}lAK'?}4 u#/6o_ק%mvjiknI{k Մ7" DEy\}7'ٝHS.}3Aoϝ// qZ7wF21Bc[zrz_6Μ'lRPl;,ׄi\S9u? R7&/1-{?^u|3~=ٳg__qs}'ml3 ΊXtyֻew:5ζ 531ƗnζB٭6n[eg{vzft}ݟ5ݏϿʳggù9kv[إoa3O&trdd֮M틓)n+FrOޅ3)_/9!F_3Hw 5"xNOZZP˘UZZP+rZւ*Lgj9՜PMȽH>z5r/Y<>,EjNP8{W%Brxbm8 r)nh`kSmz,)r}t&kǰƶk{˯^Ptؕ@))0AC~z! V7ԓ˴\=HVe0P\ ƌ 6([nPtd;Bچw!NmƉ,Rl!rd(*B8r9AnۙD{9Iѐo[/c c!gIEQIB87C zBs?4>ޤQ~=B?{oWw~%bحB?j_Ew8Cq"`I('.aȬqT$Y}^*ħaL U$mGZ&" ;#1e6%ŠLT*/wtٙ( ,"LDׁmzX:rmhLv,H5- P#;ZڗV`'%,i4x 0o?Pb%RDভv_ÍO`vXl%,Tp,z=B` uH'G"aLjcPI!z>`mj :d*4blhbm  4;Q^""4U7 "{38Ts~H T3 LяPP1ThI,Jɘ;%7@1TK SAJjqdMȁ%IR(64 0˓:<E,2B,Gbaڤdۜt 3D 'Ih\L{Ȫ4pXL~ m kvO*w0T֫'^D!RК .T,Sk8ȸ"8\JbV /DQ Ctͨ ҨO+M]Llԑ8xE!X<5m&⫈| L30ȓn>5y4+;-^*P*8QRq-Tqqha+A:bBϧA3j0#M![B΀y !K :vB8jpELzd а'dBCM`BoLTfʬaJ ˸6p$O1$oDm|6/7OE*;T1Dg&ϭ9+&9+*8xw<唷Mu"x(__rfN\1D&9+t>''q(W$RcAknՠ)\jZPURk-hk[kAkA쪨+kAkA-jՠ_S k{GkAW˯6j|A}C퓛F5q0sj>C]o-bY}DdQ8.3_̊=*52A :!}bHGhK ׬/PY1d*Sϙ2o)qA\`lb[1!nKn-Yg;# ݬo`7o䀩+S ꥀWsp8ZǗBH]~lSammaDP#&9 6bM$ޞ ¤XHY¤`,P5:;hR/Z8QwYYIL@!F ܛWSKyɶ((LyhK#[َ45 2/̋/`XyN0R Yǀ 5E #8HIQC6AI"K z|s@yZSEAR!ZdF:eT;aW3HT߽ǰ0 [$S,RԪh%}ʯYP!="œ 8D9=_JU3=j*0z/k El;d=hOWAI\rH*f,{@bY$] dc ]y?X5)qR,qb S,KXǤX<X,NIS,abIS,Nr,&I{,壳,yeI,ye),.2˰L++y_] )i@qON+4?N4:Ϋʴ:-O:-OTŃieVXuZVcihu8 jLsLsŭ#{1h(̈Z5!=$e#xFNfY@og-œ ee,fQOF Y w8>Qv^Eg(2V#5,Ej,Z$C)ZUPJ) w *':6ubBْ#˃IQt=C- *|fe\T ތ)l (KMdqE(F>N^23VR<\DX.$R[Pݍ/hI?'*P 9dc驯EDhZ2Y:jr]l6 7& /F87Ñ,>o9$~ۼg33rԳj[xZd|T-oTDn'w̫Qݝ9NxU+YZcuNplCrbI1mm 01k/7(%Xe;xC~ѝ.t3(͖%[,V]ܡO ]m3.]dmZW+Tާpװ܉"sG6T]fq:r&<7Nȣ&D5r|ѕ5Biñt+j*}ՠ kWւZޯ'FBevk-h-U*Z: [QVIuZ+kAkAdVA%*ĵߗ_=q-hZ]=w"b /Ն.^ܜm_Cn@>..6]-(oC֠fV^1| \=G?}W7<=~X~O{N+[B Y1 dA=?yyݼ|ޟzw|ʩAhq>xN,O*񵽾Ծs1sOö |,HW~<ӛ؇͛ws|  _yj|h+(v9bF۟`UY߽|j6U֟826oηȔ3zœ)u7ϭB6m^vj9yB)owevnP?@A>wH,褗oDmeBwtFwr/Rg}3sz:͂M$~rδ#WWS _OSճeThs6bS)x}֒>^}~>1Zm@OѾ߷/֋4_}wu^9 :/obcrYmqX<.<=>6oټŜwbv圮="{rG)qb ɔj~h/ۗ߾ȳv7E#|l1nn^>]]?ٳg__q#~ p"U« Gt-Znk^\wMqXl_ꡄM,riĎYuwK4d1[NOyJw'4}˕ʳBE"(#L-Pu?8+@FT_Xjy ~~v}e\5ݳ3}D_!;cs_;;͉__B۸e 6y5yG4j?CWl5}H@ԏ@T>ŲT$h`rkp& ]e9%BɔB/$`?/&G?ف.q^"(7|lW]pZ> ٵ9M4uƘi|!4 ͵0?VTͬQkh; ~vhF##{9b"*MA+k@oh֪&.@Ʉ7ҳځg ڷemo6p5},5⋬&߱lD åb-dU-l(6f#pWְ-D`ח 3g 7@fS{(A6j 9BF[2YP,@k:оb {DsUˎV% a`DMgbg:e )tMQTSsrjQM1R-un9c=I"5Pzǎay]."d2߹YO0,])cR VLF6 z\$T$2rB5H^О[MP˂abaВXH(r&/< zg[;)c /%xnd lcS%7vaB[U"?X]<42W>fZ8W%fS-MuJ&dS20@?)U*EՄkTYkbC㯮!Ưj5:`#%Cj(ڳ& .'m [0EN-Iz0:))P/o]YBL 8mwÓd g6C~WUc]ʠLl~&f6|$z6]FcڰP%.:aj`f =g-pҰٷEX晉n&gf;4_?pfl3/yvhBs͖!=űB9 Uhn SJY _3=.TeI 8x"٠Y@鋲Wж<~٫\mlx>8}k;(eC3P Zba cHPSv S-dq<F+9'kicPFBVB.ͨ"X2jS ΫgѬg6e52&3QC͔LͶFOG6X}j(VʻW8==F[6tZ`kAdK9d t\HO<_i3vXzdaiEb]l@P y,[ ml,e8 +Y>kGKO5%j,-h@s^?.Zf;,MsNmHJalc:L1a/ cVDJe?9u &akcmL 'g^)'D{G5GɥUE+ њSQ/Gՠu@>% dZV kjZ`NWfւBj tW*Z ZʬjZPՠ-_uhuQk5h-dKii҈)uxP-lo55,jĄ8xHFb6 M qlT1B~T3dՆgUf5&m) /0X#xӠd[h1֢1gC\k,AS̄"D`7Fkr@# 00 J9] ZFTjv- c 3%"CM a` 0dtk-L}0f5OFc8[haj6 :7 1O2 c&4H3Ao׈$BmC"}I]ְ&P1NzM$WĘ< UBEDlnP&4CD/cȜ%VX&CZCi 4ZFx=CґApd ; Ck()@A:Y Pt @ĘCD+1syҲ*Z?!kHmiDS˧U@2m X#xKH Ie(SpvbB )yȃ sn=ض+L=0]S"LQΰ "A[c16Af= D3~&iJ-mco41LZgd;rnfaVf(ba-o%liշLzX!Z?" WYAe6-fRW4˳@D&#".VZeWAh1l_m_=V&chKqQ>`G51iXPW.WafhXܾ չzlZ<>T;&\ԎynV81DIӬrlo͟|kv>GvtӅKVW֢ץOF뎅muH-*E7Bֈۂdӭՠnȧh ւֲZAZ&ϐ-FC!3Rt;NA4P-w)"+KRӂ/q_h{}_6z__6:K+[ MgAS6 XSo{m=qVusX ZKji)q,q]Z Z;a>=ƒhï _&v ߕ&j)۸"M\ Zwg~@qw`a )5t7g{g?ov.o?{rq}_u|~c?;]蒨2HJ6h'O]"6sp^7/\Hco6?vӳPa"fٸ^ig} 34yk'S4<ӛػ͛96&}_y \L]M7ϭ}Yf;90tr#j[PԖYQ<9_6?c< c8-w j~ˣ'X@J[( }Anw~R 9es?Rж?O<'k?d7 .N1//K_=}OV)>T|C}Rpw8HtSͩ~7/7mT-Wp;8%fͺ_lZGjwG?|۫JڕoWϞ]={NT"B oxҡ嬅Q,C #XZe$Qh): .U<|OQܔeQ/N<*kQ]s_P-tsoq6>[ :pu]!zƪht򾩶B2 VEl+1kjZʖ_dk%h-2ѧUQk-h-U%'隨Ȗ5} cS WۂdVO z7#ЪsihUQk-hpQ܈xkEZu&ڟs$ ^:ɯE1FjZVtc{x^ Z&_jZ6Fc{ĵu@u^ Zcwد%[u߸-;׫Akz"{!&.꽣uE]z5h-U׫A]Ⱥnv"ΗމJ~o1V6e{T BeD[GvУzG~,&Y@6f6`/"Cv}Uޕx4MNZYb>&PeRo|$j}ė{P`{ !r|Yfn- ojG%W'-*R\oCD؍KT: :GC?Jp l+%TӇ ,8 ٲ%8Tu!R B 艗4R:blr a&l#oIZ~3nHZfI ~F|6 B W*-;jՀԡT!1#kE dϨ1-?Z&iy{s[q^!Dm݆ngth@ngJPT^2Fա҆E#SRvh̴GޣQ Rr~0m\",> aB#QwLu \!)5{+*8)nGP*jpZeƦ}>lufVoYtcI4',jעke3tl0:Ѡ`wE"^eӜzv 7Ptuh BE]j+7hk[$۵Nyc}ol*#thjʽŦm^-M2$ pӡ_+%F yF ڡ4@P w[Yd[ #m;"t,h1D%i; ܶBde EC0B&3imNbG U<5n,qb_/hR?Grp.|,bM/\l/03>h"[Rۼhy_?|ˬbgVWuf830bwVDFF XGȍAҫLix&٪P,ZPT=T̐Xg|fK7q΢OC?$h*( <C}21Q`w 6gXfr#2<6\נc)zAlÙAfUդUfá`H ?ŋt*k6뤶nںk+J6).ҺX*nҺIK&/.Һ]WZWuuRZ'i;-Һ\,봴.֗pGE'S''&O1yjb̯i|fxf扵6O,<<=Y=^kdfؒsᓩSˆOJOp"^i]t+Rjux)Kq9 z~KQEb, mB8s!8ؙ%+2+N$gyXq<ϲ<0dxPgnyh K4&g~]VrVn)cIy"!f0neL]&(cUs1G#uuj_b!xaw6h}fDK\gMđ2@NE?7tWĦ8?p3hWp'hSp1uHqBTDD `1x@\͓]xrU ?GG#H,!b<]m,Er9Jxk1UL4EL1a4VrR&fC$#?p_1Qe:Q2p͆2e}2e}6e|x(GQba>Jr ]=d ElHe@<R4O ɪa dHf@qtH@24 rN:|"vMbCB ڟszV0]z@R@><,6>ǕĎN:c:uIb!KMB..Er:V4ɏ6M)P#E|9"hr-{\!Fs!hi8!;0"qDgxiGCH.2 zߓju9ܜs_9G^!%{dz5G(pͺ>P:ԁA mT36PA @e~>U>H+T@H`ܠ4m}_)TQZŦz*?+-sJPiAbsIi˔b =[GBFW҄"gRXPy&C *ONPy*O<"E'RT;)*/&<>ɵ<} `D)0Oy&<>\_)Ez6Ϧ4i*@(s6sqZs2='*ΉR:My<v7ǵq=۸$Ycñn2*@W6)/>'DaDsn>7„"sadݏ fӜAGft B2`+Gȼ&5l̞Yf5[<0C 9(f%DQ9hs(8P~9I+C`l1kCӟǘ'ФA91{0R`3d*P/|>D}0t|F#`"Kn"ܟԛ?L$*^/c|3]뉐%_y߄g(ڎp¯bh4V5nC| 7"Fc=8@1|E_X,Ά ݓ+(Z #Og|+Лh5PP]%DM#`xl+6]|;O"C-~$E(IU2^<TU:ED0K/tß[s"VMF7N .3le4g'ߞ̌<^w1EʥVOIZOntU=)z*lMtEq0X+Sakw8CISak"-#[~Bz*l-OR~mvA8aOX@F7-eز TؚQ1CTZQ # [RI?OW|+WDT&VhSaPZ@񁐞eK"eݛ4SQ[T2dp{'Jo BEmw%d MU;/t0!0"`9MsnrbO8M5oJ[E["}~V)584N@O5#Ow)OG=LTZ+B̿HY.GxY+C]`;o:U.T_VUtW( :QѸia9|4_,0q߯9Kv٩J*O?7T1jsl͙#g]>Z)iMUI&NR:.=l]원ď+g i/|`w$";0"Bv;fY0ܼFYTG-%9u\\t͐YڠTLā Ju;0z\E$ C.ؾQ q } !FoO%375>W۵!rrx V E&ĈnɍB9JG_Y͘X*N%dR啞VRڇ~ooy/%Cmom){Ni՘w7 ]V -w|v ޣӢU;}(q.6 P]TBJ7U" ZbiwWݦoɹHO. (Mc28*Hh> ŝL˦,&.᤼7zé|~J ^3br%dNf+.PVf^ov5 [܊i`{>9)F4d|ё>d>6D ݥ/LpHř_|†z5^uiX{w(N7^- <7¹)߇V|UܭfVPv 3(ڭ8|8<\ݦǫ3\V㕷b>Ee)+hI{&a8> (cB=g)D5sD&iL@t򬦴$[!BNK[.͚A=fPbs@FM ]V دooLO(51>`E~Q2l2(z¢*0w;ePp)%*t2Y 7ݺq1ԼNL'ba ;0t:6cwW"qVkbz1uQ[ [i FG':xh(Y:<\ky JHM$v__WL^OzUC8-]|QZf @#׮Qh8af5U;{,(n*hz5frܺ|}uDŽ|%YuHQgl?>~ܽ,:8~f,bs sy+s?F)Xz }.p쐁Xmo^at녳k`Pk;&xv8j LI6=1&K@t0c+s0Hf΃rfhs.]Em$&-BM#W7e4Fܐ,4W̐=KaNbOyFm$gG٭38V6z]>PÒҬ` BF.5(c| 6XןިԊ{T1XB0{W\FAбzŬʮeP@h&gA57z ـ@4G?E)G 隺CF *%/qrT $f4EYK>%j ,42;xjLtjSiu"0k1vqÚK:^A  9{$Pi'McGY-k6ES"|֥vWZv&}la6Wo^rJI+xdLtL fv(=/߶2n;M|>40m\E؉T|6";} _`bhr( tj",%Q J Z&: ~q" 9`67˚ƭTv칕~;{ D3 tiz2V ~K&pH`B4рo@鳝tS"s10jޡ︓ }_Eua{dB۝UE5\Z8gVdu `tU1qq/Y! 0Xݾݗ-Q黪1+ 鄉c2ӯ D1~@sJHf$^k7g$djW+kr2?3*=$b#!5ɣ\BKrL+F<Њ==b)=fcLbm؅z J{Gepf ;M8*")bڡOI[t "^w5Aw,ޘ)AwU֚(¦9,!4u4ȉFk;]S)DފY /0ebdb4 ٫OcH. -wdJ^_%yp^\m߿޼-륀o9xikkO1E k{_Lmt:__=,9Zyʤ[q+,76J 4jHmy˞*_3/>+7d!SBWq`8*kfm&K\a D,Y^C302Zi4 ZdtʐQ^m͗5LXAE\5zm/73(UFvnE~͝rXT.b"ΙYbzyHw1̀Pax% L 0"Y]=.I*`e`3x}3870MnN"Vŝ/)}s5Aa1G#< %~(\Œw (bnvZNPYhݞۦ jl:2Ma (<G]&QA.6nbG" t4YŶ<<EH9R;Q~BZDA[HkLi ;ywY `MLۋDBߞ1Y_,k1%3y~nbW)G('i%l7!)0UFCm+rKv Kv3uЫb.V+X2 K.ʨqgI+xpip-yQZ7=jBVY]V 4/I(,Ėn0/Vx ̀WWTɺDto775`?RY)P&*3IDcxqƶDM&jHܜԄ &[n3nԄ#Hw+pT_CǍ8?nwMGXg2,OeѮB"wvNjF^ S+kڷS1n*BLdJ\jf ItZ)fjNU,ÒVLRjHuB̑,I^f~< 5᧺"@ɕ4܅@dђ fʈjGmw?ɇ e8@<,> A*^hXxoߡT@dG҂ da@\Q2ERxOď7}xh&ޖKb}`Aϡ)v)Y~攞N튭,B+ M>Yb@0e[b%tSå0$ fZYFiHMbBdU)Vv_)zADeG^{x$l mYb N:(<,QTMB6/u a/ ~WPPj;%Tg-߹#mGAdlǮ߿/_|oWt~?|?|Ԥ1;ȩIrpN(Qex,l(}Vr2uxs>m7W%|DD!Κmjs}gH(]TړJI9+MEpoY@6k;q+Wȴ).٤5\I{5Psf(Ƭa4͈ @ތiX5 ;Y9_^Kn]0KWqBW ;YE^@Qй." K*(oK*G&Y_I.9t|Eh]e+qI:zP~Xwͮ(ej ZNMWM )uͲ/QДOٮGuw;*UZ%ڹ!KQS(&Uc< b)̒$ŋVg 0D+'*#. jp QgL~D[0ChMTx=S8W뀹S4ͦS` Ȍh"c HoSRP狒Y ̸* ɯX$tNzm|+X-4~ tj=ĔQ.Wm|iK5~ vŪVuLGĀc9>tva=Pr0buw ŵPbxJofR.mTG#ԂAiԒ,|DZb@>+Mn]rJ20ܘeN6$]E#?ڲ]4]Zvvd8,ہ^zM篟{8.ʇo$o!w1Xm9ܼ@Jb|Ħ@f"s0 0UUG #vSH t?omAqL'I#ilF(HtYei|vS|쀓8\"?!}5C\!e+t.E+Lƾ%`y&dMKlἸE6"A97}y\Nt6t {Цy#~##sr8I+Ë |^^)>bEyD΂d,E9&r@[}acJʰ2PmVb̳Ǝ11:^xf__{f9##hѮHxVJ a|h+}KD-Lw 99l8vufRw&3cot’1fPqH8ceT'i@c4g 2AL};7FK򙔢IoD1Ϙh/C2Yځd]_Hz͙~x9L޷#F8j 2nDS~{w4 ϭF=֌٫mV B.p* 9 9j$24nN[}.;=~eOUpf%_}#H-[?ݩDcXkY; r~>֛' s*<40c*Kd#V%f)|[-X;zrSeef%#f-;љJy+q3vkV'Ļ9 Jt21F>ts[RӃ?;3 /Bk'7xi> ^`MIO^D?4[V򍓝~<5bc6~eS!d5 4{V<"8i?n(u4rNc@]/ݼ>?`8Âֶ(<qw0RԷ?& Q#ZZrwMg,ln]F۬O XzLp tfsʊO˽(lG1ei8]]XtYqpg+u[(ClL|0,DZ>NQ)ɤg|.&asyȯXh7PgidoQmp% |R-Ytf@.J=!r$8|҅l=~rṣ)O0skE*"C::fA=[3_my !@G#qv]oTd{ H79&i TxTGd1(|&N@`9?+He9$R@^o>6?H\* m,d+t ݒv$pKZxuZ?d}  gWm¿ibm8vfV[z=͙o[͊$g{&ť]ʄ2[ǫcgN5o0nc B:1{.!!FO_a\[_xKvbi3W/zFđo {kL-{b=2{`lw4#]nzLt1v16+wjxxwP Ke = Yc.~+%6y_^'}6<q,d1K ;$6Y$ W (\H:?.\G Ǥ5G&͓pӅn*5DZV lg ް1YYaf\[w.:EFKtSǍs%gfq;rX2&  xÔKYxUovPK&w뀱_i0#m'KS6@Z8"#ɉ.ܛK.RΙůȆlz;S=n=jf.x')7W{FoI%G(Ny;=oD 0fQ endstream endobj 3 0 obj << /Properties << /MC20 4 0 R /MC32 266 0 R /MC34 268 0 R /MC24 6 0 R /MC28 8 0 R /MC35 270 0 R /MC23 10 0 R /MC37 272 0 R /MC27 12 0 R /MC38 274 0 R /MC31 276 0 R /MC19 14 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F11 574 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4 0 obj << /Metadata 5 0 R >> endobj 5 0 obj << /Length 13652 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:46:06+05:30 2019-06-12T07:46:06+05:30 2019-06-12T07:46:06+05:30 Adobe Illustrator CS4 256 52 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgANAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXMyqpZiAoFSTsA BiqQ3PnHTB8Onq+pydOVvT0R7mdiIzQ9QhZh4Yqx2aT8wde0e8eC5h05Zb5xZXFkrPLb21vEyPy5 snru1ynFfgAp8XE7LirN9LuLi5021uLmFre4lhR5rdjVo3ZQWQmi/ZO3QfLFUTirsVdirELXzZql hrer2mvrEdNhuwthf2qOBFA8McirdISx2Mn94vw9S3EDFWWxSxyxpLE4kikAZHUgqykVBBHUHFUj 80eTtM8yvYjUQGtrNpmaLgpaQTQtCyc2BKKVc140atCCKYqjtU17TNMKpcy1uHFYrWMGSZx0qsa1 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 XYq7FX//2Q== application/postscript xmp.did:0180117407206811B9A5DF90B846B4EA xmp.iid:0180117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0180117407206811B9A5DF90B846B4EA 2019-06-12T07:46:06+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 6 0 obj << /Metadata 7 0 R >> endobj 7 0 obj << /Length 15473 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:50:43+05:30 2019-06-12T07:50:43+05:30 2019-06-12T07:50:43+05:30 Adobe Illustrator CS4 256 80 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYqxLzp5SfzDqm jA29vJbWjzXFzNeRC6h2iaFIfQZ0qZDcGTkO8Y5dgVWRaPpkOl6VZ6bC8ksNlDHbxyTNzkZY1Cgu 3cmm+KovFXYq7FXYq7FXYq7FXYq7FXYqkXneLV5fLdwNJt3vLxHgk+oxukbXMSTI01v6kjRqoljD KST0PfpiqX/lxYSW2nX9zJpf6EbUboXJ0lUVIrc/V4oiiBeINTHydgoBYmnIDkVWW4q7FXYq7FXY q7FXYq7FXYq7FVO5hSe2lhkDNHKjI6oxRiGFCAwKkH3BGKsB/L3yXqfl7V5Z7rT7aI3VspNzaenC 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 c+tcVZ5StaLQL71xVm+KuxV2Kv8A/9k= application/postscript xmp.did:0280117407206811B9A5DF90B846B4EA xmp.iid:0280117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0180117407206811B9A5DF90B846B4EA xmp.did:0180117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0180117407206811B9A5DF90B846B4EA 2019-06-12T07:46:06+05:30 Adobe Illustrator CS4 / saved xmp.iid:0280117407206811B9A5DF90B846B4EA 2019-06-12T07:50:43+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 8 0 obj << /Metadata 9 0 R >> endobj 9 0 obj << /Length 18398 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:53:50+05:30 2019-06-12T07:53:50+05:30 2019-06-12T07:53:50+05:30 Adobe Illustrator CS4 256 84 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAVAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9D+efLM/mHRxaQNCZEZj 6F0C1vIskbQuHUBt1SQtGSrBXAPE4qlV55c82QWdtfRatdJeQQ/Urm1tpleJbX6z6guIUkt5Vku4 4VC/HEQ45LSpDYqndjFqd5bwahY600tndlbmJbi2j/uJEqsYCiB16g1bfFV3p+dIof7/AE28nWED +5ntFaf1BU/3l2UT0qinxHl3psFWrvWNasIp7rULK0i0+3aR5btb2ipbRpy9aX1ooEQ1B5LzIA35 eCqyDzTPLardfoa8eB4FnSa3a1uUYtJ6fpIYZ3ZmCnmTx48ejE7YqiT5m05JzDLFdwsJpLcPJZ3I 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 application/postscript xmp.did:0380117407206811B9A5DF90B846B4EA xmp.iid:0380117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0380117407206811B9A5DF90B846B4EA 2019-06-12T07:53:50+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 10 0 obj << /Title (gr2.eps) /Author (user) /Metadata 11 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 11 0 obj << /Length 449 /Filter /FlateDecode >> stream hn0{ibȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7dS}`-?yR|vJ8J*K Bo߽C0}/e E'$g1 $NނGAFg(0_55zw])mۢ6Fp$ &[r }5:ys%,7eJ@g[ݸ x$#n(BJ(gqB<9r#&7\p ˼¤_OYPwt?K%S vA!X#w&B/595ÏVu4BY4}ȼޚj-?HXgz7 > endobj 13 0 obj << /Length 449 /Filter /FlateDecode >> stream hn0{ibȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7dS}`-?yR|vJ8J*K Bo߽C0}/e E'$g1 $NނGAFg(0_55zw])mۢ6Fp$ &[r }5:ys%,7eJ@g[ݸ x$#n(BJ(gqB<9r#&7\p ˼¤_OYPwt?K%S vA!X#w&F/595ÏVu4BY4}ȼޚj-?HXgz7 > endobj 15 0 obj << /Length 449 /Filter /FlateDecode >> stream hn0{ibcȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7^[~*hWՕp tTvd {5`0q ^Xk#)ňIQHB&8:HLs|wwwmi$IF8ooʱ.Pϕܔ+mu2WO1r )*<9r#&7\p ˼¤_OYPwt?K%S vA!X#w QۗGG:V ,z q]վޚj-?HXgz70ſm_Y d,@Y-[?"`t endstream endobj 16 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0001) /Rect [ 50.793 300.162 73.908 311.144 ] /Border [ 0 0 0 ] /H /I >> endobj 17 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0001) /Rect [ 230.838 289.695 253.656 300.686 ] /Border [ 0 0 0 ] /H /I >> endobj 18 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0002) /Rect [ 86.415 268.779 98.811 279.77 ] /Border [ 0 0 0 ] /H /I >> endobj 19 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0001) /Rect [ 204.702 226.938 226.944 237.92 ] /Border [ 0 0 0 ] /H /I >> endobj 20 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0001) /Rect [ 79.827 153.705 102.06 164.697 ] /Border [ 0 0 0 ] /H /I >> endobj 21 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0002) /Rect [ 93.75 111.864 116.55 122.855 ] /Border [ 0 0 0 ] /H /I >> endobj 22 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0012) /Rect [ 266.919 59.565 283.518 70.547 ] /Border [ 0 0 0 ] /H /I >> endobj 23 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 508.74 245.658 521.136 256.649 ] /Border [ 0 0 0 ] /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0003) /Rect [ 371.904 214.275 395.127 225.267 ] /Border [ 0 0 0 ] /H /I >> endobj 25 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0004) /Rect [ 485.655 141.051 507.879 152.042 ] /Border [ 0 0 0 ] /H /I >> endobj 26 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0013) /Rect [ 481.596 78.285 498.105 89.276 ] /Border [ 0 0 0 ] /H /I >> endobj 27 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0003) /Rect [ 515.229 57.36 537.507 68.351 ] /Border [ 0 0 0 ] /H /I >> endobj 28 0 obj << /Type /Page /Contents 29 0 R /Resources 30 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 635 0 R 634 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 3 /Annots [ 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 29 0 obj << /Length 34763 /Filter /FlateDecode >> stream h{ےǑ;֪TŌ{ĚLf+RҌfe63ÚzMRhF䖉BWf%~TJzJ3{Tv팜rG?Z_j5wg_wW/_^ϯ|Xc>[DNdWfL}14 ճF^իճXvdd?|1aZ8}BDᔴ]mh 8 ]V@i+f H3rphz+A*c,"am`F7+~Rp^.[i{ӹD^8ĉ;/ ~4 373TXAkY dJbJms&HEN"&Rz}5*Iy禰HLRPƶVur(_J>J, n:s3;#K|6XPVNJ9J,Z2bC} 84@=%dJ&=A iGiOP[دRb@ݎ"SX P&GD)G yms=%%Õm5Io6UCd#' -6e. od$LmE)&ԖZE'q#K2,_  ¤^um+N7TrPې}*RVp LrW*0Tɾr:KV7j+| ,y 0 gi–DjۋbFuݢ+'2a(2pצ >†R +X{4' ~t"ͬA6gSPMgYHWu'TA X,҄za `M,;@xk B* l!jcŅ C[mRUR%|e5Lr9(yC,d(ݠ\%7r3(}*P%ѿkS :Y3Sxcn E " e3@DZ@0BۂШ̂8Q24~T‚JNeи*K:)؄)ZnsAΝ՟LœpC1(WFe4N5uhF5%Y4q16[d=5}LO5E*@lEh[kljR; 7ئv b4PZR)6K ̖CsĦ99|CnL\^9}wpپmC Jo6DeNCfV$xnS(LΘ8%^JB,86&OJ"R]]՜2mqlY2?I&Lo ohbU$ֶțR07H>̚{@;wc {scrskkWqxYspf Ϗν8=F<&S-Kp<ʣ[%x|9{0{VÏK h|4|:w?6B|"KDؼ] 'G束|w);Ƕ><[aoJfg̫|r;i]OwɜȻwyz"+Dȼkvhyw6?mm+|x"mm+|z"—mϏm+DlE0'ڊ`VDlE/3ˉLD+ճ6( Qd{kQ{TeS}khld9ϲ5);#|-vwu@v^^:j@޹djz6=Ѐ*Q]O~VvR=EW/=~K;^y[q5[spǭa;íἸ5l5l>rĵawaa%ygI{V^vc+:zAk?MHK7B {Ak35)zk}>-vc3kl3wqv[J3 tbH^R鬷^aY|kxNnlF ge?+S4tF(L8ջ^o#٩ N*z7PtDr:y%Z; ko,z?f*^%!I*͕LA7MRvW4,C2{r8\W,4F|b iG`>~0sJ%%{Кxk2T^X*I۪#1GzeHJ17]F:^+͛%} g: g(;`1~b20bEGu]ڭOVo` X%CvyȭanJclr-EkGg#UAvJrrl`iWE4/IguT:rvx:S1a= cLtP83MRMw5<Ҋ VTdn5{ 0Jx H[[nOQ,Ta}PvDZkg5L6[}9: TOM1J<( WuI|F+jyj#FfC 0_(-^tin({I #u9D-{G.& J)R*+jB% DW*4,UQ Be"DI{ida++dC`"D"δ%v'>BaDe+NdH*xɵ-jhQ<ыmr}:3] Fc:L4@2+rvSC8oLPn/taR Ҭj ;E5P@OlQT%r&]K\k5_ q#"C$^5mS&鶎]*YCm{h.!# 6>y̿!C { <.bp27\1cA_@f;KTZD@>LVܖ_I+'W~Q~H1O86[^J*ǧcS2NA-|hV"5E#5s éL6*RT2^53lD \b<1f-\P탉TW$U%0ñhDth|maJi?J4 1Yh#N5DֶY͡R KlmJmxB"ᨡr8Uræh*FFe[QQtV Paѫ!#Gjp$C 8-攔Pm\Q+؆SXIe*  3%LVFhnFi1mj_˷`WM C>vd&Odt4teəArkP&f-hMC[$'wKa˾:Y\-. SjCwCҥtau]vM !¸n[-lƃ 6ܶ QRy!rP"X47eҮ򫿬)i$v@1Cm ^^{j`߈ وN$+~GIb8_L-lȸALA%~ }*e:/D?,DR] d-Pl'1* B1h) ҀtxO]݁otG'rߩ)uģg ""Qb̈K`uvxmB lC6`55PvDCh>y2ET~\L4Tk<.60L=BLJ(Pqm%m24աƾ~f34ss'㨘 IXBۃMX(hR_gY GIŬ{OvŸP_lj$i=[!c)il%&Ny2$9F/m#_^ײLOBp4J5!Oj"2èt?1f,Vwv-?^ |5{Ҽ;8Ȍ@^i[ڀw6FW<&Luj7ŴgVW߈_SuIapC62Q2 ~ Wwr03lX05yQЫJroCaehiu8z6:IZlW6> KI3.QSb:Ckk~TJL0zu:KEoh8zoS^y:.NIZ[ĥ?aUYMW^f&P[ ߣ]X "=kZ&8!Z7;M"ѱ%N%>@z0kE}TñR;WW,/*_7glLb4V3@dS_ԊnԁHm}iRڗ8~zr'Rڞ3w>8o4꬀'H jޯ"/T8׊ hQS&8A5 Zdr RFk_$9&ѣVK @#8!2<ݪǚq)x1ϒİ MS³bY U2c |feZ l.!iDdZ4QX:c5(-#;gЍO8-#i:Dd" VVoVΖ'm:[|^|DLCMT pSQ`#5@n(HEQ||Iw Cehf*iH@*42#^{VD5k$bFO!Y J@ WsgH >tb^ "e<I,4kmC:di 6NR1XX+rYF!R+j N)lB*!WgTXWԡU3J;b+tFUh5ĂRGaV(E¨\lPq4\p+Tc2ِrbBn#"}A.ZRY+ǘg[i~l\`/JRh+TR_.3PS]Y`!Kiqr} X^aLbaB x'ء.3?1@y҆ʐM-CXBkgH-u* 36CN4HG#FgnmEi;FKh:P8Ѡzc dpMrk06wU4l`l\O_A7^pb*}نȤ)o9wߠxSNֱ1G1iF 0VRq\Y,HnYM5C9Ȏ:Sv4f8o{ <ۦvꖈ8kfHQl2A̠btA7XWoALrDK$NpArx}axLb4:ƅkx؃d{ xO>stwszB+cB;zK{}rs:Zvlg'D(qv|8?GXt98X abl=sH7PY7Q+/UIBfZ[ (`\ CB'N!hD33vC~6SSY ` HM~&4Sr0{a C7` @.L~LW2R݉g_) 5:r:w` @ opQ3n6e6FSaLA[I5j pe1)=)fS6Ӳ4`h \4M ?w=n? ƀvc@r4|1 9׍d8,z71 ٍl0<2-q7kۍ|K͸RTy7$10Nzcr1 ƀ32X dĐiLJ=38fgf @tcm%y6Fc-$SDi7KeW /;+oR+)5)>.)n?UR|DR<-'}3&Iq/)^>ER<w/|iKC* >(%|C_>P?/ >+ܢύ|e+ 4V𥱂/,+X >sV𥱂 |e+C_9XZߏ]pإʽ|jwO>j1eǭ :Vѭ9j8nǭpn2tnuj(WW_mG:WXCu#^7J&w"v0 Ȇ[5c6&pԆgԅ MW7A-Ĉݾ =;Wt OkFpxZ (xm7$ob91<S鐎y52<`kq2iYQg"WfpG6xGx1la^ g@`Fffp;C:`h$ OTx_>R1 Ͱ?cQ\DͰ[^{>k,۷\1>}µ۟g?|[7D}q릜?[7G\9ewu6=t-.=eM/ےt9rN-tˣ[{Vmxi2bpisiDV(zu$Ðx, inԏ< ]wҳNYF4C0j HvOu!<.26T2e8ĝMլ3If$fZ峧n`*␼v3at7B Qhx̴݀M~enJ(ݘPFsT=H5*$`ګs`)j`/sgaxՇ|/3ڣ0(?LtT;0CwCwlayxb0<J[xb QTh.@;ĴSN(@t' E?ݻѝPX1ޣ< D*wW 2acoxLd~}x}xr6< O8Ȍ'dڃW~idv NE2<8t2|2sd(ywwa:0t8:m1epa>Lt8Xu9ӇoT{T[XuhU0Vڱ-XuUuhU^UvQuho:|C(:C,:WthEy,:tcѡ/0,Na\0Ey,:car_ëoVZ_ڬ~xϟ}GٌDkӋF(Į7?^}gD󯞭W{}!>?|[}~/QJw&>]T|_s?^-簷Lctb7?0~[W\o,{mW{~qÅ][{ˎŚx_ź!T%5av/o~@\o_E/.6ft#ցRy  ~~WnrQ"L;.PN7w5_=XtA;魰 Sxk( x)*jo_ M.UGw۴BYɈ+2 s~Y\9@w^ag^b@׋7/wT>6 b#v -x}9II,QvTAAqqy6u>_]w7hU u~'őpC_$M.<=^n ]~ o-L8@eN~@qLo]eYF| R>jkD .*lۋdOŝgin{dx8/\ӲR,]PS/woAiګn#fȻ"ya7Ö| (jҮO,rj%?oܱ3^{we13Y]/@ 0A;@bJ`BG ~ag#`4][gp'lQ~DiXܪ!uѽ|ꜿ}~㋗qfl,(f-c"=:pvVow pњO^l7hZO=[f"L8:=(݉H˫w!fWbrhkZWhlxl1GCRxd7C*m-t4o~R-K&X*Z6!^߁sN{]>p,m%c=]~J-Ň=jye;δ}>zbUG~^^7^]Azt4NpS5W{TN\=!̜i8n893~a"vb?j;_m9wӺ=!S)xڍM;ƘxGG[ {U^nDI˱2犞gU$NGdMM8.@RG}q\ȸ&[j8B^ . ?~ww5 ʮV&qc۳9Rr7|~H^lr\s|)?˫_՛+y,g ȫ5F>9]!O,1}OSPDp-= Fv?wnJ8 LD'Lfgorsĩ1>>ib%Uv1^;ASQy@hUg5j'A 6ߙ&q#yaRW,Uk=іᬛ)1FKZYTB 1^eT<< Z;ϵ6`nҀ?ǍZ]bIӮZurqvb%=b2/>&ݬ2 {תU~ao_eRȭ#>֊ IFٮQ%kq-m4p -oGǓu 0ia R{1kVXp" J v3ϴb\r蟙bU=Oe >F+m!jqݕVzÊvMcL.-ߴc_2qoš/R\u5Qn8*7F3[E0곌@`XLZ7N6FK*JHz3l*}ݳh]6جNf1f"b >u˦ ^uXTQݓnzpj|qk/KukA[1بq;ڸRGEw!+ۻ+]U7OQAFe}A9v:jmtR&ңHRmwqCPJ%[-q lnhLg݃tRd|ׂ,]oOۢw->WzNW?[5 d~N>art;Btk1lhhhhhdh14fG14zиqC3V& 9geθBCc+ŽXO.ikA[[:ik\[۝okA[&mmڡ=jփmm;hk۲IfmӶL2^}zBGc`4϶챍gm<{hCO&m<9hѰ'6_3gxzIśc#O<<4}&"eRq/].\e C Y0EqbqK֥5^ Y3xO.\l] Y3v\` ֧&k&޺R?BYKE֥5VLn]Y)Vȭ!k-Cĭ 9wu|v.b„<|z#-=L0ŭ!k-i[^pRȚz}\w dPua*ls>ItݛOL\ Y{ɚˏEqRȚˏ/[C8n_8ˏm d>F"e-ŗC=\cWT6ڵ?|7wݏc0g! (ū//_w򻯾J+,I,Ej޲9[FJ E߬j{D_~SQ0/VW]bR|oy`zaъdf(>TOəM#շ}"7PA Tw;`7'*u 'Bn=DUBEoY<45*=aƨ@)5@[Z#X}}`|V*y۩R5ft &թ6wte~}Ԁ78죗*jv{ Rkcw].v`C'V5VmV6iY?'+_ oukvsn?bvƕjqR dBaMgǞiMqZ_Vց\~u}^b9bL IZ#!xq} ?X^쑦xy7会Pª;ɛmKߔs`RZL_'7(CpNבܼ>@wt}kSiw62*[şzvQ1g?Uɿӝ-̧ ~ɻZדAL~B y5|}{T$.}zFe }݌^3IM|!mfT-cm}RUBp=22[UOCo- Ny|Y8Ņ vlY釀os8:vt@m rS "sVnpL c9RuJΜfe>6Ί*'$y1: Sb{RX M\Z26|z$FeX3W(p.v%f655I‚#*DMLUB&٘ZLT  U@vOb7ŎArpEQP#9Qu$ՙv3~y)!d@=kHtޓOv,8?>~!7,YBRGHu5$Q^ Q3&c}GJds?8UwDvelI}A!@KY2#-,+gzoP!3fh0T2(8t}I1b]BbE'ZL ј'!l>cʰl9I;O?f}'[ЀnzGߧŌƹbk&wQAa,8Za?5{+i׿wln_c/JX?VnnY0K|A|"#ݔx̣Sg`"mal7@YV+|DSn3rڌ\ǧy;c<0mqF9mu"=&_7p05K,) QhVًI2_Vv|Y匴Ĕfsxv!̰xDiv>[F|eڞKɅuVU [Ry'48E-$U }CpU mň: ywFԹҶ:ce>KI%0Xd7 -@m! zF8԰ϻ γ _j3d((?_ՁP{ש8'P3z$RU=`,*4/,B&(G![ft1<eЌISQ*Gh@MŽ;qiHmUHZ򺄮2G<_WJ@NAO^ -$ΆPF<6U-cT9GAv^Ϥ!Dz} /+ z Dʩ3K5뼄n,ք8 RU.¸,"!{HBYEg_aeMmN]) I$VU#G|Ėg,5~&NfL-d3o-VlQwtOt\Wj|E}qRXcXp|;r`l:&`P|.J0V7?(jWOQGT>?-' ?>X2'Ǭ|C˩M/ &~v`%9c[?W78qFNXW$VR#;LbOjɼ)H ZFͥg5bR.>Y.1#dAq8Dq>rV2GTqK[و?m+*ַNQbxd9 ߻hK%MʮK0q^g[I*%U@֤Ln8xUTbQc6wa=t/[f;qɅw&,?G<{zh_K?8޻^تFatx"*!Xv$J- 9k>-BIT"͊8=ƍPTGs:)xp?7r2AeɀqZ"bAz*E*k~걼Y?6#m~ee+}oXBI˄J-.9 U fŒ+*kR1[sX`k{p܎-a(}k xQ!@^ܮYYml% Yf7F b0E~xv.85o66eUp؃OiȪb3O @Uk>Ϭ!F,B,/ctu6XVc }۾)Ǥ ԰{X{g.EyYǩ (po@qKCPtϤ٤ƱFgx҉R[3 s3\- 8L$U(!]v=JtFkcf+$3!|wcCdBIvDa-i"&s!?h;l/T L=b)rRDIʺ SIZDl;c̪_Γ'ɷž$QR 2rDWt& 9 LיLc F.c?FATXs{Jcvv&]laBiYltGuR)Uayb,Ũ6Eܩ.{A2|=p KȢDEI')'Kۓ3wo~ [ci ,?P^cVicJPuzi`-VGSLV1gvmc4ڃ+({A1;B{K(zT`s4bfuìu 3ɓxƷb6ڹWpڱnE:(3i~m^B%dw^')[߶6 u_Z{[K~fCzj7q-s\j;6D3X&5Z){ q9faGu|j/f&ߨT H=G"Ş} \6`kЦfC܆+5β/d!'3`E/8>q3xչz oKDLJGPz$١0ﵬpLVK<ΐ\cIuuZ.ڑc d WhY5gZS"' 0])94)Aވ!!e0gaϠwCl-6S+6r8+a\%if({l194;2s+k \/!/8I,j${UBJ<Iu_HSyMyRlbQ 1Z:]BYKfڴKt*&˥  8c}[H+wjM8 cD%[ <@1u'7[Z1q,. 9Τ}iNPW̤4Ԝ8Ny괧8WΏy'o(pX,D]FA Ozz?nf+-6[N{>[Bќxsr7űD>Sg~ď|ޢ(K͗I&ZOk}1CHE{!&ҳXCK҇;3'^59 ;K$8RRΪ|-c:,!BYvZ/klbb| UǶ/ X}NާzueXpN&@d#xM\'?`Y{bҥ @6"EmQ  BKc߼𢢎7Ƶk!u]Fha4_AH 8`|lPP y|-PV,dXJ\đ1 Sb2Qh];[f3e+^n&%ݘ/Ԝl; A7VkC9>c3̨廧쌄B>]ЈHO5VbNd01Ffј#*C (TkL rىo(`/ X=?ƝRt8*#3c5w;(4η]#D+LT sHӄ<ZB ;9}+Ҙz3#Ă)mp%2!Xv^ckX&@Cnۛܦ{K Q-5S.M;yM{P23kڱmEV  ͘Bv!T.]K*٫>(=)Jb u{܌|';Z1fco|<Y($$:"56ءb? [o8Pž fu 8??8B éZc&}ƸWތ%(A{*/llߕ,X!#o!L LΖ3 "g<"CULv54>^EA G#\ zm f!ڄ:d $7boewx>(zo{9,J#UFl )ŢaMd>N<<`;$S;, X=X=6&OMpo~ `!`g*xK[[%|.8U@f>#]_)|X2䫄/.Ia3dW"C, b6[!|ؓB:)@ ucȑS={EXg>\9ү>9u}|kL@^|FjW-|넏orYUJs5T B-n TZ>RB[yT)|2)LZZ Y'{A8Q>w8_qa8@Z091jaX]Ψ:-'u:Ng~}LB|2U ƏX$[5J&60h9}MQZd q*]5uzw7˹@w&_E/FOM㸆(JHeO8_ @N'{Y^DX;S+v,ff՝@;uS(Rֶqq=y\z/,P[w%1f%rz*k:6kzKjBee=Q02Ւ`C#S>Vt@NCw#Ξgҧ;-M*ǠC aj0Ʀl1}?*'j\Z*9e\'4|-P^i$)ZQ9)8N&rx E{P~ gwnW -!y(=;U[bY:Ue%qaF&UXmڦKz'@ 5lD(TWR>YLJqJLc澵vuӲ::ȍJLjY>m`اݩ e٧a.U%8R+q೘4G{R>HNo qp2u!D;j9GzdcܲӪ+c!`K*;"KhY}Jl>]DTy[)i|vEiZ2$16׍ U~ָ--eXBWx2JuEΓIғF K^ *r2HdCjtų賰Q35[!}AS_TF)1TƮZ!L1`z(^7[*ꉋ;n37٨?.LC@)}'OwU#[|^@u0oF{jJa2fM&n%$H \@c^(i s-ⅈFZHo\̹GlFCc\]ud#lf5Uԛ;KӺQ9~Ô2+A@SvĶ!QKϛS_w_ St?~Ջ/LWݗ}W_˂:#ڕj֎ظȵuH~( ^W6 bicΉ6 X])?0$ϔ2uљכa77ܴ^_U(|OjLCg{?yϡTjKE\hV?r^#~VwR޼ϲL“6AAc~tVaX#>֡ x7 2)n) k[w؆ʔ_n>*Æ"W9:Ej̀_Ҫ$P"\ǜpvU8L ZB$z;ᕪwoyq]߲Y??n P+iz_*LC2"KjrwF[{~݅ Ӌ;;wg9\p w {%S,IB) B747lLJ`P-AP)0uG}gis [0=*>k0?xc%bUiDI&rZXS0oٞIl"9Ba @vݍqba1+a8(*"%%Dgqt,>>3_s.θ8V'u=Vh2a`؋VX|g14l6ǔH1$-ڙb]޵"UO;Y:%xkM.Мm#|HI-`} LmYz7)h|5VjJ0Ǒ"yGA/xℜ]2'h%1Y?Iqq1H ipÞ(8æ~m.@`C&ef^?ڽǑ$90BG VMCvFh@=2Ud^X9{0Si ʥjq>cpN8J(oZDETV e.?ig"S#4Vuz5vv6B+m^?Pﶄ ]K>IR=ft`ܱX!rz싀j h07A'7QO>҄sPP![-MFLaAK_hbYXJJZ 8w\_`J4aRN]9HN_ 1Qk])k PtK6Մ/;TtL-riiIɩI4q1zX?-C슫x4QcJF ki2R#sR|iS$׎@֛ΞP79 ,A Ѭ- :޶H5/7yrFֶWMgd޳C{%Jbeί'oWKƄ cuH@7:ukծx[Í|`\`̘<aH%Eќ9~Gjdf`(9"@ZLUx?$ׯ( X;lgÅ◔vU0ְ)4ׯT7j<=.-a)^:X;D!!~{"IC%TL` ̋3BIxri LH 0LT' C.?.ZEOZph&cqXb!czӡTDzTݡ{~ˎ?#rp n,cLuZfNۮgr)R8[r 6~c#%S%9]TJĞpAo7g,rM$̮Y$T]KVC?9[}.7mHY>HcH%8D//qںGe&Ɂ;q4(PnH~!qղu\(cԹwZ>(urKADay#ϊ5|GXJy9rpScDšAdx0 ه*%(:lXJOqgBޞbRnq_7Ϝ̍d*|kW4/+.lA9jFIS1c 0wh_pDZPkrMS}`gyAw_.8Iӯ̏ow)X=9݇5n)iY;d5M$8wǩRFWd [[ݿ[9?rlgy<& ey+]FVNOi٣] !>Fa! 4x'Bg wS;nAY[-fm\0b0hs64zljۥmKt1{DrҨSuG兑gS/Zl0(ھbG/ͳoXC2*w a}޿{XCtc-,M Jzt{\9$&U)YʹkV=E8dyCu[DeǨ-7.JXvAz z:`m" v1FfX)6f;3X%4l,j?Ị01$L8qPWpyCdx.09Lw'Ȝն5XH?.""V^mc^dC+^T5`T#0"R*\S*2▰%](he~7^BǼ!Wmq2=9F3c!EI6nuQ|$RVE C7"bF;/[`U %Ȅu־WKvR#.R$G3We9ק]D8U;ZDRύ\Vo7㔝@ŧ#P!"Dg){f xBT3@]Naw;nqgZ_L-}qfʹ %, r8fYqNtl( owidoK(`ћN掅>#RE*DւV%zk9uɡ1ݳ?kft˺'?Q र7q;s\*pNP9Վ r\9BN㧚8! 9("O2]=hTT'G,4ay#pq] ( ?TrSptVtS4xs4nz) sU;Xy@9{ JY /{HS@3:q 3.XODQg*N僯uKzw?Ѹ* !r"sƕm40=|9+g1+6%Rqbϛ]b8QQ2j{ŇfiK3B.Tx޼1bLg#׽ 9r tk l/ѭ~~MX=N1gFj`OU@B:& %;:BW9& 'T5She= .GI&T !tǚ"ۅh?Uǘ~Z7hTF츴JatX3rO$sH4s<Xwgu"YSka{ bA90n¾# wIJ^4.:T$2lJpoUSc+drC}ZA"n9߶ *z*Nӓ*e|3p\zd0 24%,hy;w iS` HYؼV~0fn83t9cXô>)7#–F[5{S`HvcȄE䣒]u*_~N1* 9*Gb BgUA}vU;O&1KvޅEjQn5!J% PzВBt^g%f. q F1mO/0ͮ HveߨmT b;k/aC璙p:ZSs. |JӜںuznkRfY`)/E IX]WK.Pgr`3U^9.)+p m2[)udr,>V4U lZ%O G޿s _71ˇvvz=V&7B`^Ӻi9A/䮿ryuegNF9٨[ kHcoDx:1FM'.Ŕ=D尉 =/ԲGT- C@"p-F> C8%?N݁mF1b=zCgC]̉ʈhEd鹪ĠQOyϡB?`EMW'A=ifrmYm~ؿ!0H~9y:/gBH ^`KTz10e(IrC"lN1PtI3L7TFiʕeb.ʩDtʫ/qvqd Y;'t%jPD8+0A{Nx 'M)zsX!X4kq>xq ?fɒrЮ^=vrcT'9"bõ8u"t\8Z"Ί']߸סx&*̃۫;kqF(M~# "kD_ f4W6դ ihSNלaqX:Umaeˀg뱺'[^\Lƾg .iVX!ԋmqeD +DD#+ϖ.;I?`D^4ً+ʡqUByr~m.\dh EM PV*<٫o+y]e) TtDNfl̨߾篝Dx'M;Wo}j0v#,҃TXɩ>Y$[5(=5jk`lAj7Յ*gjQ,~ZVRZPOOm~\xALFSUT-B4Z 55+d)(i|kFP[s>Y7gT.疛K9ʉjǻ*f>$=ׯK6⤷TqqԍN\ou\bFFa9i"0(]<%HHŧ=sr(`H%Ht3|wq-Q=KY,ip!@/FQbW[U`O早L Ew5ZvޖђRI3 F\~uiKV<~;J\䈠{85&5mFmfc߀b_S+ajjk%;/6Ppk`?wo-Yf.C/@1Sn?2l{vo:C]%%l`Kp͵ AIͼ0`Q Q)G;1hS־V:bQoI4g&[vj0Z6>4ϽE85oz}q΄vA`Hmwѷrn,>}m`Q;CiaƜ}aD=VØVǟl*+?UP}}el/ObV1 ؝N(584FFCC 4|~@g#+v̠P ympP3|ǹqrZ< *b2ߴdwMC;5H:ʢ$j͏S7!1VCV.Y֚y?ͧZЎQj^+5lPT1ڮ^7K%N镭8l5 5ؙ=쏛]\DU4k6/ھԹ?yy6qT辦yW!<+X/]մSJPDq*'U_;")B?rfUkJ4d'4eG i"XoU yhk!62{\h٨C ^r?`Ɣw<jF&݈}xBךM}K F6"aH:o`:^itȯNjզCտwRMM"- i9?ps|e)üG,  ղR(;`"+rlNluEq6  p!>)tW4`\;WFTȹA}Z:4Ing椤Rھ>(Yʷ1]*x9h=oj1$Z'C[49a*.Qt7w?[I˖ endstream endobj 30 0 obj << /Properties << /MC49 31 0 R /MC44 33 0 R /MC45 35 0 R /MC48 37 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F11 574 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Metadata 32 0 R >> endobj 32 0 obj << /Length 15923 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:55+05:30 2019-06-12T07:55+05:30 2019-06-12T07:55+05:30 Adobe Illustrator CS4 256 68 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9M2HmHRb++ubCzu0lvLM kXNuKh14uYyaECoDqRUbVxVLPPWlXupaXbfVrVdSgtLkXd5pDMqC9jiik4W/J/3f9+Y3+P4Txoeu KoL8vBqdpb3GlXULLbwk3cMhgngRXv5pbqS3jMqqrR2/qrGnGhAFCopirMMVdirsVdirz/8AMby5 q2o3rSxWsd3b3dn+jLW5I9R9MluXcTXyxUYueBjC8PiDLv8ACSQqyzy3eanc6RHNqkH1a65yR8SG XkiSMkb8XJcc0Aajb74qq2Wv6Pe31xYWt0kl7aFhPb7q68W4saMBUBtqjbFUfirsVdXt3xV1e3fF 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 application/postscript xmp.did:0580117407206811B9A5DF90B846B4EA xmp.iid:0580117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0480117407206811B9A5DF90B846B4EA xmp.did:0480117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0380117407206811B9A5DF90B846B4EA 2019-06-12T07:53:50+05:30 Adobe Illustrator CS4 / saved xmp.iid:0480117407206811B9A5DF90B846B4EA 2019-06-12T07:54:09+05:30 Adobe Illustrator CS4 / saved xmp.iid:0580117407206811B9A5DF90B846B4EA 2019-06-12T07:55+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 33 0 obj << /Title (gr4.eps) /Author (user) /Metadata 34 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 34 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0@{ib$h=lT%8SC?4Hz` 3ciӶb|',؈m^&?YɺZ^5xt-BXB d;57uf'!hFA@|IixBcp.^9.wViP"؏,<󫴬Jap\ݞmTm ֲd ) QZ}y?k]?ڇ:Ƈ*~~7/:ͭ/ϤY*YM`etHT浠>&QZJc!J^C\e+YՐkd:t7)kcux KDbkCe]d̐2Cf !dC(ܸ^w endstream endobj 35 0 obj << /Metadata 36 0 R >> endobj 36 0 obj << /Length 14767 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:54:09+05:30 2019-06-12T07:54:09+05:30 2019-06-12T07:54:09+05:30 Adobe Illustrator CS4 256 52 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgANAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9TySRxoXkYIg6sxAA7dT iqVT+YoWvfqGnx/XLruxdYoVJXkAZDUseO9I1cjvTFXTSautDd39np6SdI1QyOKfyzSPGrf8isVd BaJdFlXWri7Vac0R7dacq0q0Ecbjv3xVz6boschWS8nR12KtqF0CK0O4M2KqkWh+X5kDi1guU3Cs 4E4FDQ0L8u43piqiNP8AJxXkLbTuNK14QUp92Kq0uheWokLy6fZRoKAs0MQG5oNyPHFVkek+U5HC R2dg7noqxQknv0AxVubR/KsLKs1jYxs4JUPFCpIFK0qO1RircOieVpuXo2FjJSnLhDC1K9K0Htiq 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 7FXYq7FX/9k= application/postscript xmp.did:0480117407206811B9A5DF90B846B4EA xmp.iid:0480117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0380117407206811B9A5DF90B846B4EA xmp.did:0380117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0380117407206811B9A5DF90B846B4EA 2019-06-12T07:53:50+05:30 Adobe Illustrator CS4 / saved xmp.iid:0480117407206811B9A5DF90B846B4EA 2019-06-12T07:54:09+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Black Default Swatch Group 0 endstream endobj 37 0 obj << /Title (gr5.eps) /Author (user) /Metadata 38 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 38 0 obj << /Length 450 /Filter /FlateDecode >> stream hj0BPK&XaCiJhZY٘%WCޘ8Isz57$mEَ[B?y ,Z^5Xl-[ RHC\m8qߝCЛ] ϺpVJsD|? (?|8&QZJc!A}!JYՐkD6t7!jcux GOSW xw2Cf !3dWE2\ɹq# x endstream endobj 39 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0003) /Rect [ 522.177 627.816 540.693 636.774 ] /Border [ 0 0 0 ] /H /I >> endobj 40 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0003) /Rect [ 224.961 300.54 248.022 311.531 ] /Border [ 0 0 0 ] /H /I >> endobj 41 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0003) /Rect [ 87.468 206.4 112.869 217.383 ] /Border [ 0 0 0 ] /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0004) /Rect [ 133.656 206.397 140.292 217.387 ] /Border [ 0 0 0 ] /H /I >> endobj 43 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0005) /Rect [ 258.387 99.21 281.421 110.192 ] /Border [ 0 0 0 ] /H /I >> endobj 44 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0005) /Rect [ 434.346 436.53 457.65 447.521 ] /Border [ 0 0 0 ] /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0005) /Rect [ 417.57 415.614 440.145 426.605 ] /Border [ 0 0 0 ] /H /I >> endobj 46 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0005) /Rect [ 424.005 394.689 436.401 405.68 ] /Border [ 0 0 0 ] /H /I >> endobj 47 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0003) /Rect [ 471.552 355.215 483.948 366.197 ] /Border [ 0 0 0 ] /H /I >> endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 50 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 633 0 R 632 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 4 /Annots [ 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 49 0 obj << /Length 35930 /Filter /FlateDecode >> stream h{[Ʊ~pȪʺPA7uV'죉!"G4mޖW4(iW_~?Ňn|;vc,Z_wuӶvoM{A{fonFA;z.b/:ߨh1׌!BiA+woo@{#pëT[*s{o\`O߼ɺ1 gm==}|4x,U^OlnQ7o[Ba2w_ s_ ޹'W|W(~B[!4NU8=39|tO66fdFhjO4 y[xumcۓd]hfvGl{yWuUoR?1]2|/xf~W|}׿?~l۝ o0vӿZ;hw?~~|~?*F^n<(Sh={-}lC͏;ƪ~` .ܹ6S}0t~駿ZM|0;pwD9DPh~mƄ^hV;q:ȳݸ&m0| X*zw5*>ki+ *pM MJ,5:EkR-`[:MIu@ #|.{vZ4n-7$ 5$3YCq):~=݆<`a;4աqx?n?ܢhxI{Ɤ O^[m~#ȶ5X,O7*N5986+L&ɸ9v4D1+39eE(4o Z jaمaӅamb%讑F*L2A9aM Mjr0Z Q2~ς[ajȹ<_ɣQނ~~Qzleĸ QfW/<r~adGV\ ?=6pd֣oȗ?y5<04̊VS ݺD65<6y g C_va6(;l s ïC%7`m\Z GMj[=WahkZ íXgTb|ZZq&(8GϺi|KAY@b;q8IbQ9t7k+2 CYS+n(YZG8rUmt;4Zи ̌jqP1KoՍ6B?-lsAY<6Z'7/4d*^=c{+i9Z0]ׇ8qޅ?XHw#<.@7tdX:Bnps.+W7Q4'FTQ Zl$/ -qXA+gii4]4*ZoE2q<Y<< G^vs7-}p:ucch9)gK94;--q]tk^NmlFRYl[0Ju˂W=v}HCwцii#6I:Vp6/>L鶡!>>La wqE&&&nMhdnMv!]vvl}KQ!ı}oCoCӏv.ĸ oC]6l&y#vW#)YƸd#ۈeoX8cCh0EC8r 7;L8k*d|GBw$ݡ%Rttf tO6 | A !bKhl)1-cp ,471VYFs u.\unN tRbly1V ,1cC,cAG?~:\/XACLCaH*3~mR&Y׻A,LG܅Pő BE ]n h eL\5,aqH\ݼjzv!NeBaʗmogB]@U{hȟo-Ç-DQX囏@NxiIH3c_?#i!In'f7DZ#՛$nbo%F6y-7o=}ˈzKY⛛z#Z/n4%>C-Tt)_gt|mK{OZY3jr?SNwu~-!E$"m=dn7ٵ3iDU")}J7G/2 :EF39UA?ߎgɛ&Z?}<{37X*Gӵ"b_>!_Ddև'ώ/ T[ȟo-7q :IRpm '4[fZt%lG FҰ#3gj:_k,ul'xO8/N?=Rd{r|ޒL/54_T7lmFR _ :x?*֞}qdEr;t@0U_Q4?s}p=0+p5qh8?|{ =c0mK ҥ-q#߿{L[NQwB%0 X|ϯ#(5Iw[}o 4o^8"G?)*S{cmxP:\ק^&p7#30||Nuue&͇߿|"3wO|ק~;}w&w1ıSA[GR֞n.x U?^߿ o(}=JRtxяt4-&d 0g 6IH@I#bHB-}Q֠G#F F*D0~fg:7r'9WX7%Ģj7&[SCwO٪IO3J耓& {_'NA̍RzK{~hIs):*z/bh >/;7UB"z:CtX)j-+g>:Κ`-m'Z,&ϭUΤ k S';BY'6qɶd9E 0;ɚ ƖIM&Egl!yL:m V XF3S8#AjFPhÈ<ќٶe[.E$1p[jc"LIH@ krjyi:B<߸O$kbzv-MJ0@d y=3dektc-f>CHfVӈŗxlEmg(-رtkGj ;9/jXoz:N5M\ݼMM'0!EX{u9 >K)0*ir!:꘬.%jwQWia'bOUÖ7^4\Z"_NBabBPI0Co%nU ,A&'< r$#bN腤?EvE-#rs.)U] %Rl$\J y+CB۷tִ5MrMNU{#O1,5c +t|}1Ↄq&򄯻n-8q^d$A~lG(k_vkrw^9.OtoD{ }oX٢HIlҲcuίFF09MJb%?˄c?kH*jdqsLj(,hlrlWlw٧W<e0%wdx| &L D⁨3ُL6?R &dOd#p!&G*LGCY:o?Xq&FY+q0jL/ \mSL0k/O=Wah[O퇫AwZ0y4 A:W]#/ΨȜo=a}n| &OG$glKV GM˅׊(T[O\0΋Hi*d񰶳 }w & n9F0uX}Nz+DbCT©mQ|*5w ,zۙNk0y|q $ f^\&E\f)5]:k-UR%^(eSdH=X[ul@ڮ nl+obmTY"($2K ݵT$lB 4|:/ĹR"YJXxǥdϚ|t]-]XT]%wgq;?HH@䛌 n]2:fNK~&8q=ZKRs Ugk8$u|)Ԓm m̝4R2<_9hbeeļxk,mעkK+k,:qKhV4] 2/g$})zK{eHmBKli6X+k*]ھ2J85oE;26-|\ ]'y2xI΢ BYm˵s,(KS5d[ .C>J9gny#!Z1\Ь--*Xۜf d~<[Rj6@q}/mױPUVMۤcZ"#2I~:{lѬ m#bG˹Cv"PU<%?]E'X^}˩V^WZ 'q[XIwjبp`wBWy+:6X'V+ô؏_EX~J4Lį4G/TNxGZvO W:rXkYxз4[ǟ*Yq<*!֌cAC!K{n f @׈7$sDzl08 "MW*.z+U{89AVm#6NI4*6\PZJun!HW\I*Vy1#b>Yvǁk}Lؚ<: +[at ayGԞbF̃zpz(dFzLyay><{y:Btʘg0nǼ)t73Gӻd*O ϑ& 2?+>8nSs#ul(0mZQrHW:@9@::@fp|WE;RH} AQVk.5LL=˕z}l9c`pLD#^8FD# O A`FFf4_[ׅ#fGT91q0xxtc}Ԗ$ Hl@" Z.Y-Wi|V[_JVo>u prBC~Dvjh7>C]>ujzJH%0٨!*$,,.Dw.09&40qi`$"&& LT40L LpL K6^C31YTbᣡ^F=^z.FPOGÉ?A]Xb6 DM%311Ĝ+ +hMR3nNݠ'yY ʢ$TҘ= 2$>ɐ4C3$iHgHlOR$iPr$z*Gr$}H\\Jq$$:IB1I&IIė$vIϑ@"$_G|M \Y}9JԞP.:x*.oƉ|B5oQy[50O-6ܪJ7 ޵k?Նtײ! (<r̵tC3V"[S9zܐ*ِH jlU,H_GbBJUob[Vg[ Nt}(XئR%5V+H3DHDY+Jƴ0|4ꁈ,օT)Td4[uB0\Ī* Y8t4sX`)cegSYhIh]Z2:<כt0%Ex7 co÷|96"K1&*2l9*2CQh\"*rF}lnN+`Ȳ|-xe-VH&h˖l=XM񑺞i͖1!`@[)m۠EXOI($1$a-1Ip +2RmR$ BmYjR$,9)yRŅl6O¦t5zUD4);b=)w '. '`O4Uy[Qr݆ 4N oV2) s˪̌2 We" [du/idKk&|RR~s)%SbK8/(b6k`;6 !Va҈d"3&?`bimj/m* 1~DHTWej)'rNp&v'2E4!2U\L=m>Q @17KIJXɄ@6y S0. u @'@",D+ @$GTaEjFJbq`@L€uFI, ,W"v"q aSd*(}$4B,Oc? E!x&d1C(PD El$[-Iy tJ:5÷T|6"0Ljq]?RR2(Vo~XI}&ȯ6⤪`-T7dcj1cbI-vP1W`QrB]F9 Pck*LG#M9xnv>ZR`^\ɣQ3Amvk*LGX0e_|i=ش%]s ].58 vc|O{(R;ggw1Rlh-B[/Q}8d!(k%U[!2o#0aNE_C˚nWaȳ؄s6]Y8qOnV99FGN;B.]!]!x#<ٞo~OƳ/dXWao\jL[+^J &l2Ww7Oww݀S<_49uo<'Oi`ow_}'?|ov/aC|v6`w d*"8B_^mؿ|{|3f4ˁ5?ٻ&=O/Bo}@eܴ-Ė寯st8^S;4G}o\+iƯ1C{MGC6,5ۍGkY&FO:͚>~ `ҠzsO|իo>EBF_ڽ9HӬ_c- wZc6#id6FjzG2c I`ۜU@FVfyx GxW5MMːv{lhYEl޶е< u (lhxAhч6]aV F^9S)Sٍ }=ǫ[M$ʱ7ҭr^oU&n?O89˻w =l iɛ&fJtQicku(VhQ_r+ ìg3}ג>w_ {E)?k*Aw^` Y@ۑwbB1Y-ݹFFlπ;τK8xՓ[#;\%_3թ,Lob+= ivҬ֟ qA#0}z{Wވ3́Թ&Ǐ|V_zxrC}5 #I4$q ,!` l Q+SN̰Q41&0 wOYےgTKL-Q{:>JD{||)Cмlp#K!g{%0"2\ЪxȊNv(yƀu8ĒH)?N:Y>`J1Fǧ" 0 8ix9VfR+f_T>2Xljʷ[8snh&DIn&F\64K3\',N"gT+NHD+I45l$:GpU%?2̃ԹHL*D#bA}Bom]kbl2 Րk{)Qw6%5>ח%f=5DrNÎq64bpcPj߮` :S*Y&Ǔs5\5qC$eљL 묔Y`I-=&G’Rz6Jx AA͌j9#D- h4&(Jg8K;̢̌tmj2Eef6!&D[64bf4Spa]$Ί1Mh܌=?R,6YCм͐*(BhHΊU 혝)vB{BC@Dbz9+d[MHӄI83e K():OqHt)ASscM)B%4Nt:7K8j,):y笔 RvO:فUv;Zex+=v>.h8M3W !ŨK85jؙ=O|#񂖃dXr$ ѻ;>L|p'4`m=ӻ3:dٯs % dS* s^Rny ])0zB[n}Efv bo%''ΨL'I19&S"Zd|j䏾tJ$qR;1Q9t'VQY܉42W;Ek5y?'8IG VA,:'26eɥd7&rgoˆѣJ3d)ƞ\]xs&b K [O -Ǒ|5gv&K|xtgL'Pޢיyc  v[~=1}Q6n9 k/evw7ē3Җft&%K] mh܊{9m ʈVyik! ۫&"yS0 )sa*8/ynbPGЀ ۢ]p^-;;\"HDiFf9̘SXyƤZD5'{jh s*p'E[HsCk =% P[RA%%"tPhicMZ"Eg7&Qjc!P@?ΠAK.%0 ֶJvLd6F[A); Y&hɸ2+Gbz*|PՕ[rs^4kDd:OJ ^GCIEH׷xLG6<~Stp9{=gk2[s!懟 Tm[/H34@!/:} ќ(|*Po frěZK.뱮.m~_9RrτO?hA;e5ҝ Zu1T猏e[wlwcGA>G}(J~PA[&G}fǿ/ /ҐvnùbD{%b'(ݯEfH1Gn#뇇d:kJ :E|4.e(~O /EÉ+ÿ>ֿO~U'5 ]Ş[zc L) 3k΋bCS3L4-0-qUyIF[2k w2az50BU8l H.#BkObRtnO}a1Xε9^WS֩v2c9[>lPˣKA㞓n~>n`_dMS`$&V/THCt|dvBC?qxaX;}%*, >y%+۵ҮKFb) )[8:Lit=M.UhyfDJzCsq|)Wvl +L|c~XIn`9kvi.86pfQjyfJGT7ݙ2}œ_gs6 X `?_A !\nOrfflzgˑHU0 ̷Pq4k\,,a,Fe w-͎;2Nd6Oi_zcq#VUz#lkM:/\N.&OhK%\ֶ;! +xu'>X~Ab /5wW>3lӇ )zya%9jFd;NF-ƉnU#67; 5rq"([GW 2Sekp'XVz$#~~~FAf<剚+~)#֭vl~z[X'ьd2f|ߵX$$0|b7^XXst&)?4L^/BAQU!4Ů8wX3?U﹯?\+-uQL(;jc =) R$(/gn!ʚf)f94{uqmv0J8v S*#'tyٕJ!$A(C֡'EkԬ+^⛎LTzقEj֪ =9(OgH@6]ױcua7Q3=CAZnX`EgJ`f!볦{:kRJ. ‰8!5mxK WhFOs)=\ YiGlQ RW\tDF~Q 0OGa[bd> 8441džM^Ytm1 F"M)88۳ <rԶBn+"i+i+6~rFw&+!Hs+Ҫ?I[rt gi~\`i6ܑ#s2kMY;ywlΠjQ+~Hui My( >$F0Gk@u![N"i+*pӅ v7AaM >}D{mgy(]K0Wj{y "וTmm5|RQ0 Xa-(<Иdɞ:;XB:9%(Tn$XnP+2e 'Z zD;_ ? (jb7琹%2vfrMd" `D=ES ~@jA$d9ԈKo# wAtMOLs L6L%yζ+U%R7J7Q*|r*b2J~/TaϪw }ZhH_goDBH' 4TF䕁&|k un[Dzu%(Y]v4;͞⛎ NO!evchW厴܉C:'+cBzXvzG1d;礥Q ׌X6wSq+kqvpum\I {kqwաÿ_՟N r_+}Kq6&_c))eR/4D2'$"a֯xfc̢Nԏ7:~`>6/ f|S{J%ɬ>J<0ZQsXNLdK{'1v>1&ݝ>̕{$; 5 [O >{9r~Jm>PGy>zi,L 5ϥ8 pgp ̏qQ3ZCg?XZZ/Բ0K6J_-+Z@eT6T_TְyT54E ;^FC$z@.^jrWh C|B{'FjrV&v6|5}"=߂Ke=xeYZ|qy kqD/:%n7rsbKC$xoUp]RnG΍+nמԌp1MF4~n \C6F IeqxKv׷FZ? c1 7mn!:_w̓ۈ{u)^1_fus&PjSm z٥l-gQA"x` QXPvLb-m0HLrhOu$x .l81ge^(Gs[[{e\ qwx.9f>Π1;Bc"u ?VL5v@1 -=" TL5-Se{񺽽06;9 q,)-GZ; 8PF .Mox`e7b-Qt6(FX>=4Ma~tyH5DDᔑp+DRYˣ|49Icq|{=c)(a No8ZɽH|9Ϊ؞f&4o*PBhB%4DТDBjHbCK % QJnkpNm-ָ&'QO[PX Sȥzpsms}Y ǃ lit0tR)@Z+"7[' v>}AgH ucU.C\uwD)=8%,Q)=RzOgNzYZ^ɺ$ Xٽ㟶N8g!2,+4ԐE K:a϶x||=QvM/q;jkS/='ݠ=#HXLĻVfHǎXk"Adv{ZPq9aY>雎ݕ3S+OC`03Jf δaֹtF1Yuzomt'z=|-VP1`ȗ]g<7d01qe1I~5Su2DzGZ~ɮshģ0^ijO~h]/Jczs>mLįR{.6v&4ɡB#΍eƧO*9̜9sʲpxf3ڄ)Y]R& u) h$T3Tr^*$l]+۳-RvJ>vmʪVZ7Ycp®UF0 bAH-T %C%s10n$eEWnZqº~9}ZqMv?V64+3Fo3>b̈BWb<wCxU-Q?sSSVjԔHe.);@񼚞>)֚(4Z{ȥ/oh}F̛`\hFIN$W r(Ebȋ]ΜUcWoz4)6g>b(RԮV$ ĶPMO:@/|Q~TUE @BBGj"#FR1/x\e]/~ 6bp͋{"0WL6.* ޘ&Nh^wl)s{@Xk&*CddУ '4մq)(m09X]E7wG'T{פZA]Ȫԣ6(ԣ!K\:[RGQA29ދ.\1 =o:VyqLua-ΠbY/qVabjk`)1.ņp4J`Z *y(*CrD.+=(^!2J|Zb"{-BED%zNQ dpީDWi 2&2JЩ |U~5A/oL3QS1g`*mX|dpZQ4<~[~aJTt`vJ7\}ӱmV#M^XX =SFyR XT4R 'A'A'0)ғeI'hC9p+*.YnLJ܊-:~aaJ\1v5ZD#!>MS k}Nc2aJ(2n< Cp3> AM%I' AC'H;y2IX|F` "=6N>ډ{,+o~I},& QwE,Ġ;=b':fDB}&@}&t`伻Ï(v?>m4{~xc{Ij$/V:O)Cޭczλw?]}KrLSX,y Sݶ;:3K"o#-\0ka99Y5M7tp,*‚HL%, E;dc7(LĶ5"n//zL)zއ ZX^懟# y1&t}chkcAbAS0%ow 9.Hiw{Q^2GY9Vx-Ή{Fdԉ ;r_nu*׾sG͉w.%5;.[nYc9o,Ò0:Rc]340 7wǡ+c -UdHG1i|pG3y}5b?qH4:*_d{'FC0#jY}*OKb c 4/vYqƖC^bէе~tr0`kɫpIEpq?_/F6נ~r__̴ӆ4D9~p# CC*9oGCoqʈ\sV7<1ׯ+?DTZI%cZOlCҳft 3Q\U`ܸ[ڱN([=[OL=[<,,:c&mP]q2d@72b@vɃvHle tiIBnX(Q[Fb qZccN&O8pe%vN,MdZDBHYv^ѸL ?HS3q'Ƕ_3AHH l8l{ׯI[og:Ȍ@Y &娡e[-*qk㐂e'TFqBɑ ߴxh+J סHDrHuHA%|Z4e`to;g8}F0!'e_@b nos1$C7̙MaBQcql #팼3"M4?zRʝ'd7T5 Q/p㨡ڠuڢ0ĘÓ{[:R_'JV/V9$ ;=1\Z0+~rzo~o^oY3_Q3/ǛvqGYT b j._D7oŢ fܥplJXI-)̉/F.0p_qXX ˦jZ8XmR1tHm(SNt)>HLK$L[D1!NEflгݙXZq~N.kH.YZbNy/˲;~ gǎs=z(>,jJ=g)':T1<Z zƯM*٤KS 'EDQXs9I.ס=Z*%z{Gל;Z0ȵ3DνtN7p$;*Mg )y5T`{ 1H2G9Fc}YU .@j$dZ[.'!>l\fi%ڝa9zEېg"}D:bcdjJJ䅕M[h+S̍ur#s6: xNs9#I:TLijRLb)b 4 f978Ch|G~Jt< Yֺх +9(dW&Lbb1>l0il8["GjBtV0*y4P!Y!ROܕlwSG4 Fr:a/d35D"2E_,{Nd;cvcn'k/wNKP &ŜGwqxJƄw$1%T8k:PFՂ9 &cq^^dN z !aۇb#9k+mRL׎"k GbXXX`/%7_?|ϩttOU UY'lRviPcť4PȮO"q8T)QA\q9_s;I6m<,wå5,u3tC~k6ZYMy`vz36ݲy# TLjA-դZkudvVJRHGm& :,r#`!d#&`;]ٲ'81b-{3~,˞cfv}3ޙ&0N);fF_9ftd#!FΌL2t gkk~ïXz:/q"lcF^R{opBˉ2[}ATfPps)|RϕGoҪMevnW.#":{D{nfH2r_ԑu93[SsQ:鑈}|A,K{&Z*b=6%pG|ŁүlٔK7pΨT-KO݌$uOyYdk\hk!ⴗzR_?kc\Ҝmm z:6N{V${8kIDD鹌ȄŪB Ӌg[CNEL4w;}l69 5To{L' !o9B Drց.8{O;צ0gcI~&>=?w5nJsCksqwcC`[D0~M(7/f#M yT\<]QǝP*A5 5cWJ g TSR#Iv, 鈈ٰ}iB"Bo;ZA\\ЩVvtN(L"%F(di >ZsE\v%&^E?'_!"VPqx/`s>ي#zJtvF/7\ B@\>CΔeqlR=sb'톗[dˊ#+\K{&Gcp¨P T9CqRc%pC~9͘QufqY){Jo,L$< {|cU3fpsMa߃vp~~yX|gorp TR/M̄rթ1]+&o{K]XPcb&#\d{Fo5-=õ‡&$$6s%fl b)QezEV6~\9KԮz7ƁHQߢf.MTUb d nvx:e޶ݰJޤNh@(6Cгvcg>5P>}zzhX'pGp}ixm _YX`wަ10; RX<\@or'4 Yԡ|ݿQq02aqH5#jұ \:O v:SJB6k1-''rY=lb%SjYm<8n\!\y >KW=>~ߑB\;Tcb=QkK#qݥ(zkr;o#3 =z)eeqФMO.v♻?4wmwHnQN>ɟ{(="Mo8C` qv?L\'Wdgk?81$@W,oYG|e_؍w.S~4%^*Hg:8ql!I2jwpI%hv> ~6g; opXF9S{5`70G+o~` 9$Q6]dң-Uk{F^qF=BթUDm Q<372fH*uzJ$5@2R]OQN9Mx{孍;4T%{^f/N .)7s.띹*b-zCvi4^e_jBʾ|W7`bcn.mݜߠ7TIvH=ydvIf'ȭ%n/K ]9(v0R9&A҉J65l GJ˜0mǼT3c gW|7ow_~W ùX *9ьcpF~bTNn?<7.1m=W{_eZ ӓEEZYk5Tg6gTP}̀';w*o` c)eD==KhO7ڽJ#0f4,G|Fs>,zu\c{*P_"~xh@a //sU3vg#By{.o[y{|j*"OS2IfeTk.KX߇ELݽrn/$flȭSJѶ&!HdS_u}y>`: !$\>)ehju??Tˡ//ꇟΜ}&g2VfJ#K{j$ )ro/Z3" [Đ\XcͪKw;Tv8]G?+Ak=HAe?լZ]ί?ȇ'6N]kVIcp矛>(z& Lf;g;%&$ ;CCtbp<3tNCpixYd}5'c=1CDM@o0&%ѩh0ΣIw#)lvPbFYDH5#,d:g{-.WEZk6 L-ȔJ39Ua3OVEqz/3•˗O`Zɨ][ie7SdrJzcv*QZǁ#9c\3Ĵz?O>N s ڳը#Eg) w;LcOǔJ^ [VO|@`Pù`ٱғ?>\*-adC69g;)#ZcR5cbRGq?[=a,#ϴԯhnْA~F;D f*jNV,e C"w;M> wゕ ǣL >bXfaG֦3]_:Lpʍe|d6I[8YxۅJ=;PEUBʤj67#>oGW¹W^h 4bt\=?w%v}MnxjwhԦ7(K7opHn>ݡ7KDVJ#`ajt&l8SrkBl59ߞ{cSfoDOhؑ`UO"MWd>&j(A|}KHcN[pьHTLr\4$G"s'bhV謓PvWtHM yw,=QSyŃ no*Xa!a݋DQwJ-ҏB@zJڏIBf[Nf[\Bmّg14ќEB\Scɪ!S/g{x!nbo$|N#dLߛIQ3uPN& %y_s>?wU**|Z|HS> uGlr&:!Gz@hϾ,>!j̱~6]HrY3s]nձggp=:g1r f\Uo00.՚Ҳ6~n+`yt8B$eori(%72;D3 ` P-tRoA.+~z8(8G= >(Uz7W~aO .XKfsƂLY]fh'T͙#儨9TVv[/9HEyi6(*a2:^{LpB2DV'ˤGSɡ Hq ) d2ezN'^,%#޶=n&ma伒Hx1ofT+wZ,Mqz0ꨵ;qSM>}y_^4f}Isˏ}BlaqN첂 QIKSbP>Y޵ΩX~ފb̘6$qCz=teV$* R5NRѻc|'`]a&Sv[1Qm , n sA>Xfx8*_daəEQbD1PQP2) X,N߼#')֔FgPSP祚kر8⚱Pe;O(Lzy`KEqT{ר@8[?SAԁ҄,s3•_ID*t A bhB%TgWݦT5lEÈkr_w%g<[ 󕲶.< ,rRZP'OϹ&Q:ʤeR#S XPjBWRkn P[-h֞Y e ݮAF;qtC3uVOcIX,8mIX=9WGkbzQ2}H#4OBfVs3G0!ȕ"!":qZ#Ҋ\@"LJ/Ԋ5B' l sBT.-h#dڙm6ja<%jw[*J@JN¿h(5LݻBkR 6LB# DGB ߟz+ M7p__҉:!wc.VhZ1ŞD)H(3xVmlR ^xdJ*QdShcIFKuyNo7;D0ӊ aCAhz@I,gm8QsQv EZǾ~ٮyo+1dߌ!p(*m@rOF..2V.iqϻw?|xrmr^њ-⍱Y.[nNn>ǎ)#/.N endstream endobj 50 0 obj << /Properties << /MC65 51 0 R /MC64 53 0 R /MC60 55 0 R /MC61 57 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F11 574 0 R /F14 288 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 51 0 obj << /Metadata 52 0 R >> endobj 52 0 obj << /Length 14084 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:58:24+05:30 2019-06-12T07:58:24+05:30 2019-06-12T07:58:24+05:30 Adobe Illustrator CS4 256 60 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAPAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FWP+dvLt1rukLbWrw+tG5cQXS87aUPG8LLMtGrxWUumxo4U0NMVUYPKurq1vONcu7We0tprKGCN0 mtmjM3KGaWOSNecyRKFLfP5lVDeYPMuv6BJHbAWWrX96wGlWLNLYSSiNOMoM5W6h9RpXjCBvTX4q VrSqqKi86vbwxtruiajpEhjeSUmEXsKCMVas1iblVH8vPiT4YqgfMGsajqken3Pla9+tWUpAke0Z W4OzxtHLNRXcxLGHVkVa1deVF+JVWVaZc3F1p1rc3NubW4miSSa1JLGN2UFkJKoTxO32RiqJxV2K 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 Lhx+GnKvTFUXirsVf//Z application/postscript xmp.did:0780117407206811B9A5DF90B846B4EA xmp.iid:0780117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0680117407206811B9A5DF90B846B4EA xmp.did:0680117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0680117407206811B9A5DF90B846B4EA 2019-06-12T07:57:14+05:30 Adobe Illustrator CS4 / saved xmp.iid:0780117407206811B9A5DF90B846B4EA 2019-06-12T07:58:24+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 53 0 obj << /Title (gr7.eps) /Author (user) /Metadata 54 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 54 0 obj << /Length 450 /Filter /FlateDecode >> stream hj0BPKIXaCiJhZY٘%WCޘ8Isz57$mEَ[B?y uw׽Wk߱8"iI[V%)p;57ufD(( B?p$<­oRxgmE0n5Rz80g~IK[O?0]TPt{QM!\G2r6rZ3/(ӜZ|NjuUn_ux[X_ /xDPMalW浠>&QZJc!A}!JYՐkD6t7!jcux GOSW xw2Cf !3dWE2\ɹq#2z endstream endobj 55 0 obj << /Title (gr6.eps) /Author (user) /Metadata 56 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 56 0 obj << /Length 450 /Filter /FlateDecode >> stream hj0BPKI6XaCiJhZY٘%WCޘ8Isz57$mEَ[B?y uw׽Wk߱8"iI[V%)p;57uf,#DQ؏qxNH­oRxgmE0n5Rz80g~IK[O?0]TPt{QM!\G2r6rZ3/(ӜZ|NjuUn_ux[X_ /xDPMalW浠>&QZJc!A}!JYՐkD6t7!jcux GOSW xw2Cf !3dWE2\ɹq#)Dy endstream endobj 57 0 obj << /Metadata 58 0 R >> endobj 58 0 obj << /Length 11035 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:57:14+05:30 2019-06-12T07:57:14+05:30 2019-06-12T07:57:14+05:30 Adobe Illustrator CS4 256 40 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAKAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9DWn5h+U57e5uJb5LOC1 vRpsktyVjQ3JbiEV6lWqfA4qyNWDAMpqp3BHQjFXYqoSXtrHdwWbvS5uVkeGOhNVi48zUCgA5r18 cVS26vru+1E6Zp9Uit2X9KXhEiFFZWKpbMUaOSTko5/F8CnxOyqUN5P1aDzimu2lxC0f2HeUUuPS mMf1iNm4P6i0t09IApxJatdqKswxV2KuxV2KuxVBTa1pcOqQaVLcqmoXKl7e3NeTgBm22pWkbmng D4Yqo65q8tjEkFnD9Z1S75R2EJEno+sI3kT6xJGknoxn0yC5HsN8VSLzL5JvtZs7USXSzTo7m6in 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 application/postscript xmp.did:0680117407206811B9A5DF90B846B4EA xmp.iid:0680117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0680117407206811B9A5DF90B846B4EA 2019-06-12T07:57:14+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 59 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (eq0001) /Rect [ 187.233 400.791 199.764 411.782 ] /Border [ 0 0 0 ] /H /I >> endobj 60 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0006) /Rect [ 150.108 379.875 172.341 390.866 ] /Border [ 0 0 0 ] /H /I >> endobj 61 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 271.095 343.722 283.491 354.704 ] /Border [ 0 0 0 ] /H /I >> endobj 62 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0007) /Rect [ 121.65 83.055 143.874 94.046 ] /Border [ 0 0 0 ] /H /I >> endobj 63 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0008) /Rect [ 531.168 378.534 554.319 389.516 ] /Border [ 0 0 0 ] /H /I >> endobj 64 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0003) /Rect [ 467.853 271.549 504.612 282.542 ] /Border [ 0 0 0 ] /H /I >> endobj 65 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0009) /Rect [ 465.981 165.36 488.205 176.352 ] /Border [ 0 0 0 ] /H /I >> endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 68 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 631 0 R 630 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 5 /Annots [ 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 67 0 obj << /Length 29373 /Filter /FlateDecode >> stream h{k\i:bcdx3+FF@5[m>4$5$p/n=ͦX*ju@ y?~mW߽ݓ/Vv۫9ٕZі>rےɫ+jk/n䧫W~7iiCv̓/z[Gxx5;t7yNM\G~{O}+-&;yʘwe)ﶄpRW^^4t,ҳw&/%'tOv9AvM)w5WEm_ۦY5Rj˩7ɦ jJ7E(uY߾}'lg̯Rr9,rٛ8|{֭w}W ҝs#ї{xl*h_\'la]rB=y&[5;k;Ҹ|'J^+i9\M]oNϹ/7Ͽ/W淿ݗW>~77?}~%[7 خʮ$mqʚ՟WO*Ϟ_}ǯ{V/VWg[%YgW|jc:,˫M.hQi*W6Ru-곗W|UzI_^}, ExwoR a۔Jf[E& `LK`PZ}וJblXV6+M8i:/ۚ T74 q1;v!KMY;vn#Z0j% x;6;6քv:wveb0)9enSsW-`k$VKWftv.<qNvR0K%jJߊJ$ǯm6ORuAl_z RIlC_9UgLOt'Q9Y烴} S˝:?1:18|p~Z]꼻C烬9:T^U稝Y(iPyяUmU-Uڼb[*];k-$'f=xWO KCT3}վd|oy&I{8?GN*Ub*Xr :2[%/ϫ[g#;Ac>X;%.3kg€їR<:vf5) Fó;bV g["ΙhRF#V {Ws>X;U;͖?vp˴ Y8/?vt4flZVE.k|&mFJGOޗnbmT٦6x|^Hޣ+i$DlD9 8i(&r+JDY""wQ~1o2{E{s[dZkT鲴5ǨFLé![h6ἢmٳےN.g\jU=#e,Xf/pd"j+bܩAlCj倯0ϨsɃWirHQ\odB[A{ ajsJCM_Y.cŐju*ژ TآS mqnbYkϜlƧ0WM;J_N5,pa] ӐT>Z+{++ҐRtُY1mB䢳q#I'P 2239G&Ui#-p.4RI;SaQ J+#\kH`db.g3t*V}QVOK 5}-ԟɈ2UB\%N!BܢPs`$%M9X|cT-,yC(鱏 hVG0qNA|oijwNv3;vhI[52tO kl+\.=t a$h C4),c˴%VMQgA[Me\[:^5L Oz(LfEQ2<{cmP.j5AnX]p*c^mrGvlk ML㪕}V7`hȋMG7Vݴ&Z6嬉Xg̸W8}Ek(a+8BVjj7k [/IMhp*u"Te91F ^ s YARL VѦm1yڕع FLm6O O`NT'>o3=GK(ܪ9:_tӐYkzm8=M 25̃S=&`(`W9PѪ.SO3TfQߖ^)OEXX>W#l ܪj6ODպC)~դU~XI0u_!CI@F^PRl]ދs>TUF1Q1t(} b! Xko*m +vڊD[zZP;>2IsWS-]Ibd |G%hEˆFkN)Jh 6wf(CK% P&$ &GϓN^`VIE7ޡnmPu*E d;Ju']Q-D=uE ,^pdء~pH," MPtqxmt$rA˛ͩ ò(f."T.y@X7yh4o7G&heÝCkDm9ԅnڿУGݱiQ]a#`umG\ qb) d##"[ldK3ul&KY;nannp+= nn77- p+f2p*f'-ĶsTlلf#.u t6*<`QLtSuEYi[HږO ݪkSN?9t?tEl*ڈ%J>QNo(յ2]* V1ԑ( xmh\kۂhEY!Ue;k 8Zz019S}-ll^a﹫#SڊHq),48$爎/H 1^!`!X1YP7}6* ipl)"RT(5DFN;w~]n౟ll}@ˋi4۶ JATd" hLWZ?IY,o+* W$o.V\MlՅ~?Mm2J9T2<M~@|bư姦iǽ.+Ou/ysczPiic_8"?( ,4E~PXifчE~PYxPY&!A(/HiHC_\Eڟ!H;z[ CWynsލynЗ9A.! 8dM\$:o/̥Kh({ِ 2Hapb=4r_y,Ci`Ł=8 PCyd%{(!?ܒ=GPCu#{;Cqw(!f4Ca:FCau !?P:gPCe::uA PCa;fPZͪ4lCP;ԁ4esO90g.dh-4_9~a وDҠmO ;$+^VqV1g0KPbU+ZK zu3~Y4nI"YW@{u:LoÝe..f%XJHhGUِ&-o7Jkc34ChY8PIm@1hf1P64Ը{W+ŏtSrʹGŷ ܴ(ps b_nnГPm6x'A W/LEYbDp©ڥ6MIgӨ`Oe,"Υ2R'7zwJ|I,Go,^zrЍŞuah#0a;JJj7.Yډ1SGW{J-= ʢjY# LKVkۼe:Sa Z@OO,D=\{SM憤,c KMĮj-FDRWewXL{.XOJXR(,.:Fd+Cx:Fݞ rzA8c\c<nd#2h ${0Sie!RSZ܀ Is`8{k:mxU)PvHO5 ZҤJbİfIӲ6+ I6\tgb##nϫhm+sO8:yYָ&btQ{`YcVҜ?tWT3Q^z)bx Ո27*Tň)r1*gNqOk) 4,QU?M WGzQh<BZ**3]bC'?.$inTxm5jl,.s&xTi2jǛæ0yfjdno a! N⊽b2 H$zc\MaԌ#3I,˂sR<6ݒE^D' 4r ;8ϊ^͢xA WEɼvkOGY![qeK+ʖ/WӮlW6aW=]+lw6wdF/?W3?tjKщq$X[ItV}}V,(}RzMDRG':%EfuBU0V۞L]ndb4JA*S>d BJPxjVڎRaxP7$SUf^-QK+SFz//1Esn< _}C~v_kyD|m4kF쬂G?d+EŒÐ^5cm\O$¨s&AK=*$fz8!duEW&=A/xtev<٬?[lL?.IHz7E;MV˴%$&Oc[TSUW-0ïVZkR9yUkޣގ$P^UL'Ŭ{KrׅM7Λ :o7ɒg;nX1MUS^ )SMKmLTԯ\l@dfI!hG,8iIfYs-o5O3ytWk5 |SO g_)H2k!Uڱ}"oYe$ɋGTbn숨ٻ΢u(1J:HWDw )J+pjE x5K&s릉s'hr1:hÉGպ4'ӮZ٠Tw=5Mi O?uI]=kbcD^/4;o-6aY2Y\[1%^g@/HA۠&|ENY%,p]E&6P%5Q~uԜ.MnCHj"ͫw&L6'د=~޴ ȯ3u c \JM#am?lr#Gv k$e# x  Otp\8qkK,v3]hOsF{Zd9=~v7dEF3m90)= ugwC>{"=Ong/هlf/c6̾eRT!p*{SݜR}bUrݹi l! a^Ct$w"a\ aA2";nDB7aZ?*'a0 @莛CnA?``0|&̉tW^j<a@b?5/՟EVw,)}twR=pGRjϝY.|~?U?U/r*2)WmNL\.+)У"?NWY$|ϕUVH{ 4M&MK46i:Mvp.p.p]h&M8h;m8hܱIG6mR&-M]?bM6`haԍ06t(MQj`je2LL4i8I,Лl$-Fb!Vu(G/nˋ-CU "Way KCnXrCrV0?En?17||nX^17aaܰt<7,av5nahz_ca~a0eiP W\!Zkd9 pӐ϶H̝z:4IR!ߌ^DAkӒgIu eyQ鄠, NҚ_lZgid*X ZrmS/rjS%*"YƼȢKEc/ڋYp@Xڲ oEn_(|!MeXfG eEE6kzS6"_bḂV j0 xeW &PY&yju"(}I!k\*|!\6d>ER%m#[ tۦ-JJUT H^SKMjm5$>5eV$ne |\ih`R鵽)yEh閧[:Vkpt{jR%7=ҌVIWUxu?a34䙣Ff(]U[Y)213٢|*hs`Va4w"sS l,^6vq=;) 9M8i 2]Y#6mXBm5\Q%sCYIDg!eًbЅj<ɔWs/hb:MLC;/[ۅ&67}]-G0QN▎Kc3>2\܂e3@^ E2[>x:MC嗭l(;?^eyIu$VMՍp"XŖ_W\ZPU*,ݏY]USY S$HqeXNx%O8zrviZwrh#u WP2/t pW1WZ+kNna$rtjnEX+ܪ2'yo땦D"QmEa%س0(^oH:mEICEE3LVZ @fQ]ڎ1ɔ :by<vE!E|y^AyT &R՗қipnª$_Wq?]Űw57'^+o]T!)Ml6tm6O.\}tÛVo_N4rݵcIZ_~lXVȹ6E>6뺵oѦ6Lk''zgi.;EawQY?bɑ>ilƫR~Hwa}{Yﯭ LJl,$S'W?E'Fsm#QE_^֯v<{&MH'N˙|w{pYi8kbSv 8DJ9q`N+69g+ 8~ L'nOFA&8"05͎(yOic i̍[|A9j?4?B7vtZQE3 x_l}'l(i%0u ߿NkxhzP:bNX߼u`׻l|'53rի7˭&pR;p~k3ԭn.P+/dfoW߯\l[o9~G/渭 A.ǯʥRgj W gwjW?pq׋M)Xze K8an.Cߥ,{x5`ɻK#XNnN|_SGmj;L3={޴{?GV$i׎!:5Nz*^"Y?h퉸p4d~OVwCNnk.X&';Կ:(?d^}6 !d[]$NL.˘3(X"񱃲i }-TlO?,ÚJח)O<&K!ܧLQ@BtߨB!Gԉ#Nou321Q*܋sŽ5bT }ܘyq#gz0Sm}GJqd_/4#,w#88p'dV[zٹauVp: 0dW8$NbR^ "[ܚCƱh \Zhj GؗǤ=ȑ-H\Dя6\{[Fuֵ6˶,{wh BlO;].qj\ބ>Op;N; `fD"z~?N޻P4dKˁTԔ5gCw^i1L_/ F_s%̖.uv[BlM*ڙdT(ShCL9$ ><;3y3jGP8FCL恊tLڙoP;3 |:vĄI~d]Δ2R2lZmS,(O*LEbح!;5A667j"ސ@r+Uf|e2n^)9nS4kFVcFUhEkT[Jޤ W|C#޺6-ZE0:fa:{Jwog!mY#K I٢X8Uqh:[<'YLH-o4M+u72I nC ˅ǽ9AQ]e;>vd T1cóbY&m2a-fQ:8ZE 3JexdML Sm|x {3 " Y)W ,jʁIS5AF60"Tf&0BƣjX1i ^,I*Wbr R̅ KMkeZΚHuƌ˞}WT\O@aTSD^͔A-R m9R'&j3aj>FXqep~?pwvxPeD<0nw+HFBV~t^3DMg4t`fESɡ)DS?g6G#E{t=f ;14@*OTR5JFJ&J|@%(,yTϹm$T3zTgFTgĝ d '"*"*$LET"=#gDEQ=#~D0gjQ=;gh2OJ6 UUJT~)T%+QNPX:|+gQC1(H1y㤐,,on|ua|:ow ^j\X e5EB<(@XV^wnէ$z糝Dw\[sG:lOI;Jq |i#n!]e)O^X]#c\ =ܥy7=.[Ռ^+w{yy]KAZݛfuE뼫buwuWHܜԿyCBIY#;7딹[xND^,|E߹Wo-!FTI3>٣Rvw2Y&N>Z%dw~G@vۛٽ~9pᬷ$ߞ?2U$f{4Ml]e=e)YGd)(vl1)m'V-ӕ"9|•$J+R^Qd("+-G!u{{NX{bz1ޑE>@QQ9WY #-}ۛ;IW䡻v_g~Js c';T^I>% m&ntVcڰ}:N,=iJ׶!FfA]X{{ΚּA1 N~ε[L}wӣp.l&7|#\#\o.>>&ÿ%M_;WL@Qڢ4@ްNM,z >sү_|˥_%ňCFb8V `2 ZOPG^+|XR{/2y_[%CpmXXP q ]O H4XB"Rh gOa髨b[N@XbQQ ,27u"^&H"j׏$BJa#C49̰PRЅBXTL PlD3;$1 )w(d, E J6T'/(4I~HrX>r'?F;OTZEz2leb}bT:G>Ȧ2{#c$XOd6D<q~'E5I 4P> T5Ь@i@Y_@ݗX( M F  0{_!?4a2]J1rvvoN2f͌BK8^#` h5 jAܪe2E$N1WQ02cdZ%jEapPanJ_\4"5;EZ:򨮣Z )?(*ё2?/MCh/shm@BԪ0&sh{mJ!ICځ! Ik6ڞC,\jF&?= 7AA Oas6dRlĶІi&঒f2q,_IȨ2`$c_UQ¿ qNƖLIrgNr sء \ z)U^i 2,UIu/e3m^:;.6n\ g|S+>]loO#diuwqwlu w.}4C6lߣ~Pvau7gT$\?z0mEa6˂>6Ê >eCSjя<'ӟx҇a6|9FM{ 곣b.p6x|ќ Lf!'z>95w}vԝE/3 uq?7FoU᧡LBB_r<-.JQ7|]ð525z\qhdh4R"Ć(4U?&۩0O1Xr?5eW.x~:؝J-1f(;ScqLmK 9f+qpg,Z,st0yci(,i(yQB$w!dE5"0Jr& >C bߊlyStBZ+3Hz~`X[~d9w`N w臬=.c}]a"8-bEª-AawK)ge(|X<#ܟZxИj\uJ;#pG~װIcBFA6<)1lnj2NI /X&uDC [r܃xqC?.xE78u,Q!lSx8t̹ɟۄߢ~pDpQ7bU}\;L 2G& g,D '7I4KX%6WN(V&usPvpY DfjwJDtvD9F"$|+ccq?fWbANF$;釟6UwWda,ag|"؎*C"cZpAס`j=Vg CcU)(3PWcI'ŠDn%TE"'(wJՔ~GOYu5]mDr(DЉ""8?˿n/v{zL!+NDK['ݤk"Ʃ\ă_Vv+T-?3{m(Έ ȃYǴoƀ|lZ{Mk14.r(E CSm-j"­x aH߸wMP&C:Uɇ0$ ^ˬ6Eehz"qZjWIE1a #dŁsg1c4-$B蜲pmgd ^awQ4-ESY/w(T*߂P%W=Д3mҦ0"<\\*Y ^+.: ^&-/7O*Ŏ3#BAW*\Lb .n}rG(+/ FeN:T+o[q0ě=A)v҅CP=9#cEP^OǸFM>a b W!F&WW%h4;|2sO(1yYA"8fɠxBxU҉w aq~φ S_q¶h;< F D0 ߷H( ΓOUfD ,QQGJLێQJs';̶p>X*rleK.  ^2+lLEU>P))(ҙFHmd@k s'Dto f_#C%IlJ\+&83ndrިbfu6tp-4'4p$"ha+Ջ_z$soQr p8T}+ ;67]kP]'ønFPY&g|0n|RV¦BU6~'wPjcS{}㓀 Ciee#tN[-( L iK1SͲGnaFF%lN: "OWS*a튕s^~-PFb,NʌT' QKS83OfHB#fJUhw2܈INTչT$e>5xr2ja `< Ѭdue;P~Pc軫d%hS%j-l&z-;zG@PL7R{̏.GYаVWh,xXy1)"2'$$M\88uݧǘ?Rrs1a+zNx8(;4 rDT[w `Z31'Bzu=687ܷ=|wOE8oR}Ag~,ymBXjՖ(/vmH>93/y6'M)e(]Lz(ڤ+8R)22\Q("3J$湐"}yYTez?zm-Cb{' _4b"ԾrkHG5i&ƓkNOyÙ40$_sEܝkR{UP(59]\LcW"SQJ%3mኲγ P F:->5HI9(W74 TNsrJtZK.1)w7( evSr+ ~GQn^R0{Y~vMSw^nzf^!12R.fPYq 6b6<5Z…wbCIKʹbtDJHsM"`:{~1ŵ0/]s% 懏Ï$a_q+fzu}98?f60UɗH.HP 付RZshH% DHd -"Ljn_[„#{=*)TȜMJ4&'~XfXu29@z;2[%9*(E1&YJF6YČ|*bu B4%'ߍ#2Wu q@J&Nn7 KXfv",sJR =P=UdBWЛb $eHXRNe*nJk4.Ji մ좃s^~>eN S6mޘ϶%܊I8EXCbEckd>݉HJLҺhew~w;jr\ʫ2t E Y{5C?3M0"'?w࣯6BUWJ3~]5Y5{ ' p %XxH5*3=YCzBrf,fT92U'K(o] C>s0&U.?|NhXu?b t%c4ђ3Nip]"d;<݇e9[ ]F4s-8g- _s4vpDڪaسUk>:?P@(xy6>U[10XlwLG/O KJYÐo8T'P,`vc5_rޮ؉Cq۩5!$FN̄rq{zVe˷sDqMjkgQ1Oj,36*eonNK!؎tJlLmyZ0T"N䕫-57cġ H)>n(; 7@vq), !_vP٣\1E5d~4j4p$.Ļ0Qӽ#TrQeCX홃͒+V'Z].9{M)ۛ "CX )YhDU^^Y֬0*G lR(aw1$gZ*9cULŕtk3]aw{I+VvVQ+݊8M2Gd&V\dArhyx @9'–I'pYq3f ̳`-d*5`yDTEo]Ei|dlh֗`XM kޥn8l"-MwDVRi=oEí":|c Fk03&8<{,?4D~6蜬…1>a'k?CSThQU֬2 b@{d1Sr&0@ySLamyi7ӟ*]tψIn.7|bUŁ;mzw}:"Ran!քH4[{fH"f b ,{ M3r?^&ܽ*E˘&{ 5$H4ho`D1 4y=3R?X,嵸)2lpį+Zdc:q:V>G+jp͖zVtnA7(fdgߕI(J$.;B'z"%iBYH͹ԱHʝo؁J$'єCr"1-fY=8VetǮh/†̆hOj,EBq( M4<)I@cy:)4OқnSWRѡEE"FLR̉D?0Nl1AAٻ4ފ@N mb`PH>$ @ VI ve03Qhճ&eŦ=Cli`0IyMPIB<ۛ}"}mxJs0,VbKGgEDE ˰#_]<1W9}eْ DG;cDz0H$$+"O]ELI> i<̓ԭ rK">gmaq19&0IU B E#7$ rg#3!){iʊ( x%y/,RUMA%G{2GRF%RE kyJ9^A9ỏcqvj"*F\ȟXA'=E lɷ;`^>{amHs(YhXZPLBwcBt)(I90aܮD’aYmy G[_0\)טP矤^3.Vx% ǽ-6Пʅ!()4oBb*@~yfM`R-V, B'&*άptf:?wo{/|/ܿo~W~*H0ZXU`RD q?!F]u*Rc߂+u(5lDY,JE1Q$CY&&j(J*WUCi1yoB!ݝl^9[=(I1Y(/ "&Z/f̊([4'Ƥ9q$bYR$T\PO>B.HD4%J 68u8*[~y98TzPV52c-5 r6yb^)QQY- xX+C%Ni^Y@y_HM!3CR宦nBשy;>ܤD[eDO/ 98?͵[*y 4>U5͡ζD@U>Ԕ[Ġ5Sk& DceLY|c^Vbr ɞ:ue w(L.PU}UL(ڢtCɔb Wbs5yRLQn*Run+j >QhkSkԫFD|^n*höpW\˱8SADg>J9 !Qpu{2D~eigngDy$=ð`2a2rsM2)T/EEi%oR&5֢LJڔ,* ,L#MԔR`0 $"R,h1hR'W[\#E&H~sEPүx4MQQdtRZ7׸9 @Uj:QZ`{c [XiVhr ]Z$j5` uԄ'+mBT$h(pU$K|JU0;ΛM:'z.^mIy#N %RRNUzemrePH](2\ kbKWsFƷ)6W2%= l`mz̍?oRN+SFqq{&ޱjnHi+C9Vʹƕ"E.]8[w 9^j2%o2x$Lve/P' ʏmZ/ҽҏ^5lk5^ƔcyBT391Q\ڛ+.`~CD8+.`~,m O4)2|²6+'ӓ|14w I uen{›I-@P׽_REVEymrmrRH.Ū{TpG: nMN.Y?c5蝮Ck;*gs=}l B\my60͓0[m 04y3Im&6k 5ֵ3̼`IQF Dlt=R=,hEA ne: J><\* Z붤ZFvox{ș)|skr@iTǙS gϯʔHhk檰yJ]E1țP930iY7YE}vb) Mc \'U$ɋbbs}03Ʀ/3 C_#ruN6ǩKV??dEKcMp% ZJ$*WsV | ~,ӯVLJ8 S.afCm1W"bli{k6?}K%m]^rRkThF0,SԹeLջLtfiϡ0b:\k:}ϊ{Mg,r~ y4/(n//` |~z4\3`l ~~D 1g#zRL.[rfꎿU|=Bs5=^;"U®˒Bc4ʺd<P]oXuE+wA{@i1!Z:O2饻U㭔G-O)Gn/9v#@rI X Ea&쬍 bpxVwնOUYW//q`a2&asCh0cjZX(%ȃQ:]v':s~}Gfw6|;A'= eIUsTL\>n'SJϟU(p^'+ARך$>hE~f_Q*V$zdXIYuf ;ToEYN DK%Ro9Wi`6YbpI0v6 C1bؙG7\a__w#=.j"yZ;|.rä21M6M^csCG\cVDPw<&\ͻS.FUz3G1zbhբ*< ,eCAZ{ F0Nef̞v9E)X"N2BNآ dtPSshqNA^LeEY ȉU'@7+%-Ne2Eqh:EF$SBHȘ0#H1(5Q;sǨp:[7c<pp)7ZzY7 ҟThgE.%40&eK֜TL94}?J떳疲?`~z:0wJ^ H@G9"AhœH4](Tg]V~B}!tDy!%zuؐO+䖰0M&+;C-ϴ.u"+^6猁FU*/ D afw0},ȼuiv̓pcxcx~lP:so.[*P-[,(/>/w7ŇpM@6Ņ Hw[]t^Qz`(SZ?FG(#7~2]9]{s"FSdX֪dp RSKWU85sc]7I^bQ$qzZ.@+.~$-:)DX-2aʺ~`( Hƭ%UْNӓDMOn*ha+ 6ܒysK*4T؛r `L|83Z04\fygPpR& /,6n)K Ҫ\J,!F)$DK06$sVDA`e0B:ͱ:XZnhF֬Jz6xam*t%S! VIV~/ߝ*=$-hܾdwN= hF=~ɁB!)+a~%J)E+eyLn*MdlR`u&OS,>\E0<cf+W(_fQbuRl%Na jR1s ]"xR89r1,ZP!t9u]06mcɏ IQ|XxFcM-O#w)1WE8[-TZIih^`!q^cM%U[D#:Q^*C p٩l?h=sPKXXKJWpwAI ɳwv\\b! C9af%1ָCH@U z/T4 XvJJe嚦_y{.B`quf`(\h6L:F :vJFU| @1(Pp"’V0̩(VDƯYlHH@'<m ѷD}&G"lw)"rUdڋЙ~q{Z ~ kq| u+ae, ;drS%N;[ (41.6+5ar8w) T$qH|C֯dEET> l1k #x\Iw/A endstream endobj 68 0 obj << /Properties << /MC76 276 0 R /MC79 69 0 R /MC84 71 0 R /MC72 73 0 R /MC80 75 0 R /MC83 77 0 R /MC73 79 0 R /MC77 266 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F14 288 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 69 0 obj << /Title (gr9.eps) /Author (user) /Metadata 70 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 70 0 obj << /Length 449 /Filter /FlateDecode >> stream hn0{ibȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7dS}`-?yR|vJ8J*K Bo߽C0}/e E'$g1 $NނGAFg(0_55zw])mۢ6Fp$ &[r }5:ys%,7eJ@g[ݸ x$#n(BJ(gqB<9r#&7\p ˼¤_OYPwt?K%S vA!X#w&A/595ÏVu4BY4}ȼޚj-?HXgz7 > endobj 72 0 obj << /Length 11578 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:00:59+05:30 2019-06-12T08:00:59+05:30 2019-06-12T08:00:59+05:30 Adobe Illustrator CS4 256 52 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgANAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FUt8y6fquo6Bf2O k350vUriFktdQVBIYnPRuJ+7xHbfFVHylqT3+g27zTSXF3bF7O+nmiFvI9zauYJ3MSllTnJGWABI oRTFU4xV2KuxV2Koex1LTr+NpLG6hu40Yo7wSLIoYdVJUnfFURirsVdirE9PsvPmj3t1JPdp5ks9 Q1LmkT8LOTT7KTYCPZ1n9PuCVNNxUmmKpzonmTStZhMlo0iOskkMlvcxSW06yRceamKZUf4ea70p uMVTPFXYqxj8wLu+Ojx6LpWpPpWva7L9T0q9jhFwY5FUzSOyEjioiicF/wBmtRvTFWRWcU8VpBFc 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 application/postscript xmp.did:0A80117407206811B9A5DF90B846B4EA xmp.iid:0A80117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0A80117407206811B9A5DF90B846B4EA 2019-06-12T08:00:59+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 73 0 obj << /Title (gr8.eps) /Author (user) /Metadata 74 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 74 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{IbO(ڨj[EI51G+$͡R4i[2&W s$4<1 LnMvC/Ͽqn[kKq4 6GQIs^KYz08ys.*nZnֺ HPGNYS2P>qʍ`Vt_@i] fz?AVg ,Lmza0ݘHkAM}AMգ|o\+P{ q]dZgMCrЁߤ+k:G"㧦>h]',o"3d̐2Cf yWE<Bɹq#_;{ endstream endobj 75 0 obj << /Metadata 76 0 R >> endobj 76 0 obj << /Length 11241 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:00+05:30 2019-06-12T08:00+05:30 2019-06-12T08:00+05:30 Adobe Illustrator CS4 256 60 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAPAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9J4q7FXYq7FXYq7FXYq7 FVtneRtqEUKfFXlybtspO2KpxirsVQ99/cj/AFh+o4qgcVdirsVdirsVdirsVdiqM050eFipDAOQ SPGgxVFYq7FUuu/96H+j9QxVSxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpdrOu2OkxIZ+UtxMS trZwgNPM4/ZjWo6d2JCr1YgYqwXWpvzIu7QyNPDa+ndS3kcNiGZ/qscX7qzkZj8byOTydUIqPskG mKs30Fna+tmdeDspLJWtCUNRX2xVlWKuxVD339yP9YfqOKoHFXYq7FXYq7FVG8vbOytpLq8njtra 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 q7FXYq7FXYq7FXYq/wD/2Q== application/postscript xmp.did:0980117407206811B9A5DF90B846B4EA xmp.iid:0980117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0880117407206811B9A5DF90B846B4EA xmp.did:0880117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0880117407206811B9A5DF90B846B4EA 2019-06-12T07:59:14+05:30 Adobe Illustrator CS4 / saved xmp.iid:0980117407206811B9A5DF90B846B4EA 2019-06-12T08:00+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 77 0 obj << /Title (gr10.eps) /Author (user) /Metadata 78 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 78 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{iȏ(ڨj[UI51G+&͡R4EWql)EϧxV"EJ:֕U)]tͺl%߽C0} /e  (> $`<Yx_߱wGߥ޹aܶ-j#d81 q"iǻ@ׯF'~d-lQh4.pĩJ.T՘"'\0a%wf3wF~kT5 >nWӻ ~]|~ܟ2.];(ɪ~)!z-數FC!aJW̫zέ1*Ml}}D鋁Z߇ > endobj 80 0 obj << /Length 15976 /Subtype /XML /Type /Metadata >> stream 2019-06-12T07:59:14+05:30 2019-06-12T07:59:14+05:30 2019-06-12T07:59:14+05:30 Adobe Illustrator CS4 256 84 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAVAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qlvmPRRrWkTaY8vox XDRiduPLlEsivJHsVp6iqVrXatcVY7Y+Vby1u9AtBqVxZPpdnex28NpLW3MKzQrbxzRyqVm9OFgn JlBrvscVT/65rtnteWq30I/4+bL4XAruWt5GOyj+SRyf5cVRVjq2nXxZbacNLGAZYGBSaPl09SJw siV/ylGKovFXYq7FUuvdZWO4NlZRG91IAFrdG4pGD0aeWjCNT8ix/ZVqHFWNa35Y1GSW7nvdXmZd etW0e8iFfqVt6/wxSQ2/IfExYxlmYsWcHYCmKp/5W0R9E0kaZVTbwTTfU1QseFu0jNGrM3xMwU/E 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 application/postscript xmp.did:0880117407206811B9A5DF90B846B4EA xmp.iid:0880117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0880117407206811B9A5DF90B846B4EA 2019-06-12T07:59:14+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 81 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0010) /Rect [ 41.82 267.807 68.13 278.798 ] /Border [ 0 0 0 ] /H /I >> endobj 82 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0008) /Rect [ 128.58 193.764 150.939 204.755 ] /Border [ 0 0 0 ] /H /I >> endobj 83 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0012) /Rect [ 234.339 183.306 260.775 194.288 ] /Border [ 0 0 0 ] /H /I >> endobj 84 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0011) /Rect [ 238.128 99.615 264.933 110.607 ] /Border [ 0 0 0 ] /H /I >> endobj 85 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0008) /Rect [ 539.484 57.36 562.374 68.351 ] /Border [ 0 0 0 ] /H /I >> endobj 86 0 obj << /Type /Page /Contents 87 0 R /Resources 88 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 629 0 R 628 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 6 /Annots [ 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 87 0 obj << /Length 31587 /Filter /FlateDecode >> stream h{[7{z:R_ymx]@CՖd-g_̪H] L2 ~qaċ˷/^-^|zEl zҴS*,] yroWg*02@c< %yFc*1V_wލFН L!ry^}s}ֶ[_zus<^};Le9UT`1]rnIhHWo& viOQ^_ί1tUJ{2^~MVSkwTGU\jk W ŗח'$ L ۇ:h! 4άN}_dhv>^# LΩc"!߯:q'Qun?8L.}8h5_vHea[}O ՙzҴeOzݗj/r߼9oW8%?kˊSzo _j_^@xg-u&:w\$_,]Rb&]=_tMh=]9?#ҳJćf9rC&q3d)Juy~4J^FaBhFR}Fe O(%! -/D?֗i,=I~:~);3@st6]߃>"qS}JB_V]˝͠˙ CrK g$F"]iCFP!c 琱PPY9 뺾.2DiW@KBC31/%9~:7Efxf"kC,\dF$Mdzƒ .z¿j|HsD5Ir !n9轨^Oh!Ioe5H\1G6VG%Hla2SMik$zL`:ug@M*;ڹ`~[ '9H _|3)dPy.+_/y@) mD[ ЊP $k-rx 3[Bք[<|dqPȚp+oG֡5斱EO< n Yn|Z­C!k-k&C5D!k­1:H?&Iu0dpt5yYK%&X)q;oɞ;ҴVk%F:,9dyK"#ؙD8hGh"J,Ku&bK#FxjzH&h"ZkBg-|NF,d=]b 0)Tx -~Pmy N : \ 4TDn,`Ӊ'Id;_YXS~E.Z<7'/[+{[TގTVN5KBeE\l‘eybJKQs"yRc+"0 SCK:BZt-FSo87v-,R{ҝ͌i77na4M?z˳4Df,A?Bh K!Kh%!KYYbeqWb+~O\4s_`I:/:EE]5Uђ:_[xr{ _}ݖ>n6"uuWs\]?XS)7g}Yd O][Ck1Oe5lfg7]9Փyn#喞F]OL#@sOܼ8nH#s)TmTjnoH!!{CB9}t܎sܜ8n6;nOۤE-Y:%q|?c"/@?E||=~B2ћsk].sh\knv]եVK=!D(-_]6D#:O:*tzdIRV\}_?YufKS( A%rVJӊ,IR/zI^QrRT3ZAbڣ hM.n֮uZ5m9IZ]s/c4FcVK/N/F%ÄL*vsBdV'j ".dû)-co_IOFqkДW?$s"viuqO)X78z3A.۲:i eTǀ4 l9tuXweEhIaucG}6(Jv[ۺ븎ݪ*DiuVo*:.^?Ʊ$d 6c*ĎD~x~d(}o92hӟhIƲ5x퓾kկNo' L5W:@yΉV~l9ՇA"۽fzW߯N?Y( ySDz?BЏߟ˄"8Ec?9sIzJ䔭#;Rf eo0*$}Fk։=%/dLi;rmˀy{ҹ罝coޜKzL/?7:K2 LNA5/ ը 'dK įɢãxb"skKk'/7ie(oğ%;n)rcׅb{D֪ڙJ.dJfD˞z;Jrn̷KCO-[JC,2 l%rp齤A_lPo'-rhll |/7 [}i*O5LL.8͢L/O'WF "/ŸHsחn5 }F!є9av; NN|О:tФK/E^OL`vm2;i?}=?=d' J63+EӳH="/c s:s@)ȳ"~$ZH*z$XH }I#X_v Nw=9zBS!z,zdR[!z"zؓ0{NqKҼ{=F95rv$I+}Ca(2N}XW?goU-'$2 F\^#՛rC@K捂 #XBR! -Dl0:& 1tibHNd-DTe&a<#yC4(wn-fDK~-j ^ P%X 34+P⛝>u^ʦ!76BVϳ$k-"̭C!k-K~q`Țp9qRDG<3Iɭ!k­%e I4E:BDh98n YQ~#r~(dMe&tPġ:4:n7AHք[Js0dMO<fNaYC 6#&vrb:ʢO\Wۙlt"Q@a@=}8[t8xEK(i츨ò 9f-΋ӄS; ϔykv$iÙ(킋 #^1"LkYĞ #iLC+MfFHxz\APuusk !G%6ib=ݥb R1ShYX -641q'r,}.M;eh@O_T8'ies4tm5]ّM W0~((Z:;SKԡB8YZX hkm&X[ۈA~t\ !VQB3R>qe-e-'3q6 Rg:r'Sg>k-m WH]!6ցb-tZt9"!̧40P k(mD訡2&lʵ!t@/-^/Ca {"m%R= әu@X!khs1(Q<K #V'% ^&i U{6" 6B;6J U{l񮩢yLf S= atvh*=m[Ð& €/|$K3MKh*H1aWLpf!] KP:ZK2lRrG'*F kYIʜg`[seɼPFi+ظ%S:NycZaBq׎p-D/`Od82]dpH/JD46{8@9A3_4[\H}m\nhjËgi"ʺih(OJy#CYi$DGգ\A* PGRc ,ͼ!ٔ6igbFS|KvbW+eFd6`̄K\bHJ%@^9X|̽sx'^,K*b)`? ֤4Ͳ2I*)'d>-$1 QY&0tBI[eOdd' l4(`OiPm9Zky[k$J( 4`}PJ8"I:MDi.i[ꠧXj7t*&E߳iT k3|B]1{kw0%fʛŭ b$ֈ¬)Mat*k ;-5͂ʙƐX[pMEt,u2(#-iK"`†Q(@yz'r1Sl{UؐWCO^*jt')efyt YpJ DƢa8`0ێwYZ9юK#X>X⊞W ' :Hl;I$ $9;ѵ-OWs֧9lC]#3%"v֒,lYnbdNE E ")I9Dt!cby%v,lU;wQy94}UJ+& FG.%Q=vHIPFVE8)+ȵAǔM [E2čS?K!ɪ31uNN(;*5/ Y>ǖ^D[PEYtYYMef Mf8TI- =k؟e& gbaPM8)ݺfz酽*=6.؝׉/l҂ɹ\(!ޠSl72v1_.^5G4׳J$_e|6k$ʆ֜LMsHK.WCI6"Bܖ3,)+RQ÷eE*75Νd[XWβ|ˊ[w#ɭ$\Ks#_$Y2wL巂o@яAρ"HAE?** *ApPhfQ?3"|Opa+n55FkaѪF juVYz#nl >ki·fG6qO CFoc}6ncAFN1G3 )ccx([x{£hlqq"Re"D1U*ё?Gsr#-hPX|,L %rS:B?/~$X}|>~`#(:G0,Ic6'F׮\/A*x1%;N\w춖l+;mٱ);ЖxTulcWձnX7UǮ:6UǦ/:nͣǮ::[]UF'ʎH}+C`d fې$"M+OPwikFKd ;F>b _\$6.n*9U Ord{2*!0Q9ٙm='JSvOv7+P@oJX|3&dN $2g^_u6PVmPO.Ip-Iu =X a2C:NvuTYK.ɮrVs؞ ;?+pORg wuٲ.ݔu٦˴e]ͥ+5]iTٕҮԗv*/JjfJ.]r승/bmv*])r.7*MqWhB[w⮡)j*bSG]̲ZeҮ..3Mmr -B.FDe^Jv3up5i +1)I |C!~tH"L/ۜUX#%WY2fKʰ/"PEuEԲtarX-(c4Y1rgr†i2aRB8f , _]2 0N@ a`eǶgz.i c6)@RET%a9Q\m""G6N3@b"6ɝ"9/m-JT$ w-FJ M²,S!}+w\Q$@pPg"f?vX-cЉ3# N2xdÊ4p-!P 9E-(p w52U+MdM_%^|YX׶IdTGͅgeSY$pm12’ )cױv$K!uZi М%y%Ya!-s{[s.b?řܓkO92 GF\HIKӡ>?}z#U$$IXZC\ϭQg LAw|tA-MAwS=*g5n|1k][)۪;2PS X8UǐoIrzKt+2R% &2R%˨C`v} ߗfGz2/Ӷmxv4%ji#q)E|G [ .Q3eBMd8-)lNe Nƞ+'L+Gj۔q ?JG-"n n!JdF(Y ūŋoP|B$ƈrHr 4fH;ۯO^__-}ׯ+//LdGO4e˥@뉘O-47'ymwëoiJ-n}jZ~xy26'kO۵⶙p G)eqzyB|< bqǀ6p?ݜWח ٱ…޼td ߟSWoOֱ˛ q\<)8ނ,׫ӟN֚lDOV7ӵj1X |D@م]K[=?z3wc2`9:n)W N ݺx itk٦MĒV4tOK [zj,$ 1]fvA'̿cy">_R{\q?{SYv|$spcRmܔ)MK`QӠp(noo_cF݌{7߯$7En{e27o|u}Շ%=&S~K*q_6i]|oꟛsR<u-qZ쿖WH-_B(;gzo-d|o9)i엃T7M_%jg1eT?nUrwk7ٌaTJSd"ېu߮Qd8.~j6%ZcmLyČvE#h&{Vy@2ѿ6\nWIuCʋM9~=d+(pl|;K"iCrkWǧӉUt/^_fgWZ7ĸ;3"bQEK~?o1T F]9c`a'mǿ-hC]~ iO )5"x!ʹ(?ƝRIi,R_\%6 h;6)t&T.^T[a*ui 42DJfoaD1~GEslnwKKPOi%a=X^i7kM )QH;Fޢ7jܻh\uHRGMLԈLw6$[FߢB BAǎdd`aϸޮr.Sǁ akc;C{+h~N7ޭl"*8b"P}R;Nuf†v2 mƽeILn]0w][u-MQ,ifaZYWE`Ht߽aW[IaRdz:qh_x^ Qow@ u=Yl-w3Pˉvdby.< rLkrCPYF$RBm\Rj$rk=Ֆ*/_VCE8C'.Q0d=>R K. ‘4ǛoȺGb4ga, ea Um! CAd՘M?MIVUyQ2KJ>6`P6L~coڻzh eK8'P]@(=ю]D^=O0IGI*4$7n(K.KF^Q ymₘP\Zb"kot]XL/(H00VV'V,ޤbqT,Ak('֜1vrx62 F95A܅)9}$XØCu Ŵ$IiszDxGF<򆣛QGiim$X?v$@HV0 =D%-;TVHGݞ.!UoI VËۨY`MooE®)>Lϒ7?>(EɃs&wW24]g JG<%/3t3S "v6yc㿷[鷓v0OlC?Ut-b!Y7෌?a1^)% hJxQ#"+4֐_fz@6!S{@9^&߃yW=~H3 ¶39.lDbjæм2J{_9Sↁf ݑ&T;o)ub1W9) (b4r&d9qM8M =r#(a퀸q/O@ fsZzl W% \! nUȨ!GwQNj:~ uD5h"?#d))'.˙N*|ngD+{S2R0P(E`Ԥ3ZI[H=*§vio$r&AܿJf:4!*"hMjf .ɤx!uh?^ʹ95p7 G6DI5{";֐;(o'͎7;kr$`4 uR/ OA G ]s~)s &h6?KGܿ^rZ"YT֔3-mː7VnU鰴Nj,9[!0_Kj&-x]L';u_3H_M z1'F>~ֆ5Tۿ_'%Pqvt*馷mߥ3I"I9q~')[er5 {x\!6?ߒ5>U.IpyrnCO^/B8^t4(JթbA/e-2|vHu w0xleCO#ܻe ڐL܈jǿ&OJGB롅s鯅3K3ҫ}j&O.[R yQ \?AX%ȹ2 72%#ױP4=+He-\Пu z3|_&CGm=Uh~%2, 8~>/kl>64B#&@R1;KҸegMdO$6(&vr.erqHWЩC K~8RQ@4D)nRa¸΂2/`>ԱGQ-R{?C; f5 cLRB5#&8ZHqmfYyͻLHNNf\4 !W)l($!^2@Z~L74Pr2<?qU6-I~қ׬1_@QbstI/쁐kT—a93jb 6)ɸ3Di.6pk2?6  c*ۗVe#3YûHWzl۔M(FɩxM9| lM%B$Lʥbx8Z pr!!C\$RY(%8(%|xX~j\H{cHR*Œg5<'%7[n=Xa1=h*a &\䐮 & +d\/PÀKH9 x`MJV>aaNCdśrśp)| q}x GO_,xΑ; i1yZ5 W"/ZEV'jPEVeY]j_E}Y*ɢ,H\<YqydQj(rXO/ ff-fȟm !"/eK^'[&^l&a#"P:n @{>ljETط\'0C#WNNBH3_kIÒ$dؑ L/\vMJP17h\:9a)!FAAx gI!d>~(܁4Q^uVrG.J+ǫYd` =K/,zgͶo7/;17 \`27$IRc~Lz*F` Z& $ Q rT޲rOcSOJ,wkj/dz-(* 3Aw!6uјYDcǣ!Н`/b/M|FKW+n-Wwq"6%AABe|HfF2e35[递WeK!.I$ yq)A$w1~+ǖ eFa t ?@:t :b ~ Nҝv n Pf ;gtd[+%my/~ZTƌ2\:Nw (sj솋|#:4i\y$jx夵!Y9`dPC ڥ0bǏ4dz$<~9tԱ_/d g8?ǐ 9Ǵ7}אּif&d̹;nڳ⢳>W=!K'ɏ|T/UKwV消IYnj1)17t BG={ydJKnDP2g`-8.<6I2uaQJB3/:q2NyBT::[Mr#X56G,&!=S'`{'ǘfO!{z=d/4A\ Ȟ̞h=jOQ{jsP{j=U$jO͠x~K0 D][+Y]ҕ|~]=ٹW 5ȩox{Yk`hc`/H3XVlRvm1vF0^-Oٿ @+o I, |I%G+]O2vYJ8ɨV0dBr&Ғ%|C$05ږ{|زC9-I)+{1€;p ǑLl62 -:FR.Q9LWƝT_1<Μp.TxDNHJ׉S4*΂:G~&Te*&<'^ U#^Y}:F}3䕑֘DU 56sjīO\_A΃i;a}eF osj+չP5:Lj\˕8;Lυ:3{uTxe1<v#tfKdWBՈW"#΄^"2U#\3Su :Fyu&T3j+3 WWJD!isƫ_NS՛[%Dg7[Iεݼׯ~}͇OWŷw~M%!-пfHvƁqc~{7:^[\_\]? P&"n&6 E6$x x#4)q$Rqxqmbac z ¬05'8#"8m+|C;7'ubixI2jŏ"XbHhYU&zwҗݤXj B\#7dƤ`$9=txAU{c?}\: Tcrb zft:9XnD }e3n(A4k퓮֍wbL]uÞߌ6>Ғ~ 7}"LCn|0)Y9]]94.xk4i~sMDe0pzPkOZp^>+SX ]0;&tn7#O|G,隽3ܖ9ז.#vlz"oB92^!ٸ}~"Ӻ1)g?77dggJ]@*K wAQB"k  }:8}T7)l]aOqdzc{yD7)Pv)L{Bٚf>V>1kYOu8GA{ρ?mn' +̙Qdob"h"82}!AC3r/6)jp cUإ-H5GRYNa9{/f@e3 XdDnxT7Qݥ3!ꎳ>OG5/(iSt|06$ t̻X4gq3 PҦ13?Q6R$ k\a^$&%Ԡd _Y,rdV`Zi "APBF.kc'xm"V0r2_tQF*?*8E1ctnlw9t\SRJ CC`IЧ*" rXOxP4(1f - Se#3XoO1ERQvx X7/QY7O2y˳oAtZe|gJ:|#U+9VFk-tj[K08jmEsf~owww ֬M.C(PW]=cNz -]c8]졋z]^mLdJ6?#+`wC9W( dW7:RAv*mѱ^J\jBRrJPtA8n 5G\ VWE`$ *lJ [6*lf6WUOTZzQ=QsJx_XϮL:+.C͵ R4vG3cq W)iɻz9 JqABՌmg ymcZ}٢8ON *;7_b+8(klCTr8Lrn|YxT8ή;_ _*uy*@ ||zխ%'Ugre:e27vylIVVr>٢sN؆tL¤䐠9Dd$db D.S$J>* @]q q0%]3 (|\ae:NU]FXfړ8oq "mW *S<Un#e[.qȊQT2!`-l Ot n/%3(2 Z1# eiDfD'cڱ<1wb!7SBѢXi 5rI7|t9ݒt?"ߒW 2>ʐ,i[&7 yW<[%`{<<^ɣFُpkHFHj_%ӭFJy-:\W *-k#)),1n!9S.ON<5G|(rcX!Defqu5~81AԲ t]BmGX=k>'Y.RW w@eg Fc3մBA r%pg@!Z8@(*tQ1 t 1wlgL)  M5LwgxG0Uo px9Ǐe$)v:FOxr֑[JEÁ2̘Yx6I#5 ɕk(\~ƁArYno;%<\L)]Q?3t*nzb: Ռ!Yֿ׳hn+vh*wd T%_4]r_\%E၇j턅bQ *5~I%GKS\0v~&2T^HEל8p?g'o.hĒ FV_|Q&x;Vx*}Qȇ#ڊ"k 7DF׭uc|C3aZL/y_U4;0%OyՍ< +h`U0s:nqMJȗK>Dʬ 54SyʓcR\}NWGm0E'Hj'ꔐ6].=LUA beΜ N$x+\ՆxYtx[9֏ 1W3%<9lImk,hǛ#EwzT G؎Ah;lz7}^=1Zl/>=t*Ie>:2ZI-}biD4rZ9Ir蒆uUr9cw -'ZIx`2}(YKtN5EV,HE7mjU G>"@^تT덨hMW u' SɠI}Ēi]u?˩@Gif4hX~t$5dnZ0dōi?>=n-kᄅl;ڎXqJEeEq]S\POEzZ Z\&d(r2+vi)^6$(Vs|.&;ձnm PP՛WMݛt}#EÉ]SQA/)7 LyGRհYV) pVPJ&FZnQ H,^Xѵm+ ̰bvUp /~'=oM* "l>=޼ݧO;5]h4<;vSF\EXR82~=Pq,gK$ lxszEڇl^uF?ǧkF}l7ݛ%P/B NkآouVuƙeKytJS{RKYEg+`軧Uㆾ(_4ᴴ8 S:WXݨN8Gy?ݠZ( h)`ņCDϣ^CݨΊPn"Fbf +NZiqbbCEJ)oty_,,\mGbWt6J&v5w:[|rWM,Mvr%_?58f}/Hç5UbÀ__?by룯 0KB,Ci(Mdlhtn2aM]1_\ho"I})_I)M,f!]{M^Mp+O8qX^q.49c ҧ]M(Km4Pno)[/*"'zz0VO2:bqrڽs2ޤFdqֱ!c8L˩rP%Ix$fs[oEfrf@Ծw ;sa~:lkHջ}޾Z}S"[`2(Y:'TӍqޥHqkNF5Qc>|98S^sfNљ ¶pyk˶_0qJw:1ޡl~Vc>6ÌE0!$A[NF5$-.9? T.ߩ`$Rкxmtufjr.鹡f4.K#/|U~J,[9[ 1vJt,tYbݧ]=Ml2xщ̑,I: zÇkq1hwe(' V4(-myj Hb4e摖Ų9wPI +uʖ=-Ҕ6:1l Wf;|#@&8:rOX -8Quuju?ɣ~C4ɱw-HdD+gG ϺSdB%2xmwio@ +Y\ 7 ``W`LyC(D QĢK :ٖr7Bs"'Ptu Vԭ#Wg̓Ope@z0 )Lg@v,, V.ܨBEzDrx åPU4z!!9$ IRCveKuwS/jV)jfB_*?W6 ]\fu /k [ƻUki3kp:Fy56Er=wńb.j) Zo7>Eh9^AupܒHB/$ s+Vv$\}wj!n#7)u湸B”[%$PY`S$\ a$)\W{K/_4vAsS=j[H_و|qHz2eUTg:L>Rt{r(X8,lXBz(5‘8nJ~xzk(8\L -_`iЖjg;W0:1e,!_bt_2(~ t6!a"PJ``R23KXxEwWŐ@iGiljFQXD 5 [B$hC2PGg6l]\( +/ r)6QȦ$LVi3&6U(|0+3bېqp1 tvPfW>Qy+e^x!@. Ǫ/]K`Zlʵ7A i3e>W Ϧ`v˺D: $m|TFlckjFow׸~Zzr*"9/%fjG-V э8r@!jkfZx}jonԲBH5[!De`LT4%g:1F+4Flv͹$xJeApЛ*ZSuBYe"Lp'V{ǃ#"էOP C;۬[5y4ְs 2 "9x~`W!sL*69 gwʟ&sՉ]PGwBH0ZLJ,=ή% \:Cj816RMۧjډ#OQW[C{)f5ngKQc'ƮD99*qb 6F.e54LUy]N{?ʠԒCAŵ5|_ O\z|a|=q2wԦhL*X!YXLmWrUe&{c%4k2G_rj0wcwh7^_jiDu`юnRcKngl bo ʶx7 mKHm M&eeέrؿwm;k5uoHoiavJie4s4}(Hvȅʫ\.N1Y"Ʉ0EoD3&ODӯٳV-y^ |rEo:jؘ3bb ]NiRr|e!Vthi~FPZ ֞p{;{++`Xk68דRRĚz{#TcCUDXЅ2ᒁ/rxD(9^_7Kb<j/mۮk'*R_nf qɦv~)z BB;CrH8Omҗo5|%." iJn!18q8)ٝfԙQָ~<`0m}v ܿ|^.#t;ZRZ t9spaC w޹| ;*rO\6ݺxi6ܞ1UA9$ԅK$}O3tvAȌF¾^ϩ0|]`B1LQwC co{\ƺE2! ZvD)Վ&~@2Yׇ7 !!L[x)jVm씑9yavTL^9*sZ 6p`2Wb =K:f֨(3ziZ&)Ιȍ4E0J^&.z޻Ioq52#S[Jo-BCxs,3ͩu㣼ib$Fh>T)Y!ФX_obrN]|Ǡ{ κ{1?MJA&v<xT*KTjDAs%Ӹ2yY7ER7:\m824.iv5oJyUhc͈J~D"eSSbN5ۙd]qbA\FXhFbZE-cF0s!U i6B8Ż+ Ps"s5F63K¡`%;JFʺK k;:R}M‰a:j~OUU'hZ ֌ԙ~fק زHV!yWDqb&gpI jCHDGЧitɅ]cX&Li W޶9\qipr'KĘ.'i.ǝ[M/ -L-NVg isE'NǔX(M}S :KQqG )4]("Er֗j.D2Lw6>=`wmA0w[u˩m*yt~h +^] MoGkAZ?휹l,}q z%vԊ%LbFUn0el Q/Ŀûˮ^E5:\XdYPuaz]1PEBh!FCo>$nZW/u;8=TE/cƾ72y1#zКݏ T:ʶ ҩkfɚ\1խ(F]cfpOay;}ݨ4J)P& .Uwz+:ʝ?<"6HTN aj\=ad>.>)lgQ*ff(jI :RCbʞ˵†˽9otq9 Ŗl9hcV R 6Cf0|WG-s7kf1Y.PL0Ώ:t](B_aClfH=I/b+$$ * iwb$JwY=f\Es4ïwMoe;1-4ˠ#KΎF#1dyK+Uq"h(iW~RP>Dzf+0ӶJfgHɖs+vcSO*"$)_ ZHA-))k*Ķg3Xߨ _oB*.*CrJ8#܈BX@%匦~)Ǭ~Qi:;B+2#3L+_JTwF5J7Tŝ؈IvpiC0Pq97n25n0p"F2c:_v2fAej:U--䱿??=Kl>eZ|"vO1Ն \=t1I36Yj8ˏOJ`Qɞ#jH<_Y1Dr~jz3[{Hdm~kb{ua⚾?{ 6<1u"9s]/G:5Mr[&g|Eǫѱίrlb;"]N㮌qV1WGzp!`/t 7pCf_kx9=YS ьp! &u?VR} Ikrar$) uaѥG+Y\L@H]L;`hP ӀÈP ۮwBmmILD+e¸KQ[٪ !ZPWϵS1NW(a#D"{ZXzѾ:p!]\cm'`2olXrc#C[*dvwƷl5PV7!|ۆL]`]l0-TCi%l(ܸTjVo];x#j9ŞO]lV¿mc#Guꜳ:طt?? 1 endstream endobj 88 0 obj << /Properties << /MC104 270 0 R /MC106 272 0 R /MC89 89 0 R /MC90 91 0 R /MC101 93 0 R /MC109 95 0 R /MC97 97 0 R /MC107 274 0 R /MC98 99 0 R /MC110 101 0 R /MC93 103 0 R /MC94 105 0 R /MC103 268 0 R /MC100 107 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 89 0 obj << /Title (gr11.eps) /Author (user) /Metadata 90 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 90 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibcȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7^[~*hWՕp tTvd {5`0q ^Xk#)ňIQHB&8:HLs|wwwmi$IF8ooʱ.Pϕܔ+mu2WO1r )*<9r#&7\p ˼¤_OYPwt?K%S vA!X#w$jRTsCT3h([KS%EC!+ܱW!W[[e>)L}}wx" d,@ tsg_ U endstream endobj 91 0 obj << /Metadata 92 0 R >> endobj 92 0 obj << /Length 11901 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:02:10+05:30 2019-06-12T08:02:10+05:30 2019-06-12T08:02:10+05:30 Adobe Illustrator CS4 256 36 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAJAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FUl8xy3CTaayPIt tBcG5vlhMnqPDGjKEVIqtJWaSMlN+QFKHFVP/Emo3QrpWh3lwjceFxdhbCL4jRuSTkXS8f8AjBir ZtfOd4CJ72z0qNuSmOzia6nXf4WS4nMcVadQ1s2KpXqP5dfXAr3GrXWoTwXTajZnUWEiQ3iqggZF t/qwWOJoy3p04ksa4qzBA4RQ5DPQcmUUBPcgEmn34q3iqS6vE9nq9prjXcyWcSG0vLVpStqsczAr cGIK3KVZFRORYAIzHtiqdYq7FUq1XzX5a0m5gtdS1O2tbq5liggt5JFEryTtxjASvL4j3pTFVvlr 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 5y9Tly5/FyrXFWQ4q7FX/9k= application/postscript xmp.did:66D25EB209206811B9A5DF90B846B4EA xmp.iid:66D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:0A80117407206811B9A5DF90B846B4EA xmp.did:0A80117407206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:0A80117407206811B9A5DF90B846B4EA 2019-06-12T08:00:59+05:30 Adobe Illustrator CS4 / saved xmp.iid:66D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:02:10+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 93 0 obj << /Metadata 94 0 R >> endobj 94 0 obj << /Length 19320 /Subtype /XML /Type /Metadata >> stream application/postscript 2019-06-12T15:15:28+05:30 Adobe Illustrator CS4 2019-06-12T15:15:28+05:30 2019-06-12T15:15:28+05:30 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUt13zL5e0C1+t63qVtptudlkupUiDEdl5Ecj7DFXkfmf8A5y2/LfTC0Wjw3euzivF4k+rw VHYyTUf6RGcVeXa9/wA5hefLvkmj6ZY6XEejyB7qYfJmMcf3x4qwTVfz8/N/U+fr+ZrqFXr8Np6d rQHagMCxn8cVYxeec/OF9y+u67qF1y+1613PJXeu/Jz3xVKpried/UnkaWTpzdixoPc4q6C4uLd+ cErxPSnJGKmnhUYqmtn50842NPqWu6ja8fs+jdzx0oa7cXHfFWT6V+fn5v6Zw9DzNdTKlPhu/Tuq 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 pdfTeX-1.40.16 False This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1 xmp.did:640632E82D20681188C6ABDDD0C5C135 xmp.iid:640632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c xmp.iid:630632E82D20681188C6ABDDD0C5C135 xmp.did:630632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c saved xmp.iid:630632E82D20681188C6ABDDD0C5C135 2019-06-12T15:14:59+05:30 Adobe Illustrator CS4 / saved xmp.iid:640632E82D20681188C6ABDDD0C5C135 2019-06-12T15:15:28+05:30 Adobe Illustrator CS4 / 51.000000 66.000000 Picas 1 False False Black Default Swatch Group 0 endstream endobj 95 0 obj << /Title (gr13.eps) /Author (user) /Metadata 96 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 96 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{iȏ(ڨj[UI51G+&͡R4EWql)EϧxV"EJ:֕U)]tͺl%߽C0} /e  (> $`<Yx_߱wGߥ޹aܶ-j#d81 q"iǻ@ׯF'~d-lQh4.pĩJ.T՘"'\0a%wf3wF~kT5 >nWӻ ~]|~ܟ2.];(URTsCT3h([KS%tfC”㕯W[[cT6^ '$wx" d,@ dsg_ hG endstream endobj 97 0 obj << /Title (fx5.eps) /Author (user) /Metadata 98 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 98 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0sib&h=lU%ګx7hw_>R_6(4?Hz`fb|/ ؈]o,ߖkV.t> endobj 100 0 obj << /Length 19091 /Subtype /XML /Type /Metadata >> stream application/postscript 2019-06-12T15:14:59+05:30 Adobe Illustrator CS4 2019-06-12T15:14:59+05:30 2019-06-12T15:14:59+05:30 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Al3/OWHnPzL5asPLf6B1W 40ya7luvWNtI0ZdY1ipyp14l8VfN0v5u/mlK3JvNmrA/5F5Og+5WGKrP+Vr/AJn/APU26x/0n3P/ ADXiqun5x/mqihR5r1MgeNzIx+8knFW/+Vzfmt/1Nepf9JD/ANcVd/yub81v+pr1L/pIf+uKu/5X N+a3/U16l/0kP/XFXf8AK5vzW/6mvUv+kh/64q7/AJXN+a3/AFNepf8ASQ/9cVd/yub81v8Aqa9S /wCkh/64q7/lc35rf9TXqX/SQ/8AXFXf8rm/Nb/qa9S/6SH/AK4q7/lc35rf9TXqX/SQ/wDXFXf8 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 2Q== pdfTeX-1.40.16 False This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1 xmp.did:630632E82D20681188C6ABDDD0C5C135 xmp.iid:630632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c uuid:5e3f2700-f124-4776-87ef-9b551abe1679 uuid:f635612e-74cf-489f-9121-637e1eec539c uuid:f635612e-74cf-489f-9121-637e1eec539c saved xmp.iid:630632E82D20681188C6ABDDD0C5C135 2019-06-12T15:14:59+05:30 Adobe Illustrator CS4 / 51.000000 66.000000 Picas 1 False False Black Default Swatch Group 0 endstream endobj 101 0 obj << /Metadata 102 0 R >> endobj 102 0 obj << /Length 14444 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:04:22+05:30 2019-06-12T08:04:22+05:30 2019-06-12T08:04:22+05:30 Adobe Illustrator CS4 256 52 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgANAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7Vr02n+fNJvLPT24tY3M tpNBdxrJFMrK0MjxBPWBZV5tE5VuLLuuKp3ovmbS7fTIbfU9YtJr2E3MU0sbjiTaD1JR0XeKEqX2 2xVGx+bvLEjBU1O3ZiYVADjrcjlCP+eg3XxxVo+cPKwjMp1S3EYjaUt6gp6aSekzfIP8J98VVG81 eXFkMZ1GAOryRMvMVDwp6ki/NU+I+2KsR88SaL5jhtBYahb3LxDjLAT6irBc8ZPrEYH2Z1EFIX/y mUULVCqfeUvMpv5LjRbxzNrekJFHqlyiBbeSYijmIg+I3UgEVG2+KskxVKdQ8zabYa3Y6POJPrOo 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 application/postscript xmp.did:68D25EB209206811B9A5DF90B846B4EA xmp.iid:68D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:67D25EB209206811B9A5DF90B846B4EA xmp.did:67D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:67D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:03:15+05:30 Adobe Illustrator CS4 / saved xmp.iid:68D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:04:22+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 103 0 obj << /Title (gr12.eps) /Author (user) /Metadata 104 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 104 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibcȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7^[~*hWՕp tTvd {5`0q ^Xk#)ňIQHB&8:HLs|wwwmi$IF8ooʱ.Pϕܔ+mu2WO1r )*<9r#&7\p ˼¤_OYPwt?K%S vA!X#wDHNfQJ(fC\WcB81;Z|lR6֙^ '(L/>j}'7$DY d,_AV4E Gȿ_ endstream endobj 105 0 obj << /Metadata 106 0 R >> endobj 106 0 obj << /Length 15644 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:03:15+05:30 2019-06-12T08:03:15+05:30 2019-06-12T08:03:15+05:30 Adobe Illustrator CS4 256 88 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAWAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qlPm+zgvPKmsWs4Jh msrhZArMhoY26MpDD6Diq2PSdS0+JY9LvDJbxAKllfFpQFUUCpcf3y1/mk9T5Yqv/T6W1Rq1vJp9 Otw37y1IHVvXTZF/4yhD7YqmcckcsayRsHjcBkdSCCD0IIxVdirSyIxYKwYqaMAa0PgcVakkjija SRgkaAs7sQFVQKkknoBiqUfX9Q1X4dLra2J66pIoLOP+XaJxv7SOOPSiuDiqh5d0q18v3dxo9uZD bXbSahbPNI8zl3YfWVLyFm/vGEnX9s0Hw4qyDFXYq7FXYq7FXYq7FXYq7FWpEWSNo2rxcFWoSDQ7 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 application/postscript xmp.did:67D25EB209206811B9A5DF90B846B4EA xmp.iid:67D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:67D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:03:15+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 107 0 obj << /Title (fx6.eps) /Author (user) /Metadata 108 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 108 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibH6h=lT%ګnК#Z}B lPh*U9Xx> endobj 110 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0012) /Rect [ 156.192 298.56 182.628 309.542 ] /Border [ 0 0 0 ] /H /I >> endobj 111 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0003) /Rect [ 42.621 235.792 79.56 246.776 ] /Border [ 0 0 0 ] /H /I >> endobj 112 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0008) /Rect [ 176.118 214.869 198.333 225.86 ] /Border [ 0 0 0 ] /H /I >> endobj 113 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0012) /Rect [ 134.331 193.944 160.758 204.935 ] /Border [ 0 0 0 ] /H /I >> endobj 114 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0013) /Rect [ 240.747 152.103 267.516 163.094 ] /Border [ 0 0 0 ] /H /I >> endobj 115 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0003) /Rect [ 459.645 235.198 497.385 246.182 ] /Border [ 0 0 0 ] /H /I >> endobj 116 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0012) /Rect [ 301.002 141.051 328.311 152.042 ] /Border [ 0 0 0 ] /H /I >> endobj 117 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0013) /Rect [ 340.935 99.21 368.406 110.192 ] /Border [ 0 0 0 ] /H /I >> endobj 118 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0013) /Rect [ 392.208 99.208 402.957 110.197 ] /Border [ 0 0 0 ] /H /I >> endobj 119 0 obj << /Type /Page /Contents 120 0 R /Resources 121 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 627 0 R 626 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 7 /Annots [ 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 120 0 obj << /Length 31873 /Filter /FlateDecode >> stream h{ے6{O3I۳D~(R뢩*Y}/=$&$R6* I~yrO/^|cWr3[+gJPzS;eW۰zys&Voj!~qΪY_yrqV.U|T@J[o]%}\oLu?~ bﺭB[n%wZZ=xb]|XJ緯{ȳQ=yiWkjS%dmRvw&.7 X::!azQZI +ŗw7k$}C L|/%<:? Oy oנj߽x>R۝v `XauWP~c*(UCbk'j][̤l;RW)! 1>naAT,^5*2OK{:0o{{GqVAXif2-@3R^>~ILY>o5Ⲝ Je<NM$LOe/;٬{i_>S^L0g Oa4ڪh =hFS(c,R$K-#6"hHMgM(K ŬֵC=At",tsARx lCUZԑ."f K[%{ר%2-1x<=14a{~E-]{|LaVWJX]y9:'z贬ջeu}յ#:OtکTq=!8]+U&9FZ MQ5wiTz)q?QaF~QS95hM)Lfх_ IX2<аⓃN,cb>hXsq[lJHa~C{ii@ %}@i}qzĐp"v:=bH/CP_4Yoj %P+|)>sqLW/0P(-v`DŽ#jP8 WGհ&>2<z@59W0Ja>T᰸:zB~ڟWGP}ڟWGpyq@ÕȃGՠl?6<zMX WG anesC5layWJTmyPSˍ ha˙{=1dl X=lE)樰u,` c8X˭px,` KccĖV#xOEֱ@ÕWȇG`oˑр0 t\x,`?F:%@Õ5!d\ T:6:FaG ְMzd:%:F.|vzqG X#1bãk$|d:u`ؤqZMiֱ-:8Xa&Xa: [a2u~^mjۡ~@ZJ15:k5웵ZVV djҒy)Q;&qk0"t֮)GlR'%$(G-l~8EJK9ؑˇ`SߕX!Wf ~uls8? *4'p"w߿}߷/~iI@[ ^r?ιOLYwּL+]ϕM$:/1qm^8$lԈ3 [Cm;H3 44vFs/ŭTѿV45LgЊģR 0 ,$Qwr+iZE4 >N3 Yy=-HZQ06m#dQh3ZI Ɓ7ҿoXt@#}iH綡y@4ڦ4Aԁ5!ϚtqH .MpF\oI:Eu0QmF_ I\KLOCXȩ#:V.&n6Rl2j^,Xj4xJU3g =T^^=r5e#q̄$¤h"Yy#%ӭ\{56qM -ԂH$ IUwڔgx@M*MoɚBɆ94\y:R|^Kd'U|nij[ylFI6Q%9IM%$iZ#ӜDB.+$X>xBXX{I*])"Sea1S%V* 0&:N4<",Ip,Ga8:PViɻ6c_d) RRy˔ _L> _a'!DD4d$Xf$H^n"NSdgski= = oL(a7S& CgYZ0~DWP'$4BHś)- /I*!jCq<{4e6@Y#h}WjmViˆCBgܷ4CcT$i.7 qsP! )TC$tlnp(Q:qICE'tԊ&Ҳ) j&]|xK"FIbZ;$$kc& /,N"rkՒ!wG#]3/&2 N ]%ءd & q'Ehp'QFK+6|ZW di\&mF8ĩ|[M,)_ ^鲺[ܦnԄTD[.%*4X /bYˤj|X Ґկn=e#1Cl,"$*#`PnMcYę#<<%H;1 % z 3I%Ilæbt>E aS)>53,.  +X\fO%'%&T&{ !XA]aZ7*4Lg*ZC(M1ZIv[SF+x7lV4⬙hUYi&p3$] +v*!f q+M6$;L8 sёƵ43фl=\)hGlf@2 8Zoq&< d6I+1*Xv^Gd;:Zn夯ɒ9Y2Ԓْ%97o\ ,Prg9D8NCIHkXKvLt3x~$ 1Keb<'nI4d;xP'Q*t|8#;N8R?4ަ򊠗MO:>@q'1)!5?nD8HqxIXtx\pytlUx$b\J8di-E.Z&Qrz2Q퐉'|hd.d/C!NY(\*B,䢘'U.HFrNj2<"|7)oE )+Dߤ:|3c y 'IŦ$ b>B%.Y/GqSв|ՑH!i6'@>H[Ong-JOU T U WrG*Aن :jc- _:0t 3ttfQg:66a]%+ubg"9 ɴgNcT;4tD^{1,!:e2Fϊ&>{fb_i&:%ěa# :h*Y%g+MPA7r}% T6P3P)H6bYv|36M\ךr]!7qj$KwKHϨ! ZF8BEIc8E+WPE0 8C!Ay."7ꂪh/q!*mTdtQEb_$ h3`%1Bi5F#fmsk[ߧ)y.88f, ¨z2*@B 6`` {R'qE\S ez]Hz]:˯"}_W;6ϯyu73"ʝIal |Y^gy)U)%TREbJ%Bybe)W&ܡSf41ĔSʓFyb FSz41eĔzBbJh8DIԞDDrv7-w]U.;}V.rq9R/~zqՋPTЖ˼dq_8CW2E8 Hxky'y|2}^z] t#gurPqb.!YK8sbL\f,R::v۹6MCg)i}\nt{xݤ|hR*C\@D雚kWTL1o@Rp],&b8^"hXJ2z`AyP?4#Ib;V^ bӬ+0,1(2iϭ"c[ۼ|"cy*cG1<*c(! anʋ-) QjYp-{ (D8?^ 6sERfzM ![8!ita Wx%ҤrLɢkEp:ѹ1!91R6~țG'ݡ'![H=]d,/ܣtve#nR(!rDBC.ոXWb]F\##(Ku;>hJ:>{r\>oXB=OX%XX]t&x_//8dyȬά/*Owc 3jY. g2dOdIP3P7z~G?.AM^y?(ACζ#TUvuB yG(tvnC^C(hMChmm]ݓyx'W`0,5zX6֟RTYU6bfXIWX&Ċu-ۦ+Nvy։NX{*@r,4W&q}̤fv/ V(cSR (VX&o2܈դO.KۉEGڰTj]Ko #mXn_OSi۰AemX۰tjR]^}ڰ8xןKX.kxSi5b"%ձ KiŠYA/3uԲp'sJ9]cw,kXplX;lְ`ˆ;a ~fÂhÂdѰ GTѰ`a aA85,8?5ֲ>VmX9X5Ko>VuX=P S~~}9D}lkJZNdJʔH;reȲ]G-:쌎,udю,5ڑe!Kcv,ڱ\֎v,+kƲX>E+Ē{wbKXvN,9҉"ݔ;P j aW! UOWe(2CQ E䇩3tcun:C5pGǟTf(Ϛ>c͊Um)%dfYm-.F.kxlR-͘l3`]<xmB ]M8g&25O&cy@SZA,){R<6I!X5]HhzkRHɇ5a"5ŐKmBD!YKqXܲB. ҢN]@Yd*"<UtYdq]H$%ހKADD<,6 u$ pOhVNͥ\*u |gh;mhh3&=QYby5^(Pmeq,lY(P WT31/`V匮WrFQz˿jѲ,gy9+M1/vE1]3Ō+fTE1ʋeWjTԕ3jFT3jF'3 PL\LBL1eFŔ_*l!ŔSr9e3 <Slڮbv1mSd7y>O U(=OvTT_~'K ZKM̽Tx}yR!/ zzK'|(軜T; /褚N*C.\N>j+Tݣ^^̽T_ m?~Ԙ!?TYf2Gt]eUR_B"e5]\15y ҜB4qYfh>`7 s̈́rn5П^R᫗?I`TR˛3٫ W h_~w˳eߋ/=^ݮ/_o7q{wFĥFFfP(cYMͻ9Gj~ny?/*x:jTmޯYL,b7k4Hwח Rv,E;i \EK0=~XKWBW{U^Kd5+zU$BuP\͗w QIb,8I3BߺMw$^|b6ޖˑ ~E0pv*ίoǷ7}Ii_ܽ, T -R'\o$* \[[~9Vﮯn`ʹ&u7n *bS=Ak%!:/9:v'`(%-F`!n/׈@ (?*`3T?$V=W}=eux_ba*AEp^-$6W;\$pCI [^XkY>*%-T+:EQUXm@9{M$r+s^a'ouDⳏŃԶ ArT` R49kELd5J4j#gȴFߓAW7qQ軱?tQ3$ez sdt+ ( ʿC5R>1B\* z?z (cj+8tfM&dJ BPnK$CPvPo\#HTwh5,#1A;m0ɘVi?\) ^π{SQpA:? (H8s m |,΍\o8q| x*p |TIvPZ $ձ W2pg( C)L(I_i]L:prJ [9#d^@n&B[[)]5ARz6UO(c7w~suۏlq8DK Y[;K5rd}A]h7"Oח\'F [(! tz5=6'Tyt'C_Ҡ$ohF6~ t>' M, #达<ڛkh9!P91;$ ggLWջﻻ^oR_5VEKWj uW|QlZe{*6hF~ 6)M0lC`i6SS]5IP0\\@PG>GMAPHEy5 96O~aHGM+>doȸl#yV4\zBYEl o觩2)D|_vRUuαՍ}6-[=@ Y'` RX!0-)${*T]nclZ_tp.y$!O|2X@$EzNujmPv3MzASxLA ~}=iz=Nql ~F7{zmqeWHMQi$.mmmKޫX_դ$O?S[p-Ϫ>Xs'9ФC@qH04"3ux0{whFpp{G0_@T= < ۮ6&T` Cb:@>P"=dճ "jm%T QaAPc ɻZAt;C#-J(C{=p&S0BӣtccjjK>*[>ʖꔣL[{~#)4Vjyh t*~:4AL u,!kYQ(cLI7ޜU̴C@I+23t j*_ejV=4/ʋh(mE3c@nؗRI$׼ێ=ו$ %J$EΗƜ1rm-tX7J>M2]o#qܟQ-N(l陑RGҖ_Cuq>YF %Tibژ ^ԫr)/[N&ok 霥F@N2W0o2jgkI-wΥGg+[f "+śsOh&n?tXy7wm%є%Q#Ȱ~%5btʤڦd*Hz,@,}ހ0.f lTT1cmHͶcVW}zZuvvuU>\[ Vؗ(S;Y 7|c Ø}9]JftQ}ٜ"f#mA s W7-,K\MFj,9ŷ>GV{}oӝK8PF=Ltu ( :|Y[u^]S-ZӢzRY~z@ޥ-u Bă"hh;cFmD;m5mAڸIABmGPOaKL? G4E#oQVY9օtΚ*u:3놩$] .6gbw|R7N@mWsJQ@B|5SӹGjr{`r!z$ubvZBNeO ABFۑ WqQ 2j.`>CP=1pZnJdj%Bj R7dZl*y\7493hPt9:hB NX&%7;x if+SI5! SIw~} yʑˑj:UEJQlf ? -ҐpV/~B>Qq0 y8~!ΐT pX.f8[ "v:pq(+5Kn*PbHPDRNZ%%|voi$9μs t2^3Qf) Ԏ=:5% ==h{/* i^xys#e \}e Iֱ);Wiix/zpl؂)"珅?aD>9뛅X?g1=7N|B4)-$4r]7TEɉ)p"O?C0"g`R5 )A45f6%s!ן-ݒ=wYꔹvv lbc[HIaZE:뽋s՟]}*l|+m2$=s̚2_K1X集qʸvm9T*Yaop̿CiCpWVkciU=l*1%ѯj Y\黛Zi .8:Ti }3ZUUN#`Imb*AdF%Nv]JsU&7\P2mOOӌ.)-oi5̴.Ԝ=}71X(WQw0fϤIҾ{|7uRGD=gvTu;A.Ҫlw15Awz3n`&C( Eﯥն>T497SľLJf\r9]-37F 1kn%) ԛ\Q&9[NNp3Bɒ#AMs!oڠU?>㠆eF}1@NҒ糽Ú#1%jqrbL>sE`}=#7cHڥ'4Sg&u<&*=|9=,l'0.חiÞ <|Vg*Ė׬ K~JϾ^ɮv9zDu[f8NgHDhNՃon`&WOT_3&Q5f[=?>bc_ E@,Z;9ZA2KsU+ H2f؞\UBzBiJtK2tDflh&=R N ַ 08:Cgla7N(?.YA.3M5/PCuk[6 W h1qH :c뗫.t_Ms8J9!nsug_R ^h PBE|nQXʀs _n| ,V:NW\ɿb؛5],e mz@3dROGva1#ՀT&Dpl FuB:XytrsVgt =W߹vɛY zq1G%>,g#'=t-}ޚ@an\Ys:vc|v#QzC ۩e jUݟV kC=Da<#`a'Wz;o6gL{~⛆.;G*>$&*Յ _Ku JzA%13m=jg!:֕mx@hPpAa]>ٵoʟ3*q̿[ؘ>}C.^ ڪdP[hy_P6x³Gh8\U |o;kE|[&9[hQ`^yGi+wٝ)g^:#y!n},1)=5矫7֦(v\xiͫޢHצ;x`itTZ7OzCKWNÆy==,-F߉w $[o5B3np 9gk1kiipȱGLi)?4mFH9rP ^;Sk?T{X5#$='lH^9p8TPUcIm7-FrqD?|3R jeNK$z@F [̘_~=Сr]H/F n"1cPZ]qoʝw1okCBk! (tУK/54^M?31o,xնZ3t `^UkK9V#ZQ֨soT= {:{\Q5͔6MP0 &Ic KJ.b=(nf UϳWX2wA4}Q>"&[c`d$jR)>1Mڝ6+CH"<]2\Jq B 쑤D]ӂןxgAE 4UVy@' Sa7Q&A.bl7rN-%(]Sn&`Th(#meD{dEVzh-wcM,i{"Bi~xx)5yԺCe {gac 2TnWYqHc@E4dzL1 ˜cPk:%9 ,RSY# SmƜ62\U^ Ty6UYQG2Up$h9P9/Z&)B}QOQxTAbfNv]yj-pҀ%,j[pb2%q(Ҝ_lo-F1 ƤƟPWY BP]KKz8_qp'=?ÂN_p(l5-q;O 7NΙ}j{~zѵ\urr,4<4ocV˛Ȯ>l={i!c(~?7o-0SBOC\_)ugSM:V XߙⰧcb&5v; zi[ K K2?>-BD pHX9]˃4,8ޅ4QIW@=[%za[+ }cD 0cЦ N_tّ/POY%#LUۿ~__v\m,PCt7#y-rvFuko!刅$pѷ^vGIӣs[7 ~Ko3E7Ȓ&@;y{5ݺlB.\NǓNqzDwA846Sx4U"$cm$œVa ܔ45)fZ N(_/i bkRU8)Mf iݼsƙӴ[|\i`cG`8U^V]IOW~=vY+|`K7tFx* 7,N4a}2b0t8v=T.QXSf[<~~<뻋E ⠌_J+ʭ97aک" ǖ.Ms z٪rX)qH9ꅂ}fxuH)邾>,!{Qnw{nv?Ly%}DBc0pîˉ ?krӣꘛV=G\DG`g]1sHÇ|iV \m-Ȱw!,v6 mqL' q-L:} /}vƞ݌eCEظ|A/Ȗ E{rR?[w7# U`*ZhZOrSuߌ-\-/i+ g]#,2l}I'q_mVr]ť1'ݿD~i$3|S_ŤwٻV/ }?@#0nHa H[5=w~TQ]ݞp/ i=}4D~xK [r|}e]kN񓷶S3>dV>j^aAְYTΐE̾O9%k7zS(_vCfc˜.&Gg9ą,!*9s .||B.{$π!&6 AC+N9aݰyT5Q=BF*:mVS";oa-J:0#HC}eH'hc t־dŏ;y}6^KWm}@h ?'&_3bC{Z6@2eO?L!By^*Vtν/_ 6! i,ܮcq8zX' ñЂ?4:/. BժS('] (8G =|o#%j|ɠr_8k,jn5 a,fL3}M& 卮 7OMEގGAG㜑cOw$HԋN8^G`[%##C [ isڃ,b~Vr̦і,5)NiSeB,_oٮJ#{A-;&6:L%x{ڜ+sh;^XA"6)\")Hj)#reNp u*o/X'qE ]C-̨}Jsjdm_4ZxN1 }?K T]@SA[ !VNM;B bKY8/zGNXtb7χggKfi k*1trNS]=!ש0;%qC)Uj0@kx# ZU>4U-w~獏 ሏ"!m=JwW훆lL"!RU4HjLXfpբ߲LjL KƏ(J Z .]YLX`ɻ&Cr4znf$(yf$Y=8e MЉ xX5Ӝ!տ/2"ie̲I+6@$W";clS!ndu4%sD`.ͰaQɾތ)Ca?]Y=?ß}VAzlASAW- U<\C萐RyWmu.M_r8JmQQ>h6^b@ͥTKۣ۲ @AS>v yĐˡ-!lHRU7ǞDjd$q9']"_u S$f jF=jVߐ} ivv^nNcI}X {az[H99_V-֚?>~ap:Yc?0KڎfxTwUD͹$&|GsXzi><`#3zc9(J__t qFcuD{E6BEK'[v!\E6vw=[a5VcɸY3"f 7Miq ղr^ΖS4}ɷ̖-abv֏%=qM OxxP9:Kc٠}!|aK4x.)C=t2r'1[żʶLem0y8nֆSˆU݈U]#;k!H36[z}5+3zND iN&{y,!9_`s'%_.딮x.rw8ײw;8XUf\ ] 6{~@1|洢u:kkoWoo_??o:Z_hPfYL`*gm`G4F\cǻnw/LJ2ra1S9I0棼j#H9qzF|C/^Bg*}C0D ˉ qowPaxMI?L =U -OWXp`rP_cڐ*/hqḿ}"kdܸuMc5*ѱXR% X7M#Pq]x=sKBQ#zF8T5rS5Ӳ\= >I#I0lkyC_$|H_sw,hB_~x8>9=p`ޡ2ِ|1lHntA#4老4pyN40N?Of`cX=A粗V@:o٠͆ 0"Xi{ư3?r7&Z;V݄e9qNBsJA̷`:i|f1 wcѰv,69*n rX"*ȑߎkpu[oF9&QAoɈ*o?huZcՉ &7}lL'* >%$`|(Bz a_+Bkw \iM5Dqu\#吰]z D\e`Lu4ɄآzSA׊=qRV[,uCjo" Yq9Dka4qBS)( DSJ*'}0opLp:.(U&\S~3thRǛ*/z4ZTxӫ*:2g9&úCSΰv\/Ն.mmq(Yk7|SOALָn`a|*]f 6w8bFoG0c v>Ձhi#f{1 [s◗ongS^\M5r6]aes[˷ӄG),} 6R8H&PВ΄˜]q0cٙyn3֝ηDo,1.޳*C`6lZ;AWix9 ]_'TVEu\[ž3.sKM_ ZXOUAH.u=(w8&mRϽ9!b `X( ,\+Ց 6ry6TjVU.(^Y@sW +|͎} F Ё1ڕײg is||d Z VtfBsZSN aEcƚŹSn`FwpFeI31ɘ ]`N2gZf2\l D>;0BŀED#q5U<(j,h\ GA C0VyL5;nKk?2薤EkWM_8 Sw@r4^ym)#’x lSs9˾+^DhyEe@KfbtF\v [zN ց'7{ l}j [`S+P.4X_vbٿ$gJ[\|A+XDFn9S7 Bݱ'UA5~M6^޼L|KpSSZ(+nOMRGeR FhJ2eSӌBwZb fzp7s,g =ʏ΋3l/.\ɛqܣ]5*03xL[}RŖeԣ7zN ,Õ$:3@ qgac]=HCP]({\8YD8HL鍍2sJUaE.H0pZq7X7crި׼'[{|ߟ5M!N3 u8Kli9LVcXvM(z?cזoQgNL# Z,-6g_]M}1-{>7b8q'3JY o6gVx7FkhCƬ1q-NipWGK!N.,D\eUq׆@FU>2yvu/qDukYr8{~oBE[^0BFhAi;w~yp+̍0T̪̓yr3˾^n"r,oʝ's c _/k0Jm//N&=]1Ȑs5H pf!'| (c1rO(7ybNr);nFi֐I|60\,kRLmC kF q걪^Cǧၟ;v>Ʒᙓ[Dj{S@"`S>+G :[>;r.Qp8|ʄʳ[@݊y1X\{)vCOO>4o0`x=8 [n{y+"i$_g}=uLeٲV}zecFoB9^7+FaΛ#?TZbfb\/91L״Sr]B`O cr5eō2;jv{epUe?LHN>|@wB5 <~:?;m`[/ j~=cE\Hwjc;<dBhQJʤ ԟV-wOYB]ՄC@9 &ڥn~Y8r>O%C=ؤAȚ0W.4إS1 Y\ShՎpLy411jiO uǸtW慀t!x*麧 >#ۓ`\GK24k-?n:ed#Yp!K5›KӠ^Fn Q`k"RWQcqF=K6Bil&eJR1=F=RgӘCw͑3Jd,AaKd y|2&b]5 LMKg܍'˚VBήd$ 8<%OE~eDb#Trt_TjK_.x)Yeҹ:&L6@Mz.Y |*W Sd1PnT/R )h7M@b%+P5V-XY4|vŅtsM HP”]@dxkz<g~>8tD̾>bdpW"k 65%`z *՛8dGJ@ĬC(Gz.c!ΆkˉjCiӋB'ˈr8MUa!Ky-ɷȆzrWR~_IbŬF<&oTST%ΐV͎yR^xtT'1݆=Y)TXa ȒI4u9( DE1t^WEߌ R2im 3K srU(U&\ Pe\XYʛU\HsGxHeQmV/6&?O5!@O+ 7) II{@*[~+UdEdvr<܏rܙV(j8'+S_F=t0%_nzX舳Vq4FS)J6_0B;A+?5Dw'e}d2a&Cm:7J]}q_OV(^w栃P=z{Oo/7r!\-yz٠4099N!8 lHKAYEe-P;q9Qmn: @#- Xy8>.O k ONS?I19DH!%'x$#:Obk-ZkO1]%i'io(VKrI;wƴZװuƈU @߯7% e{c1B7-jhLMP/~7t<3PiFqjPRܴɐApufa 5*qWzx?v/FxBrTO͛P=><1|92\yˇ![-6_#VVy)KH/^ Ȗv)s艾,A6??^XښPLa` J6t,߬yp! ̌I:(^{Pׯ@:1[W Q /N;~(-Ę_:-XJ ۶d>LldFY:BuL?$*-gNgoxåODS"P"4Zg[A,P۠lG᜚ȨkrSkVs˾Hhdz@&qJ\r oAS26qd0YA3|@c2E adtqLbW  L~|M)*IXʾXmXTlp'7oS P>G2|1%diѣ!*-.eO1-`h ϖggnºGX7xsa lw귍ѳ*]pe,)M')E1]Y[ +Y3~nJ[)٬vj4~14|Tr*5W:Mx9fY̟79)e>J&.U ʞcVZ7O;?.i>4H%pC]-җI_˲\P.ap7~Ё%k׫.^:OőQJRt$3Mfkj8AqWS|u*oWJA_voOŌBJ\HgER`8"qCգ+St3*ncխ]Vt:dIjn![- DUr=a2xq]vf8{16%S}OʫZ q:٢PI)y@dy_]w?|~vWZ)/tKDMw6N 鬟+NPL4r~vCyfptS8ǁr P(NK۠Q4rB a0lUaEǾroFwLG6&^ϧLXD{N)7z'x^E;S2o~SlyD?otچЗGZ.$:'rEWi8't0ˆn"t`0Jn\ȁ2h04S>g9x}c7KEncvt^.f WPouV*}FZ(@N.XнoW;SKEn`=zu=O9ry>_çO@$]>o5F/ ct$\0ed5C|x_> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F5 579 0 R /F15 126 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Metadata 123 0 R >> endobj 123 0 obj << /Length 19485 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:05:28+05:30 2019-06-12T08:05:28+05:30 2019-06-12T08:05:28+05:30 Adobe Illustrator CS4 256 104 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAaAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9DWv5geWptP1XUZ5zZWG jTvbXt1cgJEGR/T5K6llKlthvX2xVMh5j8vEAjVLQg7gieL/AJqxVA69e6Bq+i32lDV7WIX8D2zu sqSNwlUo4VQ4JYqSBTFUJ5fv/K3l21/Qj6zaQ+ncFbWynuIlmjW5lYQxFW9N+TuG4gitfhqaYqjl 89+R2jSRfMOmNHJEJ43F5blWhM31cSKee6ev+65dOfw9cVUrjz55bTT5b60uRqUUMlxDItmVkYPZ gtcA1KqPTVamp32pWoqqn0E8U8SzQsHjcVVh0IxVfirsVS298y+X7HU4tLvdRt7bUJ4WuIraaRUd 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 LiqcYq7FX//Z application/postscript xmp.did:69D25EB209206811B9A5DF90B846B4EA xmp.iid:69D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:69D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:05:28+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 124 0 obj << /Title (gr14.eps) /Author (user) /Metadata 125 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 125 0 obj << /Length 450 /Filter /FlateDecode >> stream hj0BP[CPÖګVlʒ+W롏WloLܤ9 =x͌`ҋf|maW Mp_?h9|=O |ҎvU]e40+3|o/Oh4S?x,89( € ν09QprTwVm뷱I "Q9 |u4F'~p]ֶTkU0^G2 >qFRp*֐_p50t>s7o\!ʼ1Sr\̏gS, x~)e`r+5|jRTsCT3h([KS%fHjW`^gMcvn؂hսnw x" d,@ tAѹu3/q endstream endobj 126 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 127 0 R /Encoding 128 0 R /FontDescriptor 129 0 R /BaseFont /HJADHJ+LMMono10-Regular /LastChar 67 /Widths [ 525 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 525 ] /FirstChar 43 >> endobj 127 0 obj << /Length 225 /Filter /FlateDecode >> stream hT=o w~ō:`v(~Nc8;H13 JxClM^wa~!hqՓ ܭsĩua'%H+s u#N7%+N"T %&^i Hʍ%4/Й7EUVx." QZ/rC`Tkv endstream endobj 128 0 obj << /Differences [ 43 /plus 67 /C ] /Type /Encoding >> endobj 129 0 obj << /Type /FontDescriptor /Flags 4 /StemV 69 /FontName /HJADHJ+LMMono10-Regular /XHeight 438 /FontBBox [ -451 -316 731 1016 ] /ItalicAngle 0 /Descent -232 /CapHeight 621 /FontFile3 130 0 R /Ascent 621 /StemH 61 /CharSet (/space/C/plus) >> endobj 130 0 obj << /Length 436 /Subtype /Type1C /Filter /FlateDecode >> stream hbd`ab`ddrt74 JM/I,f!CGO ?~$x⇠3#cxls~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k&`8 xTXYw(}_|{EUߏ讗]mz O{={wlu.]t Sď'7_~6kJ:4[ L~bfWV^׽`wyKr+[:ۻ;8gΏ-o߁w<Z6-puc`}{@`<<O3> endobj 132 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0014) /Rect [ 128.238 328.62 155.466 339.611 ] /Border [ 0 0 0 ] /H /I >> endobj 133 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0014) /Rect [ 119.58 255.396 146.727 266.387 ] /Border [ 0 0 0 ] /H /I >> endobj 134 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0014) /Rect [ 117.159 192.63 143.703 203.622 ] /Border [ 0 0 0 ] /H /I >> endobj 135 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0014) /Rect [ 120.831 109.668 146.808 120.659 ] /Border [ 0 0 0 ] /H /I >> endobj 136 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0013) /Rect [ 87.855 78.285 115.785 89.276 ] /Border [ 0 0 0 ] /H /I >> endobj 137 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0016) /Rect [ 233.952 78.285 261.819 89.276 ] /Border [ 0 0 0 ] /H /I >> endobj 138 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0014) /Rect [ 352.833 495.453 369.27 506.444 ] /Border [ 0 0 0 ] /H /I >> endobj 139 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0015) /Rect [ 402.207 307.155 433.215 318.146 ] /Border [ 0 0 0 ] /H /I >> endobj 140 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0016) /Rect [ 453.192 307.153 463.878 318.151 ] /Border [ 0 0 0 ] /H /I >> endobj 141 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0014) /Rect [ 352.239 244.398 368.676 255.38 ] /Border [ 0 0 0 ] /H /I >> endobj 142 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 343.95 223.473 356.346 234.464 ] /Border [ 0 0 0 ] /H /I >> endobj 143 0 obj << /QuadPoints [ 488.157 58.422 583.794 58.422 583.794 68.403 488.157 68.403 310.812 47.961 392.706 47.961 392.706 57.943 310.812 57.943 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 309.815 46.965 584.791 69.4 ] /Border [ 0 0 0 ] /A << /S /URI /URI (https://www.inf.usi.ch/hormann/polyclip/) >> /H /I >> endobj 144 0 obj << /Type /Page /Contents 145 0 R /Resources 146 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 625 0 R 624 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 8 /Annots [ 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 145 0 obj << /Length 30863 /Filter /FlateDecode >> stream h{[sc7~y8h]vx3m=lDdIVɭKjw!at[$A HdO?GnNRSAy+bw|}$ ~ԇo0냇_=;7 &w08FC5i؊ V]b){W¿C-i*5aƩB1`1Rk߷w'770fѻyNn9( `E;<^\J]iҋ4gZU7^/@a3xQ~S׻҃O>~<-ҸͲ_f kJӫN(k֓X˅Ŋ1wU`'_a6ZPzzHZ rlwλz_o|wO7|-@ AIPG.10;haVаa/y{'6| h~*0G;xg1tF8EqvТ x^W08pA2^ĤZǷ5}!j,+"ϖ8is0'QьQ?(KW-:m;nQs'"Ŀ>=PL]~($s+=8/7T6p>:3$ c,$br’e-q]I K^1K;ENH/siRY+R5[ ʂ"Ibz{$TK#XdS K-c=px] ;*\|iw'*HȧMJb}3Hp!"K0~zNhTnp0n0$@a p(~ B/` +n&`k9cL DNĵG^a!HfӇ!/zr_3\ G 4`3-? YbuXƪ~ RkVCԩg^R`AH8z_ӗ۟(R]K% _Φ,`/i@TQǭf_xk|(&׀Gw`+>Bd{V--ް\3־^ZOחgg>0س֣YްĖtP%cBj$"$^üZRp[|g]4oC n$%?Ŷv0DWxOm3(d K+4-ݰ%kf0+5.HGx\Pp7'Q<'lš/ [Yzr>Xya,q(x.ea ט1pRD;DLM\ 6ipAa&򉀦IKI;rZ0frH"(RIEoP@CӆėORkk 6EIڢTI DAa3L,~5R80=͈>Wo\2%f_,uǃ==`_:=xI1o0ʓk'Ȟ $"aEbŇ\D` $spj[;Ik)iAHmP3,Vf3 (U(PY2rG&%)4RD`E % )g3 A_[6{!%Id"r8@1wYG6ډC7́)MPP&ݤ|._K'I$LM?L}nROlFGImIxOlgQ 0#ʂd0ol`C,GD0 AV' 4 ,o 08q'fc4Ish >!q LҮn>P GDEkN)u' Ը'DѽcIy%v58(F#dpڦ&)b54 DUĈKF&M@MUUڂ?_D$"ԼESaVI+ I.OxB#ό}6MnP鎓@ tOZA? guNȱa)Fo8~K) 11vmE4Ir(DckR%P_LHc=Iܻ,+܊&¤SIc>]cR)4tPZd2;޸ɨ~0uׁL*ѝt\DH"O"XE!=.c(X2J=@6+45X i0E9W}YPY3>Ncr?9c9ȐW[0&xQ5M]%ym*Dj r Fy׻V׃qJ$həmC(|ut0I 9`9Gԑԑ=91E+1#ϠMjrb P S"Ŏ8Fm4r[VDЪpz&3p%0Kc/\%'R2dS[>Mnx'!"AAW IM|&ĐԔ70 934}x*Ĕd4.O9rW msb4KXzQXH 5U`HI^kgQъBX"B1 <9j ^$ZZN Bԙ8/V6g A!DZma gs3c8 -c(-5A S65E5Yr2FD9R oRJ9b"L 9 !vʀZ` w/gԤCCӽS_2#^H %%bz4D?ut=x{z,zL@iQg0`-8!Y'Bz"iC եvp%SE:pr3N(q3~3/qB񌣋g]=q‹?'??G8zQ8zƱs8~3d[ |w;_;7wjܕ`WC#N@*3t:"*N#](HWC:Zօ<֩H" کmh'33h  Nh0`w`ංT]nȇW/Y9͑{>, O'C tx_ŔB!W Ε +j U;DQ5a֮}7ӛfo7{Yٻ^oz国d'{'{[<ޮ{wOj/z<^Ӌ^Mbob%J_`cTK,D 04 M/ĸElDU@{H!>YH{RUq7U7ꞀfMDC礔Kx+Z)*XYe\$N+ZEyC;Ǫ|OZP πBB!(dJz5 K O!WAH> \ B[  T#2Yү@rGDץC!S1E{= i>7lU"h &خ`{l7uݖvUUlWe=TvclPܮvpnE]MvUUnWSmo vq>ڞnd> _)Dk"n*H""/H" Bf 1ov "@_s"ʼ88j*ίbA@x=x@]Q8"ѳ{ ;罭PSޛSyo%< ^*j$ `\jmy3g8Vg<(ϰuy-3LQa [gEV;w 0룀t<=zןXjtG}o=py{}՛oIvĹuRGXY>!*0CN->}o{#Q+jQSy'4%nݿ)VOUJS]A n&Ԫ4 )Z3ˇ-jV~k}5>zji7h ;Sj0nZTOrglbW8fW=nУ-==݊{wحҘM?j qKգq =xHP{Wi]D5J.VX,擫)TNb<9x{yoI9o5D!v/)lLw~^[͔-;}B ~eץn}$5l%-qZo:|y=?$C&e&XVrs֌ⱢhӺ~ubV Z蓦yˊEK3ӗHÇN ax77-wh{0T!w'*'cG#gˣ>./gggooO?]?T!g/ Jsߋ?0.JxECu薑\&~OAv?2L>LKi`'U50*觩D?0&1{Ǯd 0XqE)/=P3pХfEw6Đ'0T~;  *`*&MSFp:Olqz7д /G郵*i*5)VLIWVdjO_I_rriy^ybmJ*;}^jϔZKM˕x$=c_OxCY3NYn[58^ i̠CcF L8#^H\j?٤Sj+EZ˭ZzVkm?٤S'j5V+irZ1zdVOJU۵+_FVlSPiަi58$Vl4WZ1^&wuDT,(DYHsa֡,MnJp<5z,QșQ(m;Nۘr!fkѯp0iU9rI)<:fb?#F GJJc,V2Pfa5XRrR1$+*a1#&a'3;ħFo NGn4ۤdFP1e Doi{UjR)O4GacҚI[rZpzSIg)۰Pԏsc=\p.@xǢ4\Lrޞd.4X[F8ĤALѼ{\c'"o AS_\@As #brRH2ZY5F=kj2CeE_٢-Cej-9[ -h [ts*[T-Y[ԛm1E=٢lQbe0E5*MQfLq5)jx, tG0 %_Jb& %&QR\Nۊ廸X)eϖBjcq^1(5YegP>2GWS[sMA& Ijaa}E XJxF˜/ .>UaSՎ"^\Y|g Rf0WaRI"Wr0ֹtttSfre#xMS&Nv*S!&FI>w},4U!/ 1UQBL5b:4yj4bT%IXtڦ&bDqdl*Ĵ b!XkR!fQ2\) J!wroqp|ƥ;6s%`p/B,#G/f֡IC4K3 itѤȯlSkL+lcNCa*' S%ײ .h8tR%"~(2c(fQzw 0^lZݮvn'c[nv4vTc7s.7>`$'(A #F>&+hr&+Zh;pG3͔w4S̎w4;;h5hvٹ;h~_byESM+hj++Z{EځCjh2|D3#-J$X1#rlzHl&i/45; /=ru$2"@2En,_ˡZh1c1G6G M7G|C 0R(_Πhz^mxBWC7i5%jI& WI:*-=WIQ-!бq~I+'I$HӸɚA X4=l##uuLJ7v4T2$׼z@P&bt#?ل;6Ѝ.~t4e4:0dӪ d7m%'H6ɽFʰ,R`&ݕᘤmŻ>UĒLD )EVFXHkzvข&4B4Zs> $nE%i0Dpnk$ ͩD@ZIiKCNli|_%mI٘ԏz󞎈֘( @"~LM#`Mȶ T!>N0, NKB̴1 =|R.ibj(iD2ehŪ{$i6 ËFopgN}:<?ħ07㒪lR5-vmUmjkV-ݮYʪ;fUGdUk! 1~XE3-{D[8 *@).R@) :b@J()<#0JGUEq8J((*8(fcEGwƂC|(8ӠQgYGKWG~~Kmc@Nz2[̮q u scgD9bIzK{K@`V'鑥-7jҲ\0W*ۣDdI=  .ԁ ^IEk J"x00!?0pós#t]xقII^VʾH-klY+eZ)jR:C(B)/!C(eE-:`kXX+8'_swPVX ŢpۋdQ.[ww/rUq,fk]zjifwV}}.SMZ(fs22}H.=_-L-e~kzpO?!{ 2>ʤ+N˹"=+kP릂^?ʨ.UA-E,*zÚ^C5AR^*z}]k^؊޲wVr^W]yT;U;:CNb䣾ɝt= iCx}t+R_M"JJ-䠊7X~{'EcglYS1WkzG~j_j*(*}ҫ=+|"?fde>3s5c{U#+PY^ W ^pu߄j_ZW{3 Wjd/\5zUW^ W3+j_=᪑xfd_z'\Wr%_+j=}ZVFq^̿~j_jd%qFVvcՌflpjOj '\j|=jƿpg eћ%|z$9 ILC҉0Dgbw|z?eQ?]|wGߛoO>>\t_}om_=OxV7hX65XqQܢhh7g"Q-Ƈ1^YKHXzP~e$m|4cNᜊ~N4w<^A1z~@d u1(8D Oyz}!`v>Vo]jw&k@.0}=RޅqPX'Z d-Ww+)i4J`<]H1C=βe#yD+yYNHoˇ׭r;N$s0f_s 镍6zMOjMr;qvkِ-0x0t7inw! Ch_ZEpX̴"Aיִ.m'5vLYoH#8B#~eZVۿ[;v1fFEWkuĊ <*RS{,GBa%F[s 1w;C|5(mfVUH i*նeGWe :ܜ5FNj<y@,[-1J2 )IE TekdF+qQSܵ%q4~]7+4Ne!sTMyY 9vFkyN*"Lh(248w+%ؒ!ۢ*ejH-kMR*uLvQS~m#\[KH[Sz(vrO⹡kM&ޒ1m *uk_ڶ̝U޷tbPU$ܥ!eh,$LKTO5m?ڹOߒCZ=Z"?m,Pt&YkILjtԽ!r$fZrj4S+w3#V35VBu15Y`svjW7rVkSnKJy[T%9r$;""VŰki)CfL&3ː̮﨏U3@U[`A2<*PPݰOE]BlKci{l2KS,B95H )$kxӎMgi6l٦H'.&5dQNhHv$I`N1jٹ<'7{Esj͓Yt't2Sbg$r}2В3j4ҁA;iةJOh7DWMxKMp I3qsW3X Ks,L!0=rsC `i{8Ppv삃)5p,Mg6CHxfWx+DIg6X  K ]cX&@3,a49P@Y,Igv@Yeazj Ł4RC'ʵJ ,49P&C'z4ҤAVfiɁ0# ,W(p̮2Ks,M)p̮23C܊( 30̭Ȑ*(KS͐Nv`H[u:< Xd(KuR3`xNs,aUNv@Yu: ̮k-HgZ0g%XxefX^ Fc\[ &yۚq͓}QlNڎ]F>-o$Ŋͯ-)ә_#~dTCXTI1\ݰIn *80(8b(#Ars4RZ2 \)\[͓ 5TS(' 鷤9+(j3ې\Nr4 jJ14M5ŘkX%P156 11}Չ_o_o0ScU|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5U|U#_W5rSş*C{c{թ^qK3$B|ֺ45Uo‚Y*U^Pr%Fyv*c.U@٫bޙQkGŎ=a5[RkUmu:r%0cNo ]$ zEQԒ|<˻Sb&0-ښ 2dRZG1 %ͣ&>!ʘbS"MbA*8Sr Τ|\\%BO8 tKǵ$Y*'}7k!X3 /,FaIYUJYBhdEB+%L 断3H#34زa%i-a cm)͖k.2o3ɸH%ia21TC,dĎP ?2Ah d( !/k!+-EBjHC},kKl@ԗ'$2F[<\%S'tU@ 㖫㵘AM=7ޤ)Bf Lbń%{q53~BK<2I\g:XKXKTG scR<:y̝4'U˭zq#U`vc_'#Ɍ)],0[_lUz.JgW kbA6d媣q;y!!ohI~xx0}WxavzDv)fUP\;._CMn6v]By7{}/?;,#e (O ϯSrXsW?zf>śSȪ\e/aqqc+_N&&ĬC:0WiĆJ(_sϧk=[tgk_ι׃k_|xnXU2L;t&PgRk$;]9S 6ArZru+`ʇwI6%A9es֒ g$<_CI9[KgI=ݠ,XwC9b(ntR9@c{ CUSi5lhB Ĵw<S%%$>tTl Gj-~pϝǾ,'4wdx]В`l *HZB9gQ"*MW7&["Y՗)Z"ӷ^pzDXU7t P.j$As `yA7Rڮ=Ce:7V a_܅#mX_`+ $0~gO0t&.`( FʩlF $pAǀS&Hr*8E9[p*9]}u)*I0A0rFjC5UyEP֊HNyE JSZzt”nc2 u`X+ ,6J0$t.6)BU+ PetC~*ݐ 7!>~po}[Vy|_T<[c`I9Q(SwLr&n0}xjPecCK9mC.:-}ՍJVnU9 *ZwkBkr圭Q9]׆A9Թ6*yrPr0"8~ܥUY (9s$/`6ef(~&Q#aS\_ZG9-Q+‘FFĤ6bҊpXV'qRKO⤼"8)$5ZpzO( Sa hQCHEȀdD"Fkai(:7 \Fk>Ȁve@{wuA>ʀҪ}b%qd@{2=!\`@{2.ľ>O.=z h>5:JΤ#= hJrڣ%A9Ao.D~C-Kr h\4<e@{9b(h 6B $66H"BR0lۂaHefH#XeId  ;@F˲acYXmQ<Au&8E9(g N%g )ʡΤ-8EN0p 9 r .aPhIPNEa$g$ r3)gkIӓdaP10bpu #  Cv Fۂa [3J 3&Qi>=<՞ sNyѢBr>N\H9Թ9g빐|cG\wscpj~nbdd+kZ `I>pG t\'mQ@;اH[52ֽ/JkRD9$ݢX14^] khhiymljQo64Mmh^OIt {糧4~$-al&X *  )gK_9=[Uad1a.(P"%gkIk2PPg"I2 +EJ1vGHqad12PĘ"tesEmfG:]FH9PrJ@s"%g^EVOpz.,9Թ(R|;Pd@R5z77;E-E(5Pdֹ"P}@w@'(RrIF@t)"6N@Z;} Y[EeMm~z"@:{J͎@"/mȪHmvNVoeHɡδ;Ej'tIR Ork|p/䧆TD4-|"zo˽j[[nQɷ[͑J$($&)mpF áj9D$̕($t.\k|1ɗ|I>lܤNJT0U" 4pVV9[kr [PRڨ|':ùZ(ʁ/XYR@BV`TJjM,V=`f)`6eYͲ f ǐ.X|tr -L(.%+7ĺB96?Px]!'}}] l):r ~]AmBZYZ8da_7 6 V7覃H? M}[ob#)M$[BN#rk)Ahiml1Z*rkCg .imPд6EW&^WtMgOiAZ:^JnF@ӏ]Ԇ(%PzPXETIQ:3aGܵ:y]e}k#o4>)n6>)~oȯS_զz`e p4LOP.z'u|{'&GR&gtT LQ?J82'}PfQ5 'ɒ*-"^_Z<_Q9[Kβ$(:r9=ΒBZYelr舡\z-,/ KӲx~d-671lK!7)D9)'%ѫx3WjA`Q?8ġA7fl_\W.{sH$[KS8Nr SٗY)٭RXϟp*gp3ouLt#zY 엫:/ U4r+0ItLM?ǩqǩFSO)X:e.5KҬ3ha=K -ka11U ޿ziajS-GژWZyMۘj7TZv\`m%*c7>~z 7ll]oaXY}` &}%BʫxuQkȥ~{GԱsmt&̿e:m5NG\haDkk쮎F/pp[e]vL0_kء*G3Aɖ3kw5t tZ[rq_?5Q[3e'M#C? j{ݴ;z6.o&/?^ w;>|g;[wE)Nq AU>7b-XPݪ2,rK'9NvsG#@fm}U[OaN_ޞ.~xh Vp!~֡n!?^p+Y;Yv5A ^~}ge,cЛU}߻1 7m: ?F; 0[]:**drfB;'&#Ȭ3\5]Y[+J1;<`ko*iކ%\odozՀ,+I$+']h6@]&_%g )ҫ1lhiUCFqH3[̥Tk:5um`8W O~$5"*7 OZ:)9A (_U9J6~aףz)g9FJgJ4scYtj8eh عb\+:;魧Y1raUkAY.7) }DO-nw4X8@Ʊ<|TR81P gIUN M w|+9Jz`)αvdgt%OŘleXpjDk6JO^_oؿݤ*7RO93#s2B1OH_Iʦ}L> n=ڴɦeG>ҿB=֝|YGuVI0ssͱf<#7?E/\nݣc:Ʀ,U{ʯLgsBBaKc\K\~9swӁԸ'X. 2.h`Uƽ^Ofl0 ߖo;G[LnVn?qB=^o뜱O޽Z7`b1+^$'yMxA>V圳="1xu<"M|i8"SI>g&#xG<" -Gd<:"Śbbk$&6q&6N"s&&.NgcbaT&*<\,x^.ٷW"`_<)gakCNKo]6̜c] b߳ar.v3(wװӮPt-`C?N.?8ߍZ+8ߘ4{D~RkSZ[\NB60k 25(VJ<3vtRJGk849avHTl: Aث=l4ߙf^<ϮN9)aǽ>,M4‰G|X䌕^:f=c+8 `8¼^T/Әw?ݿ>d9!pῤ>)ji.޽~,# ,{ZE5E(þ㣰ώB0bRxhw0FQrLxϷ >x=w*͏" Ȥzc, ٬1 *߽gMk5IN>%_,,8 ғ>X_lTvZE]}3׸niqUC:-wJ'FΩ-@T.^/#m9eP"F oTaڽ墲/N-7BS 8 {ȩ%%sft%{ll&չ:] _Ѳ푇\S˃nV8a0K'% Qs;F:VKC׾?`!ĥ'*|VN<±@=]]˽%s5 3( dy-0 E}V'`RO6<^ZţNO;m?ݫwoZ \]ym>u 1#ރ|Č(Ty;m7E1ǁ˳DܖT4zrR6 -I?~lZAӫw.- wx6saцr |sV|c@q>}n? \8p9ҭVMQwFQgO=!VA{sO/P_fQ#rrx2.ʇw?ߕ& Z)܃xٻ@c<`ڊ~FKd)wcy^V JI0$Qmi{V;i˛H],oH$NPRة> (u{4atGzrP 4>ݽ%`՛}>jq"mW!q$7E1B90 OY@E|+9NHYvil0RFA|}‚MQP_4O8fm5T5gpDvT%A,I1}Fuu {}@wr05*G8$"Jge[8{wSF< A9|^0|B&oW5ݿ ?|wO!O:?wK;uCݡ2X;D wRXvue60WGr(1vc8ì'hi6*x =ȥ|圢efEg-ۻwnȋ)\Py7 ݻ/?. o<|ĬbCX93-P>?+-ln`-tmAkFs˯w*dg.×qWG0Z~"QYً(@wӋ5o\ xo$L`.&Zh^ig yދop@4Lcp`|f8 ]{4F^p=^Ki/Q:(-šZ?]3sVyM(/FZ l٧DNn> x`xЍ>9b`u ;Ԯ iOa@UiƿN%m]j'->׈w3 bgZv:^_M!`^bY /,,F- IY?sq?ȬH [TVRw]Srb:~H&lf$~w\d]?ZCHtV[=.#Q(Só7^Rf!yUmtnZCzbS=w&Nvz𨬗WvHlF/ \G75Q,O횺+KOt9A%H񡔭yˈ)8r~ƊQf"w!"p qbQV'_ v.B BXzSE<UY3fQm)#h O]! ((8XN"1 ж7+^/_|/^~ooSW&$s/$JU+ WˊD:L( nTzGҖXk;4Xֽ6"U=SD?(>f_y\DіWs(kS{ݻAA1 ܳÆ5ib፨rց e6g TH]99AtUQL ni[ 򤑓zU#nfwjTm\X !U~{9Q*/Gv$`UEЗg_nT8BYuwW#`ñFZsQ=gtLXĶZp-ȾsZ`v8Jr} (G˛++r4jn\Po3[p!Kn8}t'Ywl~\QEs93wZIP*%Xo܄$kvƒX?Ph5M)MhySͮ}d{A!u.o`̍ .+]x{܅tWuwcPIBsq0  Po~k6<~WaFW#!?' #?qfP :`SoBN)Fd!qwE4W7tpf2JZ?wW&ͧE#7W9؊C&ul"q98jH+ҹ. q&gֲVknržYG; cKcg(y^.Dyɦ~,wqL~1UO8zu Kpm Kjm)6JXB䄚g=لaVN[\Sx1ԛURsW SZ*ccޅ"3s Q bDGgde-HdcZ. _hH%ug~Z8 gHv F;3ʖ5}Qg00( 4 FdCsgã#%J& I ,ݜ8KtyޤV1+ni}SET:UNsq-Ds֬iR{Yc,ޫ⍟(Yݴd͚#9s?3w6_geQ n.xso)y75|. duMiҾ\jpݞR+x՝%Q]Sֻ6"j@P 7˼ ڱFrG"x =rˊn% [r1̅`vQ~Ψے^&5H?3\?Jgn/XV⭴tdx{WhǬZ13U Qf:n^jBW%* + BН7c :n`)/WwePTrNް?Pv%āJfOݜ=Zk[͓٧O*5r2P"rGtఖx ꀚ bX ;?1`e>NJX fy/5@paq3oR O#uD(EUd䧨܀x:A.͵:ccKŦvU/g#Ԥ8݃/(Q2"48&LGmI"'=Ŀe3!#y}rj!Z7gs?.#g`DEn PBgrBUSM˷(^N$ <7djƃ'gH"{^K_TZMYUXJɒv~|;[ BНM-KB 04i˥i4.LW*8o_]~XM-Ę+7FLH՚tl~K 9pZG$An]-o/0pIuC4^Ennn@ U=I]l6 pN:t`{)lZz.gB+gnl.i5¸u0%b ~T"ín5%ZGA]?s`޼mlHtsƛѩ;P6NRʵjY^3vyOliÇ_+A6pўe=3H/Svtx̎#{֚YIה]BE?g %ӳ([Z&oMhȥ|ΎFlV  .h9 -m8RZl+*m ;^9#%x_`ʦ3ntj| !EJa/ ?~@3Ԡb4ms/%9a =eW;L/l>4`fSq,S_鮝Wad/)VW5<$%Օi؍-{j[8vOJL#*'vqq_aU2 7wvN"޾'g}{?nc0i/Abdvu ~3p7PؐUaEޚۛIm֔-6{oMֲ=:%cqp|Z3c¦9R$GB 22;0m܂B37#)1,QndφEbᑼȅZz+K̭%#B cNŦĨq †>Mdp#nrqWXI=݌gaœ4n5t"lTɲCITDJ"mL/,I?2+[x5};i\S798!jEzsُ|iTh5 Q"?EVxq}VsoAGmg G5Zu ٶs"ti s+dE1"j/W18Wq`ѻ<^~}òGQ:!/lS.#7Sz4,""2S4CZzS^ot acEd@W ZAQ0s>39ͯ>A}@Ad ykkVELRW2> ;řk,5l 31J+hJzm*dN.[1piVNWd526N;~}suZpmlOu~_/_OTVj endstream endobj 146 0 obj << /Properties << /MC131 147 0 R /MC140 149 0 R /MC132 151 0 R /MC136 153 0 R /MC139 155 0 R /MC128 157 0 R /MC135 159 0 R /MC127 161 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F5 579 0 R /F1 584 0 R /F3 589 0 R /F9 604 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 147 0 obj << /Title (gr16.eps) /Author (user) /Metadata 148 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 148 0 obj << /Length 451 /Filter /FlateDecode >> stream hn0{i $aQQ6Hk&槶t_>R_!6($i",<7̌NۊmV?eiZ]ujq-;4YD-k*QB6<-7w&&fݬU#(2p < ȧ%4$,8a' F*e_81#i Rm!>}Z8Wax9hde=ߔ1^G2R1rZɞ r(&y?L(T]SÁ̒Za3Jߍȋo2#4w?$/1nny- N[Pע:G k!l/(7+ʜU*Xks]2Z𛔵6~#F髁Zۇ > endobj 150 0 obj << /Length 14201 /Subtype /XML /Type /Metadata >> stream 2019-06-12T09:06:01+05:30 2019-06-12T09:06:01+05:30 2019-06-12T09:06:01+05:30 Adobe Illustrator CS4 256 76 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgATAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUBr6I+hakknp8GtZg/rAtHQxtXmACSvjt0xVJmsLGX61K7WFvHDdwo7TQcqyFF48mZoh6j GZVQivWm5NAq1BZaRzj432lk/WJSvCFAS/EclX98f3gH2j3FNhiqhLp+nLBAo/R9zBNZ3DRSQwcU KhhUpQyr6ZE3xCu533qaKsrs6fVIKEEemu6/Z+yOle2KquKuxV2KuxV2KuxV2KuxVJ9bS0E4nuI7 aT0LK8cLcIXNAYS3RX+DYc6b9KA4qo3lpp8KTRXEulwsIYQ6zW6gBVPFS6mYfuyykRjt4mmKtiHT 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 application/postscript xmp.did:6DD25EB209206811B9A5DF90B846B4EA xmp.iid:6DD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:6CD25EB209206811B9A5DF90B846B4EA xmp.did:6CD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:6CD25EB209206811B9A5DF90B846B4EA 2019-06-12T09:05:08+05:30 Adobe Illustrator CS4 / saved xmp.iid:6DD25EB209206811B9A5DF90B846B4EA 2019-06-12T09:06:01+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 151 0 obj << /Metadata 152 0 R >> endobj 152 0 obj << /Length 15595 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:07:18+05:30 2019-06-12T08:07:18+05:30 2019-06-12T08:07:18+05:30 Adobe Illustrator CS4 256 68 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FUh886bLqXlq5s1 uIbSB2ie+urhlVI7WKVZbg1dJEqYkYAuOIrU1AoVVLyDClt5fWzt4wNMtZDHpNwsiyrcWhVZI51d CVIfmfshR2UUpirI8Vdirz3zbobv54stZM0EmqxLbp5d0wyxiSX0WlN5KUk9GQ8Yrk7Ry02BYeCr 0LFXYq7FXYq7FXYq7FUNealp1k9ul5dRWz3cogtVldUMsrAkRpyI5MQOgxVE4q7FXYqhrXU9Ou5r mC1uoriazcRXcUTq7RSEBuEgUkq1DWhxVE4q7FXYq7FXYq7FXYqhotS06W+m0+K6he/tlSS4tFkU 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 application/postscript xmp.did:6BD25EB209206811B9A5DF90B846B4EA xmp.iid:6BD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:6AD25EB209206811B9A5DF90B846B4EA xmp.did:6AD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:69D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:05:28+05:30 Adobe Illustrator CS4 / saved xmp.iid:6AD25EB209206811B9A5DF90B846B4EA 2019-06-12T08:06:22+05:30 Adobe Illustrator CS4 / saved xmp.iid:6BD25EB209206811B9A5DF90B846B4EA 2019-06-12T08:07:18+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 153 0 obj << /Metadata 154 0 R >> endobj 154 0 obj << /Length 16102 /Subtype /XML /Type /Metadata >> stream 2019-06-12T09:05:08+05:30 2019-06-12T09:05:08+05:30 2019-06-12T09:05:08+05:30 Adobe Illustrator CS4 256 80 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A79a2sIt1RrUtA6Q8mRQv BAIWHBRG3qfGCxqTSnvirYs5GWjWw5pxAZUDhXKwtKOCxOE5jbv07Yqrmxl+tMYrQxS1h9Mnf4lW L4vVMTBeAUrSp5U7YqowW1uYuItD9WkWKvFR+7jHosvECJvV+IEmvSnvirQs5GWjWw5pxAZUDhXK wtKOCxOE5jbv07Yqrmxl+tMYrQxS1h9Mnf4lWL4vVMTBeAUrSp5U7YqowW1uYuItD9WkWKvFR+7j HosvECJvV+IEmvSnvirQs5GWjWw5pxAZUDhXKwtKOCxOE5jbv07Yqya1XjbQrw9Piij0ya8aDpXv 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 OVhi+FByY06n+YsakqpjirsVdir/AP/Z application/postscript xmp.did:6CD25EB209206811B9A5DF90B846B4EA xmp.iid:6CD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:6CD25EB209206811B9A5DF90B846B4EA 2019-06-12T09:05:08+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 155 0 obj << /Title (gr18.eps) /Author (user) /Metadata 156 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 156 0 obj << /Length 451 /Filter /FlateDecode >> stream hn0{IbO(ڨj[EI5 ZcWˡW ICH90 3ciӶr as4[KM4\_V >a۬f*xakSSzYw~.вЀH\t( w>Ow]C/{E֘S4 i|R u ̣X :yap*ҤEX0^G29rZH 2ME]y?\j]@q]~3J 鋠oR2w?˕7nnD 7L^j괏j% a{iD^و,2ڊVM`ruQxhoJՕѝ#r SWx72Cf !3d+"hn endstream endobj 157 0 obj << /Metadata 158 0 R >> endobj 158 0 obj << /Length 14752 /Subtype /XML /Type /Metadata >> stream 2019-06-12T08:06:22+05:30 2019-06-12T08:06:22+05:30 2019-06-12T08:06:22+05:30 Adobe Illustrator CS4 256 68 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9Pwarpc8txDBeQSy2n+9 UaSIzRbkfvADVN1PXwxVWiuLeavoypJx+1wYNSvjTFVTFXYq7FXYq7FVktxBCAZpFjDbAuwWp+nF VBtW0pLqG0a9gW6uVD29uZUEkikEhkSvJhRT08MVRWKuxV2KvMdd0PzLb+bbu9hsreaW5ul1Gw1j 45ZRFaWsccenGNEMkal/UdihIZSwpyemKvSLSaWS1t3uE9G4kjVpIW41VyoLL8LONj4MfmcVVsVd irsVdiqB120v7zQ9RtNPuBaX9zbTRWl0a0imeMrHJtv8LEHbFWBeS7PzBpXmOOOPQ49M0+7iFjfW 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 V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV/9k= application/postscript xmp.did:6AD25EB209206811B9A5DF90B846B4EA xmp.iid:6AD25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:69D25EB209206811B9A5DF90B846B4EA xmp.did:69D25EB209206811B9A5DF90B846B4EA uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:69D25EB209206811B9A5DF90B846B4EA 2019-06-12T08:05:28+05:30 Adobe Illustrator CS4 / saved xmp.iid:6AD25EB209206811B9A5DF90B846B4EA 2019-06-12T08:06:22+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 159 0 obj << /Title (gr17.eps) /Author (user) /Metadata 160 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 160 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0@{imHh=lT%8SC?4Hz` 3ciӶb|',؈m^&?YZ^5xt-BXB d;57uf<1'O(>pGB.ipӅ[c/%ڊ"4߄[D(B8@A9 *-k|<9뼲*AgUx$(#)GBB 4:gr-U:WTp 6B谙^EEPw?K%+ lLܲZZn5Y2E5uG5VB^+Qo6rU*8ksL&em/?r=5}5A=4gi}!3d̐2CfY-J7:7nF`3 endstream endobj 161 0 obj << /Title (gr15.eps) /Author (user) /Metadata 162 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 162 0 obj << /Length 451 /Filter /FlateDecode >> stream hn0{ibMDFU{بJ"5WlCt_>R_!6($i",<7̌Nےmb4?kw].pS|,yͥXc`SSzYwnѪЀwz8 ^g仞Kݐ' 8Y5-> endobj 164 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0017) /Rect [ 124.683 196.824 151.281 207.815 ] /Border [ 0 0 0 ] /H /I >> endobj 165 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0018) /Rect [ 132.243 81.759 158.13 92.75 ] /Border [ 0 0 0 ] /H /I >> endobj 166 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0002) /Rect [ 233.376 60.834 245.772 71.825 ] /Border [ 0 0 0 ] /H /I >> endobj 167 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0019) /Rect [ 492 144.525 518.13 155.507 ] /Border [ 0 0 0 ] /H /I >> endobj 168 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0020) /Rect [ 401.172 71.301 427.815 82.283 ] /Border [ 0 0 0 ] /H /I >> endobj 169 0 obj << /Type /Page /Contents 170 0 R /Resources 171 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 623 0 R 622 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 9 /Annots [ 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 170 0 obj << /Length 48482 /Filter /FlateDecode >> stream hޤ{Ylu d7kd%v ~P.)Y)࿟ էuծq՚?Yo;n/ƽΑo)?Ym|_c߾-~vO)|o?/5*(L3vOr-+|}5zϟ˿Wj{1UJ}u}ev{|#G{P r5][/{i'Q\?f/ŏ~ .%?|Z_iYgvN?gz^>z/.#g=*2F/-\{ytbO%}j%?to>cjۑM{_d*4'M~O+]#^nwfk>0_ꏿW??z'ﯿ~9?ȃ%v/_&r5omPox1-=׿?}4u6pPwt5cuV& 9~L|歌 q[b^b%zw* pI9[^v:˃}L?z8.sۈ}Աp{!6;oޮ9oArC88oȜ7/zJЪ[>!/W Z)U6ј@cG[PZp@= 3w>Vw]=b <88 `\if\TĀ{ Wpiܯ}o[ WN &4‡H\gqfA{r>T8\XLl,kN4E ^C*U&J_eBp]ēu{ X۬-7KV<Kc<*:M昑d߂3O~yǛ'I(D^Atk-4HM)7CqE#?\8.8A@DKϴl$*]H[7Mp ,a~AՁ5TWyJ\b55v>}{7Р UZ,rgmwoY2-wP{FѰxq)/v Gي[m`uNp8Wg,hP0|ߤ܍aU'iD.7Yx-Gx"`3XioYxqoӊ@ѳVJXwy-Π{oȹ§`i| E9(!7, ^2H9Pő{f3YYxt`2,C,/xI`RF+!%T p5±7&06J\G55nKY“xW "g<-j1[Uw4m%\W%8aa烸vxi {_JWr =8{s%ƛs!P[nqUTz*}A3w62=GxYtE ,NXD_'^!4v̷)ۈ78\awo[>If[şw~l#,ޙ4`3 @[,ahxx:7<Ѣup/y[ ;I3\r57=t~LO)n<@U5J~(d 7xΰcT,c"C:pU z8L Jvj8 Vݏet:`tuI2d#dv#NJɁE=L"w ryZ;{ 9-Գx:\Vq4Ơ\4'q?w_Z!DaPhl>K;TZ$\K:R@ '}qMp(.6:9I<<|\w ջ&|DhzQS<xCrrۻ+Y1*_u?\S(#! .#..;>Qap3X9S잼cR)r6COp(u 8^$Ov- */]ul4>pK2phqbPu j \8`S|>>.6yO6-JI~5C74B89< BN{PGKMCBAz)%X=x5㖓{X-BnRM௷X&)U҄@e> j:vb)p\@ڏ`#3˹A_D7 1 jGm|odm*"ͮ"(ŠW0A&"L9s+##'6+c&Lŗ~/^W̩Hgi\}|oa2W̤R͓/NDtZ[< f!a};3uUDD-'KcdMi4ҳr;=KZԤm:X@HqC\ a6Pw꙽pXLkN /><; b]6ۻ;E9^x!NN7Ǘ$~}H\Q Hea)+̈{B*=`?,mV^ȯ,^vBVbQO{=aC?UlS{>1V(nPzimlltj op6~F&@Mꢿà ܨyi4)jvfA![tND!FJǞLBqsy0#<,wxz4pW}ߜ64{us*蜞2L@0ȓ=,-Q.:8kԙ Mhg A:+[2plMr_lΖg+l@ ̳8y?H|+^Ͻ}cW[>R^a2pYgsL`cWOAsI.8.ꔝUW`ͣ'3EEN>.{0;gƇ'W웚?x팖_74w,/k?T.DVBy(?K@N/X9^S:DT~M`xq_Tb 2vSd}UCD ΃'3&7UcȈ~l0ɩB’F_+X? s)0;)U~ߊ)UC&<)nƾ۱:>MԎ ԍJBG0"Dt$MZh斍=ЮLCLW ueqJvƁR@\{2'Kz:Q)dl4W[ 3ھ1gvT \m[w6UA`t0,TLI6p/AV`tIhgcd#tWlj!h@|0JyX.xrWb;px}i`TTu7#` d`*(XrE\_I[qFʯ˭C]lY腂rP=d(P7 (Rؿ4=2jf dBk;G˲g !$|q}nV?(]$<%b2H;yB?l E&6gܕl& |K"8´^v{ivp]np?pԗ.udv$"9='<."0YnSz>/ GhJG=UmfTUGw`a짼: w+cU(͚823#w* Vr?.I(H?'ך\K?zxR8I5}sz;BY\b<֓兪X8ENj :]XKԬՉkD{K*b^'M, SW7U9I<;Jt Ԉzw+Pphp߱~)*G?n>(mt[@I92& LS(3Og}Ύ'uy}QK)!>q* Dn %W+%؈Ou_ĪuRtM-\D|jMW23*J PR! \B< ġ?G0yJ,W-ڋ1 ,j4>޼Ρp *7mR80uUv3\Q7UTۗ᲎s%z8{q8[ $y9YXgw. gu)obUpޏ@4=?CUOBm).6xx}#*3/'S X-끏rX 5b(E 'a ,q"dW*DA\)qR,=ktmWI4شy ;ƦFC"#=FLSjY8`b:`Y1S9qZ䀃єr @%uri3S|T;A@`9!@іG!'@%bAYotdEA  ey5:Q1ry;* icA^x@(^ɌR5/9FN -}Hg8R𘬄,@CG$Խ¾)5*Y$@ġBx$w@dx(Hp+D~,{Ud! EQHbѭ%\7ajcv$@ >5 ҘUN;CPN2r._lrH{$ 0~3)h>]]`+߶mBnYղHD/ C DHva`a YN6D\Q;OxfGqn*VܜOS肏gvIJ@W.)XQ`V 6e)+ 8̏b}[ T➲2|t]=T"3 8 9Y Ej̝מn)˷--.kGn?h틟~fu.M@PH߲۷+\R" ?|rخlOdݮJcuW3j4㿚W'_"^q7B7?tsuC}5JkˆBR7ʵ?oc Ro6^+'.?pHT:6!w)w"k0쌫Nܦ*2(8 bZWkFfJLr ?q=C\ٙЅve37xF7M3ֿA+ > e۽w$|W T}- P`I8T:pZ .n 4n|+Ux4 >M;Ӹ/%~\Er( Cu.(t9qH$PmR !вJA T;+ǐr?d(FT"VI B>y#o燥 _6߿ExBXyO&đJ-UKtBA4G"1\mLR-MVtȣP_OO@ey y3~-uTwnUP]u Tng,C3ϙ6yxџ%P2lML1ܺ)8{Y9dXf٩vdD!9rdB-QK'$0ci3.i>qO¢)e1iQO` BR.زAS9 ǔ܃i9C.)Zbx/ȃḱITb Im{sVhRB(7i_ʑE>v(#<&ǢPX"H@YF5uS12lqL^J}s!^+=V(!M~٪9a\Y)B;LƳؕ~ʘ[\+E~,n+J:ƋQ נ0c՛D: y?@Q>wTre뤋~*`g\`VڃWx&ps_ÿD.+$g' c U#,;a2neA؃^3#7BKtcy܅w)˽pP8}/\H{G `V;^n*X4?XE>a=ExV!G/fS EB ASn<\Ĥ.>L$5~ŢXa2)8_}1+L@Q͟~P`* 80ÐQe}謲8-b FIT&=Wꑵ=\zJk|vp/&9~ VưTjHէnYrLEG^4T;F6df>N\p7|0BFiZ*|Bδ| Ն' yjeO%CwC>%jq|`F,d:$bfAR_Bo=;V>d]EE-s2FdĄ%;UBQFpf8どӞHĜڔ`F=fUf ݁uHש^y@yc+2.?=x|P*Fy|ul`'y/+ɍL(J_+|{Џ.$wG}5/_;xTxŦU!5#S& X(XnJKZ9]tc7}/VV >uƺziK⺗szҲׅ-9BPyvm O-1JC!jq %.?,*r9I q5D)@gCI>pLyYQ0U4{P4`pmiFjL6]?Qkg*!+Ȁ[ףp ίSȲEWSŅĢVzA! >sX3(,,N]M;8zg,fS*ь?~ݔ}ɸ}Հ␺8 Ȋ~KJ"eQ==ݣ>1C֐(Ym}.{W({,K ҧ5!@L.`T0 bKP*G1!"uE*npS4qTI/3_'im = M*g[r qfU'PPatA涊T7 g2O\L|Nړ`fYsQ9*W<覸dE&8DA<1# EPYte\":25[PwKВJhP$A Ϋ-rmfd`#Bi!0OK)y(&Dbw_ aeJ:x{\ƃ~IU&VB+!Ժ4F(@Lه%Ő"-~NoVFMz FG~7Ӱg[+ 7EI}S@|+&+oЀ^|JBɔd2^}l@C2Ee%D(dH1Pi }[R -EylHŠ-xIUHԝ:%,L(۫$ZC>~'PqyKd>&H`Xw!CC>sM*,{Ft⁀lm,hV?h@ DKYtZYiyp^/ hA$Ky!f|Txq!⥣o:ER%fR!НQТtGjQ@2t7{Їb)e 6NxW/Z){/4՛7QBâi )}݌Vn*D-MyͺtD4,k*H)#)F@WIh3",].S=l5W͜h 7?50>D=J_ =%O) KjT\^ʋ<E-bJTb4>Z}{x-Үr[V! Av 9w=İSV^ނ^/=OY@.a+}WUWh ;EjE*]6QyzQI#-#Hɡ @g;ᒯ }ܗB^xAN,Q ϩD YA[ ![:!hD>-Kki,Y.vJ%RPsgtj*CN( )Q-Pa9xzq:rDlW" ƝLC ˂&@n%f5B72Zwʆ*smAEtjU3e`gSld /Р2)l3ԝC&T$t׽iF`d8&iiᑷFv"e uO܁}QPhD-jd5 ECe#?wѴ+w#BhsT7kvOاc(MƮg"3HƒI[a:SHDx~MvrRțF`+a'6&!Q$L(CL&c@ ~hm@g/UHR8=KpfJOHK[z,۴kWqzZEo`jU- hL+G5 LLHY}0xR6+& )ߘɀM$Yl1J&E˷p.R$Uv)xBI?j';OұӔ;,J/C;m*=qТ1Nf`/ OqM`9&%r֕2Ro$Gm'2u}i `'4B|]yi ?5S X*FBPwʧ.lVMbdC8\<Ȗq @ tQ ь?0k>n(-BI\TjA.n  m@ðAV[@JQ]]~؆,卲 >#Pȁ {Ś\᪡A E. __1JZz U9$$ R, xHgj)!LwhFBs(g? M#h묿{!4KSg#ND`@Q9ziAm!ތOݖ9IQmN. SwG !3A꽏︱U!։fcGOr W#\3W#*DPy,U :]L–d&[Ŝ!IT8-RTVEƭTlCqrSbexL-O\ch%XpH!;*Đ6d<"6q҂\huEYUlÞjEYI;od %LwgU ܉cJ7#}z@Fg\ V3OgOH#pPR+07AsRxgVY#[ө"U! yuaw^LCd7&1ȵK$ϼ4K3+`:w)@&=ߝexuє.d@LN o;l$ ff*lB;é~!ɷ}Mj<+:f[3H_wEs#O3/%$;3 1{ܤ{/W;2ư0fVŒϖx<w>A" Rrg_3PZ\>E*y#6@"~7{%9BMTniVsKOdmfX{a-cTu si Bala LTMCM2ETjDgFAHg85i6ғ͑VΦtz,VHjW[ϓJK6jjPg@r0,s+C[!3i[8K&pP6Q?&j؆OtsF#7w?g3zF6e<]9UQB|j~HGNTy$GMp4243BSYފ7ƴ%PL4yy21K<,N&m'dc B#s UO⳧@g,a@qf7rXKvdWVl4R=lBD&[LM%B?~7B:"?-]"C᥂ړ%Biz+6Q;cdUTD.La3'D%; I>.8wz[ TuQ]n9;4͗!ZsT0=fLRto"L8yg6< g _YūmR8;ʵe&ʑE +=RA-ܢva{Zһ(·wL /!wj =\ OZ$MJ7qo)N,"UHTuR&Œ 7,Zf*f1Lv7r"Ͳ,aB^,myӓ#2q)'\;}8U%d$Ȇn5(VV%ߜP@;_) !kRn[˳;+z#wތ$rqڟT5$d YuQl߳^v ul`j%A]Y=&GM=CC)﻽w๜cW D,9&WNLq$ GuK9Jk3A iƌNdg7Gn;Ңd\ >־AD z^,!Lہ_ jADR}VD*X X@c4^@¢bKClS σg U  "`Ȑ6ڬk~V1߈_KU67@ .^GZ@!99NwɐנܿQ8@}ƍ u`'Ӂ{cx'Vkd܇Xn? @Nk{?##fsI' G;9&wm.$psKz"mYlGt =<׀`zy PhRtz3{FYVA, H} $$Dj5V{uAd=%0N07# k]V *l˭>,nm:"dp !sg70Dm&.Ghxy*?QX.bf .}[a5uhI,d2@Q뵜IуoN%|DDY+&0pg q'I:*02,12"GB%b1M#g9j#U (=Ԡ \@ȜD}!,@`reF4!1.\:X@q߀|0]Â;g,erי;anR9 2],N|-6ACm 8@t(DŏXSB&hۤ@!؁4fl@Y 8.!w |,lJ}qPgx4i&t^dRbcQ4PtE0 L# 2 ؚ\'՞-'~1~mo}9Kmt{n{j!NDX&uIQDmB%2["KoSk7B@$len߬Mǭ9 W.WHI!nV 6D !2~\a$|=rtw0HW! [ ⃀d=FwSR@[4 [ma"#yocKQ(H]Hkw\S74) ;DT"YQW%{"C#{Ed7 DdU5͉)h&HD8(= cuZ@xw:%:Cm9&~&Vl#70X'^˥RqYF2rGV =Gݕ '"C_ @"r_B8~7 dXC_e#"mcDZ Oy[ 2"OD?F?8a@n/3/sRP"Jρ:UVfqA=VO(jch%A-mFfҋzQ ߍY[H Q!ZL(j2[6AuRV#j[75Ok#EH:/r+ cN sʈP )CO(_/$[sQotHWV*$#=,}ej 0"A-f(uЪZ=iMݨ|W ")FDiVlqO6Hb*@FW~;AfQߣ/oyޯ&6 + fAYv(}w%E~5_ėV"rF$r퇲:hr*q ֝sq?cE6&)xyr@wDy.EC65V/lV";E+3؎ACahHnm1 M q@c@mphM)jZWȩ[Ѵ۩LI ?ɷ Y5MVN)8xVGdy $yh2֟E8=6}m*`i_3Aզfd%U&oU,!{Pc m;~S<4?HTPs_;عrOl'm͘wlo9tJt ^rH-H[;ȑOӲ>uk9U9S#|inw2%D^%p;3 ]rhP|y&+px-ӀȹMfѽ%iMH~I~>H|:BE%M3#yEyK^M }a|`&j}^oK(ЦW٬v}+agFbXݩSXOb,^<2_=NgIjjʠ鸃>r0%2\6nÉQb\ 2/2͹m9L$NFZ Ar;6jiAݨ#Ahcl .wi;E)js_E vđ.t8&4H*f_>(~}Rxd/!j&y&~4X@'oﳲTTNx~;]n\`]T#O͕0̶(FDA޴--䤹a1ifՄ {e Y>6 ܦ˝i.56#XvyH%ّ3vz~a H^wY6ŝ j 4f[H3zO0]6~زBO|%G(ˆ}|MFx%ದ췩q޼\6}f$Wy<|v"CL%@b$;ONs{HW"#/;Wm)j#u~yH/62vNYm~jL5-Ǟ=_11s:O`{rm 1 ddHGՕ Bf݀V`wϯ*{6=ȩ{XF=fvDYZ ՙަ:amC HdQNKH:sk)3W ܻ7ӴBU(arl ڊ(_}iw]HF#rmbW?욫nIdQV%R{M]?s(߄0D%8[9< tf\@<9V+ t@Tx3DxoPQ"鬒VlI %X4CBP Fq ({ lv&?FأQQ $r[䖈+1Um2ykLn; `1Qm+>b  3"-a8&=b!5'?$;X^qtF8|0s8T0K;|@c dW.bKs~#| kyۈAjpK^9]ؗ݀X. "M$čҽk>bs KAJ"]Dh&cNHd~'"3 9~4]Z WM׼mD^%.+Vٮ <# U iѪkd) FCfU`l7t|T$F"| @qپ+>M>0^wJqyoo V݉wujWs:L1v*1Rn ۿs5x,',@>vȖT:e@m@ͦ* vCѴIER2ϯ*Dm,y)?'o5RjQ<9ȯ@}b` 5Eȏڑ2̡&5r\˸a'p-rg|ziFhlKEwALx|O@Q6i1s'rq/t<)]#Z E@2Almۆiw~1W'2E] ͸7yd?YwU ;Ԟ7 td$:&˛$pŽ[=Ib@~`,M9B»<^~4kϪD{ -GBgVncPG/Ѧk "-|~Dk%1nNKB_M">ER`፡&G~lO$B5-&v5P!T{ǀ> ŁH Η U[HW̠-B #!X %}Eę3djmGŰfX[a9B <%Gb(,yvܑO7]&2{ұr''^RgqWHX,&tE2v܀B9Tzw흹A=Ǟ٤19;@Tx~aȰ-_莚 !wTUЈxoנd>(PTtͤ2_L$-( ~ODb9 .2&aֲv_r&`]=D;ΨBP  +?Y x4r1g+JZo0uDxUf懻j~{>N<Qd*p;337K.8{6E~G0n;\Ϫ2ܱxFȁb*Yqrw9,_L >6ś9Ctٹǫ:w'`H,"S'|-bkJaxvhIMKG2*5.wfN}j`2zߑ)~jP/HEU?ΣdԽS)V^WSyevt:Ɣ qJ=[&MIv;֨ W9Tj"jFq9mB z]]ɼ#Yhyt=is}*z>ķnH!"7bOZջD|M IcjjW2dtjcм1-"Q 8|E@:<;C͑@3W&KWSJS:HFsNqj'jhۖA]GF>tq"d e$ "KLӨ!?VBi'%b!#d0ƦOe/%: et͔/7Ѝ|ĐM:SA}E^ -̜-}OMH.Ky<BN^ LhєR>:]ppȋQ\߬sȈrWr湧*欌9.P$3'U%k26.+rp"UE}W_(a 5.jf )b3n*oz򃞹0\dࣜDI-m ?UbiCU; ],9a#[-lTN'#6Q>󵈸Tx{C (ʍvqF)꧈-dGdE]~EuhHUqQDg[5BBDQ~H \|„*H͵)Q,ā0 YW*0KkϝVE者; .G!wmlo qhod]*z٪_=ckt8kX}{w T(V< mhQRufHuW % Y~@*6ذ5DgUw^ϟ̴D2AR}zvlv"ǖ4 ^]+WS*c6 Ӳ Lg AKkKNά0RU&\5<&ۺp$:C@ڹV/Sk1>YoK&Q\+X&NclKG:*]L gnXepVkv/,{XBBYϼB2Cph dˊm3QʵR?7SLJvV@$9\,i-.g@/l!I*IrdKğ6ylaïi# r߯L1/M^4=܄d0_XQqM!+-3ޕdyPmtry;TŚx=1}:)#÷wx#c'H=M-md!=r9 @&MQd1) .BKe倖@$ buy5"]pBnf 1U0r7Dg_N6!=FӨ왭HD˓ԷG݈! A<E_IlRdу!KPe6CY |H5 |dվܴP>/s%&Y!H3 ќE<"~ɑr8HkC̔qBnxĥ\xqv+$ɲBji(qaMXx4Nҩ-\BʖV\Bȅ!K[tUM3"tj: Gkݧ@M+>MMI#&K-e- ȑ&VCDIk!'O:pSyYMGpÃQ><F8m}DB./ DNi@6CxT,{'ƲEg>@mZM}cPCҮwFlؐ1iGd6P` {&MS$l;ܑwRmN9J$A@3ӦzGxKU%4f*J9',lDPfԊ\!{& g|&an\S/xxG&A΀6b ^{@ʔ ,TZzHdV r%f+ޓtɣ|RAdXuI 6"Kk:ܲwaȀܦ!2{m SF0yHe9ȝDYWj;ຝYzDMTtZ`hϽ X dvj@Zq E?BDM|N

!QPZU'z5zPW 6kf:⤸hkɸy d R}͉4.ٺR[dJdo  $.$YNٗ N;7pXPkEtJcKP@1u b!.H^q{/+ H>qK>tb*2d};ReW6RID/QHT@~'l  ٦y^fGT~Ț=W$9uqF(J׶@Ѿc;Tp'.(y-,xvbQzZ\y@<^ r> 2r$,>gdWA 7Vgu P=7(0G !-$?' 1Q˔ZcM.@Z$xCFV-^Hb e Ԉ:9 8ɏH$'d Ze!u=J V]h"L9C+- 1˖pUׂXy{3s-k 9%ؐFD]4@I$V6F !_TIࠐQhx*qD"5nVLSʢ#6)yY("HF>@Gd]jF}!ImLՕ3$t5R1HԁHٛUă^A\Cjz ˀH^,m3T:UE&Dn0O囈YrzEec=|O#宐v`(Y`֙d$} EC\ў"1g@$\ C̆t;LD ûDYk ̦*3dͱ:0 hl1 "f< p (Qot=(eugQ9R2 J Mq<%Uj &4[BV1>)s`/\dhVqγ+SDBXO:e$RNyfXA\a"w*k,\srUdN"Q'dkuc?F,vt#1_AiLM0Yp?͖o+6,MRR!D=Hg8] U=Q%lXtid]@Sg@NuaV!)ϦײCTUWLU,&J:x}xTuC=:SZc@O0 jJH?{u{Iy#oIU/Udmr^DqERUIT'4 K{H_H$方B6)Ww>xTࣵP9|@Xvz* ]!+J_*iEu:F ELˁC ļE;P \sNAXd GA$ :5 4 [(#b i5$tCGEĒ*LI(]|H:#OX UHt +)EX8ِ E1#o;[*u4ʦ 2\\CDBYH⁗XR/@"+u_rb"rHC*-ʺfHq$K$+" /P@tKEIq}y8>S  ܹT˂ojkSmdW>3ebsuUl2NэJHtAj,W*ulU9+$Oi)]hdgՔI%й8Q ~сK \60O #CfD8rw%ᦅyr|*_vU}WmTx]$zcT+ys jg9IRTѠNz- yHj 13n \F"A5g;rsY\Mۚ-nG"*1U[J֮_|YqN]Ԭn~b~m MjQ%h_["p&2O'\nhDmcx!FoI K,C4+!nސ nvi㴊N2 T46Ѧ]nR@Ìe=y\#˸!zByudAFQM.9M׳ŤrBFVgy;IjFAa S_vǘಘ8Mqs'̼Ҟ  8Y_2K!G[ՔjB !JrGZ<8 Y-dؑ~ 34#^ڨ]U5ZJ-)tvzyQ`tu5CdIQ^M?mAtEj*:N-kHU,{e$ \ RD.jMY`+'}\Aq{gRtWr|U-MiHئVbϖqy;ys%7 yE\ܑ݈e̕o*Ї8yN2?M2' Kg˸YbE&nw?B61JLFᮮmybO[Eo#(]0J>Gk)p/pwM~ ~ZѴpHUhmHv2n0岄.lj!(٫o\=r*QpU/{ ŅV%t't:E] VN:[ӯ3Ҩ1f?66S_$V"Ӛtxm//1]O%i}bDc=%0P_eJ>dz֋(EڨZh}a봥*HJXW~e22][zoT&Ҷ3v" Ut {ړߺxr|ʼI;2)}@&=I\w"fɠN0d!ɰNshp95'$Ԗn}C^Sr:!rR$E$*f;mL`+t juL6qn3S~gG2'x {U%{1o diWfhn[k7HR F6{.mZGt-5kԒӽ0()"n( ` f2OmV78&dkU!U-v|2@f',m$Tkײ_ru6ADk'Ҍʤ$ ֤oFߪI'dm/iJ ]sr VǤέ&̴lZ=yEʜ؈i٘tF,=JGƽK NèR &2 E)9H`&fr2#Y&۾p DRid=^(|uxbE$DaN"( T@t %u UdfE9`a~'ؽ->PxPsMzZB7-Z5 h-Y{A\)^K *^Y_x"o.ܽ~wq֟*ݧûyf}⡳[EZ,؇dzg /~kyhRH*u_Kd0!z=X/A4޸ʒ~Ҟ2">72ζX=d^EBB4< ZS7]I<`$iR[8ІQ*/ה~~nё5SFZuBkU< ŚRC.y] .K N̤Ijګa x,nZe-3 9bU'1g(JדU>M+3|`0T/~5~Pw^A` t;?dBjk}0_T:5?tDIރzr*9p 8<2ٽqr闇66>.S5BE)h7@HOܻ%z'Z(SR7݀ &+VP0A~Xa1{}X"~Hp}6~ٯ<  έ?s# y`P!4Bc,ިȒ (m؃}8H@"Eg,Q?. /ԟK+TY:CIEHj oTџq]D}[ۋ [Z 7$m*)ήo{RyRMOJ#<)1ONJ)18{Q;g$ǰ7Gv7Oob0QNN2+2iH?P4 G\$S'fD~89/"{焛0b~:Q%♙K<\ꏐ{#fOgEq)Œ>cڽp)~ۯ?qo _ǻ޿O^W˘/XG$?K8| ًV$#RʰO~'v "<@,5L/32R.Mm5oo^o^.ͧyDdry^[U]gKriku?߾[{W:C"Gi4볆tЛj77Vonl C<,ſ5 nq"ןF\ 4*C)0zp ?U?611̟rϋѳq&n`?$\~p)pP~7|re%>b[:K?Z(I'gʹPy=*˨}k<*gVΗdub7,|Te>`ʳt?*2ūo^5`z-א]4w?kܿ:&Gꛇ&I _FFux,0LiQ/^H>^cɶkHOQr7!i74FT$͢tW߼\-3mL_qq['HϾ~wo^~_}7_~s~'oyL1Kr]m!>w]9>LN_•t%їs .4 ZHokGY9OV"BXBq> ~ǧRQSws>tM9HkQ~1CA blH2Hl-b%ʱhR@ciςzFH10ͦqάx=w $`B~߁ƐHE6d81.\%Ei=ߨ:ٿ!3i.ZZf2عm@C.v)RФm뷍 UCDԠ0TlZUZ6 -M+ |\XUk͝FaZ2B=N2MeЍo%"y4ReO, JfčHSG8kwhQeB@,y,m|,<?E 0u} @ָ-jd3$e Me8@[{3KQsN/3pv{>NI)uYJ*Wj!9F졾b/u *x QY 7IQ.U'dRd ,z3Iu"C7_ 2 +P{H϶fdTFxB*S-Alκh$xBFl5zq7b l`X:" <]~Nd[P691gG2kx1TNG6x K7HzkŘ % eT#N[jQ ۇ9 /;RMgĎPYׯSc#su@8M&Έg1TTWZ6b{ZAtBTt7!O嘓O@b\y?HB9e6zBǧwG$%s]Er禨 GK;b[Cۈ,w[r2CM@H5enPupp]& 0m@u@mN04#%R ,F[]VŌ,nk¢Q Z7 qz$$쌧jYT%w,[{!s0xb'׼){~Mw 9FV9tzS>zC;r&+tc ;@_+zUyv`RU-R{븉;!Z#C˟7MESهt7(^3AmH0"z`g cڀd$n[;"* nKnEɥz$Ck7P27J%Le\ۅan&Sgdq@|OicAcu#f\mXG/TjtEh &bhi@^(\8;P7H&bFmO7!YЋT).{ͣ@uYMuU/,?O8dA"a^F 4j1iƬ[/d_'^qv ',|`||Y):W[g')- tZJ6nJO;$1sdt>X-88 ө'ԨHWP0RB*;iH6IpJz9Hh-wn #g" ֐Xb#ҡ%J c=V#5םo J]X &E$ ZJ@7<;0 |/}DzV֑#K K%Vʢo*RlF^ϻ/`i" , DY#ap'G0#1_Žh!ݑZ̐l"?!ecsVY|¶ÎʘMGH=7DcG-HW(E9$0`ޙ$0>DJJ)!Bc$={z{V%a4!"Fdd,LP2czP&Mehd(MF*O#Cn58͂NGF#Ld PP刞hMOiq%sF9*ۉjH⑨y`(& MVChXuEt`=35dʡL/ʾVF7 ʳmufD >5DPkAn~҆WD 2`S3`w3`n5 5IDz Oܐyd̳3g 22AȟJF|Fu"HϟrAdrdG-G&F^NaryC-`}dHKb )C,A H,qd&'?LFn5id:C=9.л AY1fǤcF2RCP>w:C|{ Y(!e -GܸىQX`C1![ ; C9v@Ձ^8J@qcm +!g34O)3ĜB{grr Á]!5=>aoKA+.ƿh^yDY((U<˔1 (`Džʐ}w"u<0Q}K.F|Og=Og4_EXuq+7t`Tp=-Ea`[/Il2V80%CGs1'f s+Q3vG2XTN-&8V}X67ɑ!߇[>}4 l5>zOGa EL:GG,"d22b@H}Fp=ۍa$a$M$c7<fHU} bÈǩNP #cH I+锓7Q8!ݕ߼{?~7O/ۿo~V4aoa6,OY5N^X/;^췿wBa3~_uWmW:z)Ꮶg^6|D X+y}׾GR_N7W,W y> _GOOw$0w|.owI7{?ywJI^\dscd/JqwE]蓲un}wp#=;wӏ#3Gβv,||$o#ֽ<d֝ ^í|}?.׷{)Lqpm97Tl[OcH3Coͥg'z*F`lqPN+VD*԰{٦HEM  nG_? i)SlϴOp~3xbcMAWO,MD~x+He0 Қ}=>O%%cܑ! ,h #EΫ<^Yzbbnt(ll 8F*@~݀pd%~Sk@]>Keszr͸(E2 Zp![(>ϷEkjѬ;>C[)6&[bHXzo&oĔ4EH ɜt͉.c޾#H+)t D zVwH Sʵ,Ϛv ‰xf+Uf"(vlӵP a*_Y˙4- {$R$6IrS:GQ `.dnHFE w*sT:ڴ`4v8)~Wg ^a@ΓOVߖ`Z% D/F W.^<QwV__|P8/4:9ś/EӃ0Y\{S( yua3=vocɬ&LNK%>2jG WAť]bݲt8iKtNe&;BjiE9Yh XY,<ЙW6׆v X2m;@ynt۝w_\<:+r,i_5gﻻ(C6b0^._pTؽr(D*  z$ VW5}ݠ n_^kNd"w}.rAgY3fT2z`.n)pID;o)mPs7A=9zH?ρQaWpm_IZV'E`*fQdb,>',DzBfF,t D]m;^}oIAײMF_+ahR [ihm?UJH.=DToX׾v#ao:u2Sqhy0l4M:{YC V ۽4O%')b - [M۝&SeqR7l!PܥkXUF}439ݾ"b(N–VAQ99ú̔NWXg RE4ȋR`cii|,H`ԝ34QxUS΃\ C+Yd2 9A\Xk XڔDcVgOOei$T\VUOӡ B$v|uk⿲6lYQ2j!2:W- |]}$Ãe-ԣCU&j"۰s>d[?e4)v)E(<=ۇ"+MAqe.`46n ҒɁUrXzt%~jf|2'BrOlb@#S 66&G ]0h)x"n=g]^D05+ڏ:^vb5l kQn Ç2 Xt~KYa-^MJP.;+ǵ0`qO;fG<'TNF=eȎPe󨷻ۉDz5*F;#0zᴕs*/\2/ 87=@MV%VZH-{rXN/R~ӽsT]69f6ɖ@js$䏹j(C9e>_c n,(vm& <*i& kBޡ<ϯK5#LsAHwxbt#Q r|}.?ͫ,ȖQEג J@"̌"s^-agz̓#kʦ'%,kӉIrNܰt0yH (͂| {HWs֗_|SN`ߋ5$Ox*= Y.৤[)4[cCƚvhM֙J4εLϬvNW\' \ѫ&}IYZY t2vbk J%-%Sߕ-{WQt{͂@2w8t W{r3Zߖ9k[%ϡ,JɕމL:Rcɪٵ.d2:E>m^PM,@i%kuE -9 H5 8]~qCp.&kW22'>仯6f(JD͂Iږ)tyd!ttx\|5G2[VAR"QךpljJP_)yw>|*w b A5dtNjפnɱz}>R2ͯKX/ؽԢY(:N(=j^ؿÎ*=|AqGPN I4Qۺ ۇ - f`i ܨ^q%*dz}Ը:R뒱qSJ,,dS#~Lh"rJN&>Sс%}o=<[!acz|z>,}Wt(A*gE[:a̶u(UAS)ٮm( 4jeyS,["49E32y gl%P֋!" Γoh{F;Ljr'4_iDULdCxk@K]GAH@U$Ay0Qւ~$ &s|ӓ8QP+1"ً^x~_yO rDDOnvٔ ,o]_8(}U_O {.ǰ'z#Jdstsx>z=JӀ[̉QzИMShNN&uN4PUUF[{/}q(X'kZД9'.`X=WDrlp#Y@Ez%7&[mTE-,lpMjH`Y "Bq 1>}ZBhr:.op ^lY25-K1=LOT' ((2FDD{ axV%d S*@m2p4K,dwOSH"S"G&Yd/юXv${GHoYD+̻I&Ӓ&HI]V")EU<Kfɪl~ L:r>h\j`U(xMAo0")elyD}iq&sY#?:dTCį>?S!4m؄ha.DuK-(c"{Nis-h!UȲT63+]y%ъd2´stxRW1r~mR*_CɌvdd8$40dB/ZRP/,Lt'?!5MJ! 2\R+N0R\|KN0AI)yMtZ:Z.كL\ B}8{3ɕE2{'"*̆qY-QKfޓi,7KntGP5Zk?| )#?IT#4ͫ8EY|]൰-"3ރ-ʌ)`nkdQ%rw=]H־,=+V bUcN3fx3dK`veɧj46%U|zHNv-1>cCDǢjL:v{Sz)[eOOXo}8vCzA#K+U Y'ex(:VHO$04ttx>+^Yާ.NCJN Rzc^i,{Y:q=!{vw8瞵/GpNOT|>Av[T]%#eQA^ߚ_53urDX"L k{l̷Qϟ &_0wǗ*ܯڰy+ʩ׸AUH GA ,V)}LrM'!4pKg  uc<-z(iv<<\.KM* [=w2CQ#<*] @g;O#,Zgr J8^y+%CE{J &.ȧ\ C6ڃ3qx9 n@`ҹ !mܐ^|]@63d^C Պ }| =β(޲"K U(Qp,~9U) +nF.%WM oX^[mY[ݸ]{Zo~chmQrI']ӧ&Rn!>SJuu! q-L\_/c\TZOEL(ۦ[%{nQ`*)W}ac4fƶ >}a47Ivڢ:T^rrWTL*uH9ZCfG$wwFQ"FhjށK"k_6q eӦ'7AY˶t|܁sM1׽ްO yzp x_vo\Єɘj!.Htyv,Ou[H8!Kzry]>iO텷_GMEE@=D]F ~OAJ6kpnqS[Gv.X%}YEBޘ$@}\T4Xz\pR2O zp?YM-U[ ?Ԗt j}(lŭ!yBq\o ]16V06S50EQڦ>*>\ɛN/Yc!dϷG_u;cA/(uu-dT<ڥ;ڤ/=G-;'BY ІL a/L[nz`jنrw6[K'Q}A-Cɤec$$m&B-_ɫb3` %{g)<휯9kxI7e('B&ZW#Qšd9(&ɲl62S|64=8jm]()`!{ K^\ =<\XI7'TmEJ\[_rqcXßϙ5(B{^O=@\fMz6E;:LIvtX<&X'i58R 7y[GܰKryᐼ][۴XWqK'$xUI[fQDS1IUͯtιU,i @U Ét>TwޢEٰ œHQa0I&Q ϻ&dD}!o{+2$p6UPixNu%Qv .]zќSQA@~L@~vE0M~7I!1UMayE#v]&xhXHL{aYQ=9rHyQU{UƐ(2kDAnZQ@`٘&/eթCS??Og;F$EF`Lƿh-b{%mcj bv$K+YUtݤ!2w ;G.Kɲ`*ּqt7Y0j-ߡNrHA6T%IgseRfؽdֵK&!5aTM(AŖi?5Z.9/4kr%H=Ɨ;]Dհ5&Sy70j; endstream endobj 171 0 obj << /Properties << /MC145 172 0 R /MC146 174 0 R /MC149 176 0 R /MC150 178 0 R >> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F1 584 0 R /F3 589 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 172 0 obj << /Title (gr19.eps) /Author (user) /Metadata 173 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 173 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibcȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7^[~*hWՕp tTvd {5`0q ^Xk#)ňIQHB&8:HLs|wwwmi$IF8ooʱ.Pϕܔ+mu2WO1r )*<9r#&7\p ˼¤_OYPwt?K%S vA!X#w$HNfQJ(fC\WcB81;Z|lR6֙^ '(L/>j}'7$DY d,_AV4E Gȿ endstream endobj 174 0 obj << /Metadata 175 0 R >> endobj 175 0 obj << /Length 16118 /Subtype /XML /Type /Metadata >> stream 2019-06-12T09:06:53+05:30 2019-06-12T09:06:53+05:30 2019-06-12T09:06:53+05:30 Adobe Illustrator CS4 256 132 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAhAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYqoXl7FaRiWZXMX7ciI0nH3YJVqe9KDvTFWvroY0jhlkI6jgU2+cnAfjirR bUJTRUS3jP7bHnIB/qAcAffkfliqFvbW3i9ORAZNRL8oJGq0jEfaWtV4oVqD0UV6YqmeKuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDtPMzlolDRRni/8AMxBo eP8Aq/j0xVXR1dA6mqsKg+2KobVVJ025ArX02IoKmoFaUOKooGu46Yq7FUBFbwx63NIkdJJYVaSQ 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 V//Z application/postscript xmp.did:018011740720681188C6ABDDD0C5C135 xmp.iid:018011740720681188C6ABDDD0C5C135 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:8a74b292-2736-3b4e-b605-a0e9b620e9f0 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:018011740720681188C6ABDDD0C5C135 2019-06-12T09:06:53+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Black Default Swatch Group 0 endstream endobj 176 0 obj << /Title (gr20.eps) /Author (user) /Metadata 177 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 177 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7dS}`-?yR|vJ8J*K Bo߽C0}/e E'$g1 $NނGAFg(0_55zw])mۢ6Fp$ &[r }5:ys%,7eJ@g[ݸ x$#n(BJ(gqB<9r#&7\p ˼¤_OYPwt?K%S vA!X#w&"HNfQJ(fC\WcW[[e>)L}}'wx" d,@ tsg_ U endstream endobj 178 0 obj << /Metadata 179 0 R >> endobj 179 0 obj << /Length 15482 /Subtype /XML /Type /Metadata >> stream 2019-06-12T09:07:49+05:30 2019-06-12T09:07:49+05:30 2019-06-12T09:07:49+05:30 Adobe Illustrator CS4 256 120 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAeAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FUJq9f0Te0 JB9CWhCCQj4D0Q7N8u+KuGj6QFKixt+JT0ivpJT0+XLh0+zy3p44q3+idK5FvqUHIsshb0krzjBC N06rU0PbFVPTIIoJr+OJPTj+sBlQRrGvxQxk8eP2gWqS3jUdsVR2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxVKtJ0rTG0yyke0heQwqxkaBEYtKg9RioHwl/wBoYqijo2kFeJsbcqUEXExJT0wwYJ0+ yGFaeOKqdpbQQard+jEIleGBmCxqiFuUorzH2moACCNhTxxVH4q7FXYq7FXYq7FXYq7FXYq7FXYq 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 8cP1dOd5O07KsXOXiql6D4sVZBirsVdirsVf/9k= application/postscript xmp.did:028011740720681188C6ABDDD0C5C135 xmp.iid:028011740720681188C6ABDDD0C5C135 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:018011740720681188C6ABDDD0C5C135 xmp.did:018011740720681188C6ABDDD0C5C135 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:018011740720681188C6ABDDD0C5C135 2019-06-12T09:06:53+05:30 Adobe Illustrator CS4 / saved xmp.iid:028011740720681188C6ABDDD0C5C135 2019-06-12T09:07:49+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 180 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 468.987 510.978 544.194 518.145 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://www.openstreetmap.org) >> /H /I >> endobj 181 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0020) /Rect [ 194.505 206.643 221.346 217.634 ] /Border [ 0 0 0 ] /H /I >> endobj 182 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0008) /Rect [ 153.492 109.668 165.888 120.659 ] /Border [ 0 0 0 ] /H /I >> endobj 183 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 397.734 258.951 410.13 269.934 ] /Border [ 0 0 0 ] /H /I >> endobj 184 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0012) /Rect [ 483.225 206.643 499.824 217.634 ] /Border [ 0 0 0 ] /H /I >> endobj 185 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0007) /Rect [ 313.791 154.333 361.494 165.327 ] /Border [ 0 0 0 ] /H /I >> endobj 186 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (sec0009) /Rect [ 381.399 154.333 394.524 165.331 ] /Border [ 0 0 0 ] /H /I >> endobj 187 0 obj << /Type /Page /Contents 188 0 R /Resources 189 0 R /MediaBox [ 0 0 595.245 793.92 ] /B [ 621 0 R 620 0 R ] /Parent 539 0 R /Rotate 0 /StructParents 10 /Annots [ 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R ] /CropBox [ 0 0 595.245 793.92 ] >> endobj 188 0 obj << /Length 19675 /Filter /FlateDecode >> stream h{Yo$Ir& ,@ "[XVsJ TCJ5I1ɮ.]GI?g:Zt47ss~g~qsx|k~/}|czi `G){̅ռw_{.n\{ l_q=sw/\.7ÿ K!xүse9 я ݯK.{&w+vͻ~A%zǔ~Ϩ%N׎pwnEǨ{kiNZc|)SwҲ]39WB1Ewt\&(=l}Zr94L(߭ q!GV1=XL ̌+ }|d~;_//8o7_ς\ sM3#B7t*[p D߽4I6v]26~.F^_$U0O_ly.}o_.<}t<ײ')A_dcK#Kw;g!R۞K55V:wl/ϟp H¯kƒp $A=\@|W ꇽFMȾ${oa%pxo#dSB_Yݐka; bz2jDR#P3fY<2pa,hYY<}ג) 8WY7YVVVJ:iVjNO/=˗[)?7"hç{p{K>ؕ%2,<8!: ONm F..I7 'Qw!"ͥ@?,g287n Y?[5o-~@ M:n }:n~:nY:Nhbڴ9M:0稉?5Y˚A΅Ϛ`ij!+5=3n Y 8Kn Y ;Kn Y'41_8M:gƭs!kYϬx6d-Gƭs!g+&m9w׷CD7voy8l*+)=v.e%D躻r!\R)V\>)-bDy?s0C {lzrذiHf\@>H(U뗋vSղztg !_[3E8E?Qm)|BJhW̭AIB Tȅ1_&LP2e2P S"rݚ4^z>WLڮ.}w|OKhD5?m`,~=lRf-: W~ W!L W}J0 pc|# 1DC$3$oI?J ̅0oI|d8Q.!KW9FY/ځۿe4bz3! ۷fF{MRTA6yӽs(eQ9;>^8R9GLl-,V4 ܛL݂ZP"9: >KFH3iӧYhGi f(i8rv tU-*uoE3lwnn.굵B9SԄKT!Gg &AĄK?9UeNGeh;g/hPr0$!>R3b]f 5" xMVp s˔Q(BM s}x%ɸ)Gr1& ?PkXB}j^){ztsW+K=[Mcm*C].%'1&\?l7_flIAe8kSO* ~GA*xDzJ8!Ęb`CΫP+i@MoCr:Y ΒptfIj=)pMKL/`"/9P RF!S#FCPǩM`G{=mĈ^9RJFu}Xޖ\Lv O1E!8<>.8LO, B1%ΙM L=VzH brLs 5C|Zuh$WH C>CiyC64wtDwA #tuEJ.2eVq> %X{r頕ARsKrZd?(KvۻlWq *qdܭ\{̈mMU;ȧq]E ^?|GTU6k5-Lj~b0=N;LfGl-!W’P%cZF}juL4KZ`@>\$<Va(E"OF4孆ɣvaD HGr)HEk,0V/=~ʺT*֣Vx"}. E&b1(T%?qf[kz`~ƘM;{̓d R|âSVa!K*R GՓ9q{/SiE 8o!G^yrS ۛn1!#=Ї*9S΋oV0- D4i&3Ke0r YŷGIBC.| /qB)1ʷHJkcwESwXj$m rFq"v~^aUNCmc>|W9hӀ<)H_1J#.DL˔ևljA ºV9u,X Sa{:<v[XC@ DęcIw=L}; ^6YڒJDn0Ĺ|_:14LmԨPbs`s s x!.;%Q(/kd*TAeGcs`2K^DRf[1+?OyH,e̪ӘԐz*]̋9iBwH|,qʶ5dzb%AUl J6#u$0Ė\weJb h-ݢiy= +D|)y+* sJ9[U?84Z4hVy;<(vP~ƾv+svzP*ۥvںF1&5,dIiA_4a%dp;Ӭ7:>Џ_Y z`&g8PdU1@l @*s< b.2x>ff@/-]ξQFM,mBmv&pCt]NPZ"Dyp1b9S0@ýĦ7ZJu w"(y!"T~_rx-1 ռ2!vs|ƒTs$=I&?Y8ssPgz6%7q[9閨=mz#e#x)2gB2UƐPF4Rȭ5UW\Qw'Ep1u9ՉA!Y-SYʲŷd]u^r4+ E$v>-K VxL(ѢWN=TDq] |`.1OHE^s*JצUiU)h3'ry} z^ə=M?ƀ7o SWXc]Z-\o הJ#fc]AA3f{}"8,YSblCYDsںVO㥯^u86/C S0Z'?x[V"qE~}{C^W,{|]1+L Oo B R$Ap!i5~8J+JFV"C'Qa89«4xq{j#F {ֺkiOcwæ1eZPKd~OCYOhhbsF"ypFJt&N P%z}@l8G/cZ7-ܟ|tz~3}34Mz)ܞ[f#* "=uY㟝'mw sdt %F4 y;rK] o EZD:nͺiZHF,8yd{v4ȧɝf;8B 5;zA18c*e!. T":`-0QG7ma.P`)//,D3;%uIJA̤2j\Ƹه < &M@K]wrҔ >!6G2X1F,)RG.hKqeѤoK&EĬ ̒Ý]N}0-l,#qӀxR';â&TȄGS! fZ:֡2g$J乥1Vemӆ6g/!+gSFTcV'PߐPADX|Q+ܠ]JY0 OaL=JMCe4VxjO8J,!\hWlCz4%U̿u,$P/O-_< 5^'AH!z1~x{ɂUÉ$g$w,( ډ*"y#e*DP4_ObvUcNW[a{)ida0H̻l^Rc߿"iMdz- 3W cXReY\r+qK*\RokqNB)—]GV RPS)Wh5f09T~W1;``xÚ.,avNQAJ;6 7oeux[e6e<вWor g$ 輟λSwʆQ⃑@cGLOtPXxv/0@Iu$oމ0JCAJ9j3=J G`c* _$mJM)P}nv٥<4]LKn}.ַNQ*Qc|n=w.$+&gKkZ"h CU)s{5 4sC81'!(GtVSX_7uG80ai;7HNz@4(?_~zyX"S2nդhAAzY h'{`"m?'rJZF[` HOCIgÄPRUUU#/d|jֻzԓ3 fc٥YnXS0;Ub?ܶQ/HVlpYŗ 3-G ' F_rRkcp|DQSOEBTZDtsюD&߀ZrҘuIȬ@ LҋZ !燬ACb!k|v~R&?pf+zzE BP H~qkJPXT}4 POϔ<֪3|M0RB֨Lr }w8LBĂyٱ@'?<Ʉ' ᢜ i:35=MXD0U*fT,UfA͛Z>sc_0%sZPC\Zubǽ9ʐYOՂ!$M~#2(TFgBcO} ْke-#i-βPZ G$?ݿ&RjMC0chTM 08##QNx!c]c stYm{.o1[i%w+34@^*FKP5YI{VgVKlo9`W[Gg }EWyu^I@("`5§myy/ Ec^Tu 3Gxi-G+'XK됶M/+E 8oEu`61a$%=ʟCzv4\i )67u&∔Ŵ?n5 A -SF^3F##GT 73JޫorA0U %<͛.5tu:iB S6!߶66io ._i RQ/NHRi&]IQ?$$o18]% wtqӺ-Y S7d̒4ۡ:4h|P i]ʕx TF)YDy 9#"\~5]2g5cꏈrC!'ix6 xlQL)RYa쌡 z4jX 4 [Bq5sR"}~/,B|u޹t辔K\rD4^3^ "!*ڊ+'Ny@9`\Q"D3l=0&;iH_HUG)D.q0'c9{h4, 3)mg7Fz9Ƹ?An#,T|`y-V7E"HidfI*a.Lj@9 owy' sHIc*{o`E,QYAzdݎ67@VO]J%E%uaZbV84OHPFq!PXRWHO'] Z/C ֫ \m4v-7/\ëJ+&R$!ݡORФ-d84ql4?JA3F! 4Ņ*oeFyۂXE(eV0cZPS;0#3|R-8Im?2ey'EM](C"a 8 MStц0)gͿ+n=Y,2x)LJѸyd9mHqj1SZ  (LST_s~jWT^q$1.oVP;&9b}65 9kPnB5 j{)KO.Bm!ψ6{břXB]/3Q ^|˓B&/C>_0[ վSlo0.aΚHB ÐUܟ|D1q^̞}8qpC- uC<{^n(Cwm O "!25ԦєVa%ǢHɘ.xC](F`i zm9WeKP# bhq "cLͽCt$G>l[eO9/kDYU.xŪR.E} ;m^Pc *QUыa{MRȝSc`7GXY׵O\p?Xl힊 +8H-y$ySϐӢNH,U5^ >en0jE&k^SZK D4nA9-VE+Dx6l01(ㅞCB ңnuCv)]BXRr*Mӛ@iJ&ϝш7LZ8r#zs]QJ{H7 48ji3/ GvV aP F#)ӶAp>>|RB.,6{i d,mp(Ń?|6avtd$QeIh$&A7?p6h@87fCc Z'w!oѧ.N(D"U'dʜrÅpq5 D;n f(0uF"fRR]4iSqmzm=Salo?^+{/d]VIEK+LA{AoJs0Š-QNǰ (`W &tPvMz\{%0=lI*7vB mے0TSW 7sM*pT=*ֈ M)5o C)xL 0+<Q/ٹ*b-yaFpI₉k[{簙%&uSo3'TnsYy.? Wfh3+N0(͏*d~?ֲƑ]#fв!@Lrb"CC4ɐ&P7,4/7^?ެ*3 YYhtyu瞃='2c90j?^׭ (/bﰬmaQ6mwVц5Fw9P+ a7ptܸ;:ݸ8"423<%łcXz%i83; EN vEm?UCC24y"/S~T0gmGj].(׉y.iԕs,ϝҽV{RR);ѧT:`9AH4w'(;"r7ͼ *Py !y`煃Z;+NxY4Uj37{ `{SKY2X HOtf1nCCZcr|t`M%VfOIXppv8R58^z5/7_bHQxvdKfkV] DB4`z"`'HؠH%ocpsUۑ?[iJ8ػkWWo.o._?oϞ_~C4T .%NzS: 62%Lۺ7#1R3AQZNL eLٛ.]2Ч02Ý/[_ϗַw irsxLΖvM A(w8 G6C(m:3Q? l;4!ad }@ j;Yha8 UEE*g) Z@,` ?mۇ]{ 鎝B orZ҈S.!-å-M7b6MQ0 YmӜKHFЉ// S"%sY\ap5ԡ7B%(# |>[Z!\i 8_hliK02Ɨ=ĊfO\nl}7N""Ɗz$<1dm9!en|YXikڳN(lNE")/BJSsW|P*B\l~֘< [* ب!";WC1*(s)a% v˕vԍU)=dr1̝OȩsB֦^me+v:"1vYIȇ\L縐݌lp `-3`jd.Q9VɲG9C*&}Dv/QWmf*t٠m(T8]MWF7c!O BkC-]5((cgFL"gğ5m.}Q2K|$mJ %D:VM1ar5`f FvP֫〒17\pQima)ヒXJAɉW"D#o;qzWJ,ɐnf-kXv&ObvZ)2#DV/J^qzI6PX'SeW13N.ܽ/}F )tқ9klx9!ݓASeO+$qz(Di!V02dj8,08&fW2.%,ZrXɉB* L_/X¯8` 'bYODwMj(dP_Bv^fd$&gB'Z]"\l >7E5Q8u;m\Hd]زtϹ+߰;ΥPE}'<\u} ):2[Z' VŖuٻy|wUIٟǿ'`hH_5"{0l@ ` s<g_߼3;CR\J%2_5لKbY1jrZm(1ݟFhEj܀I_]~N'yt8BW-4hPS-/d%HBH 諈Q^6n?/pmdf EoPڪfdAu׫!1ؠhG]*^֫!+0!|ֱؾBu=?<} PHL]=7vkx6ww-k.os~F s3GPEZI+E7>gR4w`GchWrՌ {eS}&(yԝJP7XaٜEfӎLD D e"R>#;g}*Ru~}z|-{XLmgpPלAIތ$:sr-7-$_r[)jAo )R_hvW0sي qz]I<*V%uD-|&ٚ#!jvE,5d|rdUhxjV@JQ,+Q0W0,Mwa̒ܜjڰҲ$~<],m.)- m<,xHՊ TbY"*NLi>3,^ J\.5# twL4ꔄm(4ũ{MїaqcFNbseL,cOg(pEQz?trosZlbgg` Q|6]{a?h9Y\}^+r_υ3χT7}ovg,88f'U2Ұ69eٹ:!W0 r>T"12-wYl z53_V# ئeHIUAz7[x电{WNٚEaKUWmI@(&8AW>M[^д"NU–(ةEYY#*E.iVˏ(ٵBue5g,λA켒^)kV=\ ybPHc={^jz\E-@LsLX)Ӏc(|a$MpcUrz%J,ɤy5W:Jv5hmJ+liTIֿB4QL| 5Dc:FVNblw=o&y S^=P$U>#^1Fc%,dPuLOw7#]瘨L/% 3AVDKe6OYFMN 9O]rG 2XF<:9q+!oHSZV_#|< S`T_ /}#Q?C3,oޏV.h-0=n穴M69?,QBExy_` zPt1$nR2*y6ÃI G,vЇLbZm#uB+m=H1nM(Y{OG.!r>2g Ѡ;H c?S`H(yEXNZe 9&H<(`JT:G<ǛAb6 4cy%t.=K8-r|; ɹcvZx)C> /Font << /F12 278 0 R /F8 560 0 R /F6 565 0 R /F5 579 0 R /F1 584 0 R /F10 599 0 R /F13 281 0 R /F2 609 0 R >> /ExtGState << /GS1 286 0 R /GS2 287 0 R >> /ProcSet [ /PDF /Text ] >> endobj 190 0 obj << /Title (gr21.eps) /Author (user) /Metadata 191 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 191 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibcȏ(ڨj[UI5mW롏W MCJ=0 3ciҋf|/؊]2"O7^[~*hWՕp tTvd {5`0q ^Xk#)ňIQHB&8:HLs|wwwmi$IF8ooʱ.Pϕܔ+mu2WO1r )*<9r#&7\p ˼¤_OYPwt?K%S vA!X#w&"HNfQJ(fC\WcB81;Z|lR6֙^ '(L/>j}'7$DY d,_AV4E Gȿ_ endstream endobj 192 0 obj << /Metadata 193 0 R >> endobj 193 0 obj << /Length 12938 /Subtype /XML /Type /Metadata >> stream 2019-06-12T09:08:53+05:30 2019-06-12T09:08:53+05:30 2019-06-12T09:08:53+05:30 Adobe Illustrator CS4 256 44 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A775U8uyaNpLQ6HcMsEd3 e/6FeO88bf6XLWkrFpkY+NWXvxJxVD+ZHsb7W/KqatZNbXVtqhkieS5MEasLO4KPC6Mi3BaRVX0f t8SWKcQ2Kp7H5U0aOKOJRccI45YUrd3RPCeoepMpJPxfCx3X9kjFWn8paK6MjC54tAlsaXl2D6cb K67iX7VUFX+0ehNCcVSLzn5e8uQ2drNdLIeeqafMBJf3EZ9SGWimIGX4nCsxESCrnsWpirIfrGsX 21rF+j7U/wDHzcLynYeMcHRKjoZDUHrHiqW+UvLGmaRrHmW8tjNJe6leRNe3E8ryNIY7WIrsTwXe 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 Yq7FX//Z application/postscript xmp.did:048011740720681188C6ABDDD0C5C135 xmp.iid:048011740720681188C6ABDDD0C5C135 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 xmp.iid:038011740720681188C6ABDDD0C5C135 xmp.did:038011740720681188C6ABDDD0C5C135 uuid:9d5bdfd0-cc90-0241-ab1b-9c0c28b6af67 saved xmp.iid:038011740720681188C6ABDDD0C5C135 2019-06-12T09:08:51+05:30 Adobe Illustrator CS4 / saved xmp.iid:048011740720681188C6ABDDD0C5C135 2019-06-12T09:08:53+05:30 Adobe Illustrator CS4 / iTextSharp 5.2.0 (c) 1T3XT BVBA 49.606323 66.141724 Picas 1 False False Helvetica-Bold Helvetica Bold Type 1 001.007 False HelveBol; Helvetica Black Default Swatch Group 0 endstream endobj 194 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0003) /Rect [ 67.974 631.533 80.37 642.524 ] /Border [ 0 0 0 ] /H /I >> endobj 195 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 56.76 537.384 69.156 548.375 ] /Border [ 0 0 0 ] /H /I >> endobj 196 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0015) /Rect [ 193.992 474.618 210.483 485.609 ] /Border [ 0 0 0 ] /H /I >> endobj 197 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0009) /Rect [ 110.247 464.16 122.643 475.151 ] /Border [ 0 0 0 ] /H /I >> endobj 198 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0016) /Rect [ 250.035 464.16 266.481 475.151 ] /Border [ 0 0 0 ] /H /I >> endobj 199 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0017) /Rect [ 82.545 453.702 98.802 464.684 ] /Border [ 0 0 0 ] /H /I >> endobj 200 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0016) /Rect [ 123.54 432.777 149.733 443.768 ] /Border [ 0 0 0 ] /H /I >> endobj 201 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0001) /Rect [ 271.077 422.319 283.473 433.301 ] /Border [ 0 0 0 ] /H /I >> endobj 202 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0004) /Rect [ 144.717 296.787 157.113 307.778 ] /Border [ 0 0 0 ] /H /I >> endobj 203 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0021) /Rect [ 216.249 234.021 243.009 245.012 ] /Border [ 0 0 0 ] /H /I >> endobj 204 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (fig0021) /Rect [ 222.675 213.105 249.624 224.087 ] /Border [ 0 0 0 ] /H /I >> endobj 205 0 obj << /Type /Annot /Subtype /Link /C [ 1 0 0 ] /Dest (bib0011) /Rect [ 390.786 621.075 406.926 632.057 ] /Border [ 0 0 0 ] /H /I >> endobj 206 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 435.237 507.063 537.957 514.23 ] /Border [ 0 0 0 ] /A << /S /URI /URI (https://doi.org/10.1016/j.cagx.2019.100007) >> /H /I >> endobj 207 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 469.472 348.516 478.428 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0001) >> /H /I >> endobj 208 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 351.762 469.472 389.583 478.435 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0001) >> /H /I >> endobj 209 0 obj << /QuadPoints [ 387.591 469.47 573.975 469.47 573.975 478.426 387.591 478.426 316.14 461.5 390.78 461.5 390.78 470.456 316.14 470.456 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 460.503 574.971 479.422 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0001) >> /H /I >> endobj 210 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 453.531 342.648 462.489 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0002) >> /H /I >> endobj 211 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 344.616 453.533 380.034 462.487 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0002) >> /H /I >> endobj 212 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 381.993 453.533 412.227 462.489 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0002) >> /H /I >> endobj 213 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 414.186 453.531 446.013 462.489 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0002) >> /H /I >> endobj 214 0 obj << /QuadPoints [ 444.021 453.531 573.975 453.531 573.975 462.487 444.021 462.487 316.14 445.561 573.975 445.561 573.975 454.517 316.14 454.517 316.14 437.591 368.145 437.591 368.145 446.547 316.14 446.547 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 436.594 574.971 463.483 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0002) >> /H /I >> endobj 215 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 429.628 343.134 438.585 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0003) >> /H /I >> endobj 216 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 346.317 429.627 374.553 438.585 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0003) >> /H /I >> endobj 217 0 obj << /QuadPoints [ 372.561 429.627 573.975 429.627 573.975 438.583 372.561 438.583 316.14 421.657 473.31 421.657 473.31 430.613 316.14 430.613 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 420.66 574.971 439.579 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0003) >> /H /I >> endobj 218 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 413.681 337.77 422.637 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 219 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 339.873 413.679 369.99 422.644 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 220 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 372.102 413.681 394.452 422.644 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 221 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 396.564 413.681 433.17 422.637 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 222 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 435.273 413.681 458.019 422.642 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 223 0 obj << /QuadPoints [ 456.027 413.679 573.975 413.679 573.975 422.635 456.027 422.635 316.14 405.709 573.975 405.709 573.975 414.665 316.14 414.665 316.14 397.739 375.309 397.739 375.309 406.695 316.14 406.695 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 396.742 574.971 423.631 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0004) >> /H /I >> endobj 224 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 389.777 346.365 398.733 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 225 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 348.198 389.775 383.688 398.733 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 226 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 385.521 389.777 410.148 398.733 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 227 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 411.999 389.775 446.634 398.731 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 228 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 448.467 389.777 481.374 398.733 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 229 0 obj << /QuadPoints [ 479.382 389.775 573.975 389.775 573.975 398.731 479.382 398.731 316.14 381.805 573.975 381.805 573.975 390.761 316.14 390.761 316.14 373.835 445.248 373.835 445.248 382.791 316.14 382.791 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 372.838 574.971 399.727 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0005) >> /H /I >> endobj 230 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 365.862 354.978 374.82 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0006) >> /H /I >> endobj 231 0 obj << /QuadPoints [ 352.986 365.862 573.975 365.862 573.975 374.818 352.986 374.818 316.14 357.892 510.219 357.892 510.219 366.848 316.14 366.848 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 356.895 574.971 375.814 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0006) >> /H /I >> endobj 232 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 349.925 352.71 358.881 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0007) >> /H /I >> endobj 233 0 obj << /QuadPoints [ 350.718 349.923 573.975 349.923 573.975 358.879 350.718 358.879 316.14 341.953 444.915 341.953 444.915 350.909 316.14 350.909 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 340.956 574.971 359.875 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0007) >> /H /I >> endobj 234 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 333.986 344.241 342.942 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0008) >> /H /I >> endobj 235 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 346.2 333.986 380.376 342.942 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0008) >> /H /I >> endobj 236 0 obj << /QuadPoints [ 378.384 333.984 573.975 333.984 573.975 342.94 378.384 342.94 316.14 326.014 442.755 326.014 442.755 334.97 316.14 334.97 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 325.017 574.971 343.936 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0008) >> /H /I >> endobj 237 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 318.047 347.67 327.003 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0009) >> /H /I >> endobj 238 0 obj << /QuadPoints [ 345.678 318.045 573.975 318.045 573.975 327.001 345.678 327.001 316.14 310.075 371.079 310.075 371.079 319.031 316.14 319.031 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 309.078 574.971 327.997 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0009) >> /H /I >> endobj 239 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 302.106 354.528 311.062 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0010) >> /H /I >> endobj 240 0 obj << /QuadPoints [ 352.536 302.106 573.975 302.106 573.975 311.062 352.536 311.062 316.14 294.136 503.892 294.136 503.892 303.092 316.14 303.092 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 293.139 574.971 312.058 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0010) >> /H /I >> endobj 241 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 505.833 294.134 511.542 303.088 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0010) >> /H /I >> endobj 242 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 286.158 349.029 295.123 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0011) >> /H /I >> endobj 243 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 351.6 286.16 388.161 295.116 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0011) >> /H /I >> endobj 244 0 obj << /QuadPoints [ 386.169 286.158 573.975 286.158 573.975 295.114 386.169 295.114 316.14 278.188 522.513 278.188 522.513 287.144 316.14 287.144 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 277.191 574.971 296.11 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0011) >> /H /I >> endobj 245 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 270.221 343.836 279.177 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0012) >> /H /I >> endobj 246 0 obj << /QuadPoints [ 341.844 270.219 573.975 270.219 573.975 279.175 341.844 279.175 316.14 262.249 390.744 262.249 390.744 271.205 316.14 271.205 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 261.252 574.971 280.171 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0012) >> /H /I >> endobj 247 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 254.282 353.034 263.236 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0013) >> /H /I >> endobj 248 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 355.344 254.28 388.017 263.238 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0013) >> /H /I >> endobj 249 0 obj << /QuadPoints [ 386.025 254.28 573.975 254.28 573.975 263.236 386.025 263.236 316.14 246.31 420.12 246.31 420.12 255.266 316.14 255.266 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 245.313 574.971 264.232 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0013) >> /H /I >> endobj 250 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 517.317 231.096 552.807 238.263 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://arxiv.org/abs/1709.00184) >> /H /I >> endobj 251 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 222.402 349.992 231.36 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 252 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 352.23 222.402 383.553 231.36 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 253 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 385.791 222.404 432.126 231.36 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 254 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 434.364 222.404 473.652 231.358 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 255 0 obj << /QuadPoints [ 471.66 222.402 573.975 222.402 573.975 231.358 471.66 231.358 316.14 214.432 515.493 214.432 515.493 223.388 316.14 223.388 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 213.435 574.971 232.354 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 256 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 517.425 214.429 523.134 223.384 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0015) >> /H /I >> endobj 257 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 206.465 350.577 215.413 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0016) >> /H /I >> endobj 258 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 352.662 206.463 381.654 215.421 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0016) >> /H /I >> endobj 259 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 383.739 206.465 409.887 215.421 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0016) >> /H /I >> endobj 260 0 obj << /QuadPoints [ 407.895 206.463 573.975 206.463 573.975 215.419 407.895 215.419 316.14 198.493 485.604 198.493 485.604 207.449 316.14 207.449 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 197.496 574.971 216.415 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0016) >> /H /I >> endobj 261 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 316.14 190.526 351.126 199.474 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0017) >> /H /I >> endobj 262 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 353.769 190.524 383.193 199.48 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0017) >> /H /I >> endobj 263 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 385.836 190.524 420.489 199.474 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0017) >> /H /I >> endobj 264 0 obj << /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 423.132 190.524 452.673 199.482 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0017) >> /H /I >> endobj 265 0 obj << /QuadPoints [ 450.681 190.524 573.975 190.524 573.975 199.48 450.681 199.48 316.14 182.554 482.283 182.554 482.283 191.51 316.14 191.51 ] /Type /Annot /Subtype /Link /C [ 0 1 1 ] /Rect [ 315.143 181.557 574.971 200.476 ] /Border [ 0 0 0 ] /A << /S /URI /URI (http://refhub.elsevier.com/S2590-1486\(19\)30007-X/sbref0017) >> /H /I >> endobj 266 0 obj << /Metadata 267 0 R >> endobj 267 0 obj << /Length 14109 /Subtype /XML /Type /Metadata >> stream application/postscript 2019-06-12T15:12:11+05:30 Adobe Illustrator CS4 2019-06-12T15:12:11+05:30 2019-06-12T15:12:11+05:30 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Al/8Azlf5v80eW9M8uyaB qlzpj3M1ys7W0hjLhEjKhqdaVOKvnL/lc35rf9TXqX/SQ/8AXFXf8rm/Nb/qa9S/6SH/AK4q7/lc 35rf9TXqX/SQ/wDXFXf8rm/Nb/qa9S/6SH/rirv+Vzfmt/1Nepf9JD/1xV3/ACub81v+pr1L/pIf +uKu/wCVzfmt/wBTXqX/AEkP/XFXf8rm/Nb/AKmvUv8ApIf+uKu/5XN+a3/U16l/0kP/AFxV3/K5 vzW/6mvUv+kh/wCuKu/5XN+a3/U16l/0kP8A1xV3/K5vzW/6mvUv+kh/64q7/lc35rf9TXqX/SQ/ 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 pdfTeX-1.40.16 False This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1 xmp.did:600632E82D20681188C6ABDDD0C5C135 xmp.iid:600632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c uuid:5e3f2700-f124-4776-87ef-9b551abe1679 uuid:f635612e-74cf-489f-9121-637e1eec539c uuid:f635612e-74cf-489f-9121-637e1eec539c saved xmp.iid:600632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:11+05:30 Adobe Illustrator CS4 / 51.000000 66.000000 Picas 1 False False Black Default Swatch Group 0 endstream endobj 268 0 obj << /Title (fx3.eps) /Author (user) /Metadata 269 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 269 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibaQQ6Hkf7h C4Hz`fDgm Z6+b4?W\]uzy#;,YD-k2Qˢbmyw&fݮҀI@ < w=!O/`)OApk r])MӐ& Jo!u}p_ST'~.:+M Z&xJ)k-{J*(Hȡ0GGT0| ?ڇ%u:*}~7/:Ɍ ,ƸuRZlڀ@Yg?X=[`[i,DQ׈P9myiN`rH΍R2:uetx yGčSW xw2Cf !3dWE4Pɹ#;{ endstream endobj 270 0 obj << /Metadata 271 0 R >> endobj 271 0 obj << /Length 12496 /Subtype /XML /Type /Metadata >> stream application/postscript 2019-06-12T15:12:23+05:30 Adobe Illustrator CS4 2019-06-12T15:12:23+05:30 2019-06-12T15:12:23+05:30 256 124 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAfAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXi/wCevmzzP+XWt6L530etzpV0Tpuu6XIxEMpWstu468JePqD1 AOyg1G2Ks/8Ay+/Mnyt580ddS0O55OgAu7GSi3Fu5/ZkSp+hhsexxVlOKuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVh/5ueTx5v/AC71rRETndyQ Gaw23+swfvYgPDky8T7E4q+C/LXmjzB5X1eLVtDvZLC/h2EkZ2I7o6mqup7qwpir69/KD/nJLy95 wEOk6/6ej+ZDRFBbja3THb9yzH4HJ/3Wx+Rbsq9nxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvgj8+/J/8AhX80dYs4k4WV6/6QsQNh6V0SxUDw SXmg+WKvPMVe3flP/wA5OeY/Koh0rzKJNb0FfhSQsDeQL24O5AkUfyufkwApir6y8pec/LPm3S11 Py/fx31qaB+BpJGx/Zljajo3swxVOsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdir56/5zC8n/AFzy1pfmqBKy6VMbW8I/3xc/YY+yyqAP9fFXyVirsVTb yz5r8xeV9UTVNBv5dPvY/wDdkR2YfyyIao6/5LAjFX1F+WP/ADlhomq+lpvnWJdJvzRV1OIE2kh6 VkXdoT96+64q9+trm2ureO4tpUnt5VDxTRsHRlPQqy1BGKqmKuxV2KuxV2KuxV2Kpd/iPy9/1dLT /kfF/wA1Yq7/ABH5e/6ulp/yPi/5qxV3+I/L3/V0tP8AkfF/zVirv8R+Xv8Aq6Wn/I+L/mrFXf4j 8vf9XS0/5Hxf81Yq7/Efl7/q6Wn/ACPi/wCasVd/iPy9/wBXS0/5Hxf81Yq7/Efl7/q6Wn/I+L/m rFXf4j8vf9XS0/5Hxf8ANWKu/wAR+Xv+rpaf8j4v+asVd/iPy9/1dLT/AJHxf81Yq7/Efl7/AKul p/yPi/5qxV3+I/L3/V0tP+R8X/NWKu/xH5e/6ulp/wAj4v8AmrFXf4j8vf8AV0tP+R8X/NWKu/xH 5e/6ulp/yPi/5qxV3+I/L3/V0tP+R8X/ADVirv8AEfl7/q6Wn/I+L/mrFXf4j8vf9XS0/wCR8X/N WKpL50HlXzP5T1bQLjVLMJqVtJArmeI8JCKxv9r9hwG+jFX563FvNbXEtvMvGaF2jkWoNGU0IqKj qMVUsVdirsVZn+X/AObvnnyJPXRL8mxZuUumXFZbVz3PpkjgT3ZCp98VfUv5c/8AOTvkXzSI7PWG Hl7V2ooiuXBtpG/4ruKKo+ThfauKvYVZWUMpDKwqrDcEHuMVbxV2KuxV2KuxV+YuKuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVn35ffnd+YHkdkh02+N1pan4t KvKy29P8jcNF/sGHvXFX0z+X/wDzlD5A8ymK01dz5d1R6ApdsDas3+Rc7KP+egX6cVewxSxSxrLE 6yROAyOpDKwO4II6jFV2KuxV2KvzFxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2Ksw8j/m15+8lSKNC1SRLOtX06f99at3P7ptlr3KcT74q+ifI3/OXnlj UBHa+brJ9GuiAGvbcNcWpPclQDNHU9BR/nir3LRdf0TXLJb7Rr+DULN+k9tIsi18CVJofY4qj8Vf mLirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV THQ/MWu6Dei+0XULjTrsbetbSNGxANaNxI5D2O2Kvqn8mPzO/PnXRbpqvlldU0lqA63PTTW4n9up XhMB/wAVx/Tir5FxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KonT9N1DUruOy0+1lvLyY8YreBGkkY+CooJOKvbPIv/OJnnXWBHdeZZ49AsWoxgNJ7xh4 cFPBKj+ZqjuuKvoTyT+Q/wCWnlARy2Wlre6hHuNR1ClxNyH7SggRxn/UQYq9BxV+YuKuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVMND8v63r2oR6dotjNqF7J9 mC3Qu1K05Gn2VHdjsMVfQf5f/wDOIF9OIr3zvf8A1SPZjpNiVeU9+MlwaovuEDezDFX0T5S8ieUf KNn9U8u6XBYIQBJIi1mkp/vyVuUj/wCybFU+xV2KuxV5T/0K/wDkz/1Z5f8ApMuv+qmKu/6Ff/Jn /qzy/wDSZdf9VMVd/wBCv/kz/wBWeX/pMuv+qmKu/wChX/yZ/wCrPL/0mXX/AFUxV3/Qr/5M/wDV nl/6TLr/AKqYq7/oV/8AJn/qzy/9Jl1/1UxV3/Qr/wCTP/Vnl/6TLr/qpirv+hX/AMmf+rPL/wBJ l1/1UxV3/Qr/AOTP/Vnl/wCky6/6qYq7/oV/8mf+rPL/ANJl1/1UxV3/AEK/+TP/AFZ5f+ky6/6q Yq7/AKFf/Jn/AKs8v/SZdf8AVTFXf9Cv/kz/ANWeX/pMuv8Aqpirv+hX/wAmf+rPL/0mXX/VTFXf 9Cv/AJM/9WeX/pMuv+qmKu/6Ff8AyZ/6s8v/AEmXX/VTFXf9Cv8A5M/9WeX/AKTLr/qpirv+hX/y Z/6s8v8A0mXX/VTFXf8AQr/5M/8AVnl/6TLr/qpiqD1n/nHT8jdH0i91a90mVLOwgkubh/rl1tHE hdv92eAxV8V3EkUlxLJFEIIndmjhBLBFJqFDNUmg2qcVU8VdirsVRmkaPq2sX8Wn6VZzX19MaRW9 ujSOfoUHYdzir6I/Ln/nES8nEV/56uzaoaN+h7NlaU96TTjki+4Sv+sMVfR3ljyh5Z8raeNP8v6d Dp1qKcliX4nIFOUjmru3uxJxVOMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirxL/nLLzh+h/wAvI9Egk43fmCcQsAaN9WgIllI+bemh9mxV8ZYq7FVyI7uqIpZ2IVVU VJJ2AAGKvcfyx/5xY80+YhFqPml30DSHoy25UfXpVO+0bbQ/OTf/ACcVfU3kz8v/ACj5M0/6l5d0 6OzRgPWnA5Tykb1llarv12BNB2pirIcVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdir4g/5yd84/4h/M+6s4ZOdjoSDT4QD8PqqeVw3z9RuB/wBUYq8kxVmn5c/l L5y8/Xwi0a1KWCNxutVnBS2i7kc6fG/+QtT8hvir68/LD8hfJXkNI7qOIapr4FX1a5UFkalD9Xj3 WIfKreLYq9KxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xVJPO/me38reUdW8wT0K6dbPMiNsHlpSKP8A2chVfpxV+dE015qF9JNIWuL27lLuQOTySytU7DqW Y4q+hvyh/wCcVrq/WDWvPqva2bAPBoSEpPIOo+ssN41I/YX4/Er0xV9R6bpun6ZYw2GnW0dpZW6h ILeFQkaKOgVVoMVROKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV4Z/wA5O3Gva5baJ+Xnlu3e81XWpjeXUEVPhtrYgIZSTRI2lblyO3wYqnX5Of8AOPvl /wAiQxalqPp6p5pIq14VrFbkjdLZW+71COR/yRtir1nFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqor9T+tvx9P65wXnTj6np1PGv7XGtaYqrYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//Z pdfTeX-1.40.16 False This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1 xmp.did:610632E82D20681188C6ABDDD0C5C135 xmp.iid:610632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c xmp.iid:600632E82D20681188C6ABDDD0C5C135 xmp.did:600632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c saved xmp.iid:600632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:11+05:30 Adobe Illustrator CS4 / saved xmp.iid:610632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:23+05:30 Adobe Illustrator CS4 / 51.000000 66.000000 Picas 1 False False Black Default Swatch Group 0 endstream endobj 272 0 obj << /Title (fx4.eps) /Author (user) /Metadata 273 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 273 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ib$h=lT%ګnК#Z}B lPh*U9Xxq`\FY@sν3t/do>qv{cJNi4Iw 2zc-{nDջɓ+NK9bS&xJ)kzJ")( 7uKGDrABw=ڧu:*}y7:IW ,W"Eu؊Zo%z+> ~z■myE^#h+J[6-!9wE?+UWFw7']M |6/OEV̐2Cf !3係,qN΍D| endstream endobj 274 0 obj << /Metadata 275 0 R >> endobj 275 0 obj << /Length 11958 /Subtype /XML /Type /Metadata >> stream application/postscript 2019-06-12T15:12:31+05:30 Adobe Illustrator CS4 2019-06-12T15:12:31+05:30 2019-06-12T15:12:31+05:30 256 136 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAiAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Z/wDnLTzb5r0LXfL8Wia1 faXHNazNMllczW6uwkUAsImWpHvirwX/AJWl+Zv/AFN2tf8AcRu/+qmKu/5Wl+Zv/U3a1/3Ebv8A 6qYq/RLFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXyj/zmd/ykPlr/AJhJ/wDk6uKvnPFXYq/TrFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXyj/AM5nf8pD5a/5hJ/+Tq4q+c8Vdir9OsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfKP/OZ3/KQ+Wv8A mEn/AOTq4q+c8Vdir9OsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVfKP8Azmd/ykPlr/mEn/5Orir5zxV2KvXfzq/MLz9p35p+Y7LT/Muq2dnBdcYL a3vrmKJF4KaIiOFUfIYqwr/laX5m/wDU3a1/3Ebv/qpirv8AlaX5m/8AU3a1/wBxG7/6qYq7/laX 5m/9TdrX/cRu/wDqpirv+Vpfmb/1N2tf9xG7/wCqmKu/5Wl+Zv8A1N2tf9xG7/6qYq7/AJWl+Zv/ AFN2tf8AcRu/+qmKu/5Wl+Zv/U3a1/3Ebv8A6qYq7/laX5m/9TdrX/cRu/8Aqpirv+Vpfmb/ANTd rX/cRu/+qmKu/wCVpfmb/wBTdrX/AHEbv/qpirv+Vpfmb/1N2tf9xG7/AOqmKu/5Wl+Zv/U3a1/3 Ebv/AKqYq7/laX5m/wDU3a1/3Ebv/qpirv8AlaX5m/8AU3a1/wBxG7/6qYq7/laX5m/9TdrX/cRu /wDqpirv+Vpfmb/1N2tf9xG7/wCqmKu/5Wl+Zv8A1N2tf9xG7/6qYq7/AJWl+Zv/AFN2tf8AcRu/ +qmKu/5Wl+Zv/U3a1/3Ebv8A6qYq7/laX5m/9TdrX/cRu/8Aqpirv+Vpfmb/ANTdrX/cRu/+qmKu /wCVpfmb/wBTdrX/AHEbv/qpirv+Vpfmb/1N2tf9xG7/AOqmKu/5Wl+Zv/U3a1/3Ebv/AKqYq7/l aX5m/wDU3a1/3Ebv/qpirv8AlaX5m/8AU3a1/wBxG7/6qYq7/laX5m/9TdrX/cRu/wDqpirv+Vpf mb/1N2tf9xG7/wCqmKpTrXmTzFrskUut6reapJCCsL3s8twyKTUhTKzUB9sVS3FXYqz78+f/ACb/ AJo/5i/+Za4qwHFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FWffnz/AOTf80f8xf8AzLXFWA4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqz78+f/Jv+aP8AmL/5lrirAcVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVZ9+fP/AJN/zR/z F/8AMtcVYDirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirPvz5/8m/5o/5i/wDmWuKsBxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV9bef8A/nFa981+ctV8xJ5jjtE1Kb1hbNatIU+ELTkJ Vr08MVY9/wBCW6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBC W6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX/SE3 /VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX/SE3/VbFXf8AQluo f9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1W xV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U 2Rf9ITf9VsVd/wBCW6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd /wBCW6h/1NkX/SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX /SE3/VbFXf8AQluof9TZF/0hN/1WxV3/AEJbqH/U2Rf9ITf9VsVd/wBCW6h/1NkX/SE3/VbFXlv5 xflDP+WuoadZzamupnUInmDpCYeHpsFpQvJWtcVeeYq7FX6dYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Uf+czv+Uh8tf8wk/wDydXFXznirsVfp 1irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir5R/ 5zO/5SHy1/zCT/8AJ1cVfOeKuxV+nWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KvlH/nM7/lIfLX/MJP8A8nVxV854q7FX6dYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Uf+czv+Uh8tf8wk//ACdX FXznirsVfp1irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirxH/nIL8k/Nn5iarpF3odzYwR2EEsUwvJJUYs7hhx9OKXbbviryf8A6E8/M/8A6uGjf8j7 n/smxV3/AEJ5+Z//AFcNG/5H3P8A2TYq/wD/2Q== pdfTeX-1.40.16 False This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1 xmp.did:620632E82D20681188C6ABDDD0C5C135 xmp.iid:620632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c xmp.iid:610632E82D20681188C6ABDDD0C5C135 xmp.did:610632E82D20681188C6ABDDD0C5C135 uuid:f635612e-74cf-489f-9121-637e1eec539c saved xmp.iid:600632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:11+05:30 Adobe Illustrator CS4 / saved xmp.iid:610632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:23+05:30 Adobe Illustrator CS4 / saved xmp.iid:620632E82D20681188C6ABDDD0C5C135 2019-06-12T15:12:31+05:30 Adobe Illustrator CS4 / 51.000000 66.000000 Picas 1 False False Black Default Swatch Group 0 endstream endobj 276 0 obj << /Title (fx2.eps) /Author (user) /Metadata 277 0 R /Creator (Adobe Illustrator\(R\) 14.0) >> endobj 277 0 obj << /Length 450 /Filter /FlateDecode >> stream hn0{ibaQQ6Hkf7hC4Hz`fDgm Z6S1FY+wU..pS|,yͥXck`SSzywnWѲЀI@ < w=!O/`)OApk r])MӐ& R/ CkT᭣?P &+|]&xJ)k-{J*(HAzģ*M| ?ڇ%u:*}~7/:Ɍ ,\mc:)lx- N6O^ jju4BU5"EpEl9$(d2t7)Nѧ>hm@',"3d̐2Cf hAɹ#2z endstream endobj 278 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /FontDescriptor 279 0 R /BaseFont /HIPJEJ+Helvetica-Bold /LastChar 101 /Widths [ 556 611 556 611 556 ] /FirstChar 97 >> endobj 279 0 obj << /Type /FontDescriptor /Flags 262176 /StemV 140 /FontName /HIPJEJ+Helvetica-Bold /XHeight 532 /FontBBox [ -170 -228 1003 962 ] /ItalicAngle 0 /Descent -207 /CapHeight 718 /FontFile3 280 0 R /Ascent 718 /StemH 140 /CharSet (/a/b/c/d/e) >> endobj 280 0 obj << /Length 748 /Subtype /Type1C /Filter /FlateDecode >> stream h\]HSqyfgAӳjR ?P[!vCγtVB샍漐Y-2 c҂.(OHn=7 /yxy_* IRWUf[M~̹x!4c' [gl]"|w␢*gΥq$^)8[EH EƒM15/hILKP]rhon SYg_Pyc#%H8Y.!^B,rsQ$FIp:9TM x+oYK$Q"(h'd'ixd#oZzr& +p@&q O0n^ }ѹ<4tO.g6>3-Fi_'Vo6\crr}g~&$j{Ar(kI0x!W;*o>"5}2uP^ƈҞg,vMzxsDbK$N2x(aȅC/A-J;u$:;}!mo2˰1.z?c K@c^@ }]԰5qR[p^#0EC/ = p\RЇӃKMFp@7P/kNZz> (fc;JX7!dc0~0+4k?fP`0ɾ_̈́*[u)I h> endobj 282 0 obj << /Length 244 /Filter /FlateDecode >> stream hTP=o 7vj)bITCN8;H5 qSuxw}c{j@߃SF'7pXjF[2E[;ЏbX`ZK`w>RmBƞg9"U.^jk4N^* ZZ?GEq]R/Cu'AR]jK)ްMb&\%{ endstream endobj 283 0 obj << /Differences [ 69 /E 72 /H 77 /M 80 /P /Q /R ] /Type /Encoding >> endobj 284 0 obj << /Type /FontDescriptor /Flags 68 /StemV 40 /FontName /HIPJLH+CMSY10 /FontBBox [ -29 -960 1116 775 ] /ItalicAngle -14.04 /Descent 0 /CapHeight 729 /FontFile3 285 0 R /Ascent 0 /StemH 40 /CharSet (/space/P/Q/R/E/M/H) >> endobj 285 0 obj << /Length 1308 /Subtype /Type1C /Filter /FlateDecode >> stream htS{LSwǽޫSPX6D1t(': TZ^,m@imix C!+%3td[0Ƹ,.3n)ǟ;㜜|#"0D"ٖ~Κ׿$HIhI 7ElD(.vςOg;k>(хg)gFTc䴴ԵLi̖rV]0:\ eL>[VLBJظn]UUU2ՖnN\Tu*fR5(KFP+%2D, KR71 6'+g{]> \CވGި~}0GP?34H 9*D+{~M@@Jsqfe};S~31 í -FSi~OSNx=7>v}GPڌ0$+dA)f`oȏP>~v*Bjcmm纩+}g="Z/4o97KY:z Y욃H7D@ؚEw`{ @y}nwSÁG㠏n[:i/{|6Q TR-Q6zz9yEEGTSM N;h,N,[] V{<$ y=}hEt=-dpF{Z)^Ad=a[PݙFL"6fd+#^ KbU| endstream endobj 286 0 obj << /Type /ExtGState /SM 0.002 /BG2 /Default /OPM 1 /SA false /OP false /op false /UCR2 /Default >> endobj 287 0 obj << /Type /ExtGState /SM 0.002 /BG2 /Default /OPM 1 /SA true /OP false /op false /UCR2 /Default >> endobj 288 0 obj << /Type /Font /Subtype /Type1 /ToUnicode 289 0 R /Encoding 290 0 R /FontDescriptor 291 0 R /BaseFont /HIPNIP+LMMathSymbols5-Regular /LastChar 128 /Widths [ 736 ] /FirstChar 128 >> endobj 289 0 obj << /Length 216 /Filter /FlateDecode >> stream hTP1n0 2:d0MQvԔ@˃_IqSt|^ď%h endstream endobj 290 0 obj << /Differences [ 128 /bullet ] /Type /Encoding >> endobj 291 0 obj << /Type /FontDescriptor /Flags 68 /StemV 56 /FontName /HIPNIP+LMMathSymbols5-Regular /FontBBox [ 0 -944 1448 791 ] /ItalicAngle -14.036 /Descent 0 /CapHeight 731 /FontFile3 292 0 R /Ascent 0 /StemH 56 /CharSet (/space/bullet) >> endobj 292 0 obj << /Length 311 /Subtype /Type1C /Filter /FlateDecode >> stream hbd`ab`dd M,M)6 JM/I,!CEs> endobj 294 0 obj << /Names [ (Doc-Start) 295 0 R (aff0001) 296 0 R (aff0002) 297 0 R (aff0003) 298 0 R (bib0001) 299 0 R (bib0002) 300 0 R (bib0003) 301 0 R (bib0004) 302 0 R (bib0005) 303 0 R (bib0006) 304 0 R (bib0007) 305 0 R (bib0008) 306 0 R (bib0009) 307 0 R (bib0010) 308 0 R (bib0011) 309 0 R (bib0012) 310 0 R (bib0013) 311 0 R (bib0014) 312 0 R (bib0015) 313 0 R (bib0016) 314 0 R (bib0017) 315 0 R (chapter..1) 316 0 R (cor0001) 317 0 R (eq0001) 318 0 R (equation..4.1) 319 0 R (fig0001) 320 0 R (fig0002) 321 0 R (fig0003) 322 0 R (fig0004) 323 0 R (fig0005) 324 0 R (fig0006) 325 0 R (fig0007) 326 0 R (fig0008) 327 0 R (fig0009) 328 0 R (fig0010) 329 0 R (fig0011) 330 0 R (fig0012) 331 0 R (fig0013) 332 0 R (fig0014) 333 0 R (fig0015) 334 0 R (fig0016) 335 0 R (fig0017) 336 0 R (fig0018) 337 0 R (fig0019) 338 0 R (fig0020) 339 0 R (fig0021) 340 0 R (figure..1) 341 0 R (figure..10) 342 0 R (figure..11) 343 0 R (figure..12) 344 0 R (figure..13) 345 0 R (figure..14) 346 0 R (figure..15) 347 0 R (figure..16) 348 0 R (figure..17) 349 0 R (figure..18) 350 0 R (figure..19) 351 0 R (figure..2) 352 0 R (figure..20) 353 0 R (figure..21) 354 0 R (figure..3) 355 0 R (figure..4) 356 0 R (figure..5) 357 0 R (figure..6) 358 0 R ] /Limits [ (Doc-Start) (figure..6) ] >> endobj 295 0 obj << /D [ 547 0 R /XYZ null 402 null ] >> endobj 296 0 obj << /D [ 547 0 R /XYZ null 587 null ] >> endobj 297 0 obj << /D [ 547 0 R /XYZ null 578 null ] >> endobj 298 0 obj << /D [ 547 0 R /XYZ null 570 null ] >> endobj 299 0 obj << /D [ 187 0 R /XYZ null 490 null ] >> endobj 300 0 obj << /D [ 187 0 R /XYZ null 474 null ] >> endobj 301 0 obj << /D [ 187 0 R /XYZ null 450 null ] >> endobj 302 0 obj << /D [ 187 0 R /XYZ null 434 null ] >> endobj 303 0 obj << /D [ 187 0 R /XYZ null 410 null ] >> endobj 304 0 obj << /D [ 187 0 R /XYZ null 386 null ] >> endobj 305 0 obj << /D [ 187 0 R /XYZ null 370 null ] >> endobj 306 0 obj << /D [ 187 0 R /XYZ null 354 null ] >> endobj 307 0 obj << /D [ 187 0 R /XYZ null 338 null ] >> endobj 308 0 obj << /D [ 187 0 R /XYZ null 322 null ] >> endobj 309 0 obj << /D [ 187 0 R /XYZ null 306 null ] >> endobj 310 0 obj << /D [ 187 0 R /XYZ null 290 null ] >> endobj 311 0 obj << /D [ 187 0 R /XYZ null 274 null ] >> endobj 312 0 obj << /D [ 187 0 R /XYZ null 258 null ] >> endobj 313 0 obj << /D [ 187 0 R /XYZ null 242 null ] >> endobj 314 0 obj << /D [ 187 0 R /XYZ null 226 null ] >> endobj 315 0 obj << /D [ 187 0 R /XYZ null 210 null ] >> endobj 316 0 obj << /D [ 547 0 R /XYZ null 652 null ] >> endobj 317 0 obj << /D [ 547 0 R /XYZ null 115 null ] >> endobj 318 0 obj << /D [ 48 0 R /XYZ null 473 null ] >> endobj 319 0 obj << /D [ 48 0 R /XYZ null 506 null ] >> endobj 320 0 obj << /D [ 1 0 R /XYZ null 748 null ] >> endobj 321 0 obj << /D [ 1 0 R /XYZ null 624 null ] >> endobj 322 0 obj << /D [ 1 0 R /XYZ null 497 null ] >> endobj 323 0 obj << /D [ 28 0 R /XYZ null 748 null ] >> endobj 324 0 obj << /D [ 28 0 R /XYZ null 611 null ] >> endobj 325 0 obj << /D [ 48 0 R /XYZ null 748 null ] >> endobj 326 0 obj << /D [ 48 0 R /XYZ null 645 null ] >> endobj 327 0 obj << /D [ 66 0 R /XYZ null 748 null ] >> endobj 328 0 obj << /D [ 66 0 R /XYZ null 565 null ] >> endobj 329 0 obj << /D [ 66 0 R /XYZ null 448 null ] >> endobj 330 0 obj << /D [ 86 0 R /XYZ null 748 null ] >> endobj 331 0 obj << /D [ 86 0 R /XYZ null 649 null ] >> endobj 332 0 obj << /D [ 86 0 R /XYZ null 469 null ] >> endobj 333 0 obj << /D [ 119 0 R /XYZ null 748 null ] >> endobj 334 0 obj << /D [ 144 0 R /XYZ null 748 null ] >> endobj 335 0 obj << /D [ 144 0 R /XYZ null 634 null ] >> endobj 336 0 obj << /D [ 144 0 R /XYZ null 513 null ] >> endobj 337 0 obj << /D [ 144 0 R /XYZ null 362 null ] >> endobj 338 0 obj << /D [ 169 0 R /XYZ null 748 null ] >> endobj 339 0 obj << /D [ 169 0 R /XYZ null 496 null ] >> endobj 340 0 obj << /D [ 187 0 R /XYZ null 748 null ] >> endobj 341 0 obj << /D [ 1 0 R /XYZ null 650 null ] >> endobj 342 0 obj << /D [ 66 0 R /XYZ null 371 null ] >> endobj 343 0 obj << /D [ 86 0 R /XYZ null 671 null ] >> endobj 344 0 obj << /D [ 86 0 R /XYZ null 497 null ] >> endobj 345 0 obj << /D [ 86 0 R /XYZ null 376 null ] >> endobj 346 0 obj << /D [ 119 0 R /XYZ null 575 null ] >> endobj 347 0 obj << /D [ 144 0 R /XYZ null 656 null ] >> endobj 348 0 obj << /D [ 144 0 R /XYZ null 534 null ] >> endobj 349 0 obj << /D [ 144 0 R /XYZ null 375 null ] >> endobj 350 0 obj << /D [ 144 0 R /XYZ null 237 null ] >> endobj 351 0 obj << /D [ 169 0 R /XYZ null 532 null ] >> endobj 352 0 obj << /D [ 1 0 R /XYZ null 522 null ] >> endobj 353 0 obj << /D [ 169 0 R /XYZ null 308 null ] >> endobj 354 0 obj << /D [ 187 0 R /XYZ null 673 null ] >> endobj 355 0 obj << /D [ 1 0 R /XYZ null 349 null ] >> endobj 356 0 obj << /D [ 28 0 R /XYZ null 641 null ] >> endobj 357 0 obj << /D [ 28 0 R /XYZ null 518 null ] >> endobj 358 0 obj << /D [ 48 0 R /XYZ null 667 null ] >> endobj 359 0 obj << /Names [ (figure..7) 360 0 R (figure..8) 361 0 R (figure..9) 362 0 R (lstitem0004) 363 0 R (lstitem0005) 364 0 R (lstitem0006) 365 0 R (lstitem0007) 366 0 R (lstitem0008) 367 0 R (lstitem0009) 368 0 R (lstitem0010) 369 0 R (lstitem0011) 370 0 R (lstitem0012) 371 0 R (lstitem0013) 372 0 R (lstitem0014) 373 0 R (lstitem0015) 374 0 R (lstitem0016) 375 0 R (lstitem0017) 376 0 R (lstitem0018) 377 0 R (lstitem0019) 378 0 R (lstitem0020) 379 0 R (lstitem0021) 380 0 R (np0001) 381 0 R (page.1) 382 0 R (page.10) 383 0 R (page.2) 384 0 R (page.3) 385 0 R (page.4) 386 0 R (page.5) 387 0 R (page.6) 388 0 R (page.7) 389 0 R (page.8) 390 0 R (page.9) 391 0 R (sec0001) 392 0 R (sec0002) 393 0 R (sec0003) 394 0 R (sec0004) 395 0 R (sec0005) 396 0 R (sec0006) 397 0 R (sec0007) 398 0 R (sec0008) 399 0 R (sec0009) 400 0 R (sec0010) 401 0 R (sec0011) 402 0 R (sec0013) 403 0 R (sec0014) 404 0 R (section..1) 405 0 R (section..2) 406 0 R (section..3) 407 0 R (section..4) 408 0 R (section..5) 409 0 R (section..6) 410 0 R (section..7) 411 0 R (section..8) 412 0 R (section..9) 413 0 R (subsection..3.1) 414 0 R (subsection..4.1) 415 0 R (subsection..4.2) 416 0 R (subsection..4.3) 417 0 R (subsection..4.4) 418 0 R ] /Limits [ (figure..7) (subsection..4.4) ] >> endobj 360 0 obj << /D [ 48 0 R /XYZ null 531 null ] >> endobj 361 0 obj << /D [ 66 0 R /XYZ null 595 null ] >> endobj 362 0 obj << /D [ 66 0 R /XYZ null 462 null ] >> endobj 363 0 obj << /D [ 48 0 R /XYZ null 377 null ] >> endobj 364 0 obj << /D [ 48 0 R /XYZ null 346 null ] >> endobj 365 0 obj << /D [ 48 0 R /XYZ null 304 null ] >> endobj 366 0 obj << /D [ 48 0 R /XYZ null 80 null ] >> endobj 367 0 obj << /D [ 48 0 R /XYZ null 503 null ] >> endobj 368 0 obj << /D [ 48 0 R /XYZ null 472 null ] >> endobj 369 0 obj << /D [ 48 0 R /XYZ null 160 null ] >> endobj 370 0 obj << /D [ 48 0 R /XYZ null 129 null ] >> endobj 371 0 obj << /D [ 48 0 R /XYZ null 108 null ] >> endobj 372 0 obj << /D [ 66 0 R /XYZ null 259 null ] >> endobj 373 0 obj << /D [ 66 0 R /XYZ null 238 null ] >> endobj 374 0 obj << /D [ 66 0 R /XYZ null 80 null ] >> endobj 375 0 obj << /D [ 66 0 R /XYZ null 343 null ] >> endobj 376 0 obj << /D [ 66 0 R /XYZ null 312 null ] >> endobj 377 0 obj << /D [ 66 0 R /XYZ null 291 null ] >> endobj 378 0 obj << /D [ 66 0 R /XYZ null 259 null ] >> endobj 379 0 obj << /D [ 66 0 R /XYZ null 150 null ] >> endobj 380 0 obj << /D [ 66 0 R /XYZ null 118 null ] >> endobj 381 0 obj << /D [ 547 0 R /XYZ null 124 null ] >> endobj 382 0 obj << /D [ 547 0 R /XYZ null 842 null ] >> endobj 383 0 obj << /D [ 187 0 R /XYZ null 842 null ] >> endobj 384 0 obj << /D [ 1 0 R /XYZ null 842 null ] >> endobj 385 0 obj << /D [ 28 0 R /XYZ null 842 null ] >> endobj 386 0 obj << /D [ 48 0 R /XYZ null 842 null ] >> endobj 387 0 obj << /D [ 66 0 R /XYZ null 842 null ] >> endobj 388 0 obj << /D [ 86 0 R /XYZ null 842 null ] >> endobj 389 0 obj << /D [ 119 0 R /XYZ null 842 null ] >> endobj 390 0 obj << /D [ 144 0 R /XYZ null 842 null ] >> endobj 391 0 obj << /D [ 169 0 R /XYZ null 842 null ] >> endobj 392 0 obj << /D [ 547 0 R /XYZ null 376 null ] >> endobj 393 0 obj << /D [ 547 0 R /XYZ null 145 null ] >> endobj 394 0 obj << /D [ 1 0 R /XYZ null 267 null ] >> endobj 395 0 obj << /D [ 28 0 R /XYZ null 151 null ] >> endobj 396 0 obj << /D [ 28 0 R /XYZ null 377 null ] >> endobj 397 0 obj << /D [ 28 0 R /XYZ null 222 null ] >> endobj 398 0 obj << /D [ 48 0 R /XYZ null 345 null ] >> endobj 399 0 obj << /D [ 86 0 R /XYZ null 277 null ] >> endobj 400 0 obj << /D [ 119 0 R /XYZ null 487 null ] >> endobj 401 0 obj << /D [ 119 0 R /XYZ null 99 null ] >> endobj 402 0 obj << /D [ 169 0 R /XYZ null 163 null ] >> endobj 403 0 obj << /D [ 187 0 R /XYZ null 602 null ] >> endobj 404 0 obj << /D [ 187 0 R /XYZ null 539 null ] >> endobj 405 0 obj << /D [ 547 0 R /XYZ null 402 null ] >> endobj 406 0 obj << /D [ 547 0 R /XYZ null 175 null ] >> endobj 407 0 obj << /D [ 1 0 R /XYZ null 296 null ] >> endobj 408 0 obj << /D [ 28 0 R /XYZ null 406 null ] >> endobj 409 0 obj << /D [ 119 0 R /XYZ null 128 null ] >> endobj 410 0 obj << /D [ 169 0 R /XYZ null 191 null ] >> endobj 411 0 obj << /D [ 187 0 R /XYZ null 631 null ] >> endobj 412 0 obj << /D [ 187 0 R /XYZ null 568 null ] >> endobj 413 0 obj << /D [ 187 0 R /XYZ null 516 null ] >> endobj 414 0 obj << /D [ 28 0 R /XYZ null 181 null ] >> endobj 415 0 obj << /D [ 28 0 R /XYZ null 251 null ] >> endobj 416 0 obj << /D [ 48 0 R /XYZ null 375 null ] >> endobj 417 0 obj << /D [ 86 0 R /XYZ null 307 null ] >> endobj 418 0 obj << /D [ 119 0 R /XYZ null 517 null ] >> endobj 419 0 obj << /Nums [ 0 420 0 R ] >> endobj 420 0 obj << /S /D >> endobj 421 0 obj << /ParentTreeNextKey 11 /ParentTree 422 0 R /Type /StructTreeRoot /K [ 424 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 439 0 R 441 0 R 443 0 R ] >> endobj 422 0 obj << /Nums [ 1 423 0 R 2 438 0 R 3 531 0 R 4 532 0 R 5 533 0 R 6 534 0 R 7 535 0 R 8 536 0 R 9 537 0 R 10 538 0 R ] >> endobj 423 0 obj [ 424 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R ] endobj 424 0 obj << /K 0 /Alt (Imprint logo) /S /Figure /Pg 547 0 R /P 421 0 R /A 425 0 R /T () >> endobj 425 0 obj << /BBox [ 0 0 373 60 ] /Placement /Block /O /Layout /Height 60 /Width 373 >> endobj 426 0 obj << /K 1 /Alt (Journal logo) /S /Figure /Pg 547 0 R /P 421 0 R /A 425 0 R /T () >> endobj 427 0 obj << /S /P /Pg 547 0 R /K 2 /P 421 0 R >> endobj 428 0 obj << /S /P /Pg 547 0 R /K 3 /P 421 0 R >> endobj 429 0 obj << /S /P /Pg 547 0 R /K 4 /P 421 0 R >> endobj 430 0 obj << /S /P /Pg 547 0 R /K 5 /P 421 0 R >> endobj 431 0 obj << /S /P /Pg 547 0 R /K 6 /P 421 0 R >> endobj 432 0 obj << /S /P /Pg 547 0 R /K 7 /P 421 0 R >> endobj 433 0 obj << /S /H1 /Pg 547 0 R /K 8 /P 421 0 R >> endobj 434 0 obj << /S /P /Pg 547 0 R /K 9 /P 421 0 R >> endobj 435 0 obj << /S /P /Pg 547 0 R /K 10 /P 421 0 R >> endobj 436 0 obj << /S /H1 /Pg 547 0 R /K 11 /P 421 0 R >> endobj 437 0 obj << /S /P /Pg 547 0 R /K 12 /P 421 0 R >> endobj 438 0 obj [ 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R ] endobj 439 0 obj << /K [ 0 440 0 R ] /Alt (Image of Fig. 1) /S /Figure /Pg 1 0 R /P 421 0 R /A 425 0 R /T () >> endobj 440 0 obj << /S /Caption /Pg 1 0 R /K 1 /P 439 0 R >> endobj 441 0 obj << /K [ 2 442 0 R ] /Alt (Image of Fig. 2) /S /Figure /Pg 1 0 R /P 421 0 R /A 425 0 R /T () >> endobj 442 0 obj << /S /Caption /Pg 1 0 R /K 3 /P 441 0 R >> endobj 443 0 obj << /K [ 4 444 0 R ] /Alt (Image of Fig. 3) /S /Figure /Pg 1 0 R /P 421 0 R /A 425 0 R /T () >> endobj 444 0 obj << /S /Caption /Pg 1 0 R /K [ 5 445 0 R ] /P 443 0 R >> endobj 445 0 obj << /K [ 6 446 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 454 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 466 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R ] /Alt (Unlabelled image) /S /Figure /Pg 1 0 R /P 444 0 R /A 425 0 R /T () >> endobj 446 0 obj << /K [ 7 447 0 R ] /Alt (Unlabelled image) /S /Figure /Pg 1 0 R /P 445 0 R /A 425 0 R /T () >> endobj 447 0 obj << /K 8 /Alt (Unlabelled image) /S /Figure /Pg 1 0 R /P 446 0 R /A 425 0 R /T () >> endobj 448 0 obj << /S /P /Pg 1 0 R /K 9 /P 445 0 R >> endobj 449 0 obj << /S /P /Pg 1 0 R /K 10 /P 445 0 R >> endobj 450 0 obj << /S /H1 /Pg 1 0 R /K 11 /P 445 0 R >> endobj 451 0 obj << /S /P /Pg 1 0 R /K 12 /P 445 0 R >> endobj 452 0 obj << /K [ 0 453 0 R ] /Alt (Image of Fig. 4) /S /Figure /Pg 28 0 R /P 445 0 R /A 425 0 R /T () >> endobj 453 0 obj << /S /Caption /Pg 28 0 R /K 1 /P 452 0 R >> endobj 454 0 obj << /K [ 2 455 0 R ] /Alt (Image of Fig. 5) /S /Figure /Pg 28 0 R /P 445 0 R /A 425 0 R /T () >> endobj 455 0 obj << /S /Caption /Pg 28 0 R /K 3 /P 454 0 R >> endobj 456 0 obj << /S /P /Pg 28 0 R /K 4 /P 445 0 R >> endobj 457 0 obj << /S /H2 /Pg 28 0 R /K 5 /P 445 0 R >> endobj 458 0 obj << /S /P /Pg 28 0 R /K 6 /P 445 0 R >> endobj 459 0 obj << /S /P /Pg 28 0 R /K 7 /P 445 0 R >> endobj 460 0 obj << /S /H1 /Pg 28 0 R /K 8 /P 445 0 R >> endobj 461 0 obj << /S /P /Pg 28 0 R /K 9 /P 445 0 R >> endobj 462 0 obj << /S /H2 /Pg 28 0 R /K 10 /P 445 0 R >> endobj 463 0 obj << /S /P /Pg 28 0 R /K 11 /P 445 0 R >> endobj 464 0 obj << /K [ 0 465 0 R ] /Alt (Image of Fig. 6) /S /Figure /Pg 48 0 R /P 445 0 R /A 425 0 R /T () >> endobj 465 0 obj << /S /Caption /Pg 48 0 R /K 1 /P 464 0 R >> endobj 466 0 obj << /K [ 2 467 0 R ] /Alt (Image of Fig. 7) /S /Figure /Pg 48 0 R /P 445 0 R /A 425 0 R /T () >> endobj 467 0 obj << /S /Caption /Pg 48 0 R /K 3 /P 466 0 R >> endobj 468 0 obj << /S /P /Pg 48 0 R /K 4 /P 445 0 R >> endobj 469 0 obj << /S /P /Pg 48 0 R /K 5 /P 445 0 R >> endobj 470 0 obj << /S /H2 /Pg 48 0 R /K 6 /P 445 0 R >> endobj 471 0 obj << /S /P /Pg 48 0 R /K 7 /P 445 0 R >> endobj 472 0 obj << /K [ 0 473 0 R 475 0 R 477 0 R 479 0 R 480 0 R 481 0 R 483 0 R ] /Alt (Image of Fig. 8) /S /Figure /Pg 66 0 R /P 445 0 R /A 425 0 R /T () >> endobj 473 0 obj << /S /Caption /Pg 66 0 R /K [ 1 474 0 R ] /P 472 0 R >> endobj 474 0 obj << /K 2 /Alt (Unlabelled image) /S /Figure /Pg 66 0 R /P 473 0 R /A 425 0 R /T () >> endobj 475 0 obj << /K [ 3 476 0 R ] /Alt (Image of Fig. 9) /S /Figure /Pg 66 0 R /P 472 0 R /A 425 0 R /T () >> endobj 476 0 obj << /S /Caption /Pg 66 0 R /K 4 /P 475 0 R >> endobj 477 0 obj << /K [ 5 478 0 R ] /Alt (Image of Fig. 10) /S /Figure /Pg 66 0 R /P 472 0 R /A 425 0 R /T () >> endobj 478 0 obj << /S /Caption /Pg 66 0 R /K 6 /P 477 0 R >> endobj 479 0 obj << /S /P /Pg 66 0 R /K 7 /P 472 0 R >> endobj 480 0 obj << /S /P /Pg 66 0 R /K 8 /P 472 0 R >> endobj 481 0 obj << /K [ 0 482 0 R ] /Alt (Image of Fig. 11) /S /Figure /Pg 86 0 R /P 472 0 R /A 425 0 R /T () >> endobj 482 0 obj << /S /Caption /Pg 86 0 R /K 1 /P 481 0 R >> endobj 483 0 obj << /K [ 2 484 0 R ] /Alt (Image of Fig. 12) /S /Figure /Pg 86 0 R /P 472 0 R /A 425 0 R /T () >> endobj 484 0 obj << /S /Caption /Pg 86 0 R /K [ 3 485 0 R ] /P 483 0 R >> endobj 485 0 obj << /K [ 4 486 0 R ] /Alt (Unlabelled image) /S /Figure /Pg 86 0 R /P 484 0 R /A 425 0 R /T () >> endobj 486 0 obj << /K [ 5 487 0 R 489 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 505 0 R 507 0 R 509 0 R 511 0 R 512 0 R 513 0 R 515 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R ] /Alt (Unlabelled image) /S /Figure /Pg 86 0 R /P 485 0 R /A 425 0 R /T () >> endobj 487 0 obj << /K [ 6 488 0 R ] /Alt (Unlabelled image) /S /Figure /Pg 86 0 R /P 486 0 R /A 425 0 R /T () >> endobj 488 0 obj << /K 7 /Alt (Unlabelled image) /S /Figure /Pg 86 0 R /P 487 0 R /A 425 0 R /T () >> endobj 489 0 obj << /K [ 8 490 0 R ] /Alt (Image of Fig. 13) /S /Figure /Pg 86 0 R /P 486 0 R /A 425 0 R /T () >> endobj 490 0 obj << /S /Caption /Pg 86 0 R /K 9 /P 489 0 R >> endobj 491 0 obj << /S /P /Pg 86 0 R /K 10 /P 486 0 R >> endobj 492 0 obj << /S /P /Pg 86 0 R /K 11 /P 486 0 R >> endobj 493 0 obj << /S /H2 /Pg 86 0 R /K 12 /P 486 0 R >> endobj 494 0 obj << /S /P /Pg 86 0 R /K 13 /P 486 0 R >> endobj 495 0 obj << /K [ 0 496 0 R ] /Alt (Image of Fig. 14) /S /Figure /Pg 119 0 R /P 486 0 R /A 425 0 R /T () >> endobj 496 0 obj << /S /Caption /Pg 119 0 R /K 1 /P 495 0 R >> endobj 497 0 obj << /S /P /Pg 119 0 R /K 2 /P 486 0 R >> endobj 498 0 obj << /S /H2 /Pg 119 0 R /K 3 /P 486 0 R >> endobj 499 0 obj << /S /P /Pg 119 0 R /K 4 /P 486 0 R >> endobj 500 0 obj << /S /P /Pg 119 0 R /K 5 /P 486 0 R >> endobj 501 0 obj << /S /H1 /Pg 119 0 R /K 6 /P 486 0 R >> endobj 502 0 obj << /S /P /Pg 119 0 R /K 7 /P 486 0 R >> endobj 503 0 obj << /K [ 0 504 0 R ] /Alt (Image of Fig. 15) /S /Figure /Pg 144 0 R /P 486 0 R /A 425 0 R /T () >> endobj 504 0 obj << /S /Caption /Pg 144 0 R /K 1 /P 503 0 R >> endobj 505 0 obj << /K [ 2 506 0 R ] /Alt (Image of Fig. 16) /S /Figure /Pg 144 0 R /P 486 0 R /A 425 0 R /T () >> endobj 506 0 obj << /S /Caption /Pg 144 0 R /K 3 /P 505 0 R >> endobj 507 0 obj << /K [ 4 508 0 R ] /Alt (Image of Fig. 17) /S /Figure /Pg 144 0 R /P 486 0 R /A 425 0 R /T () >> endobj 508 0 obj << /S /Caption /Pg 144 0 R /K 5 /P 507 0 R >> endobj 509 0 obj << /K [ 6 510 0 R ] /Alt (Image of Fig. 18) /S /Figure /Pg 144 0 R /P 486 0 R /A 425 0 R /T () >> endobj 510 0 obj << /S /Caption /Pg 144 0 R /K 7 /P 509 0 R >> endobj 511 0 obj << /S /P /Pg 144 0 R /K 8 /P 486 0 R >> endobj 512 0 obj << /S /P /Pg 144 0 R /K 9 /P 486 0 R >> endobj 513 0 obj << /K [ 0 514 0 R ] /Alt (Image of Fig. 19) /S /Figure /Pg 169 0 R /P 486 0 R /A 425 0 R /T () >> endobj 514 0 obj << /S /Caption /Pg 169 0 R /K 1 /P 513 0 R >> endobj 515 0 obj << /K [ 2 516 0 R ] /Alt (Image of Fig. 20) /S /Figure /Pg 169 0 R /P 486 0 R /A 425 0 R /T () >> endobj 516 0 obj << /S /Caption /Pg 169 0 R /K 3 /P 515 0 R >> endobj 517 0 obj << /S /P /Pg 169 0 R /K 4 /P 486 0 R >> endobj 518 0 obj << /S /H1 /Pg 169 0 R /K 5 /P 486 0 R >> endobj 519 0 obj << /S /P /Pg 169 0 R /K 6 /P 486 0 R >> endobj 520 0 obj << /S /P /Pg 169 0 R /K 7 /P 486 0 R >> endobj 521 0 obj << /K [ 0 522 0 R ] /Alt (Image of Fig. 21) /S /Figure /Pg 187 0 R /P 486 0 R /A 425 0 R /T () >> endobj 522 0 obj << /S /Caption /Pg 187 0 R /K 1 /P 521 0 R >> endobj 523 0 obj << /S /P /Pg 187 0 R /K 2 /P 486 0 R >> endobj 524 0 obj << /S /P /Pg 187 0 R /K 3 /P 486 0 R >> endobj 525 0 obj << /S /H1 /Pg 187 0 R /K 4 /P 486 0 R >> endobj 526 0 obj << /S /P /Pg 187 0 R /K 5 /P 486 0 R >> endobj 527 0 obj << /S /H1 /Pg 187 0 R /K 6 /P 486 0 R >> endobj 528 0 obj << /S /P /Pg 187 0 R /K 7 /P 486 0 R >> endobj 529 0 obj << /S /H1 /Pg 187 0 R /K 8 /P 486 0 R >> endobj 530 0 obj << /S /P /Pg 187 0 R /K 9 /P 486 0 R >> endobj 531 0 obj [ 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R ] endobj 532 0 obj [ 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R ] endobj 533 0 obj [ 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R ] endobj 534 0 obj [ 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R ] endobj 535 0 obj [ 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R ] endobj 536 0 obj [ 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R ] endobj 537 0 obj [ 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R ] endobj 538 0 obj [ 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R ] endobj 539 0 obj << /Count 10 /Kids [ 547 0 R 1 0 R 28 0 R 48 0 R 66 0 R 86 0 R 119 0 R 144 0 R 169 0 R 187 0 R ] /Type /Pages >> endobj 540 0 obj << /CrossmarkDomainExclusive (true) /CreationDate (D:20190625223000+05'30') /CrossMarkDomains#5B2#5D (elsevier.com) /Author (Erich L Foster) /Creator (Elsevier) /ElsevierWebPDFSpecifications (6.5) /Subject (Computers & Graphics: X, 2 \(2019\) 100007. doi:10.1016/j.cagx.2019.100007) /CrossmarkMajorVersionDate (2010-04-23) /CrossMarkDomains#5B1#5D (sciencedirect.com) /robots (noindex) /ModDate (D:20190625223023+05'30') /AuthoritativeDomain#5B1#5D (sciencedirect.com) /Keywords (Polygon clipping; Degenerate intersections) /doi (10.1016/j.cagx.2019.100007) /Title (Clipping simple polygons with degenerate intersections) /AuthoritativeDomain#5B2#5D (elsevier.com) /Producer (Acrobat Distiller 10.1.10 \(Windows\)) >> endobj 541 0 obj << /Length 5461 /Subtype /XML /Type /Metadata >> stream 2019-06-25T22:30+05:30 Elsevier 2019-06-25T22:30:23+05:30 2019-06-25T22:30:23+05:30 Acrobat Distiller 10.1.10 (Windows) Polygon clipping,Degenerate intersections application/pdf doi:10.1016/j.cagx.2019.100007 Elsevier Ltd Computers & Graphics: X, 2 (2019) 100007. doi:10.1016/j.cagx.2019.100007 Polygon clipping Degenerate intersections Clipping simple polygons with degenerate intersections Erich L Foster Kai Hormann Romeo Traian Popa uuid:fd8cfc10-4791-4a8b-8025-00abb91efa0c uuid:1854aa7b-2d0c-4782-a6b2-baf23fa9de80 journal © 2019 The Author(s). Published by Elsevier Ltd. Computers & Graphics: X 2590-1486 2 10.1016/j.cagx.2019.100007 https://doi.org/10.1016/j.cagx.2019.100007 100007 100007 December 2019 <6mIUqndmMndqQzd-Got7-n8NNmgz9lt_7mMeGngeJowiPytmJodiJo9eOn9uKmdeKmt-/> 2010-04-23 true 10.1016/j.cagx.2019.100007 noindex sciencedirect.com elsevier.com sciencedirect.com elsevier.com VoR true 2010-04-23 10.1016/j.cagx.2019.100007 sciencedirect.com elsevier.com True http://creativecommons.org/licenses/by-nc-nd/4.0/ endstream endobj 542 0 obj << /Dests 293 0 R >> endobj xref 0 543 0000000000 65535 f 0000227841 00000 n 0000228134 00000 n 0000257057 00000 n 0000257470 00000 n 0000257507 00000 n 0000271242 00000 n 0000271279 00000 n 0000286835 00000 n 0000286872 00000 n 0000305353 00000 n 0000305463 00000 n 0000305985 00000 n 0000306095 00000 n 0000306617 00000 n 0000306727 00000 n 0000307249 00000 n 0000307392 00000 n 0000307537 00000 n 0000307679 00000 n 0000307823 00000 n 0000307966 00000 n 0000308108 00000 n 0000308251 00000 n 0000308395 00000 n 0000308540 00000 n 0000308685 00000 n 0000308828 00000 n 0000308970 00000 n 0000309245 00000 n 0000344083 00000 n 0000344390 00000 n 0000344429 00000 n 0000360436 00000 n 0000360546 00000 n 0000361069 00000 n 0000361108 00000 n 0000375959 00000 n 0000376069 00000 n 0000376592 00000 n 0000376737 00000 n 0000376881 00000 n 0000377023 00000 n 0000377168 00000 n 0000377311 00000 n 0000377454 00000 n 0000377598 00000 n 0000377742 00000 n 0000377887 00000 n 0000378148 00000 n 0000414153 00000 n 0000414461 00000 n 0000414500 00000 n 0000428668 00000 n 0000428778 00000 n 0000429301 00000 n 0000429411 00000 n 0000429934 00000 n 0000429973 00000 n 0000441092 00000 n 0000441236 00000 n 0000441381 00000 n 0000441526 00000 n 0000441668 00000 n 0000441813 00000 n 0000441958 00000 n 0000442102 00000 n 0000442349 00000 n 0000471797 00000 n 0000472158 00000 n 0000472268 00000 n 0000472790 00000 n 0000472829 00000 n 0000484491 00000 n 0000484601 00000 n 0000485124 00000 n 0000485163 00000 n 0000496488 00000 n 0000496599 00000 n 0000497122 00000 n 0000497161 00000 n 0000513221 00000 n 0000513362 00000 n 0000513506 00000 n 0000513651 00000 n 0000513795 00000 n 0000513937 00000 n 0000514229 00000 n 0000545891 00000 n 0000546331 00000 n 0000546442 00000 n 0000546965 00000 n 0000547004 00000 n 0000558989 00000 n 0000559028 00000 n 0000578432 00000 n 0000578543 00000 n 0000579066 00000 n 0000579176 00000 n 0000579699 00000 n 0000579739 00000 n 0000598915 00000 n 0000598956 00000 n 0000613485 00000 n 0000613598 00000 n 0000614122 00000 n 0000614163 00000 n 0000629892 00000 n 0000630004 00000 n 0000630528 00000 n 0000630673 00000 n 0000630818 00000 n 0000630961 00000 n 0000631106 00000 n 0000631252 00000 n 0000631398 00000 n 0000631544 00000 n 0000631690 00000 n 0000631834 00000 n 0000631979 00000 n 0000632298 00000 n 0000664247 00000 n 0000664533 00000 n 0000664574 00000 n 0000684144 00000 n 0000684257 00000 n 0000684781 00000 n 0000685067 00000 n 0000685366 00000 n 0000685437 00000 n 0000685692 00000 n 0000686219 00000 n 0000686364 00000 n 0000686509 00000 n 0000686654 00000 n 0000686799 00000 n 0000686945 00000 n 0000687088 00000 n 0000687232 00000 n 0000687377 00000 n 0000687523 00000 n 0000687669 00000 n 0000687814 00000 n 0000687959 00000 n 0000688286 00000 n 0000688549 00000 n 0000719488 00000 n 0000719851 00000 n 0000719964 00000 n 0000720489 00000 n 0000720530 00000 n 0000734816 00000 n 0000734857 00000 n 0000750537 00000 n 0000750578 00000 n 0000766765 00000 n 0000766878 00000 n 0000767403 00000 n 0000767444 00000 n 0000782281 00000 n 0000782394 00000 n 0000782918 00000 n 0000783031 00000 n 0000783556 00000 n 0000783701 00000 n 0000783847 00000 n 0000783989 00000 n 0000784133 00000 n 0000784274 00000 n 0000784418 00000 n 0000784689 00000 n 0000833247 00000 n 0000833526 00000 n 0000833639 00000 n 0000834163 00000 n 0000834204 00000 n 0000850407 00000 n 0000850520 00000 n 0000851044 00000 n 0000851085 00000 n 0000866652 00000 n 0000866835 00000 n 0000866981 00000 n 0000867127 00000 n 0000867272 00000 n 0000867418 00000 n 0000867564 00000 n 0000867710 00000 n 0000868502 00000 n 0000888253 00000 n 0000888502 00000 n 0000888615 00000 n 0000889139 00000 n 0000889180 00000 n 0000902203 00000 n 0000902346 00000 n 0000902489 00000 n 0000902635 00000 n 0000902780 00000 n 0000902925 00000 n 0000903069 00000 n 0000903214 00000 n 0000903360 00000 n 0000903506 00000 n 0000903652 00000 n 0000903798 00000 n 0000903944 00000 n 0000904140 00000 n 0000904354 00000 n 0000904569 00000 n 0000904918 00000 n 0000905132 00000 n 0000905347 00000 n 0000905562 00000 n 0000905777 00000 n 0000906196 00000 n 0000906410 00000 n 0000906625 00000 n 0000906979 00000 n 0000907192 00000 n 0000907406 00000 n 0000907621 00000 n 0000907835 00000 n 0000908050 00000 n 0000908469 00000 n 0000908683 00000 n 0000908898 00000 n 0000909113 00000 n 0000909328 00000 n 0000909543 00000 n 0000909962 00000 n 0000910175 00000 n 0000910532 00000 n 0000910745 00000 n 0000911102 00000 n 0000911316 00000 n 0000911529 00000 n 0000911882 00000 n 0000912095 00000 n 0000912452 00000 n 0000912666 00000 n 0000913023 00000 n 0000913238 00000 n 0000913452 00000 n 0000913664 00000 n 0000914020 00000 n 0000914234 00000 n 0000914591 00000 n 0000914805 00000 n 0000915019 00000 n 0000915370 00000 n 0000915556 00000 n 0000915769 00000 n 0000915982 00000 n 0000916196 00000 n 0000916411 00000 n 0000916766 00000 n 0000916981 00000 n 0000917195 00000 n 0000917410 00000 n 0000917625 00000 n 0000917982 00000 n 0000918196 00000 n 0000918410 00000 n 0000918625 00000 n 0000918840 00000 n 0000919193 00000 n 0000919234 00000 n 0000933428 00000 n 0000933540 00000 n 0000934064 00000 n 0000934105 00000 n 0000946686 00000 n 0000946798 00000 n 0000947322 00000 n 0000947363 00000 n 0000959406 00000 n 0000959518 00000 n 0000960042 00000 n 0000960237 00000 n 0000960494 00000 n 0000961333 00000 n 0000961566 00000 n 0000961884 00000 n 0000961970 00000 n 0000962207 00000 n 0000963607 00000 n 0000963723 00000 n 0000963838 00000 n 0000964036 00000 n 0000964326 00000 n 0000964394 00000 n 0000964641 00000 n 0000965043 00000 n 0000965092 00000 n 0000966372 00000 n 0000966429 00000 n 0000966486 00000 n 0000966543 00000 n 0000966600 00000 n 0000966657 00000 n 0000966714 00000 n 0000966771 00000 n 0000966828 00000 n 0000966885 00000 n 0000966942 00000 n 0000966999 00000 n 0000967056 00000 n 0000967113 00000 n 0000967170 00000 n 0000967227 00000 n 0000967284 00000 n 0000967341 00000 n 0000967398 00000 n 0000967455 00000 n 0000967512 00000 n 0000967569 00000 n 0000967626 00000 n 0000967683 00000 n 0000967739 00000 n 0000967795 00000 n 0000967850 00000 n 0000967905 00000 n 0000967960 00000 n 0000968016 00000 n 0000968072 00000 n 0000968128 00000 n 0000968184 00000 n 0000968240 00000 n 0000968296 00000 n 0000968352 00000 n 0000968408 00000 n 0000968464 00000 n 0000968520 00000 n 0000968577 00000 n 0000968634 00000 n 0000968691 00000 n 0000968748 00000 n 0000968805 00000 n 0000968862 00000 n 0000968919 00000 n 0000968976 00000 n 0000969031 00000 n 0000969087 00000 n 0000969143 00000 n 0000969199 00000 n 0000969255 00000 n 0000969312 00000 n 0000969369 00000 n 0000969426 00000 n 0000969483 00000 n 0000969540 00000 n 0000969597 00000 n 0000969652 00000 n 0000969709 00000 n 0000969766 00000 n 0000969821 00000 n 0000969877 00000 n 0000969933 00000 n 0000969989 00000 n 0000971262 00000 n 0000971318 00000 n 0000971374 00000 n 0000971430 00000 n 0000971486 00000 n 0000971542 00000 n 0000971598 00000 n 0000971653 00000 n 0000971709 00000 n 0000971765 00000 n 0000971821 00000 n 0000971877 00000 n 0000971933 00000 n 0000971989 00000 n 0000972045 00000 n 0000972100 00000 n 0000972156 00000 n 0000972212 00000 n 0000972268 00000 n 0000972324 00000 n 0000972380 00000 n 0000972436 00000 n 0000972493 00000 n 0000972550 00000 n 0000972607 00000 n 0000972662 00000 n 0000972718 00000 n 0000972774 00000 n 0000972830 00000 n 0000972886 00000 n 0000972943 00000 n 0000973000 00000 n 0000973057 00000 n 0000973114 00000 n 0000973171 00000 n 0000973226 00000 n 0000973282 00000 n 0000973338 00000 n 0000973394 00000 n 0000973450 00000 n 0000973506 00000 n 0000973563 00000 n 0000973619 00000 n 0000973676 00000 n 0000973733 00000 n 0000973790 00000 n 0000973847 00000 n 0000973904 00000 n 0000973959 00000 n 0000974015 00000 n 0000974072 00000 n 0000974129 00000 n 0000974186 00000 n 0000974243 00000 n 0000974300 00000 n 0000974356 00000 n 0000974412 00000 n 0000974468 00000 n 0000974524 00000 n 0000974581 00000 n 0000974624 00000 n 0000974653 00000 n 0000974875 00000 n 0000975009 00000 n 0000975134 00000 n 0000975233 00000 n 0000975328 00000 n 0000975427 00000 n 0000975484 00000 n 0000975541 00000 n 0000975598 00000 n 0000975655 00000 n 0000975712 00000 n 0000975769 00000 n 0000975827 00000 n 0000975884 00000 n 0000975942 00000 n 0000976001 00000 n 0000976059 00000 n 0000976184 00000 n 0000976296 00000 n 0000976357 00000 n 0000976469 00000 n 0000976530 00000 n 0000976642 00000 n 0000976715 00000 n 0000976996 00000 n 0000977109 00000 n 0000977210 00000 n 0000977265 00000 n 0000977321 00000 n 0000977378 00000 n 0000977434 00000 n 0000977547 00000 n 0000977609 00000 n 0000977722 00000 n 0000977784 00000 n 0000977840 00000 n 0000977897 00000 n 0000977953 00000 n 0000978009 00000 n 0000978066 00000 n 0000978122 00000 n 0000978180 00000 n 0000978237 00000 n 0000978350 00000 n 0000978412 00000 n 0000978525 00000 n 0000978587 00000 n 0000978643 00000 n 0000978699 00000 n 0000978756 00000 n 0000978812 00000 n 0000978973 00000 n 0000979047 00000 n 0000979149 00000 n 0000979262 00000 n 0000979324 00000 n 0000979438 00000 n 0000979500 00000 n 0000979556 00000 n 0000979612 00000 n 0000979726 00000 n 0000979788 00000 n 0000979902 00000 n 0000979976 00000 n 0000980090 00000 n 0000980468 00000 n 0000980582 00000 n 0000980684 00000 n 0000980798 00000 n 0000980860 00000 n 0000980917 00000 n 0000980974 00000 n 0000981032 00000 n 0000981089 00000 n 0000981204 00000 n 0000981267 00000 n 0000981324 00000 n 0000981382 00000 n 0000981439 00000 n 0000981496 00000 n 0000981554 00000 n 0000981611 00000 n 0000981726 00000 n 0000981789 00000 n 0000981904 00000 n 0000981967 00000 n 0000982082 00000 n 0000982145 00000 n 0000982260 00000 n 0000982323 00000 n 0000982380 00000 n 0000982437 00000 n 0000982552 00000 n 0000982615 00000 n 0000982730 00000 n 0000982793 00000 n 0000982850 00000 n 0000982908 00000 n 0000982965 00000 n 0000983022 00000 n 0000983137 00000 n 0000983200 00000 n 0000983257 00000 n 0000983314 00000 n 0000983372 00000 n 0000983429 00000 n 0000983487 00000 n 0000983544 00000 n 0000983602 00000 n 0000983659 00000 n 0000983776 00000 n 0000983861 00000 n 0000983954 00000 n 0000984087 00000 n 0000984172 00000 n 0000984273 00000 n 0000984358 00000 n 0000984459 00000 n 0000984589 00000 n 0000985324 00000 n 0000990869 00000 n trailer << /Size 543 /Info 540 0 R /ID [ <39d7289c71f0ab2d6059e81b0abd0689> ] /Root 544 0 R >> startxref 160 %%EOF octclip-2.0.3/doc/kim2006.pdf000644 001750 001750 00001251123 13657530155 015524 0ustar00topotopo000000 000000 %PDF-1.3 % 131 0 obj <> endobj xref 131 41 0000000016 00000 n 0000001613 00000 n 0000001739 00000 n 0000001783 00000 n 0000002123 00000 n 0000002410 00000 n 0000002861 00000 n 0000003216 00000 n 0000003253 00000 n 0000003465 00000 n 0000022676 00000 n 0000022880 00000 n 0000023263 00000 n 0000038240 00000 n 0000038444 00000 n 0000038668 00000 n 0000050118 00000 n 0000050322 00000 n 0000051482 00000 n 0000052471 00000 n 0000053447 00000 n 0000054379 00000 n 0000055228 00000 n 0000055479 00000 n 0000055683 00000 n 0000055838 00000 n 0000055984 00000 n 0000068832 00000 n 0000069037 00000 n 0000069177 00000 n 0000073630 00000 n 0000073832 00000 n 0000074106 00000 n 0000074203 00000 n 0000074983 00000 n 0000075208 00000 n 0000076255 00000 n 0000077367 00000 n 0000077736 00000 n 0000080406 00000 n 0000001116 00000 n trailer <]/Prev 346002>> startxref 0 %%EOF 171 0 obj <>stream hb```f``ec`g` Ȁ l@p\ oT>CܲKu3ă t;G .d*Qࡲµؖ2#38qj(1RVqeQf:BnUPMV/6p(U*PjYbΘEYݶ?,M^yNeM;mv @+s:@îKgL5W8q=k(4```RRKKK *)5@C TJd I Ђd$i@8Pe? Ć` Lq/x>?``~Z̰iV h2lG27Al&n9] \ ?8Õd܌jKJZ=OPrb^paˁ T@ endstream endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj [/ICCBased 169 0 R] endobj 139 0 obj <> endobj 140 0 obj <>stream x x0|y}y&$I2ɄH%eKkIRb⊀JZm] a1hV-ZURk[RKI ~{_?g_soBF48޶(Uدy𖮾neo6g@߼zFoE AHzu>Bbٺko"[>XP+׮\s|EV6>WB//2m>[~^~l|Y#(%$*Xy/Ի~l|#Jo5X~p6^(=|MipNL})\"WOlP9P =Qe54ZS\tE&t~(3(C9ȅ }.Cw*@clvQ/roEwMR:Ԉ~k"3u&v8. 3I|#NKS<7Iesa6ga0o #"8'sks]ϸ_s|arj#ƕP%s`50^M rڃyDB`Øޯ .<~Ŀ_ЏW@I=i$s:r|=)Vs |CR\"^->"?D]Z%$+Mib@~ >.x`''\^a+^+&ܵܽW3?۹k!DžZ t7ϑߒ/& d=HDډo>EՒ-x62vnK S< ~A";P_)CW@{ r>q Qr9IN }?T"" v+Cx0c\P'#n'g%W1P@7bL&7<@55y#7zɗ(v=KQ)"oZ8݉P)y45_Q|5Ja=PKm-^ -X5 xs7 ֠.= 6BW&w]<翡/-GOE0j(sx|rR c缝aWZҙ ǚ|4am1QIR2'#peѩ3_U)Sz|_a;uu_˛j9e+GWE90ulmѩ#;|9ww$ĵw]Ow-ZqX#ƞٝqXR M478#D \%QXf: գ$&OHi*K?J)w\`u34d3Z&s'2K2"nG r6A2bKAy t#h(d #4c/-y$qX#g5 :cp; _PR~ AR =G( p4^> s{Z)!r7YQ'wsOp;#3!p)pm4{{$7NpPʙR͐jT>i7+ϙC˟9!&XS!p-3B1#:A+q,8Js=DSi]2,3 'Xo(WZݑXwAOmX[Aۓ|}>V_P$bԓ|( BO;]ʂ  ,fI3[>0t? $8OO"?BQnp!%/ry4}'_`ϏV57 Ylh/Kπa!p@32rT\/8疡eCzs[-#?yR z}lQTz}x4?R }#E9z0`PвQБ,8Zl"Zv0G"e(_κ D$(š4a31bC{NGv%R?\藇rء/"/^#Q dR4J>X %PhoѺ#,V,A|$tKKt:R,ZP\hNlCZPm?Q<s(J)ܡP!,qT! oR*it4S%E H~ɮjdIc45D4ѩSjgvi" @< ˄$+!pv26.3VԺxvfFuT4SlhWtNe] ^.IwRza7qOg'n͌F`:l7rnw[gYs''܁C:2:340l̥aG77&tv7Ki:|1Gzۏh1b X1@Ӽ}yyBkкl[Qj $H>d3_ؘa3kl@1?-/"E1Zdߌ*;X?1222DeP_5Q'Ҽ\Of+ݙUoorֆxϪWRrm7M5&eKj2Ҵn^ܱoid9sS_khcZVJzJ}zlޱOfwV~y;g;Yp o-=h*n(nYp:irYg}G3,-(W5aÆmڔ&7K653*uԉvl;Tud}@κẽu¦Ml}%x[73o8ooH3.8 %؄7¯ э66vܔlhCA # p ' n~pp\q&cg7Wf+p,l8 G+t f1:[>Gp'p\9k|Sk;7 I GH ɍ8 L{dQGv& ,l(R7j( `?h~*-μp/*WFNy4 kȝX>[pCXҰ%lck8h_|9k|NJQŽx~ThC rk_|kao˖W|oWo6}60R6My[`6&Z p⠣sVt9IU֪RڝOǷ=7 k [o򛿚|k#'|lρ(3BN:䴮 HyƊYU5;BAŅfbAw-1Jӑ> FIb$/^UY]QtoJ>fնV^s򹢼6֮({>ʠA*U5Lq;Cx>E<+A~rJ]tRӡ$maGx&ôoOkHSjmVa^-aFV_2IVVcPRKR*m:MfrRUCa#G|H8;!0lx=!ծp\Nq""!y ZW_U(In&1`2kю$³j{A(( ;ͪUEq5NxO|OT[hGh'4;XbxoPh$%"&mqsLw{\"y*!BQ> xVٱ yt1HB oUZgv;Ώϐ]Ί@, 7.yzgk\w9W1XRM'jUݟK_?&?q6/Z48 5"=Uw{GnM6;15Uht5U )m&Z@8tW&YTC=fq!Q|:ɺizaw-ǿO&U*,vW"UtISI1ol6'm Xn$yP (9ꭒ[vUU<3΄T'͗~ _YZFѲ;]ϛt)_\DxsxW-i]z>PکHn!.EQV Z*T,xwzgxppF$W۶6`mXRmԎE *\G!E/8gFn r$! ~ϧݵLDW_]D>}_ةůhk L$5&rȁ-{P(ecE|%#-oU{@NaAz`1*SL!`4s%Suj%S9VI*zAb#6O%8 ;]}gwx9xx׸5ҠT03b^8ca^bx\%A3UX-KW1@\P o;c/U3d1)>J}G"ҝw>e?m[ {]+xCɇ.Vچؕ|˶n[CLS~H#ԋ׶ oo[7 ð:dDV FPS͸Ѐ\i#/pU%IxI4hPȈ/A~a(`QE q@ɮPZ^p׳e=@N9JX.8C}ulAJZ V',i ;0[K<+4@APǎ%b W ;|ɉȦo<9g|_1䉉nJZ~+kPu6)R̻3zU b oy!܋xurBJ#[>@; a|rG?GɃdF(ppqH\JMٵyڸ\~~,bq)nlv O֬fg>m128xbs:/Lr )¶eT2jR\(Q=e(4'~e#uC3/N=Vݫ8~h'G'?{~myN"p9ap0NOS~P,l7۷ʏv9xWָ-V{ I{WhĐžPd$iumVUZU`]C%dV"7'r*E.f#K\`Ӣ. L,QDqw$N0P? 8ut2X7hv1{WQE1a aYE>:HBbi_XA p)_K?哿8|ClFxwR>w&wWFoJqᾂ(3bkVIq$$H~9N+ҀfPwJ;5I-.c2W\<1LMI>9Ñ`GE:XWqT Q' G  5ћCp_0%ĶvĶȔ - ۢE@E@8 ]@R҃#|a3ϐ<1 QrzHbwQz]ncI1M0ꔢҲ#n.6Z j]?Y\.챺c2FlxدMQx+nbN Tj'VcH"SDYO |pi{ GV &$ϚgZFwUs#M`]d(rʜ<:uB@4;A )zs*A6;m<6'O5FΨ:Z5S}!l='8I@ 6)͌UPWcZz `(ikjvjmol T&9L=?h'ji!W4 䀏C4ָi}lM[VaR;3QZom>"=ULj7cgjkj|h=18wUcգe5#Ry*`d7LICk#x!P~`^%!£8)+r҂^I g%[_=LTJ_JJunZr"*QJJKJ2 ]>`gZ?џN%/e 0VSIxF4Wg.,A8+FK%[A\_@ sGmI*P̗ +ٔ(Y#H+0QAJefHiW0W'N]uQ z9͗(wbFDA¬L{R$LƧ]JFb֮/?xG_^Yb1ok|{Fm_pPu G$|Y[K=AL}}yEl{}TyB) ЙGNAz"ND$'pOcF w+*,J1ަD*f=:掸_fx$K@ =x)<& :U5 ܹ^+^% +N NbnHp%_㘃曄 4J4>GszN)}&&d"{ׁu1 ӧڑ}٤!WڪZh$)PQQ恐l2!"s.}Su98y秥88u :x(!%P@=gNw!w3;nnHOj]_=J~Z$՚)--U>dK l4}4VTdTJ,R8UŪI>_̟E /)XM6 aA.[{fiKW;β8P$F1u*jTђ-xA'vk* *YP^aP!y٣Ѿ@[Вg Mym'] 'avųA׊G'ɏk9&Os۸]ϞUW)WI%1^OĘC V+YRE !pVuPv_V%:3E UJ*POVT-4jP[ 0:@pc7Kun9x:yKMP~7y ¶ylddҧWjlUBgt5i݂T܉vwTVYi[Po ht&IAyqn~~U-ӯߡ]w޼yIU֕$+_e@Cڴ@6й{kdC8P禂EBnsw׻{4C)ŒK:*XQnj%cŸ'*Ce%,⒊=( Ɔb;#1i؋P8J;F:5K$ՔVviPd p;PY2$I)M$Qd ى]x_x?p%2ʒ2XxVN35j?"fTQiSXO+f8/2SHQRUz_cSxb,#c,-,,܏P00^#VpWQq f yjDf)=CS@)UO}OݫzO(PPP P{^֛sw3gdm9e?/A52mA-PH$D/V0g$27^4 ޯN1V R| Akz(2H{]9B3\Խq7ۭچ,C~*S4TbHZˬ;B;șdQKS.%=0Aa$0PxO8TL"pT:cZ)@E{ƚI?paR2*E*Ahe:4g7xov/b(63"F,f/j10vV} >FO[sGL(:!FMM ?@$H$>{ F T<)e'sjb}X"U"wY]1Bkb|`ʊf-Hd֚.yb۪gT'Ǧ 㩸cs(زk,f4u4{QnS*ŬfH"C6`9 %KO"JC?UPGBʨ)dKZYb#"Irᜄc 9AƘ&_ZRG{X H fNFÜ<%X0B; o6OhJ DS%Kf[rt0]]ǁq@7;2EdIeO&&a;?ڛKIjj0EPYH.h'yVR3tsuKuOIIc3I(H llSڔ˕+t*7*hXyV:,Qklk;@S"[P.* q҇ 0s @JT*(UbcI@*p| Wg0e 2HLzI^k JH1 EʴeZVk(~.,##2fٱKTYZaN'7&Rl;}3%bTG̵+͹ F(}\%&~7v5` %';PY7* L(sjJP-.HHdPN=Vo@O_3@%qUR1v:638 G¨DG DR%EHz@p#}w]I05zPI0[@{:[&'M2BwFJ]X]c<4ک!:*]cK&DYDXA%K^TXR=nr 9(i51_FwGsK>0(%lG ۦ}UN2N8-='"j2WZLkW~Ͷͳ}uڌή9!a$Ht`2nCYnǀcq4ihgZHVU k|~qf'^ptrγvj4TSsRU3d44YG(^qEԤM2&ĝ1alI.,bK9^o g[zT!~<P[zcaB:rT~f7}$mPFpq *O#l̗t٘.ӲjҦ'Q,iŒ="zgMtnJ9X,گ>kl]~Gq#O鯇}cb+~F=Ff|۷֨<Ԇwp7JMtNJ*V))fz/e58ZQj){Oi !s<}#VQRcXqy<˔ƨ8}T~~Nr-FfVAU5В&A"=lzvY:?dT\4͂>tXOC皸&<Qoa5nKX+@ į1j(QCp Z1N[ZZDGw;JQ,Ƃ-}f3RdS`mmgaAW0EnSit$Vo:Pl.ܼBDth[~ƦxN6Ugּζ]w7+l[qbũgVBWVOkZ}U[|_km6V3Yv z~87J;ajtX5Ҳ+a. T CY=Ԃ[ Ziic(֨<Tq(W<-{=2$Z K'JK%EE?JO\Kҝå\R=Unp1^Lf vbg - pArgn+-+8Qhɂ5YRQIYQB]\XAsgNfg8ѩU 4P%/]kH;'g@%*Gb2 @]||=u}Iv3G O}®/OO> (x)L|BYD((Z% Y|_ď%.QPTIS-(cMՕȀUښND7A"9\i̔W.'CX0ˏ絤Μf'¥_\ԵϽzGR%uW&Ѳ}Jk׼|๊G/NyQU.Nv"5^ڷenwlvu,l|eo^>[*:bY*N^1!"6Gy$gi>2x14iD0hZDKZ _F4CX)7-NKAགྷ[ꝫ-><d%o=sEƙBDpIuu4e| $}w^3*Vz̧hm3cDNAM I6:/T?F#Fƈ2_#ctfg5hMyH+^?:V,k|L<=PtOLTPQR/J @yy%5YX\j[Nm-yD {`1؆`*i ͪbmҔ* Ts}w`n5v3;xumq=>#3e@JƳl( LM>h5{0u+iS2F{Țə3 f)kll,i_`v^QWX8s2<,MQo"c\XkuoO b)'h0ojJ 6yvfPSt똍*H,a," .2ŝ\c3.9陕5b\Sªu @AɐJ-y8#T$ fW"U3+ ݀{ !`q^ uه_m>U&c~OoЊ5m7mFF@!ݍ x9# 6/n3 ƿAvݜx9L=or_E<8s~3HY d$0y!joAF6ٖNND[m9n"( P&NS)Ci B.J GbghVq{UgY#M%ߞؕ_|gď:g% V^M ;_K9sV:we/FPQ 6@*ZDhBuLy٧^l6NNN>Bk.S56?)%|IP/[j62'8?R]Yk$ ˀs4,[vlBr*JTN]]^^p5 㾡ЉlNTIw-ma֏z$ڱZqu:!U\)I4(I@BT)E pr?K#j Yʉc!U!=X8|FIU"8~|z}|3[RQzr8Fxv1Ǩ&OUS.TUktdx}XTAR%T4E%/3V5m^?x'aK\Lr}ɤ5Nk4a袒NH(b'zX1kC굋%vx$9: =esdY6lY)9}{5Q(JFEPIc+C #`u(wazk*-||z`=cmn6$sQp<% J8sҝbT= F\ r/pE}C7!K%ʨi=䥅C-!H #ch$)eJ5nD!cQcJ8( Rv+4"7LEFF#i2gO_OZ7ԩp_cԆMgArǫq!ܚ)+iG .v5ӗ)GMX,,ն|V Wl<ݾJ=3 1uH?s}Ѹs7*ؓH +%HWSǻNtքvF_q>h^rGy,*w4wAE ?[` ,X`W""=#S))v|i|25=pryrӡsAo61fD@>al DA(PH0i8 0 3P9@mt.z8Q>Rap6ܥhYw=y(?qcc ȃK287!At}{ѹI~CFN?i41rs>Lz I/"':8ƲNbYW뿵G`ׯ]Bpw:~O{78C z:OW endstream endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <>stream xwU/~NUPU]9<'a` CNQ]1+UETD`Q\uV ((uߩI>SSΩ:sP&R@s Z4y#ܩBϣιt/m2[Ps^5x.1=Э2tʴzT]c+]x֌/йjь_]*v*XtQ_PtˋBK.ƃF$V(؄ nk1nP6p A'6OA,#g=u'x \ ZWQ)=t Jr=SkoQDp!x cMӁP9ڞ§p5\V`&|#"[0LF4bv< cd'xA*bW":7y> > |H/Du Xf6Ђ.܆2܅m7ğ QG6`B\ I^@, {@߂Mk .CW6àIڊׄjP)[ ~?jy||x{^RX[B@Im}fo/|IIAvU= ٱn>v5~o܃en8U3TbٴEކ0$?!ԜKHdp (PRHv:~=FvdPkX }b ("bXA'*G,bœtW GsbЁQ?Z * N EUE,͠&ظd 3 $Ɖmz0:K 3bZ>nL+^KXR&B*KĒK(8x \'y9BNwߝ~Ó+_cӯ<<Óu'yW ?Ïxa ~'l<|_{&;>| UwLXxyo-|kOgqjzf5|u5FNu5|}O [xzn'^}eWWfW 8|OnoK>Òaƻjɍ<܈Āp}plxrntvpxp#Ѕõwkxf?rpĝWwv; m{J$<\)|w/f;<\;oo)7M<򰓇+WWX)r.ᒽR.vmpQ'\Ë;ygygELΘΐ3^8er'9NxxvL`N`XQcbp4 y8#ȱpۢpxlƒn*pv!1-芖i ټ6m6՟u裮v:*` ֐DYX ,χ0:òav ̤df/L82mi %R, ʫv9R 9:Ӎp\f<)14Pg$VZ=n5`fJs~L zV"58ڄZP-H%@Tߥ? *q KϚvCo;{ۺuxCGF>;‰\x1S垸Ea2oю޼jw_|heKv~xe׷M]zͤ=2weO\W\~AR6VY프zCӝG:ecy}y7<ވD8#@ Z;dSZ5T#)$CcgNIB*saX$;{UFiSLRn"qtߧm8Gv#lh--P~~]br:%ܳG'2a_x6J-JOc464So{ujJW;/=ystMdm7χv%zDqF2zc\ɓF}^x>6i{fF0a?KOO=qR_z$<- v(hj&m)0)j^j)5CӼ nwJo@ghI}Ќ[*nmD;#ggNUyY=Bl-ނ;L]F.Aͯxe_4ڦd.=kS>֔+0%_'+_#WpUFƩCAy ԱSci̺DNς{(B !`'wwՐz1NOǨK]3fM_Rzv[?v€{[ F{Խz7s\c]w)RJWџs=!{QwT{;rOzL&r5t/2>TC^ҋi]'+$ڌ\ , 1PDI>k ʴNQh>;=uH@$h+A׉xz OOA_~3z$1̀kH(àS)=Zuc~=rՁ J 9?VX|ێ&/|xMiTTt퉽^S`خ[1-B@㠀z?AS1)X*Q3ֹ{(zh3݈|/}4->,r\p454 ݿrIIۃS3'۳{W }nsTmZz3=n+7wc͘#[: aI$U:Xlbf]أn6(A菊]=EO0[ڀ$rDra4/c2g2$roo#ɏ 1m&M_8㴽ciʨ9??"W'V߁ot۷m M/gVn:׷]2rϮYy+wkj_\VCHHH vq10N'z$H ZүÈ ]4>V#PA{c-N~n0/1s|=5ECl97}[~@So1^ecY)M1ֳ}+T-"D4,P۴n32FJsBQ_E?GXMMLJ8X-`GIa, &6ʹnTZ "<T3N>dIkL7d0&$_z\:F`R!YB lIǎdGYUoGiHm& J#@v}^Qu"d%KC! >#feNU7I5,i'!>M'ToҹafGm/5dWot=1s'[\?]e^Е>mMXa6 {[f̛Y:1r膺_a ٰ -< +b13?u_&lٵ3͟1k%N|Vװd13e̚cS~nv%ipg]+blEYI< )U>4VRr豓ˏ![1?9F@:Cv: `Kqgf_ϊ%gL8+lsKԷhe糡FlA~vQ$pY@RD(Zmabks袋1ö&BStW9{x,h(6aSaE/xP2/\ҡcn.s !H&0pّӨh .(;e4"TJD}C(bJC@1C*^GKh+˪Ɩ`#e>v%} zFe| I%6A~(l8VeFԷ" ! HWǂBКTI˒|!ܙ{YZtՏHW`4 qD!P݈RݚRqE=sTQ8O|uWPzN;s5}9q?)*TN֥a#rH xU뼲HlZ5)UJЪu*W"O4G龄cz@lfmcJkb4UFQg:uT):O C}1 CF?9?}- §{hw SFVuZ65we+7\-BqR#%zʨCԙ2e"so,Q9`ll lC4<u͠t!1!] &qz{>VHqFa՜!&\s ZT틖}-rk-$ N$-'Uty?w؅qHޡgX"b~χJCRXlVURi]#{Y;SSx up !M" NQS_dn zF)Q@=ù *:,(,WHCiU&$7ZF5#rMkMԞe#Ӵ3(XջLkzO6A~ufGwLze/BȧdR˞gdbl]848أ3b*gJaVI-JKM on Sr˓;N+7֦*EVhpRPtޗihƴvald2W!D_wܝvz2K\Kʥ3L!}=_ v/1 g8U$&5j J+N)Wb~)’܅k{TRKY8ATW zO[& ?PZ2m&s T\l_PqC[۰P*Fh۩j2xjXuFjzҀDBdBt/0(7_D8=~!o*S9WvҼ{1)®+q*JMcn~џrS\( e6bҤ F:Y 0L/UP*&WiK*L?n5Ĝ8MO"bѰ*ru4aIBO `|]t>>f}W5@6d* ϏD 3aڿ_oo-bwV?mْ%˦}3ӮXfcYC{0IӦN^3b9Bؓ % G#ViLK6DwmACc7F̅,>+|s0GAPZ4$65OcqR; l"`GǗWNFI}%<][W]}a0ej)-_|Ҿ4hoBh`C $-;Gtl(U}jGՖpppyz'N8]" > Btf9GFzԠ%~ qL@PTwtC :Iۓ#.-Z(j +Uq/rZ$ehiWHdzO+~6+_%}<~_ ɩ@(qcXY+SkY r'z^=h ȵ]h>IhŠane`CP{h20цݙo]}c =_fͿ̌aSoD81Ӵ)O3KySkƽ|7<j@[!HmH9Ƃj33jx*bUU ԱnWR|O:}8??.HO߸-밌oC]jJLDiٖY3 6bq0z/%p>R3c`6ÉXKq @z$)OhyZCY|SR9̳eU<3rzB\6hwWa޿+fb86o/ǜ{ k3Hx;҉iP46ޗ5]6NoP_ME>%}~tDwj89B!!_^ L-sDNDA˲P1^sJ;Z*%~î{[)W;XoѨ JiVlZU,ٸk(dϯadRAF)doѹhfC%FŦps/V:Kp7̦k<㏐w_b 7ނ/t۝2R9ʿ(_8FpjeR+Xv9QcJJ8):)@S"[>gk0MR+:I},,2Ni0av1:N^5#YlUtoaVHC+9) ~_˩f) HBbJ+ NZt龮 a#N;WBrQӨ~}fhzpbsxO{7׶lF?PlFMe[ k)S{\9a9/ME/VNuf.>o*UhU_W[hTcPA!(UK~;VGNsJ}CLByYrp^D t`B?՛s5okY%ae;6ðǧ[}[m93/o%~LNhզϝihױ3bF{.*}D BqHU`qF|(.N1$v6,%SbOIa{^华'bOem 9w}{At!t t4*B2 !-צCͩ}ʲll:H9F:eqaD}H/f" lB37|=%+Z>#:mÔo _UktmU9 ~6S S$Bc#&?9Z"YY \ɫ訍ՉFj(8`RI+g岜-!ZQd/씠eHBeTPae}F~8 JnA+* {mZ^1o(<3ug#<0ԅd=ĩ`}W~a UOT?d16ⓨq-w;qˢvkoԨіNmfKUjOa3=W>ΠU& 1srRfMT4fʤ5^/Ծ9gbeE58}Di)0VM)Y5r 8.U`[VGt-tqXTC&-btwrlUtM!i rƫ7kJa34!xyyA* 2u#j^kQz_Ï.$dYAIT;d*ͅ) 6pR5S>f%2'qAI>4ڹoVc` M5֕ӑ׺`l8FS@9]mY^=ys[&T r=!^w]()^(8o*:\?cRq1b*6>(ڜv{&LqS;G%P" ̝q Mx˞s u?c΢jwEtZ|$l.Q8 J^o>r mڟg6D44!+`Gg[: 'tؾ%4/8(eVC 8DP !6: Jq(W%!ݢQ'9Tmiԕ'5-d5~y ] N#L]o- )NpUg c29|P~Nx4-6L}~BH[WgTh2q1>+ޅLZn0(-cҒ8max>K% CBkuZЋ'Dĉ#rW%Rf_H2?Hgkݮ飏1/;{~CчdZ ʹe<D٧V1EW*>Q4 ǐ2iHZmvMF $iQ>`TkZan'? S5*NMod@(I0zzUXV䔃{N̹bR]-7-޺'WUFht3+.̪zclǘ WGYhtd&ЂZH{\Ƶ@'}& <?\izd%6/6iDS&LAg WȜ~16 Ԋ ЦɱJ5+9WuSkmX1j\?ksCEM:Fme$ 8, \1N·@)&RE;YÚmﰇ"3ApZ%Z@mN^]\U,B1WT!:匛9gV-qƱt"d>*G1R%S]Mֻ߼f0C'j2r5TR/lޓHKA`6p=ʬz$08Mtw @ AXV~ꈨ9Kղy(*[LeoTW'Jx|j<Ľ9_c3&a .l\Z& ,Kfh,x8pye,:cƷY)pV!+,MuuDօ*ą)jKs4}^bٯjAA)0DQBUjWg±:K7N1d;C1[=YE2wn>%rH:`J!Z`$Ћ%X3k#üne2,(mW+A%Pmn,ƎSP)NU/J 8+B ~?ǨnJyEmĹ.뒫PUty ;!jjV}@%*JheU|a7/6: Bj2:ˣ@\[t~w<Ltx;xV<|rk3Cf & D K솮y_ ϑV(G6lTaiB4JsoԤʥN+ FDUe1seV Y..nL"R+P{܈(* >gp儖jqzt (NJeLqf \p? if WuisZOk $YGncfWI+f-V霮تBv ^P+ܥ2N/$UҍY[{g|)XwLP*-g$m6,6~Ѯ9N#l).Xhr).NCqtJA{O1V|Pg@U! y>KTKɄi :J@ɓ!4U&aq0 xRB ⠃V&ً&SJ Y4G:foTq%dV_-et-NRxu_ONGQ ⋩3*j4zS{]t %mq:8%<82{}pMU_ڷރ %ɘߌPdT/(c#/А976Rkzά)*e+)t~_d~c?Ѫ+4)"JaU)58-0]!Zh5ig5^yE:TɕIO&e_5ӧU]!Ką2P]~))$x{ @\Ju &^U3Ec58y6MZ\Z3tlŲyX q"n=֜zmJow1r&-G:I Tm5+7b]RmHH ,BQeM%Utn`G9F` )RM~GSj!<[Mަ=(B }` s3u/DERuږ$t)AV/57wh^1sx&1ʊ\RzƥU Hc`)M"DS剟)^fqJ_Ƞrd4Yi r>XJԐ) ~B xĺ\Z)T~S3`փ[qïķxI^rdtJG[~QrʭFF7o_SŴPzT MFeh\ߦ6trۘ5>fҙrusx߾9v9\nٛ1_Dc>0%{ :i;a|.l-ԠӆALfcdr< 'u91V|B>NQj$)L]?KBW{{Q %:'Pc@; & .@ߋA3b\Zh @h@YlJ9:`f`0A Q0 pA0F`hDp( hT!4(PdCYbXA L ;.w )$q%tSm:yy2)jl \_#^sw)/bDaoKZAp!܊zAڷ݂v ho@ hOB.= ֒ME:rh"_uiҒhD@Mpk귂:z`"2}Tv2 Q ,gt1N*vSDX J7  bmا'{$U:!f4X S ?gvj fYwO??M[Eٱ3e&?!}Q>{pƽ endstream endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <>stream x{ xUսZ{|>ʲyH;n41˱Nm}lâz<8}0ooVċٗD s#[ ~ H@?`m'ql,@o[ sɵ#ȍm-V@}F VX?VW 0qgnc|x;p[cy,n6G&SVX^fߙ忁`lmIn;c (2D|[z÷.uUu`$#6P[ 05GoA-= TP|qcJecMA)xg10?#^$@h4G^)N-Y L=aF_@}ݍ{}EӠ!}yJ}Y@g y7fćni 'kOXEC_N)/zE;*EzEoEFEo,z5/f7zCN,P' ^FyџY*gdѱ年GS/ߍ^zfn3zEϳw,s,zNF<=zEOOF~AOarF6zZI=!*"޾mhӒעhYKF3LF=Fy]oC_GzG획vɇ|AE;fo,Խ,vmz\FwnUgmV *t n֠YE7ԣ6f]ۂ6蚫U5,ZI]DֳzUZ ?)mJ*Vy Ws42 u-B˺ԲnԥG]G>)ȥh /RP hB9Hq!тjA_@h.~.4Gfh'gvS% ԋ:O:%,ᥦu|ËJT)ނZT[j5w), 5FQ;ФnTW@PE5gQ5XT)*Pݨ"*QgQyKP弨L2](+PnbQ'Qנ>FQvH7 w dQ@, /<,r ׶fdd,f1Sndk76dFF)2Ez| H ifJ"Xd)%jFR.W HDnD`5ीk0?=?+mrj`6liR HH V:^ҹy}v@tkY"8*|^{F&H3L}?ix@O3j55QhؤVoii-;-j%{GNh)/RI~ZC GƆK,^ kfά<?a䱑+PPQD@#C=5?iF^*u,?ZaףыD\jPH^ceRl(V˥# @y EtZQހQ v|m?}zR/sSH (y~ 5:=.e3\YYVc]7a(-BsE6E6lL͍IJSDf#'Fn jFV8FyP,: a!pN*C 3h L4 {pSy;SeFGϏq`\V3DL_vL&1}k: ūsP3q*? 32Pv:[5jW$.Gpͺv"svÒ'>忾:ǾIWȇY^j5d{}Ơq+u˃c\ sJ`2cSRtzo4 3aH| PNdϳ{@@c}}^sMim^{r1ߪaIUL[%Px4nANKxΩ4ovO$5dʊE_Uzs~y^k0_^vS88R_r.5U\&rj5J@ᐉWWb1VcИE8ar H1xWrwYڈ""mZ}oo .*Z{mBx7G]BAnd`eMNY.TV.or_=v-7v_Tb=Stymy^: NJ!)(G~[fc4DL"#0) (y:l`eG#E׏ 'PlTJftsn|z:3U(QS F$)ʳpƱO7 N;z',:k}'p&EAFSBk y#y`ʙsײl~-:d5E$AN*ȓ)Q3ƀ )Ƹd u0tqEL(UB+%qIC:8P;at:,b:zx/_|rCk +OŸ?@ʇvL2ٖHdwϲm#Ku. )L"r4@{=@m@ĴI,g*x- s <'G"VGGyDջ~q1na}}kVqBQJ˥l1 &V5\ ) s_}(ʢm>WB!*с%3% \U&CP[TfLPN١wN OY[S.Ezee~wVkdʈ8w+dS~ `^_5Dcl}'35h ZI 0$h-NiVu$$Е+ @ΨݲnKM^JKRqk^Oq'Tx. 6AAHi~O7ʜ,&֐os*TǺc6e;QX6ڀ* 2c-Jr;Cw;!t7ON@-N&(b*SgQ,q0u{ q3}~W<` 2\C$2b?YWT)),Nd{Q 56X*`W ䷻ޓK֫%qb&PHW'~P"eVzl#*?e_wIEडGdUeY7i7"U&y0Jt?T+ƒʭ.VJ ۋUMIXʬbe7YA'd7~|e>C+{(\MȦ->\Pϔj |Dp:W7ƣ;n24 :zU;OTNWubRNȜX*RF" Z)"< MX|YA|N%B $wLH}w? y6co 2B*t,7)  !ᕡPZL*dB #coxm )3hجn襚;iz$`6::%̇X߅EC,qZ=aՆuPD #Bwx 5帖hPJ8G`CrS( d21 QxBH,6 {ː}!X06̧UނㄪwDU̙YQBV1?0:rOTw(a Z˵Eׁݎ>f`/їBG,6XjxO$ȉVY~] 8Ms#*3%*հg:O T5Y)Q @f5g>Y dE9RO. =uZoBsSv)kٺW`۪HEBqN%e\qYV_Z;-U lc3rzVGbs"$J#6;*Q"VJْ]t<2QK_V)3#c(IM2 y]ΙvzRI~rļn;ܕNN{op׸9.kS8Udz[k u#rh%{ޢJjzcEd.!/oVʳ9][N}Xqc]5G~j⥯opp$J^ԕ^ͅ}\?ri~Ue읉 { i4 jAnmyY(X7HhD5xSM5e%x\iHZ8SIH9 F%HB kQ)smqUQvx}6e#s ,+WC.4Yћv {$\:pXoUD.P+V䪭9mx {es^ۄ}1H; '<>?7u+VPF&Tyjt1}3,VkdX2ȤͶWWD^sxSTNҪls&bY_F icTv#KI|%asUz_Hj&ګ=c <1"0Cdr,G|?=ڋ7t߰ Uo޸MpvX_C˕ ,=3/_sLc܋+)0"8b NO'#'ZN@aP4*1(pz}T^A C\h4p\P|gƅ@%{͖ rAH!v6;j?=VV@A@!%)()t\lt !Lwτjhf4}R|7clVose} N`ԝ9d;b6aB-J#wvNG׌JYA5((7`NUW}t0CܖI^!>=@5FQ )E4]ʍyG3kNNUǔoȵ,C]p*m80=p2Q(y7ܻ][-S؞p}Cljx\r܍+/ (VeJY^Z7i3pΕ8rS3H a{t{@D+F(!V^$&  *Oh'9+!O+B}&"ԑԄtw[ _ťrOтV;kWT6`[Mϓ @BUK@:&.;HOq;`|954jrDzp #SapN,J(!ހ2 b}r1@6H|1V_|q0!"󞛒) 1*+c~ 6Wck.o[$6c{)F&<4Pe`d m6S:ŭr;~a)n#HʞWz AX#1щ%=GUN3),& BB(,l5^ TNRv4!Q"V3K"c1j0KX* {%H>vؿ`# іB[^ےԝO?{&lSKH Wrp= 1֪&5v?mw+RHnC"FE6R+K/Qk /'6WR]U"i*c*M&.)y 9V訸?.%t6}#ȃm2Ćwgp~fp/E^ӞMBt {FMnlVͼv4J@*I )pcÍU6l<߃c~,gK+Ub9-`\7i9*v(K ^/^n]beW-0pxF?\^eT^yѼO!uEcSVHVrWklYˉHY=΢׍OCEςt6Ytq2SiЯcݡd2M}jbm@kA"\`sU|nxԆOeэ~t]Wۜ]hCw>0J{QZRW̾T.Bz?Bn\U7eՓRO38IQ*w/; $56do9ERAP|86dǞC=p43bWҤnam̥OUq8 3=R ۷iG a"?W&w&:G@BGCd'7.Zr~S#12Ua%2-?-`ЂEOb "(0/(+Z.K?W?cv>(>.?p~ = (Q.vAB;]T_)S^} }2=pPuf? ?Ͳ+f䊻o^0fݫ8Bq^ 9CdP9گUC/#54D !i U8 D]mWB) "WY{Cfƥ^B^;rc`-Z r{)b*PkzP}JT9ΊIj5)=(VIRz&ey\`QIL9?mH֝r/\g@WP{q|i3دg8,\u]q{Cs}mKkc@86,1ٻ.}tSMkW+^$-w޾c;F}Z\ nPNvsS >VDȥ@,YnjSK^},O^Y 7MQJ'Ѝ`2B\.Tǫg/Y`|:I5رβ@eW9PagksS[[SK (婈&,./Zv$`ؼ\'S"1 6I=R)l- b v!Mr,ASSeyCo&sܡ<&كab!EIA Ȋeek>]e*4Hڵ bRڽ.-ےZ(`J%8A>9"շrK.;gѪ_`PaK['0O5jn E(|({1OSۮ*GA퐻BuiZѽ{wQi1nJD_"fÅ 5/ x5_hOa :7gφuyj{+*SY%iR}?ŀO5(2^E\[{e7T4݅s 2d;-5kM,g1H"RDʈF_t\S3;[ |m{~\AIe@E*%J,} FA tUS`0%~Snh!,j@* _n\iNl1.z3>>קps/#prjTheԯԥ[-BQ $2(GBjb .v暚zǦ.%@9`v#УX@uQIiY? B!QԸM&t0j9%-LEiQדػT^RܹG)w= )->Xo Tx"@m{kVL 2A&K5YĴ |fċl/z FD^ !o/%Ć?(DQ F_xMپ'Jx6;^+2&::o`H}>_ ]E_r\0!cފ`Ń;B2q*KCM4]O)) b9:)tmVK\W~8kka_arڬW~2sT#h7c6=򙀤zb!zƆ,l͜/UUW6;/1aZmN*3:- 5tLie$@yfK4B I%A4)h*2U a{fVㅦb9fGʸ]]b(ew*G'{ 3Rdn&+.de[ռ*60v5jkr H197G(iD:AZt^38-?r]D^ +c`kC6y. f-CQOkN:sR.1  8f6._P1n86U-xn|״Dnf'R_ْkTx,zkR1>4g Ƨd6@^s)iOV2y۸Ta?_.ɷ>4,wp]mg? I Nh< Or-U@3AKlytYlRPEpd9LVI3-ȃЁ8H`/A0 T F#4ِ̤'sW$}Ꝁ/S%9|䂁_GJlB[x/UJ Nڈk+5.uWU|OU AW<t Z{A'1 Vp AN : /%Uj,TT 33zt/V)[j&> endstream endobj 147 0 obj <> endobj 148 0 obj <>stream HWKo-5 ϯ if+FbѲimcg&s**5v9:|S?8Xxn)@'laY!$ts*IAM,h@m^# Ag"IHcצhS&xOwgQ2{Ҧn&-2C "t7 赁 -Fo8e݉`|<ܿ5!GF&zQd>7_D!\1OÐ/?< 렎}ҙzҿ?c a@$J-_~X&g$9ƯSTΩ2~2G*?_4[}}*!v>rn^ܝW .i.лkm v{C1:Tvp>KF\[rQIE^XR2ڙ49u pȖ١&֨Q Z hXkJ_W }2 l,M'GԽ\$(EsTؼUPE an?+}V 'w9#o)9hcMX:*o,HWt, ׿MfJȽv/9S?t_L*h+r(գ v]PJ|;r"^ZEdg8ZAl^ 9QUE_>v tߥ}m&(,IiZ}+]Ӕ/(~>HK61ϋQRzT~L{%M:;%c\x=nOߖHn_Cc⇧ɘ=UF ӡ{5Sl0j CjC1r- 2r9iNLT D4-5#zzר. ;NGl%rAKyw&iF\l"D-!=4[T己N>*]]qőʮ>wH>߽ һ\p"*Fxc!U]|̾z Ox!` endstream endobj 149 0 obj <>stream HW0 +w&T逆a[lβs/w8de:\M[lUϣ+Zޠ;k ]4/*_*N3 0 Fs X&q'r+AWw>"{s2RsH0WXFιps'VyXP*"ZVEuW !g<50Ҫ2)@fdqm İ )f0k;04pUk S`E2VC\ 7mRyUj1]].iAMŰaY~8T&kYMKxw=#A 80 brN?s7R1瑚J5 Z/.R^8OU(+9Ww;ERӯ)>Z?iDşǡl=Z,7k8 שOͿ+M/ t`bzcBˠm&-u.Cu `Imݭ(3C UTC~пXX)o( ('홧=iDlG8)<\D8 ; yR蘹jT̑8L,I.[ERψ}do.35..;#/=1X#U/8vWׇt5f0.7^&R9)u"~cϹ6n.] QTpTm-|NpdK)ZvS0ڥ|B-2|H{uz7ʙ7DeVHұ jaE_,KHkw(>Н&4`AS8 endstream endobj 150 0 obj <>stream HWn0x >$G*u97"E J]r8;;\iL~ͧϻ-p{ cn?0.3NSi1OMH5p{٦U-ȩM~v&:?7X8gE -2q!"SvzeK[/ ~Ĉ^GŢ#߆pZ $sk ΄!-9 J;o^-4ɛ˜0Gp@z)oO! "ʚ@[-2HŲ3-r}H%`J0j\1)Hr2C).eEຒ.o;?5";/_nNd2C&Z=ܚ]>黏I2Gb#s=mFܢ|Cj+Dc^}xTC߉8 VA:,(\WA?~Za05"wN !5 endstream endobj 151 0 obj <>stream HW=!W8"`i-`waIISS 3̰X^0YsO?~1NOK^Wup~ѓSgUAu^l(ozs$GTє<e$匞8+e[:E癷 SGE埪f)Wm Z-z mꚳ!n-RP/{QlˍEy ܛm렭$hz騦ARoы̿׺p"L~nuA>q6Ne Ő|J73 K '@d$,Z*eC HbH12 dՉnMcuRZ[IWd-B1X4D+n5^0p=af{jt)Ou铞]EFmF3(N F ePdD-Q lvF(lh+,gSʀx}f(2B܏XpF\܂DyQc0$ĽCIU|3J@#!Q07@$  BsXvOg_O:PBformn(bhlDAN >y`Movܿ)c'ܑEd_px0 EW<&UW)Vo7$uh90gFz:Y j@ȯPaEp:7ZY a9 C>x!K"γQsAJAH3WEA &LY҇P>3 ?wo%;hWjYJmG3|8`; endstream endobj 152 0 obj <>stream HWKo0 W+a[56`ι5C;cIlASȏ9~ܹsáx8{z|?=@W'+q.o^,_=kB0j|Z'6(aR^LfA37BS[ٻ$oK,ծeTH^e9]&1V=YRK@)BwWf?nwT=$*9Kv FF恤ɽ(misYIxڤ0unZDyPoΝ4 8nAY+ɿ P-fK%Ȅ.{I jeQϑjwoA1npc#Ŭv7e t;@N>a.{ͤ;mVm86gk"dh=vͱ{)fv yTG:w+ UiwG۠ZŮ1bi÷SſP[2>X+Ja0E!Xk)',f$׹AC&=-; 9Oirc֥Duuk|_F7m5/b{ؿo Q!L-e;niȭlw_ ;w endstream endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <>stream xy|T8~ιw>7/Y2ٲ͒dܐB"ʮ"  }-R(C2, V[_W~,EQۢ|s'Ax߾-|?o9Ϲg9w0BHN.!$B2su Wm+ݰޝkP[KW/>yBZr|{`xgzChr1TV- fn-B:Z.^~=B_j|}jB6t_%ݐW[/OfiKVorL|/GHlj2 2k ?1;)wQv-eiGϣ]X6P+o7ѵh5BQ= MD,F/Dp5v!kMhG= hzc8Q [wP = zm.з;w34 ݄nAwc+| 6+ DW-CY kTtizNgrv@ WHr0J:ԈDGЯpTǑi!:u؂t $@Dsaw>CC,餜Y {!!ҡUh'3VYx#0/fs+rC`t5ӂ&7CG;OOOgsܟ:-Gף-hX wI5c)PnT[6q=A/Jr+O`1gk={pBMn@/#(~>C+N|#&"{QܓH ( NDc@7[pf8oޅ/]mf~b6Ʈ픝wq euaMp :': { b-uxވo[n~dY`1%vV`?a-I3pC|V NAt }ڏ?G_jf% zx3~ǿƟ؈&O53&djY Bw/xj9ŏF#?y/ɚ%ٓ s{s^̝N*[PthZxr݋9x!tSC;}.;ٰWTj7I6~?4>?ÿ_1rRMZD2L#l!ɳ9AT%dBD+1#^s;̗ha}egeAb ߕ+C?\krr\NAtq́]2Urߏ"0^|H)DƏ N.y8 h.C{MMl((AvfW@0hy soro6;#,0%ۛgd>^<P(?ɓh }KRd6a+І@Q/+{Ѓ1G92&DxejM1Df R H|ucde~v2G_"&- #KFE\>V=)`g z7S.d'}u䫷\'%Yv;i@Keq& mEQJwjjSVޯ"]|?Gn8&ArDW?~3Gkl7Egi`%}pßk&AK4]llW_WN&ʊh$ >- j1^j*X`mMXNـ} be npe{}eOz.=|ORO̻Q}isj3xvWiRS+嵐x`նŝ ܭ 7,h]R}KTQtHrio!lmRX[k¦_Kkk;H3օSzZ[Ooi4N#>"uA2iysq_Ct;ãD4}I3 {X%m"Lnhvyh]ŁmS]=zh sX⟰``,}7E6BO_%RK|f wZ[>b1F6yx,rUy 3}n7plcNt' /4o:$ݳ{`n3H0i^0P1HjɥZZrD!59;/RT^HSa(CuTOd>7ɶYk/.f_/]n_~>b-->!\l4rMϝaN Hq7hă߆nDœ$ AS?~4SU KckR1)Dd(5,}֤ cCS?lMVf`U!NYrO! cxVKSt$; moB;=mKh m0mI|;-q_WtFE[[[[ɭ].tk绵-nm7E㤴BJhG;HyejH @B`buRh9r)0 ȎB ,ǨJ_ ~19Ц3ȅKoJ OV°'(hR࣋qieмrrT5irT,ukqtoM/.Bp`0?^! A\%Ds¿W~|Tq--*/IrpN2F6x sjfo0/?UOR`J\*@'6 + ʷ_G˸-n)\ Wŕr^Ù)4 B+XQ );+F4y ,MY)$]H*NStHGMKD:ʩszaw,BW_t2X7 cxtNdpIMsYX'wۋ,74  -$Y0F~l+[QtfrE=frskqr =uZz/uSߒh7-Rynn~ h uwhrH>j_곟]G>eUR\ ]*iCbp+5w}7o7o9oޗo͑%w=Z;R`J¯nȸ~ \ȼ`˫TƣF[}rMZuDڽcyEr]ѦҦ&LtԭmZEm⡺>.5^ҋl״(Xφ ֭[>0 ݑV@-*[7:aHq\+g-EqȆ|I]QdݥzL]Gg`@i&ސPҺG"q[ ?z{t4̕a]~Vz PasT4"%T%Fv\%XxҐ[|Q?Rs5BIeS f\e+fπx2>u&eh#b8!˜YLrp'zd*W_tfo&+lZe؇툼d-{"dˑ):8Ize $oV=+3fHay&i|:0Pvx}^zy'`D2A$AC3Lq!a+.T A{x`H>Ÿ/^/ ax,-R`l|8ra̟ɧ5fy`$\}0>O52=̈́ xZ%[՞EQ Uv#oWx - =wP<:د987ſT2d?|je՚Gvύ׈"jc-2b63~n;hN+ߐ AY2hp'S_t8GG0E #㐜4OzF eQ_oe}OQUY&NJ8yuv/g/ڭibkx֠/}u[{:6|ZRZr2{/eȔ;#N((l+t}`sJQ`;Xz䎨N,1m0Q5!FXbӓJ_)̱&N0` C'60wZ)0R0*EUceH=G\^ No S3z8'֡r ఔ0s=}.* _2r\!U>|j/_(䜅r$L@E1)Sq≫gO/-_qW6E~{9t'x\eefۯZrsozg&S9Ե&Aqaէ, EQol@MfX59~7&J( `3,_T`]JIT gJ!RSĈ F2RP+(w+e~[J H$)8O*@IEk0ٯ<3)㺣RiU x60@e$'i5sDR4IE U(ͬ,, F < zKRAf__o7 cA>/*Ka1hZRDs#AJZ$rO.k"eB_ pr9P࿫G~=?N ѨE^9)pobbKbߏI[.3"{!K~BˉLl?y (wģpbc6T^,atblV%FzRG?#{yXZ@l05 -֖Gn[M;oawd#/>p `!٩2-ȏqxU,k__!DIn-kR===4#U676'8lE-;Cb<>;w&p>+!*$!L {!\a1>w1 "ː#C؄6\C(U൜y qn!N\p,IRi󊞦Fg m^ ]©%sA}!#Gs^ej58L a(jI)PLF KUPDΕI&&!b^"t#q l]vϲOzs}Ѩ?kX?YG'>1羇gm}OԚ{*8c&,zx߱m?z^{ t3;n-'t+t--'OA&J.,.Eqnm]J<{0-AcUUGGY{ϵ qL32v\.*c{׆=~#SgCJ^{/jk`ف UmJ“w;G);?QWPi՘mv% Orמ hboeU`EhO0`hH `h-%局V@ybqAIJ9`2o@Tg2^m ̼v@2nF,as,>fJLϟ@f\afk;i~<y+" XY"Q$c`w'}ZDbUfJ{5OT045H %h-`~6"Ac|zbB=9|1|^#cSֈ>2{A d@o `!5G [ڮ=Q2s}JrӋ *'? TX90̉$E$߅ΫFh%M"Ln_quKu'-xf9Z%QEsl˯*voܴb^b8imaඖ){TWQޓBVTe"?lj*),B6@YJP(vG@fCV kM=C(&hu&V)v<%,=(VNoWzajdH +ZzI $@JR?3-#~UWephadĹᑾGcnW/XdTa 5._Q_PMG%* y͑)[d=[K͑=/7\<{\Z7ZǗ[q쉹p/wom~)x1t+$ ku6]ѮlSQgg>cdq  2]T(eNPh)*T Zg8j_ZY0JȢNmԉ0WǼHߩQG/`E1`1EJQc(&2-]Q1 9 Z?j8fYGOCۍ0Fmwn}dKzak|srxSӻnIǙUguO^4.(U?N h68/GdS553<Ĵ0Ԭ2Wtl7u5j!q+]/H2^F1Apm](TW[ɨ՛S- 6ഴ,P]](\]7n&-@GwQ15/G3$א\"龯Ẻ0HnltY va4ug=@kN/nAܨ7:jNƲc-%C_CIxqM)U2ͭW?cr5MMw0;;w4?<{~j{~_ӭGjm_[zE 3 LH+$uSՆڛ[nh{:%bdbUeow# iݝH[&DeAAS%u8.*LPVk056&w;6@*4sC]G;Pl7+@?$ B P$kqm0N%DgabU*Ëu'F/N{=/%KJ@ |14m͟N|)eu닕rʞy[f|9a}|`ևZx}m\P)q{RcSMٛt*m3U*Vipt-<'w鰕І/FŧGyNNޝ׌Q|bT5*-Il7M9ބo.zD@= llldppWre͕fHDBJV¾(F{|Lq#Th43EJtfȃ7J+*1x4(Z P}5Ny[%*)40a>(5Nq>wB?':]GYFoL3~k?i/y+vύ5d敚d][z[’IO }+ vJakz|~qvN;3j3wJJ}aVK!kX-V^ H=ыb(%SAà|~nۃ'm*c}>K10ȩ4b5dbVM) .pv5X($BHAt%U =dUgޛ;?L14 @ya00C{ yv72y?xiBߢ_mse'1?,P w3='5/jNie)s`n ϐ/mmrW 5{:%"b2!Za1Lf_3uAoF s#tȧbF:|\0tY|ʃ fwTn5wq':#>_Fk%K4BYԁ?=4sԠ>#yX$2SnTÐ'?n+F+Fo+IU_Ikno>uV[Ne6k* $V.^g̎KYlRNZ¬69]\ɈqR\4uƗR #HJCb؅g0TB}g;:r%z UNLLn")b-Xj1Iq W(ET%> endobj 159 0 obj <> endobj 160 0 obj <>stream xX tEUΣ$4!lIGL$HvAD$:8::8I8(=̰s]T|.8w@`<dzgٺ]{oU}DC?0hYؚ_zJM⪎50+;6GD1QXٳj͗Gc8U7 y@Qw姗wl@Igv<5^/u05=OP SaaY7̧p}φ[b_>zqWs:BOAohBB2cgr8@,$@CoBxM;0A=t j6x*Sh OXHPIց $`>4;`. \35"a~7</oõD&gB:h9l8GNx#{ɟ硱k?SYP ڑ~?~Oo=2 8e4QU> Gp8{Z\M3c(%H۩JkhG0. 2Ao [`7܎)!u9"7':cDgO.u$LRRE|A~L#=bX,a^c[+E\7f%$y$Zˡ6M}7 " !z40ү]c>#HTTE\dYB%Fr/y e'rRZAttjt',+md?dK{[aV 7 w pJ ZD#ಐ=TjB1C&+sz#!v;qEGY!җо7m\߻Db!El%d܏81qr W^En{ G!&%R\Ȗea?eC,ٯ*T -a0$<"~#N8&U&ϋKRT"JYRO o`Dv#'L`5zldAX _ 3[,ejo;YI?t[kI+k!* __#l|EC7 '$Z^8z,Giph=,ZXTb>i*Ogyb8Ƅ1y!n>7C5}H:K1G@!J?uqKBO/po+8@߁%5:0\h4V#=+UeK rsY2<=#=͔0->ePdI%6Tu޼\[(_$i*.>ziO\yYOWBObTQVU{ުՋ<ؾU ݤD#c;^ՈOuk ܾz|߰!ZÑl%[{Ir54]9LAYi&k[K)hwj-<4śk9ZCu0T0jأ0Bi/hc9pz-'Rfu]k؀;eف]"Z /^|>Km 6DUNG#;qH*.K|שZu{:4>ˈ::&:Z4_>FS]j꥚ܜac\ةFTō :w%|FڡL+z3fb5&MswWj$[]a}cq=¶./ji<,Nhӵ/t'Jlt z.!jf H;>O׏MMSt\W]_2촱ꁁȋuAS j, ?0^zt8~YE`|pak"DHvju$ _ F/yIGyW9#YXt7 3L'n2*>E"7!e>e^nͺ%AR$>Nqȇ.IH( î yyyhTZ%uCKyTʓM)'(QQHEQ$EPJB t%HF^I/mGBMcuVh ȡZQ[y T<⢝i<BB;oO^Ҩw@cnH$S!Z|#4IM5)5q PJ)qqjl;fr#?Q|̥(ҥC\:KS2{[=S^7B^2Z;clNUu56Dn^1kW֫õ[AkðuպzAh&ك wB6i7H;e6yFf> qjGtnC[< QjDS,9IƞjnU[Ҟ< WQU\U18JʒyrJeDqu8nt\6)"32ʑC =Q,}SPW8ΒhYf[Ȼ䝠=h% F arEA#&RO?"tc8/ y>QF$Bi [$`a>^D< T0pbUأ)(T2I<=A++*v)yfSġsaKf=Lk4L55S'p8߸ 2eWCD8\\1Gv#)u}.-;%=nKϴAv 62+ap8nmH1ҲbIΰgJ2⢤dnΐKY)[te bV\Q–]5yS{7|)O5M`c4 =4 b?tyG{Z:6;ޔ+ˌ>9 ]卼ef.&jQAq8*"*Ɇg}XY 1tM&pK !G4'j&1ea•S\n[fKFUYSd#fHq,3T@ѩmosśi]ٔ~%dkiY츒RD61A0a .A]9k!K2k_=ѣK#u;+-vYh.hغוݼV˂Oh}/6&o~zcL8mi[k.Gc]lY*2&a s~vEKڭܚt$#^Ҳt0cG;iq5M $^{&+O\pa^+H(r"{_~^'[]Ʊ@|M+{0CuZTFYJKW_1iS~iL&)r;%Y%*vsӮrv/(,izf ;P2x{$=vQͰ+&I &xR$QF e`H$ Z52JK)*REQ ЊQwυ ƍc,.o>'"\c#qr:!&!p=[˱1ͣxڒ~'mi#ȁg r~Iw*.$5޵e꣇_'#]$ol= f:]x#A4@[]Z[P> MKR.eO%:N}={bawyf 0/)LS?LaX;ܵ/c<:PGPZD1 k8 30k endstream endobj 161 0 obj <> endobj 162 0 obj <>stream x]M!F4ڣn\8Ĺ?a!M{,Ƀ9Y?uWeL9TzLK$RdH~~[;1/> u}Oz6HC((OgRcG64lͪ[ruĎ2 ;v8=6@D\};IJyn[_n2}Q o#c endstream endobj 163 0 obj <> endobj 164 0 obj <>stream xTMLQ}@D`e+R!)bJ ٽZh DM/&jɣ .L у9xbYm5&r1f޼yog, 9=> [(Ffѥ ϪDhx0H~̋򇉩 ,dŒ?{sw'P XoQߛLggJQ3'6g2HUQ=m%nOf\Y/ϜMd> h^8pFkv( P n}A5ѓm^URaB"V  6Gtx^I3nIbĉDhW-S(cfJ& H<$ 0Y0)"`/$UD +VP4MVV4@/V>)Rҙ+̬6֘^bľea 3 ;+(*_LQ~$̴_ NXAy-c8 ~Qnk4OB}節m0i$ 7}/0*iŏ`WWPxpnkȯI2CдIyWI !G.?i  tttYrԍBU" RU(7-ZG>.gws||xU}u}/  endstream endobj 165 0 obj <> endobj 166 0 obj <>stream HVI1I*K稣LNj ߷*{GyYr:U~Jm}t|Ty W:7?lf8=kKQ"2kVT}LAFy͂Ԇ+[e ͌^"mQ(p%A;5,}XsBtq9Ni*EqT+E&me-Gϻ"tb^D[!0}}ӕ37zTz |4RwhYl5P!ed)p])$+n7*ψU]W-yT>+4^Nm:=6n(@Nw~c+/O 65}6i#:hdFLޱ*ym (ft$s)C`HaؾO佢bolNc^ w[!ɽ?JZANNRUiX&V)px뎶# ;uƚfבe) %G`%k$b#'J*3cUKbiau姭C扞%Jj-@wfpY3KZUP-z Lg)Xk%`oVz';%08''ov3e:`hhC[pK bט}тg m`1TC6{ҡ,wvx-tߍJ˫t ۾5~~{\_? ,i endstream endobj 167 0 obj <>stream HVM7e: YUC&a|b%o&ҷ'k0 ֔zUj!4 ^nˋm*@A*V1-AkZ!DVJID1F PUamYUs1FFfn)- 9)ɏ>?{Z^kqww/+| F@H(CQښAWwZvM0~f(ZЖF y4;j2 ?Wf[d6ڦ6@-kMMb9ގg5Ou{s7u =&^txfq|RSJ>stream HlSn! +xkRҤ" [!1kB|]]<@*B}ʣG[vHRm1 *JPm-R1Xl%-;F'&[;0QXLn N`4tGA+`>XA2P0W Tf`&\ԣW/@+YXGLÎH"eOaIvWj g_;RQBylO)vX(k7|9ūzv՗[^` endstream endobj 169 0 obj <>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 170 0 obj <> endobj 1 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]/XObject<>>>/Rotate 0/Type/Page>> endobj 2 0 obj <>stream HWA8w@SElɖ-3蘉JE3a \+pW \/rɒKvf-:e˫B<'?߻b+D)EVvoKњlZ#vEٽ.?/q+77K?؟?zs^_?sss7Rmԏ^{7Ei Y'VK@#4#Vyx3VB[ㄲ*E*y$#;lٱkZUÆCRwsJ1Ӆa#܃6zm q^ʼbivY蟶fc~z:uاUQיi㫛GYa1˞7Y+UGy <܍ڵnmrUq puw¶,qNRhUNnXK Y)d7~qjq0fde-u^hYUXtb”UY #/4JvgE+^b;_!]qus&j{<Ŀ"+SUqTUǎH$d O!e 5pjڮЏB?j D`G:!!!a_~}>|˗߯R>1H0O{g#|zx.!öȅlZy xd5?~plHH9 2sX 183$MH]x7нY,iN3lG>@HCZj\x HF i'yה-!鑰X3qআЮj![}S\Ks0% BG`{GC:_*x(kfL @q:H !!A%E%$NYGuYa>6GHBVL촚JEb1!DyA~Gbޔvm(y4n146:5=cДgXmo߂jY^$EU[)!Bx#ܝ$$$1C!;Ty`GTivF퇔)C͍!A5cڪ#e^ٓjT^MF ]yiQ]GVD0Na57~C|FY6O6B՛ɦ'(Ov)̝ȅ98L8jVR*4MبiQHNXQ*Sii&9̈́.4:ǧ:z~݃v6"ȐmrD͙3:^_wmЯaA ! n0Ćgթ MDvMvw10S֍zoA-YzաDf&"$v DdSr:+o :\7z}BB)A5FHF'$r&R΃9DdQ/BM(D"& !a$$d>.8 űlg̋+I)Nc&B_q xH39ː#ƅ UdHC%90)}՘^׮*y~GݫBҪI>!!H~[ݣnb<^uO`rQ^uO+SM8|^uOu@y BI:NI'$ѫ亓ƓBE4U+t]V4׭Vr큒8֨=&قSb"8;;$Y'mT %"6HyBא p<Ն1`F: oȊQRbt4)OPIzݙ3b^*vW stHMX G5'xB͆hqxH;E=^+ z[p UߴbU_J}BBIA5Ƒb+֖r>9+(W)t&Q7B|)x=@d==%f}hx*Ő)A#U*]̹Ka27(Tمꅔ"|W1jSM^սUFcN=vvg`CпTzV#$XC]CSؑ1=Ay1{$~KHHF5_ ۶aji˞7' ) ~R6E-a>yS iA( Dڐ -SH1/!(4z4չS Y.|Y;H(2NeP~:*1{?3l @fosdh3X3GևɸI1 $: xb PB7HO 2?x)pRO]z'e1LH 5!= jؐp^(x=8xc@=HfԦ25(3P aR,OU']cM̴PT:TpvqiםkV#3qg=s -b=AT'ХxnbOP5 bS'P̥AM$ 6{ KH"=ld{[V-0" $$$?1!*{q&ǀ*7މMꢬ!bCfv^P)ET3Zi-p ,͎Pvq'";wJބ^@꽀J^cYK^@zA1V'OpJ$O P|6' jH J0PNjY#7wc ?7>+Kjz(Ci/d*+3߾~zQ W:>oo9G;kBׯW,? uQ]n|ցuHYhks*|>ύ;/;^vѝ`/;޸ /?w|=@ZOoa爐fJ"DZJIG/^#yݞ/@`Uκsr-(qK7~{DwB|/?VJ;9[{+ o^;ͱw y?9+e|>Ɲ%ݷwOuW?^s5ҁ^ߣjObv ܫBu!hm}W^v$ߋZaB S!,ؑPП^yqVg-qbc7|xl1rbPZLdލf1Hoo ~Vf>T NL'˒n^ŖՕ(֕/wGv+]!eW]%|dWԕ6+ԕ ;)[֕]`+<+k OW%Q]92UW~)}+}|Vҳ_|: -Mnmt˛Xemc(ЌI,K3Vn5)sm7_7yK%)s̈́r\>4[dn9`ߒ\F7 A MIh7o̅խX,y'VB#)br2]MN߼9lВ4 ,NbAb DHʅ.4#eBb/77!e._&$oBJMIR'XMT[@FIo>I,oS9E_7I\1o\6Xf'!P.뤛\f 2%m-I0oN\Yʵ7'%XdIӽ7OҼ-lPM߂r[o9\\[˛%Ir[NRmߒsbޒo F\ b Òh@oH+oђVʅE& [tDZǼuN*4[wRmߢsKd^h\o1X,0Ko18%Mr2Wa䔹69Ktd&`pr $B9K7U mr5y'\p=N~n+ UXp"o yDp: 7ߦ؝+zgfٷ7Mn9ҔT\(m Jk,Fl /gVptSH6k $l֞2Wp,s\g,8U*NU\I"6 TqN+vKe:b1O Hu:\*Ipe'^*;ɲW2D,{5U.SAa٫MH&\N۷)JFeGse8k=$a2@1XS`Jg#o7Pen*eh[ľ Fc#xyc+l\1 AЖA1ق3uzg8U` ]=`"/cp%,wcktP' 7Nn*HT1@审> SMt@pXdp0EU]@ܻp5TQfU$OTV0w]d.b4Ҙ@\SRA1Xխ]r5'OiX$)tU KL5.ٌa 4eMyB)Ike3IGrׂsU2V+8P%NsM)$s-\M0%Gä`TpɂS6'4H*-.!& v -&w/8 Ɣh 7 l>-Yhj7z WkN46X,AduRkHDmbtemPu'jS%$iQ4oڄŒ@m2Ih%,4Ԧ\JU 9 VUۉ%f@RXRt2R;iAmNJx6ڂŒC JK Wm,x$h'8EB#^ )DwdCm-fCi؇6OyMf$H,](sOT gȕIbcu+Ϥa&:)Z ThaY";S`5?WKo W p7} H@I7A\@Hjy'v|GgFG½n (P+d⽠R/>M],^KXw1nߝFHGudcnW!` x;!P0ps}%CuՀ.Q) p4^ ('uNbՀhn@u%Kuj@R0HQ'lBrOfJN@^Ȟ1z(Bo~+fQ^2>L, '@2cx Zy)-=|[ &&`@U_m4lUl-G;= ]@<(_fy,gElUT̚і;1oI,s"9WG9Ĭ!5fSfCWdhUFUdJ+q%sꮕwcXs6lL7UTg]%8XnDQ(86Y@fD`IO ?G>s*d_c!h )4DISgPy3cU wp Mh4M0S5=kyezgXx B,PwY:+*R+e+g(N8p`1\3 BI Ts:EoDgoDUD&E=Gd!)"uE1tȴCd!^@dǙ+" xEwEI4EK` XT…EYX a17,*{,"k>"(Ec(GR4 A8DG!ڶtm; pv$4'JuI 6 &@0<ӰA þ V!hJ`8n0I:bAL AAОCЈiA>qt@,. '\7\XNeÅڗӋ\v\Z=8ɿȅA&F}>Ǎt3:*07[1iQ9jvqƲ|΍aˍeLFeϐ/s۪oU[pU]~%)QKXG63b8bw6zAa84lX1͎AY/=ccP@`T*tm,It:u8vmo+c">tr[eڏV^ѧ!Q י؇O6S׿>s;3u+^Y2F#;QcK(j<>GANș%}ƦJO,yK' ŗݝq֖mV^鋳ț7dY,!'A-']J⼧_J\hK5=e]?պUOKWKߗOMVTcV^V~jkhu&o%%"P8RH]5 {BGcڝSbI*,լJ&|'zcz^B Opxw^sRDAC\˟|aaM}8s t$]gRc #0;;,i3)\e]TlpWƢ&R!>H׹~lc`D)N-t+[3V(!^ l,8]yhV!a!̽H|ژ(&fU}KSUM*NV1z^Y2Ho r.gou$klu<=f͋s.&lj$fB`~ƅj'DG!ҥ좹+65hrJ:|&ۆkj hKVĺ+z faN0 Bf0/Ll2gd8u~,&d^ @iڻZ\ ft{dkx-жC +N-(ybaVV0gMeǎ8= -g𔫕۰|T ŸIŋ-ž"W5.ZӞVrEt6|uUN4y‡?PT EY?@"q;obF_UK^4*"8_tH:@\Z.Gϯ8~b;9c E2C?aMթQd:b(U?2xI%sd=e"1}th)R XYnIoƜ­}kS͸j /`kJW^P)OQ)6"Sn>y첶A^) |t)߶cŮ{p=`Fk6<~'<7F9xJ^>wZJ_ U e<֢ϓ>`h5TOw0SUEΠ+ 3y>ESMO{Ghi`7h(h<:b||Ü44)L 8{"ȝ I˽D;F ;kܹ/VfKl[mLC(dZlQQd?憰겗6˒ ڮ3nFHms_t^ @%3 >P{ð x.<ѫk׷lV ny`E~KJEWd΄YOܷ9Z>t&JlXmԫHrt)9rs1X<~p>w;jGr=H tEW 7q ǩg[9#\0pأ{;W/ VTI\K9Yw ]D޻b*0c#t\L~Mon{ vCQ-\/,17SLٚM2D:vesPb&V[?ec7nE;x@Ѣ(ga 4F2 Po[ڂ-x C](Rz?l4@?QW%y!l {0#;9Os e-Tcg16|j\MފcYrCqby`-IYs9R%r4&yCȚ#ֺӟ vDo{qew"4hdktGfT|hN)9 <]0zfA27cOڭ0ɝ?>H6LxcA/=F jH!\6I鮷wkUz) ۓzx}ֺ}+z1 z>x>gx&=ܶc7dž+|brF+2h5q봅 >6pKc8hDkX?n֛3Yi]*֥]"\xu [臐NVB''=;.zʰv9jWtvmpRHGP0*|}b㱄G/9kuv:En4V~o6AxF`awmix[/sO".[@"o`<2i6=PgP?*w e*C4ֹ]s8n=K[dޝ~Ɓ s&4rn6w:j{{*ٶ3$ `ɧo-3cKfq&*nnYAoٺݛ]8HQdh{>o-eߝeN@G4tcg/^5ܾؿz]˄Pݛ7Z]A6}bZ) Z0WߛFk{E{vӪ}jv/knzr} 8{/ao{y=VUU}ׯ4ݻw>}z Ġ? h#yxx^ z3 p_GSP(dlE˽ c8u*3M!)EPP<(TʅҨJ?acVU}Mrqh3wrӎAmB s=h3 >/K\/o+hTUU Q/4`V=T!hι ) aKQ!h* ~L24|\ qNەOؕ( U߸JAAChAch;\4ZřI0h2АH( hGUUBi~Ʌ,&r/bdoDr^",0oZ ??E X6r߈Hwi4/ʒPPQu˘xJIEc'C- ViTgDPҭQU8:xuch;\8: pa[qCr 0qK"Eōay$nSA"x) (A‚E7HB-EKAQU7d/=n(z7>W ){Ӹ7!vjWਪzC4#CC"l Lьh sh{&OiniΡG9KE!\iļ0H1Z(mf,c` Gs܀O)RM q.bϱ"Ab13˘*ԪoG{(ch;\8LIL8ް!I&Z/ :zA}[j>VlPz&H[=#AL"L"`@>oiY/(ni:)xzEv9gB="d-a2Q Ehp> }PspqL`Bq] :irT0AL` lPUUU` 6 'g3K%Ā_i 0 Ŗc$:@aZ|fq0H rq+TUh)/ Rl :oHUUUs'g៰&vFf{q ?$IvQ2ưJ #1BX-}3p[1dǵkkp?B1 bWs>!44 3BNaҰ,97H ȁ'kx^zw}lq2tyd:dXMJtZZgǞȃkr;m3ydgS8h퐊3ˁlݐB]d<$xz:6>1\< gx,xY(/ 甤aIk=LkLZ81;|ӁSиv5kk:sDȱ+>(jk:a~d$0ǧrV#PΓOk:u(QOz9>kLJy >bMa:p~9(o'h^kkZ?I,pA*lj1ĪlDEratI3C^t_;AU:e4`/ k^&G N戝Vt,^J9 Y3O 0Fx αޗsp9/xkw:L^I6Oܿ0rߝZ7rn&=M*CO $2Cڤ&$FɨpM6 mSJ|8%)9mB^{IOZ=S$';q J_mr zh 귲~])rGx9g0x9i/+8=97^Ak‰)lp1ZɸyJcRɺ3k4Xo䷫X=oU[X=۷Gz,Ū!ŗ##\=5\/NKcU3qEsuT\g4Vu~<1VLTP eM6%\@ @ѝo-;\;]-*sԂ8Dh>Y%mj_"MZIѤfh?u&B=ok]u|{ JlrEys|*_\+p"-9K >Jj{JEq!T\M8+a%<\׷%\H: ?}WK0Ŭ8N9ЗB Ȝf^@q!0]+ȅ `Rqn5uAh %$S> t)* E\=RH lB@vUL4I77QbnGQOVГT>l#C &X!g /xaϘ~bOb1TqwD/Or6TS/Pos8ΜVMPo=Ņ g A%;-+=t,\ H#(.|w-#g?܁~btS?J J 1Uw~-Rޯ&M#eaw9ǻꨫfx!˩cYt9:\Rт^m ў^$ZCO%+R ܤ7KR!5Ѻ(F|%+ e{J;/K~@)ԓ&nOʊ]NS@0uJRPU5хe8]1ϏyO)GũtRV'}-qj~zN8]0%NrSs?Nkl"Uzh͊7{f,_wMXSa/6h`HRo>̳@\!n qAS݂=}Wg7=w-[Ft#\1wwfG}e؃F8i6CxNvm \#l!\/wnSl2knz1 P{2ss׍ϛDqc?j!1ZJ'&_YgXoBhXFivGwB>(4ty]i{+m~Kj lrΧ$Z$,#5J$d'. Q٬tvi J+8h+} (Xi%*V@>t5]J*Xk OƝVi`M}ͺ3* !''v*VςuKzfXXs8khK$Yǒ"As+ `-BZk` s |[\TܔE,KPMM}@{ *2B5 ee򛶼y8JB)u?0&o>Rx|On7kgzG6`%sf%#JI߳-J~^)Nm[֧E]eu7?<77ݶHknߠס6~Cqx/@R/\K8^y߼+..ww4ޗM]NĥaZYlǂɩdyGxFe5?odvWGȓJڰL{In>:k-dt2Z7 5<2Ԓ dn" n֗(SeN(-Mt{~W:N..xr͛y4 endstream endobj 3 0 obj <> endobj 4 0 obj [/ICCBased 169 0 R] endobj 5 0 obj <>stream H ك FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa  ,@Ze endstream endobj 6 0 obj [/ICCBased 169 0 R] endobj 7 0 obj <>stream HQ gjZZP Xd'8H翻((q˲<.Xs>c4cdKyQ"^C>ɞyɶmH * t( VAu-(ї0T& 5 kU@9Xk<3ݭD6'z8j;)He H$IP' 7!@80v~RQEK pU endstream endobj 8 0 obj [/ICCBased 169 0 R] endobj 9 0 obj <>stream HA Ec ,DK,` h@g S.,;cV!Bvk8b}iwA ~{M@i0\RJT/FWc+O|ڷЛ@1q"}pbK<-O`i9gi Wr5B!` endstream endobj 10 0 obj [/ICCBased 169 0 R] endobj 11 0 obj <>stream H] ,B-B-` P ,`7mz䮗\mR <B!ֺ{c#-]Lށxz6]@DvgeY`I)[J !xW͍1<-@,Wm@ vdE5VnDafZ4 |DH;[s sl#F4lyVݜmD!'s endstream endobj 12 0 obj [/ICCBased 169 0 R] endobj 13 0 obj <>stream Hė01 `ThSRc)X P6 #>=+ b;g{y^UU~uw.hh ( iazT}vƷϧ!ImVu-R*A@5t:i)c0 y{o+eI?WP2{_g لU MQ|dYf]G 9t(uFf@C}OC=qgނ6N40{ [`#9Z#BԸ`I||xlNbmۚM܅mF+8_HW2T{->LO3zZw{[KxwdwVuMq`w{& endstream endobj 14 0 obj [/ICCBased 169 0 R] endobj 15 0 obj <>stream H̗0 n ѦL.5} @HLed?) 7o5u|>H|>ʅj~Ÿ^F1 AaI8NDh1vv2wB!V!d`v 2.ij}wi1JΉYQZt1,K<\.vv}9=wwfEIbUU%/G4Ft(=1غI?іe`޴{*8 TY0 5̨P۶@]M^7#5tvdN B1[}Z1>+BߡJmM>!'|GQDjI)j}3P# 0ZR endstream endobj 16 0 obj [/ICCBased 169 0 R] endobj 17 0 obj <>stream H̗=0 i詨%%m:T4 q' GVYWX^dLnKQ^Ll[y@#Ϟkvk(Ņ~^={$8I wD-O^2(  a`4rȱ ?֚7;K>lQ% gH0 ֠\"QF4M5.8c U(+!@^ܦ̯ptf? 0ȋEt? <-N0L*29| p`8Y endstream endobj 18 0 obj [/ICCBased 169 0 R] endobj 19 0 obj <>stream H̗@ )r䄄 IɈ-rJp?$I N'fvv Úhx<eu*/> C4Ap'%;}۶Wq0vlWl}®5OOE.! endstream endobj 20 0 obj [/ICCBased 169 0 R] endobj 21 0 obj <>stream H̗@E$ 'D:%#&"'q4DߓGB Ȃ~2};wk}yriv)81`f<{PEV'q+2 iY8.ME%ΐ3" Cˀp. g>հa(~$y>#eY.,Ӂ+Vdک]ٶ.aܦiS7,x,ǰk @Vza9 0VU5(1٠y ɾ LTda@Rg>ّ3NdGٵlyXi}d !\Nq48հYbE)[&EH"}lYpҫI{>w>0/C%?XQ#J{"$ nlۖno>stream H엱0E$ r"b2RBBR2J =H;M߳öYiRm~@(q!EQ<80@"y^eD*@ A| &ddk.P$,`lp1aY<+ʲ4Cu]s.?2\0 Ä ɼ֓sAuJ.QQmP{`26v endstream endobj 24 0 obj [/ICCBased 169 0 R] endobj 25 0 obj <>stream HA Ek k X@ ` Bi[va\C8pu@;p%_# B`f endstream endobj 26 0 obj [/ICCBased 169 0 R] endobj 27 0 obj <>stream H] ,B-`jj,`7mzOdR <BHj˲.irb>stream HA 0Dj Xj X/aI˱{whLi18cM<>MSͶm̑feYbu-:H8>HP慇HH[RRrβ\5U@';7&sbEA h|@P4OEU VH:PS 2S|a5} '"w0c1cbw endstream endobj 30 0 obj [/ICCBased 169 0 R] endobj 31 0 obj <>stream H̗@ o "@ I*j:ZJJZ E@b `{ʉG z$_ gk7t a{:m{pRd5B@=hXWlDY "CuI  i{EIB]׊ ?NO]\ϲU7UU~n*ʃ ޣ(2ŝ1N' V1aCz<!$I {Tu<<5]ɛn8E ^3#&|a}7Hq"N&r >B2r#462~s-`2Q`BV8QũuOOtnIQ>[Os߾{۶*I* 6 endstream endobj 32 0 obj [/ICCBased 169 0 R] endobj 33 0 obj <>stream H엱@E @BȜ:$$%#&"'@r;KvJb03<L5x?z>0x1qAoN'EٴhEu]b@cy2HEt=4UOEB+A. ͩ ;6 5M$IdeYurv=WWV;ʲTU-0ɉ{7D'Ⱥܗ^=$ O<{Qn*P9WA7 EQ, !r ð `6e{1I Z{mRe CH71›֌7ڹ3o$R7X"mV2:>B0ԿГP>aW~b.&AvI`\ҵ%{i@f?Wر`7( endstream endobj 34 0 obj [/ICCBased 169 0 R] endobj 35 0 obj <>stream H=@فq$nSQZZYSӸ 7` ;%OOs_NApo=sg躗x<. y['za-l6NqAv bCD.~Ȳ l>e(vk@(p-t[ J3–zE:FKwһ+Im՞)-x3@X״u=Wi>vUUztR 1Q4Ӎ j=//JO*@RX+SFoEQ47 I}.˕30~(AB1̠\fg /i}<3,1}L4$p4FCXpHQj[1M-xͦi}iu2ir1 loU|!V|ӷ &d9:@]2\3̂ h890 &%P endstream endobj 36 0 obj [/ICCBased 169 0 R] endobj 37 0 obj <>stream H엻@kHȉ)CR2bG$\ӎCx.?s;΋e|iy^UUv꺆!sE~:`#p h-\S EQhD à@t; J@|P@zڶUDl\(<$I,!Ox.X{8am,Ko&l @32o4yǗ rj%`Ŀ,.va z\<"q*v g:&̤\0VYu=Ɵk @n޹BoddDwg_ßWᡒ x1P?b#-bzn4~ZC#NURS9α-%6 endstream endobj 38 0 obj [/ICCBased 169 0 R] endobj 39 0 obj <>stream H엽@FQ% p$:s9-$*@t%pO; a8 n ye6Pq;}0u]a1zŐx<p8P2 Nb|ImA8k "Y`P4M e 1t0$"n]%I((h@~{40 endstream endobj 40 0 obj [/ICCBased 169 0 R] endobj 41 0 obj <>stream H䗱m01 `4Ttt @b0)!=\ҳ?χ5MۦeYlYa\׍X 8N]׊ @V(2oRN!MS A`?Ei( %Vm[E0sE,uU0seΧ0]UU <"}q*Ze̗( $I% 84 Hk}~|r_@`=Y#+R 'r<% XX|sŀC!b}/]VMϏ.(kKV<x䖤Nhe0#a%΢̚s#Pq_ˈbK 8rǔzNaqu 6 endstream endobj 42 0 obj [/ICCBased 169 0 R] endobj 43 0 obj <>stream H엽n]BH|(((P2;hN*/ o^;/fzwf<9ׯĎJ3A1#)i=f &/qۊU[wyǤ.NNGdJ^R1 9#VfC4ҊL[_ŌZŊmBNi:dYI$<2sY%V®\,9k ~ E^?H)У?(m;k _5(4̐i5Ŏdv撉,VR̻ 䊃r;?3Y%VR@13!PF#/QseO;fɶe%8J(,|L%AM&*I,-zǺ\P3[w0Hq8ZO^pR@%F譩d~UTDTrei h}J(W%MPIbϮ@"yO,RHb(qtr(ld6iB}y: eEJWIɼ>y3'ĢDAF$Uh+R $1Κ]]ʳXVAȶGduFBTMDKJ-&j8@%+ՋUMH-7s^t8<V+\}`?k "]*)Yr!mJWFQ^$IK%[:vv|>sn7y+ɪ*YLǾ9|!6FZ%DuL) $bLMd9$MDinK&SUb%TrYшGetz^Eoa>634WRn:ъE3,ꖠkz'_WCk@,dp%|eέ'oKQ] ITYBTEJ8FQWaNs`0;o$Qxɜ[5!=TGu)*UMOGvBޠmB0/!F(+]"/ZVGB A%Q"V\OwP[ظ+ n'м.o{[^ܞt !fAȷ!@력ZYBkb'$oC*4~[}by!/} Ÿ OԐ,pA ;բyC,@R~nws l1{*1pz|qd?JÍy!6G;,."( " ]XukO\T$%|6gDĪAsi\.JCz\:5! "r6`ߚB @ KXVf *o.Cq-:kYKbum>8kڷ]B!B!b KBt:Z={VIB!D <|pA%Z%BTR!-ϟ/_MyuǓ+K9<<Ɍ{.tt4 lׯ;;;~ooOfn}}BQ߿@7gTr('Oث>~Ǐgϲӎ~Bϟ#a_|FI3r+}!(]޹sǺBtL'W* ߿go'Blu|ggYDp8|H_.BqGohA%7ojs +DFӗK%Bt~޽=zȔqF%RU^Z.dQLYWQ0zI yH۶٬íѕ,hR>X¨J(= =Tbb^S.7Stj`X(ʊ6f[QnXQ(gRʥL ;( [A.pJ Wu%.BdppR:n{U[F\%ơYWgޫR g?jҝ * oq"}3})t/)KQqHVX˹R{5w+w)&)JPg@w&bdNQ+bL*ye1P h#>S<"OۙRH,efx^ҕK(UCm^dFr9'#ب @CPGsJMnE4("6ÌV^Y󃕼)ʊuUUU$(a?5<W d-2BvqD\4|DY5^h-2aTmN&ȮlA_UbK,oʺ_z4M/deR5Gߥ*ڠFYwZNv-K5,\%IEw^u("]%@֪4$vKnq#ZmO|  (yei h.a짚(% {;v ؋Ţؽ([mfp Q6y8å=םO3R{/S&Yk8y_ C8X}U$phX ^3m<8yGzenmzE^L{/l6 iZ j&xi֔/B`u>GbQu*yʭp#%ρ)+"UfԫvֹJ{rJ^|&ԫxm۪R:n^;*eqJG{W1OǤ;HѨzn\*XWCu6n6 y'N(yep(ʰC ?~<==M}o{~>߿+ϟ# xtu} ׯ_^R&I=]ٽ8#lKiMl-?ses<$Dd#.uL(2RaUZzM{ÍOί_F]UoQt[?Y+ԱWۭbua"꯻@B|#c Y¨BCU4T1 .\T4\[?GкIۡҫzNmZ6e}Pmn3͇.Fpc/ODзQfx90YY89@庡e@d'(qeWCU9wI;*<ٝK~JϧK$^v[w7Lӭ vo8t|;ՍY8t|.:=e0%G;Nry".w/)fOtɻ0`TIkTOPMb %%m9`蒣W'"AB|HaPot|> =N%#V^__?౻EJ.ev+|tɑ %m"KzzK>W U 28mJMZqKFѶWPM5J K6)ut0{]׾ ;9ZMxݨq]r$7D4HznZ GVOX¨lZvYq9FJ{u.v֏,ۛ^нzҷl{v ]^,l.z%;\w0V:GÕoJ#gQV(r[(/G^K ñ`OG]q^tZ_y"Km[u"` endstream endobj 44 0 obj [/ICCBased 169 0 R] endobj 45 0 obj <>stream HQ 0D,,` X&+vq884MMTo۶}˨0 0PFڶ5rx~db33-z]bJ $UaXdaYB8㐏f$/0Uӥ|8͘T|s̶@qH>YQPG1[`3GnJi ;׀ה8i(U endstream endobj 46 0 obj [/ICCBased 169 0 R] endobj 47 0 obj <>stream HQ @Dk X,` XI4ͼBnfqc1źMӼ>cYiym[UUmΒu]DqC>t?Yah7 B͝$<tQ ) Fاr<"c1c̿`w endstream endobj 48 0 obj [/ICCBased 169 0 R] endobj 49 0 obj <>stream H] 0g X,` X,` XNB |OM[8N1XUU珙si 뺖"telv]wzQ>1OeNUWeYna&#FKN`FS9H}4tm&Bn䓄sAT@kv05h$ĝmYPOR[=Be5)%$zP][9\̵+ꚗy Q6U1c1s//FXW endstream endobj 50 0 obj [/ICCBased 169 0 R] endobj 51 0 obj <>stream Hm 0DP XZ,` k.:t]B_뺪 <7M݆"4lVG!eI0 Y,UyN=3 Ic#Xm4h$4YgT>m,5?, A4 ~s"4҅Sa[PAPd icȔ~ &}s^ !B!KrYV endstream endobj 52 0 obj [/ICCBased 169 0 R] endobj 53 0 obj <>stream Ha g P P P ZZZ`_vYڭa %{~8#!}{2 þmV^!ݶ]a,, B9lDZ:Egu !<5e[cࢭފ\o?e*oIؓJK\ռ%A3`f4MVs3gAЗ'V`fLKDoHc:/(B!O 0Mr endstream endobj 54 0 obj [/ICCBased 169 0 R] endobj 55 0 obj <>stream H]m@Z,` X,`II,Ca.=se$I%]UUyHk8d41Cڲ,aLn0 d˲/>stream HQ Dj X,P ܄ \Ւ&3 t B!䏈1~6RJZk?cJ)0GJuaU+\m` 9Ղ Dc`M.ٍZkmuLuR>f$n-p{d7爴")@] ox@ƈ_!B!bW=~ endstream endobj 58 0 obj [/ICCBased 169 0 R] endobj 59 0 obj <>stream H , KIM{iMya=x|9pU)'4)m;Hb{cY RJʼw ͆w۶<'`'`i#oIuX M1V?>stream HA @FZX X,` X$ +I;p fOI$˲<T.u]38эRb.s}t#y 4E7q%]mlXlpL6v/8B:BZMo:^gQ]]&KȘntzwd[*V\ۏ;-#WLG$I$I$I%xί endstream endobj 62 0 obj [/ICCBased 169 0 R] endobj 63 0 obj <>stream HQ 0EY@ ,` X,42CKrGzm^}$IOUU8{v];Hmɼm[ G]׹S$M$8ʼ,K hVXf^q0 LBΘ 3W_9+3`t'qi I^z+#Y#0# /~ 7Y$I$I$]{ 0fx endstream endobj 64 0 obj [/ICCBased 169 0 R] endobj 65 0 obj <>stream HQ @Dk X,` XII\;hy^ٽecEq,KEx9à`4rZ}<n(R@m),чHN>eEkИ̹zw$?%|UUG"˲OmJ;LcW[ jLbqWY"q~9DB@=R:߄s afn`1c1x 0Br= endstream endobj 66 0 obj [/ICCBased 169 0 R] endobj 67 0 obj <>stream HQ 0Y,` X,`d2Je=,8d]׾/mzDι,apقmZ٦iR)*NxVjT :_RVȷSr3JюFtY7y վt]%ݥlJ^>stream HQ 0 DG!JJ!B!JJJB!{(LڽwϮU!!}u,tou@9);>stream HA 0a,` X,` P Lel/Jz^- ?m6'!D?IiqR`eN)Y)z}o<a^eYP+ԍJuU4^.V%gQ[E圻Y &_]y y}5<|%wGHX:mُj7G*Y"g endstream endobj 72 0 obj [/ICCBased 169 0 R] endobj 73 0 obj <>stream HQ 0q,` ZP P XK{]su./3P!Xwʺ ,u#my>stream H @DᴰX-؂-X؂-؂yE^waݬ$Isڶlt]W:%8ieYJgj2tb/*)%Q: 1fQ: }ߓyxv:HJ,xT⢮3srm?%33&;/DͶ޷yW+d-u?fK$I$I{}Aʵ. endstream endobj 76 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 77 0 obj <>stream HWK d5@ y ^Lm(jۏA("?^NOӛϓH7NOrT$W9m~f'ol|J9_FyHƬM3j frz\Qb⯞U1?6y׿z=/yNg}~u_i^G7B,GR!Gy)1Ze~|;3t>E(N~@U|cj-+Q;l2[\$oV6i`O343G"JXj\Iٌvh&-?+J$=sp yevJ^8V &/?t27>YMtv0]]~+,%xg))lx*eHyzsQX EYܙ'[=oJd]u 씹?yOI鲪'IcAҘѰH;B7l M7 9:zPnj7vx[Y>Ȧ6/K400IFSsPĺAki?c5< "rjXÕQ\7∴|k=,/ʠUѮZB?D2Hh*]EaCɽ[;0ֹ0f#%-3/w> l[vk4_htJ7 }5h>wi %?F<_(/"ڿ Hg_He7ꎀ(U~9C^4Jcy=* m)@/Iۣt!yܵpv9a|Mqm{TlHb5Pkoؖxy(ڷN%E u`k3h@LԬܗzCVa) #kY5JRW8Y0>W>8*B3efuzn̕0Ss"^98tLH 4&5<JvToLG frѓSzܟ"V `k tE؃ "㩴 k %d^j5p87/F NgP*xB!ǦBDCr‡b'`C|AђoGZChV?n:h1awp~)3s>[/;VquMb5/ՔDĦ2a3> ?M uʚOĩV(ۢh$j~i-xO1;yd15 3,o~y?;1l#jko5Sj(t' O-`b;Þ?l^9s  %sfҮ޼o>>Nfnq iqPޝOᯜJh)X<ɳbz"4M/dWi8-`v|=*,xAab89a0)'0hh~h U˭}-2TNt%Š@ !FKe6.6?&ţ0h2(%B^ȠCybPI`(ZnH)ic ]1PZP=WijYPbd[SPh"Q 6Ճ))KAR0‚0?9ȏS :6lW ӰomEXж)+ۀdқ߮ma _L Z"{ bO0X0jQ ĩll @@vUfF!2Ts!!ECl>I b2ɝsU!Weڙܶp_WX6(XIk 7ya*P;'lN="]ucDcLL;Km@/S4 zvlm:LpWr9,I&-/\Ez I&ɣӦqb_:tFyӉM/rF^]HyR~ۉD_wub.ۉ|z'םH;1j̉ >?ZޗA녰γGiOJJtya|@籯J;6*lM9sEǦN| MAh@:N RRCMǮJ85RcnVBt .Wmb1 3{?m 6>|A2* {@㍿~Es/c3KBt2uϭٍ>8^Ǜ!rc_Fpc9 pG O4tdgˮB>h&ĢmfeM=u꿯˶b4SR)u9.<벿S)|o'[tdNwFڒRJ;sHCrFĐ] P)Kb }D2NVdģn$!{7!`!#&Krq)BoT tBԳN?;MZ[eLK|+*Cҳcdׄ|kZ|&[[ħGu)-n=I$|AupvJ.=Vq,;}__jfQ+7~WA`A4Ji_ʄ!!е/r Ť`#!;Lګ 6ۿƦ;2܅2om!ۃI7wKVDt{A++׃7u0TǨW3{Q=VD=ڨБq҃oE =.v{AHX=hJ6XN oWe~)";tlK5t * Xܥ}e; ".!\/|ф` R3kATB)J(G@%[ sMH2G>0m@e2d_g3guH; aFH fA@k ģTzm03u&R|^SbVʤ,j\º/ZӓC F,ʐ@Mш5n}ڒA6QDW Q?] R @-bn}Wא ::T,IS D *G`dV>ʄ ƣ,^~. Iu]%ui֥~Nbt.۸4Ǿʥi d@\iMKMKWmuG[Vib;_lZ#!e8}3p38b:9Mw NimGoS"e. rͯMneg[i ,n$L^q+p%wgx //p> eay < :+P#%|?*pkl[D6jn2>|zG~3&w.`cH}^={Yr~"&\bg1Tu^Vl,~Z5cӚ y]@sdw|c؆Miֆmijy]Љ !r;U#Go>jjAN C,j\¢/pS") %a(K_@:i.n/M* ˛ykR*Ph1h硇P1kehN'X[)`f=+!ijt)*4 E^e rIY_i3%$M@G3nv{I;:S`_o!SsL(<1 "Ϋ`;_ X_1j瘐-!O1adJRI {f]/080#x?N(nïӧoZH:ZFVn~mtzIA:|9z/GA}x=A}~a(zB`r0|ۀD^|ʀ~ {7o+)>{qE3 to6C@Ek,]9HaŪ^_;<=vә7{Nx; [ㆈ׭?bh[|>z61-oNVxszŘ &hi.D&!_ު)'m>Py @Gu`؉0;߾ eTga9C&Z{!pK±/Y;Lzֿ?a)@b_ TfgM@Ñ zJ iV@ʝCĻ`=MtZBY/wć&SK|eǢ-umQM05f,(& (\i8@:ob3^{X@k | [^5q$s/pu/,]0n8(DVi3m.M[qh@2nZlR~.^3 %]>0 ^;T?PufsF*X U 2knIm|?}OR{rꕇψp*Yq16G$ p3/&N0 Tp8͍xDՔaM)x(xJ >;N|gWfzװw.qjKY?ZG9"᭝yzh 7i ߨk(d)0'1pP-[:@xs X(X@Y#1Z'ڷFoYXR"4bgc@5`D^Q^Ù/WRTբS\0kiiMO4ƵhgV c5u4.4Brw@]o33 4Xt1ճ). 郊RhoҒ Ug ׶l3uFYW[}-64i-  %0&S-1Vyd@.d&\S"9jjUn-d7ҘA:~8&>'/01b&W!hO5 u  @$R%e 6~t] xQ|ҷ{'z=HiȯTzZh3_>k,839iq\{UZZtsW (b({i{=CzSt2CU:d ~uj854s|hC!^h(FFH#KW(ԟJI ]6z=F&I}6i驶(A+7{^>==G  endstream endobj 78 0 obj <> endobj 79 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 80 0 obj <>stream HWˎ6+gs|?3 ;^Yؓn ?X$EI.EQuԃً+%~Ƿwӳ`gڈ˪9JyDqNھ$LN;-f^=lHϏ0/yy]9lOXG,T:ޯ& u1lހyq Z|YWM0f-čРVMj5 XkY=ؤ RT B|aǍ>l+nar %md&?=|UJN1f}5^f~}EMIZkC4ܾA-cnݯvb#lVl`ӫZF;ފle;+7L`kAR Yx*t I&rlA&ԕW\i2",w{)a6 g-|@N A:`Fm=J!y(1 *CnV\^,VD[sT(f Z"MlN" tI` !8tYXe$" ; ~\@:Ȁ ua8ozr~ƃxKsH-2 .(V}qk5>.MLSŤ[dkҷIT4Ӷm)F*£nvKQw(Bս/UaJ=*.fD%Gz稨ERZR=J7u֣rUوqN B[-"fJ +i֌jE6RWke9ǶW }j;.fOn^,z~ILg4TM=(Y_NOg]q^iYw[)p(@tn7z``CXK,5u; =:;oUSXnM׃=u:#cΔ/&mt<` OG!ʘ׹f K6'|ɶeNբ@r^-?$iZc]WӖhS9,XlQ3O0 YOKtiIQGexE>)JẜWm)36MzYC-qkNGC]eˮjOYI5BmH*JbEvpJ=@:+ĝ Xu+GyV+Ɔ+Zuz=_d޸|CEy?RJc@Y:HҳğEcwP?_I^ *\ߟ)+2F6趺\stQo>.nZΠn^SK0*V'zle! PqxDÑ*LFd[6fC6Ff 5XOAFvu=GΗ7o¾ kJ[bVU?kX0s~ T9q&ͱJUd^3VkL])"7ڿ)?Z眽Fy{{;ic>Dq;[7<6YѸߧ_ݤǷg*i~P$ 1E $Rŕ/W/~B,K1] c12E$ms /7|/nƪXp5ߗY\/WPrQ@4`TK,:.0ըdD#FyIIJ= (D*:RhH+6jiMY66څHb}؃߭$Xl M#VoGkrjmjk0n|lC"fZtj#HT{@2, `b|P5bcUa#zCl &ieאYJJG+J'z3:y[fT#]Y(d%(tQV%YtxgcLI)`=Zi8yvJn#+loЩJ׉Jr)l˧ҢVR@9=-阶EhL:5p 1"h ޮz#Lf%(VLNl' FǂW(E ^6 _'*^DEO4R1y]/id$e,M pv/6+q pjpUTbzq{5D0L4=k+ǞeR,f/*68ihv$-2 DWı/QWkC7@@3=FX@aٙ.a :ގsނ``RU 9Zۡj0[7Fw">{L?+/δ?4AL{X-*jVmWV &xycxO)lmt*͘))l|}y GغȠD5ם,~W$s!yb.I6tμ>,c,`Di 1Br&-V+)Εwk45Dp_NSK;\N[ik% O6=B5[$-?ְg,rSيf]\;% ;"Fdꪆ.d5UA\V*l)lRnV5rjgZ7r[إǥRXs @v(>P7\9;eM0^|1QW؜.I\FYme[aZ9`[`_K(_k؛ S)#"Op[ z㔹ZFb ok8%L1@:Z-{a\./=_@tΦm@ _uP˫:Ŭ_0 _b-D}ȭD $D?]3g#d%78qq>OmT{rkQ@]Pg,GZ}Io u$nHBtiށOU7GoM$_Γ1xO>򬣍AUۂUs;‡řc( aW9+nL9ǸCj ^UF<\I=]xU {z+ri7hx V?QK] -nm¦/䦍pX昙W4] /ax[CaϤ L*ƚ.+s1̬ꆪI\-4jZZh5c{10/FN +xFVZulԈ*7I2łi2KL S[j^?S ^bihp({9Ra4{d޶^T.j&80"(x.>t~N-<4#lj$VMAwDaH[A V->pLV쓼]v@9ĥhcNc3у^`ily][!knBcmu+dO$۩ڬϵY1K_٩ԄLZxZSVK+lz?]7(Mޒ]R]Z-mww&Z%יM2gF1 L[j6nݭBspL ,}Yvvf^%powF: a%t$gl7>|%}|'ב!U:J᮵h ޜԶD< 8˅7GI7n/m``PZ[i[^ڬ$퐗Ut暫僻eї!6t6┗#%+WĒ6ORI.iSKj˯60u1+Gc-]0"Wl; /%@ѲfA>݊Q4 NdQgW>[$;z ~חf_AcU14+LnTO-NV_yʐB -w-j/y굄g pzj 5],}^^`Yl@Y#GCf_WjfԳiB=t6xgE4gGT z},&%9-"T"vLW393HXK%\aS P0!H":/ǹyyi?XI>ń;m]dw\XBsWק%Hk9ã0iGRoIxsH-=̑3=fSA·t(ĜxlG1%̴d&7|֒w<] -J5boǙę"X.@C=$f.2;*#ZzdpiD 4#]?i+@yCxhR2a9ڀzlDgWZ#Hwhs^W$‹i H -)UFqA@Ap HV)A@8Dφ I}IAь[ y HPC4I;A Q5(|AP} HPnM$]:qQd`"^YXEHQc"QKFKɏaTIFZmZ#  bWަVUL*V#呬 ] Q@(HO $ U)fWdW[uvulWydSGr 3./>M/GAgd<2pI&Īa(ޠpϔE`I8rf W?ev_ad安SyO'NIΘ3>Q%!~Of[2O8$'zR8 vDQDm;r {@P`|Y!"Ê-Qqj.sdc 7KZ}A 2 V%YY%˴TB>:~Ac6Tդ~@_)H3Y0m4SUO&{y(tjżյoADd09 pR$`e>h5wm7)Rҥ]endAPe&=x$ugMo+Gj=RHXw.кyrSNkC6̌ULEt֫ mٞ%"6_f2s-֓7N"}#~пKEletj#gr:V%#v|ުĜBT%G转D+ODuPEt3]*p񰕊:kN';rNB(ʼQg9VGE&!H쨀5|i"QDlP 0FIE2MPD O໕.a҆-J̮%B%%>@$^θᄄN$4]=<"ŒGM%cTZ`+Gx'p!O 4/v=m?ԣg͗zOE$;Ո PlwJN@,Qh-շk]@aZqvE+'mǏ E/@>k=kEiYA7#}k!Z1Tg[6AJ:Σ+AQ j8ك<#D, @Y.?iֿ<ẔWWBk5P;aW=%5,?u;qB(}{>'M׼q{"%M w-u endstream endobj 81 0 obj <> endobj 82 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]>>/Rotate 0/Type/Page>> endobj 83 0 obj <>stream HWˎ\W܋{⛋l,h,$oPC6`I@~? yg%# Mxꛇ/^^;n#=J[+S_W}?v=GԸ=xy%r=p#^KH{W>IzF]cAGE~|Pנv3D>|TK"[드7;WIt |ݢr38 $zblbqP.p4?% Q7t!l\÷k=^ ^pB!$v~-6ch~kO=_ۯzr9KVQr$>an_Grczυ弥l:=[i3c?ʖOx 㲮iwGk58sy׺7oo9}G[}/̈ƷSs) ʝsb3Pڃ Py=/`O}Q=1 Ȼ<&/Y {'rʷkʼnʷf6VmYNWR𦇦rJ,TLlY7-%S) &U,c( . }1e)Sp:Tgq^cUO#:N ɮDDPd-ȯbR'Q/;D,R $Ti%půH~9ELp^=0pbR:y"`'%@;J8*Nŀ_#g8 5 *x4$sVJ*:8CInokR֣)6iJ%po츛|<Mv pR9PkBKZj1/gHK:J<l"8ݯyߎs܃q&d=SjsΈ{‘DcOܗp=^3 D{txkG/${ *K[YcImMRz"iHz~ I3 *#j6gHZ෌ex:@k=wIJ~gMOt2'?1;Jnt_Q:&cvɋ~_/jLЖ7 ?)Oh߅/4;,JYOIYJz J}P;io'9ex{=`O ]AuFQ%!kRT{k [kb_h7G߻f8=1c\RI.؛|}Iz1n։*k"oQp _T/Y2pKpxt\ցZ7PAmzq6gIz3;;fC"I*i.?PNlJ<},Zvx3<g83 'D:1|gABb@\ n(,doB3ra\,DSEs HdGz쁛J~dtI}Sa2z+KyR=>)PjoZcb$,a S5#G؅ϴ̜]鼡CA_{H]c0? gx?A/У'h`X('ZC COAFPLj0hjowK}ў K2 UgD֖-:ټ\R4r ץGF]+~SLk"hnŸ\NՖ~×6|eUDg?q MCc8XZ4y1sWŝ>c1lǰx7Ia-c*,]87ΙA{h33DJ\njD[$S{df3k9M~[M7@7G#N 8<4-6҅C0 8)5tìxj[PnB&TTW12r ajaqj8A5Ty a*kT@s =p捬պB Ysb­)H#PURAcc":Y(L { OJtwlQ>YGaCyc' JHw`aEW\e;fbpW_{\A9cjr8pֳ "ǫgȈDʐ ^ɃaX|]AWt]AWH{Qf$%OwWU߈p?`7mk|W 6 j _mwr`ݘ/Q khW+,ѲM8 |7sy/:]qsH󚏳^1dWa`E2 PzVtu}g\~_)lzݩ͟^yɳ{s+NBXG%a|q97jܡ|x+e>RlDxh\Me'\%Qx_MI"eʯVf1r墓|ahO $YPL:m&GACZ,%4>R,k(NUЦ?r>Ye 1/'!g/|H4.Y>KDҮ@f IK%&-$t:=1Ֆyw6"3K(^ֈJyA еMaRJ [6P+j!:ᘹd'GBT%F"Y.Mې#:4'&΃]ATCDeGT!D3${,cħ>Rok\˶abe'4.J(&MT( rZUzL-ߺ-2֌r&7H N/K|PW):I, |Y[ 7?aWlQ٢ͮ6~}[T̺PY2:{Z*c5ˢ >K m$DTd͟*H\ k,mXhg]7 Sɏ%'PY PfAJmL^. XFczBgrRza$EE;uVfn,! iqCz0\OUWXc%0m#)yPӏ/D{_3]+۟yfJ;V;gAu㴿ҼhjSj L- .9w+_"Yz_?oɸCU1l__fn{HXS&ACQ.lp79iϚ$&vZ#;vkVOa@-jKqZ7 bxG ic.Ck~:F n #3zhaapc-x4 gnN7)b%2eų6ɳI9;SK[i@%He_Od\`h |k:.AJL[)Q5:SIc8V_|,PqD( ve]vet]z11;\дr99Iu5҇‡ZTl.1USSCDL gjqjD85R"l=5079yXXAr&IEdZ/sp-K Q3<.ݩc]T)AK(u)C cxIN< Kj u!&OL9]d#zE"noĹ `nI2. N&DkaN&8K7*LIƅ& 3~jwtf~EB < ׆oâE1pI5e].:e0$wdVmRJ|s8@/caJcOA><` OX%I!X)<7KxS}eto s6۝,PM$n`yDkO< 7z0 )LI=K7y]ئy'䒄$X,=td]5U)VC.+>?ջQXRV<uQ*bQ U] fH+99a3al3ѫ`VWڴq%c~ar'ZIb4dSw8KXp,iJ5)#"N4SvЮfnbe`t+<xRҷ u8nV)UFz,0XxR]VVO';m'Di;k}ss!|ϻ˗/Hx>o070:ҒcETz7޻wӧO78^sp} BxI JͰ$7j]A+ <,QS@ӫ6@B7A܋ + +/gF%s%X|{5vBMm*K Hl(F>`cTTN^@;k#FJ|h0v2x$= vjD'X|>~xk;p3ޔ6zfbN[+X=L-tm[9Vr,~# $RJa|FyL|'3Rh&n#tu0.nU+N1V'ť39mhbCs?l$6cFgcڈE'\|~? Pfy@::;P+*Xr>Z;(((H/wOf[AitdLIfPʒrɃ% ,aˠТ'@]GYKyl"hN/>og#S659v[0#wX|ǃiyfb[<П\ĶsV܁9*IF!zksF ljhWIFf>\IaK pPW2.ZBBݒtgaʄ=Nq&ޢ1JޠS~N[L'Pe'X]`m;}pLeZQ c{e_ {ý ^3ejJwVn^3!U2Ioy,^Z|iVf% k2L}:ew;:4˜%| q+o8%LKaT\aVꡀWM̺X#v͌k4c' na_%W|q/N_~*Xl.UHBo|"]!MS؍{XXC~0.n|σ+Qd1L mO:4d!9f A$8 OvG[mPAχWC!o`y4p˜7(((x@4@dCji+K  !3cBy,A}7cLKgLΗ)u@N$I]G8ǜ +hfViX;YM#vl; ]Bc7&mG=|92uqOx IݿA~ׂXqF&a!Xk`P^ h8ɐ*Nl(bENٴ-٩\l30Q3k:0\Sk cd5IaC&ͮVVMښVoPW0i5Vܱ.%D]%۩MVץqaMkhV4kWUN ͙7|aS?CU*j{R2J0w!+|X^W]^u uj%ZH@*ZCMiuįsrmQ%5M|qfqkoT>QZgv  OOO߃.oooq!΃`R! gP/R݁ <::z||ؐ0m1vvq| t6}6hfL6HIƶjBONHޑ &N&Hϡx`oV],N/.xe^d#E*3g0swşOO];?z.s4V/zˋ/ YY]c4blzk*8ӀZL  ~XlkQ!}=N$d3;{NwȁB.1}!'qFKo!br[3fr~;%d_F%$qbLnF点MQLnA&ș6#=y|%'Q{ֱ^T9Y\49 uX,RDϐQ|iNJ?.T&) jǡz$Ll)ZQdro\q ]rZ*r]e\+ N]8.U95a_J'UXG-1!XN2.թ9S%\Roֽ@'KM;`]i޶zЎy]w=f43lP~MSW?+^JLJKzf%8u)RCV&P4,? SKZQ/6noͺ1>6 tҢ:zY|"UTxZy8fO9e\iW1@ JJF@~p_DZ.!weH3Ζpfq)ܙV'|<;("gHoCO#+9:c]/÷[Mx_q3Ң(=M@v2UXuYm`g%/ˏc$pf`fZW%4V$|2T?sa\(2@6j0~+ʗQu6i(CC\W 0s~Xi4$] B`#"0vF>O4ǁpuw&LR*FsH>ڟ*PGe^Ubʆ (A/ ,VSr4#Xo/ܫ>3HF,kp0u2h9Pz۠hF"k5am#%F V eTY= "`~f2J ةroijJl@Ljϱ.!'sYJyu7>WF 0xVL:w'"#S.)TY齙-G<0??藚 zOz~CK=M`-bv)IX(-wDin+p%QMKHZHAЩN)RE\-uVlDvڷ?0(H[s endstream endobj 84 0 obj <> endobj 85 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 86 0 obj <>stream HWIohv۵/`90L`\ $ zji6%JtBzջObu7||y3ln'~#W9D?Ņvwrd&g̰7:S fpdo 'ؿORz{>>1 JC|Z)-Yz(=N7LLVYg=WdKIP$HO-~ՒFYHL܁D|I `C0= /mڈajn}ine#f -%Vnl#9-pA$~f$xkҕGn?kKPl>>nE6 Ӫ0VD=GcCRKɤUٗ?ՂN ƾN%ߠHr%u)H-IP~yy" [uV"*VxHyCg 7`o.mwMfhE ˜xc;$kmlQ96HWyEr`3Utb9o^=yR~cbb֊υ6k85B+N`$ S*U%7V_ .)T5 RY?//uuQ- jgNۚ\}nLާՔ -QpNl@`{U9zPO.H͵iP]zh ^ԦѢ9ݰ辜)ħxwC-°k5PHJ/AjQOl23$Zi^Z~4jHgʧؚ,DvE.Wd+m Iz-'J# e磔g'p6Za~˴ccPmmZ)IJ{ c };}Tڸƣ5} $6oc^F\|%;m:=RGT4꾯jM }hNd*̟W m_S7ܐu!)\v0?wW|]V&-c>7CY)1eIn2jLqk<}bd!UTO͗%\k on#׃AzmjOg+.Yϑ%/&!>q&'O۵D#L+cp)r>S ؇39SXeTS2C hvVm;S6>sm|'wO]A8Z d~+,ga j~ݩjCVy\e]5[FaL4BKs4BKAg+, %Ԟ/3($Q_ g P)U ,`'!759|h.|ivz1)vhfS7fjZ :o¬v^Ħ:;9кOZ;+OfG'.!!Ǭd6Xn5/ي̂69R;T4 1=Qe# j5SZebq^f_U9'2`!p6U:C'+mlcN9=' r8Afv _16bQ#gC.@;tmȤ5dg9E,:6X{h}%3~}ѕMp(ҳer.ՠ(=GVۮƚf2l^"Knp {ĞE<5x*wQ<#1Ӣztp1=|SbP@ 6`&1kz'{ ld,vI<zeYK8C]z!OJ-Ru jʡjMˎ%q3 [χBƚa\o,EBAl-a@ʬ`a`Qu#k_2Wا) qe[tlD"Wu܃y8Ih.Ȅ\ri0M^]޲]xJ5P.V?@ixOG,a @ۼ&t֗a9ysK MZqi=VHh@s0K*YNvieZ 6jw.Cr.7 C9cgpwnD}tݮGvfAͬTࢉ/L LsmТl:`^-zFtEd,f1 c` 甤g<\,}-UzStcY_.&.o8yy )\0֤4#Q/Gl-1JgwJ 4rHfX:ߣ1 '[.{$J/OMu_SzͭҡǏ-̴p`beo0.F)#)®9/'L4kgbQ&O~B"@bO YbsS"i(OWM^e*m.]ae/bq"7_Җ{٬|~/9۩ƌ۳ʼtٍٝh׵C ikeC!~Af|N)f1pxe쳊ɢ `u99.T d;7 J4 amwӔs%ba^uݤp;Ɏs<FfƧŎ@KʖsWxDMCɁۧdwRswm,-}PI:o~~뛧_am5Z +6[(ʚ}_[흱~noaӜT駧r'cSr_6۫ݨm{O01m?/[n&Q-@O><5#FzO%Kμ6OĿ/.NvxhS jtq"oX,VuۣkH_;{n=/n)Ks쥽W"`XYEkkk i]{,_nnLذdp(2%163@*fw|/|cHlFl0 {p p :`+/cˉHoA0}R<'p+ G]wCS휐ź^1ءb|ж[-G-ÖxF.]F܌9څ:Ur[8aOW0%!CQ.k(P' -RNʽLt`.DYʍ"G aciuzW;*;. N ԝPk˞m8^̃}O}HS{vC=w'[jψPOPL[(a h JGyCo 6&~?"XxA`yps[9U|Ugq$mkAF2&x;QED´:i{"]6 2z33mX0-%P}ȴ~ayLH2eZLv2+Fe"LK+[)3m̴86 Ӛ´Q6LLe +rY60fiY."S+lEosfѷL;i{YwGmfJg+< W-iyhWy_yT8L{iQ0Z[USxx$kź\;c;z^uc!9^0ϡ7'a?Ȭx'\PK !ljixٿ44~Cp2iCTnӅ\A;Y>&l{r m 0{Vb۬Ut 4ɖ[&7!;LnMOv!-K3D:S 8B&a~Z-ȭ{){eRҰWשLn-'L'M'7P/:;:縆ed U{'6k9߷{>=ݮ[OWZ!(jhHIlhmTfT }bTqesqߏ)=}}ġC?f1>o?ӣ2I(7G|F _ ?I',sHbBمeg&%ܱ0e`=pd<Z5c KYr3qg=~_B!/Y|(Lޞ aDLAi)&-j2s ϶.UEQa4U=wF)7 7yAawa"|Bg@q*ab_ ˲s8% nD l/g%7N$-h `L:\OBezhR27ڏѽ<-hN^a&8ȉ %6ԯwGTdU͂`?^LΗ.N;1 X7<4^` endstream endobj 87 0 obj <> endobj 88 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 89 0 obj <>stream HWKϯ$L _M/H>ra x% ?YY0&Ū;5|<(>|<ϧ.דzXìu[! _OJ ܹa N'v4ƀ qZ30N8Sў_Ɖ^1mT:^'zv?'Gޚg?|'>8`EzЍ%')  wpqomj^|h8hh`Cps& cfI8{ŮaXuΨ8/t6\[U .;ގ{Q[5tņ`ַ0F ` B=w^d݅wər=ﲊA9IwzC*$lB lK9cs3eMZh1A%J8\B_K9Y-}ttfqC)`o9.hܖ0*nqκޤc^RZ7>Re؃5EaC O uQc&+tM4y1d#ӄRv4Zk@7q@K`EnJ}J0y׀Lj>5 fYg8ahkxK 2kRRdK|>eL^̳]/߼SÛwr޽70?/pm1aqO 0@g)(\A 9u6yJX4?EQT>3F_̂ GRÚC(21%XlyBH}nvJn|]W5m&7E*C%muK}@d/Ƽ_oh3,4q- mmUoXY`E3mBks5A*I'ޥ.k5aՌu;Q1qYn 7P¨hFjw7YXyPԖe*[{V߫]@덫m֍C$qXک`߫kՂ s)Ɋ!D̂&*^9_e}lY4W;VK9YttNZ֥bT. + +xva ꉐQw{(fԭ> z;mہgԨ383qb5}⢜sSzF.-.7];Dȶ2jvhTNxr 0dEȷ`̄TwB5)𴨭c ׹*jiԪ.1S)pZo-fDXZҳ]=J G,`FcGtI$LdѪG;׳ԡȳޥ6$*yv)ـ櫸2:~vQH ̔ʼnHjzrjv^h۪}' R-ܺKzH}C~䒜ruV!3@ aiyG:5Gvʄ`eZ.>6efmI*sQP:=|Uw̌` dfVz$*c0P7- daѕ6?I_HkXhmG$p'> :?ϒjw,"$AfyQ]RW&2ჼlṊ{_Ļ5[>z`o;f`Ae&+2o&zqЪi`ֲs?n3~˗G?ߕ9NA%@ 'Ę<й߇*jq7W7_W/^f j{8 3";1u]cȉq.3q䬲 :fD+ ?kk>;0'ǔ&zɏ\an ^K] ˯}O=ok` PEf6^NbkI6c{W%?|H 3b! 24(˚p"-l~ݍᅨvlGfU}]M%5iZoR-Lj/*۾NVYW BI%ErN]K8w#z}$w䚰\mZ>VLf WQ7{c'j OՠM^U ӼeG]Qf&$r(cyL7h)$`3|,xS>q2 1 3/_ԯ]ө @qA,yacrEq>󕦴r&94)11鱟 -k_a3D6:C}]`CZUZ>^*x|{ R6,`k#AG  `4ԲY>]0XQWCˮY#Ҡ!uX45&b }A 5.wY$lWzNl80TeϏajdcsyY&9чg@H*e_"-Xb>R7>;E#8Bw|n#Ie#03E( _7]Gc52-뵋\;|%+\L֗e;,-"3rh"'3ÿ!D87DuJ6╩ EoNkUV/llO% p o\ګկf/l}ۻ[p?Dsfq:@gcdCyByJ XBuJF9 Rٌ(4(segTH+!5Mٽz#巢"}OQۊn&LAd@i x76"-() ͒r*-ˆc-FV[p+pxD&XbFUz,t]_XhhNB#]chr*8"Dbfs\؎HSNp\W3"-j:7!ҖT$tj(tcc1` 8(d06O\+^56n)*B836E(K~ȥ}7E6#= qqOwFS-n3a2 s\786H] Hl dP=[d.i.,sȀvN5'|(mJ"*pn%=4~vVF*jt ytDt؜) d&n'N tL6F:| pb vI*NQ;h:`N ,lE%Ϸ 8('+f8CB.^0HY[5nnB[#c3/-tT_i*h>n $H}<6xa@ 1B { }Oޯ[S>:~yA5ջNpmeg̩{.̸޿粎b"{xz'vűBIڢZ%B9E /QN$Ln=rXSPت@bzSPlmQ2l y+knP2"rC(c ¯+ 7늼aݞ=RFh=fuqYv\Nb آ#=W;q+adM!ä\<M ˆq1-*+; wщ)bè'Fܖ Bh iF?2v ]e7ƶٍfaҠAG|n#Ѽ$Q|N pda80d"%{. jbydNR}d^?sσ5E,Vd!Q2RՑnl0;kj6.ėZy>=s== 8;sm+SqlІp/3ä+ #c {d1&Uy$שjf– υΨbȗ bv`%rQMbm-U$`P&7'%5N`r%yd˪˹C[M^ްl]";J4^z1-AijO :H)-`x)&m:'i=vLkg׷tBc0MMrC:;waݩm!xs}q~KOݏ_o?}lTk'yn2NxFpgzÿ,f.J1n4/#dM#dx䐾7\3̹o+{&,L_taCy"Wz@3 }ƓEB>B᷈HoΠQSb|&w'3 -^Յ`Xa qĸ:! d:#γb-«̥gp,1P.@pPI4`$zuMD؏4k6hb%BLmȊ[S7B8;TΗٸ XdClA˔ Qbm @f=-7PӴ]sζٟpX VoI[t{D| w5Kqi[&Qi{z?2AO⤋⭊(OMdT*X 䈁:D}6Cu=GK27CʾB-gn"X)Ifbm!e!HR`ΈrTD*/PlP Ah 90)S},a(!YFT jxwZNT%$%$ ͬLDْ)=i|lK(GHx]aZXEx4NRl)=:Rx2Bos>K>P|$?6^Aϒg0Ow "O64&ܷz?~c x\{.=~9~^ ,x!_ \d 0Y]?<_eȭ#|(|$?@Oeݎ~O/O2>u=`/Up:x endstream endobj 90 0 obj <> endobj 91 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Rotate 0/Type/Page>> endobj 92 0 obj <>stream HWM ϯdlU.}@,"0eAl ?"DJG`x(ݫ?mxҿǷ^ݫ"NⲻU컹8mwy|w761?;hYח_9/:~Y=a΋%<V 5K^^9/܄"ĵewt>&:y+ G?[Q6Y)tOQ|cJgy!h~ `)>\om>.A![}W cOwVݝ5uVmݝO)EY~yWuR-pGWDnU\T;;r~ v-4uԗbWn[@9Txup >*+2)Iyjl"+V'2Ӗk;?24_'\(,}Zh+i#<>xoZ'].hx>ejZHaIAץ`>;R)?0ð tt?'Ng19+F jސE*=gt1/^V_a?0`|;utx"Fͺ5Xs|;e C͚diNxDNk(GB'`l rL,ϳض驪*w\T֠KHIi|dZG*b ғQdmr,zYvSSH0dJ^#+smym)eeӝ-Y})i1ެJ[ ']LӰV7j4}uŬQ2 Ъy† 3&U()}B{jۢ&aAXOSz,)NbSE\ZtQ|7jlZ>OVNRGVOVYZ}"ߥڠGZVM _0`<5r 0QTpEr0ҩnkSs_EEN Pru#;S')U >B7`z:@IںK^bdx&gX#.cAc'9 ~AB%oG&R]WVB3eQ11 M} E[ttF:Fk9I8×b5fjL_BEYQ] yWvtgMUkB-ИRΔsԩO_a=ogw9*mw3.1<`t׎^xOyUŰ_"y!`W{4ՙ;<<2?x GM=\g>͸Yc>P6k(]'LzQɠ-Fq" F d5nK챛ĺP[A 嶗op+o f\YulKXɥ@'H70h%:,fa2g0o[ʀ1mdwv<7eOq{﹩43꿰H}aߔnlr Ծ3f g,BHV30F\}[tA16༈REF&7u1DX#|B9u7uؠ ?<~FLy9>|4v%%-4xDmwm<ֱef}{ѽ-@˕=( E1d&+ %) xqjpz}Z#*ވW#:?\`h@TACւ\@Y+=.j,k[NQJ*])D2͠.wpʘ zb)4P 3xWsǤHmC4*K?5%M4M{Lop9r\[e;K:*gCF KPX /Y<#s=VKjЖ]8"$`(lfp1DŽ/EJ7{Jm2 $J/oΆey.; 7L(eqI+ۨ?VO2vϼӷbo|[;![4ZAQJ,7u,]'qp:t Җ 0.YU^!sv|{-8:'XX6Kw~WnnHosnfEkIT;ßQzġU.fl:*Z_lXŋ {uc|@ ϗd o>Em o0B]!g $wc^FB*./ylpH ьny<]3Y yޅRM(H֤Y _p5\FB᠝h<11dVmp#ᝂ!A*ZkurE ,yRˁ]%9{d [u̕gf0UJ%@pup*Fͦ-'a6,=DiAdY^ crpz:8$sZG:>2T"baaC$8lo}հe0謉q!kݼXHTf7@%DC#IBAkLJobIq4=Ij 2~2N6>]%㼷[XKE2;g_ˏ{{Uw7Gcno~ޅ} m῟̛?nO3j2'܅ʏ]Nr#|]d/^T+;p8IX%O2gbh5jCyCr p(=ER˙䷆;r91>bKGL7ґ:hU~T{'}꤆bhXق4- ,lqCS&'DE$WBy5dKQ Ȋ&}XXr#a*w$:r.W<.~ ,Q?^/DxuM`nP# vj:D^x!D-ք|2AX hu,p"`I{gbC}`*g4ԟ\+-VaB 80m A̖\[CXzMd SLn g9fUMEMo;4%WDJuV"O}H焊kpSԺ$d-#>JGk%xJb)x-vI-V y @UR[ңƎ|󀿢F)=7,s"բ"?À MB mfzjow 7c,? 6{ޔ2Eojaf<[YBipIZYZ*QWXl@Αj-O</kCuFy0r.Y~'y--s) 1 ?\I=vF y  8zP`g$rBmkBwKAيJ6d-o $#o AzBR PD-"Eo_[BEwB4fϫ'coEC/񼭛1445˚ړL ҼgR %~XXPyF}.~qgm%AڍBD&[BmMHۏ֦k~,Q^q쟖A9ˎ%?| _Y]c#s.1Kأɦϼ>gZ\,p861CաETY{+oomkbFtܜT+TV 's/XJ+W}]}ig/eJ=ہlf"0& 2r+ %`C.3 dK[?_q^7-#k2ljXH(,V6sW,3#ťV"1NLlh8r?.KZ.0)f Rt.@l,}e$XJ`_ ahr0!|PqeQlY[W* f6skc F -!̔6bUՇ MWˏݗMXdiziˣ QaPWU k?ݲqmeE6\uyYzp56#X=S)Q6UpYV֩#L:^T-s>`Sܚu&ȠmnTQE-R#T䩰*c$×MfgbX՘v0BSkwOOyBJ&'˲Qayƣ?>>r߃G&y1hD}a‰ T;pn[WϮ2(;3OJDU n"oJ8=]*!cPvC)U;lBǏ5ۡ6_pPuYB|0 sC, Lp_YrWtrԝFd a#g;@`:Em@p)D]0ۦ4n V 5T>4@(6cGC wwZss b;8X|7i~ԚTd08C{q/r5|1:YrpG"?6;{Tr^.R@8E3w3DAAgA&ز+69M)32fPUz!%t^:W k~,7&.6FS^8V1Wu5ZJ3^͵`|+` o!h6 lKeHе5Pάct A"SG.]g,#NuR=4u4=iCE[;N_?eLFo41lvhvf&1^̊عz96٤#^ƺu Ionj˩0Fsڪ6Bz0ӸURB1Q ?kV^/¬6˼ y3ReՂ>4 c9_v *"pJ% )k#E9U)IwV*s 4&L+dv> endobj 94 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]>>/Rotate 0/Type/Page>> endobj 95 0 obj <>stream HW]89o ͼԇa^ 0D~螗QM -[` l-T&8!*UHıセypQ?|__+_88ॐe!WQ6McJPϋ9]ݵfʖG%uy'eݏ<U~r?~ho/#y8)A|ڧWh@.*B# mo)zHu8*2kYcx}U汑Jg:Rƽl #Ʒ);yx50DE^sC\9Ga!Yc])zxYp&PH J*KE5I$~[o?Wg<6lW>_~4.vӚm|,*Lxh7';Ƕm¥d &:RZEܻٞ283e00X>n\R80_w 8Gg!WxCBKxN"mz#H"7YlOGY.`9 _ 6k.\4[[2lmP;q~-Z/+WI*^)0{1G2|8}6|{|qԲ#nspu+޼yC:m ^b{apBwFP:n#x54p~n`.@\Z02a  SE賐{YC ؃,HZhA(\>!9VtDj>|Q@PҒ L]LQ Jk&$6{s$OL , jX_9虬 8 1њ|;AxMA21`Z&E`J"9VtDZ*g!K+z5r$##!dV@0B71ntIRT9*:p&޴,`m%$PfH&ޚ9 X[Oib'kLFZf Gn|h҅ >`Դ1'שآRKWLY)ľ܆$$dFFU/G8K^W^*p_Ὴ.ߔ(ZBqˣM̈́.BԂU50_Ѿ2UiŴ5Ғ? Z!3fh\$DԠApQwr3 ûi񤸁4)^LY($kbfd`v dv{JW 3U<ٕ`R٭eFbnzv(D#o9LI7r1LY7Ğo;t: 8jQ3.o|bԆi1XnWXLM"Ts0bs+~֍Q0D83]XX[3`!K\RF/`@O` GP#^Iʚ'ztI~?g>ϱg[|@v<[4e,΋6ʤyc-ѱv.vb'=~5U g¤5`jR_)?^DbUMP L ;2.O:8c+fvp4; NM]h#vΘ7mKVlb tQL ==ml7u_4xt'Jg`^$N;elٛDƎl> 4 k33Be%SfGL¼6NዪysNr`#(SՖ9£M~4VI?&[&I+WOYx)dR$eyX[x4( P7 ߃)y\I)!l&7V%RnӬW Jޯj'kcW<,BW<|]Vk ve*<)|ܔ ]LJˊg"CJ)ty4nȀbo:rטS6&cYZhrTjHRĹ9$ ]3Ƽ*_pH5ײ~s.﹖չ=,Wp킹V Y^]5?;nL/p8+OX)j*gW=:DuŦ8k]dWrDOD7X//̓b=lXX'c]V __ !o,;I($,"qF jk$.RƎc287ǿD2ϟ# (ׯ6wpP``)/0Jy___J=?<<<99+Z힞P.am+ >|P7o f}޽{7<'D(^zQBio߾%yyy9J4A#LZP^j¨M;͌*;;-ŅQEU {>AAk8<D XQώ=F;Bm4tTWsQS+D8äǒHDZhn%KsQ%l Bj3t ;==EXQ~vّ&mGj gGڶ;vu`Zб&;B -1]@UwɎošY4"րuykQpObŊ!(ّvp'DIzWY7;t{+VS,yK&\^^t!nnnߡ 1><Jhx`d r]Z&>.ʽL ZLp{{tܣ5Ȱr0` qG [AɎ##;:dfGRvdŊ |(|I@4OzŁbGȽ n&H&H&ɏ:QmP7A^iA/3M QEBqlq wHگӖ lQqHw.0G1h?)*(e2KwY㣇b;!J8+V(ّvp'"1TZv䠄/_ ph" 8??1p||eP o(~jz- [ր} I!zZv!PK |M SH]0 i{uPs+ve,2geU gvig%?W__>\v=Rd.;_~ccaX@'(9oK?˫on\v\էaNuZ|%۷o߿g7߽{MǏI[)ן?Fh"e̿nf>nnn$#&NvLGOn H}&n{ꇓc#e2 gƟbrj9L1JdJ>%:}YNRCE=NS~G= 5WYeGtlnh,H!y 3 = T4'HFihBHM-v᳖N $*[Gcs0Ec)M'|18'0;5ig2flJE[gY+?{:9/_ 6^bb ip',(-Vlb2{1a.Its,ߴBj)Ţcۇ͞6)e휁$pv) 6Le]>ӗu SCH Ԑ IL>0b: 0Id7" #8uHٓb)ٳTJ ݾeY6^28pJl$8W!pW4l2b8赓v!$V\YϬˠr|b"{e#d8iƦ%s &Ot z )p砆*3+PWC v~Z |1I T1wX ;HO"1LI>&y\z SîҴPЂ? -dZ)niӗu ¾.ڽR\L Yo@\H_̍@OkÈ&StO,[3ˀhO(Ed2LDo<as#ڇtJK`9nXuեRCJS ꟅV*CGeddt5`Z !r}d ;H>1#Z$gqVh}>|RN>2)9$aJRCSEQԐIKvra% .|g3oZ?_nI·6Gv) [9,p`<F ܟ%fj7=rbiYWnG{nZ-Qa=73KKC}wV,ǘ{ бP!҉AY"I" Q~lbA}] ~rArө$ќ??_lʚS۵ҤVZd**}C uƶ!oye==#M0شHtK8'1k GӄHh6FVA Y]&W|$ũa3΀RN Bz)JA|xϽU SC/Z5bWQʤVnHf+Q+NZM~3Mn|JYzSt#=JCK}zX M{{3txM`f#% O~o /\$#-2mg9P9oNlP@M<:Rf9ZiR+-k?RCgnW4 ? .8z8VnLf,Q&aMNHV?-\H|5l;-g/u*AZҖC3T21%I2/mοeüY:L>H jWT7)̓Ҝ+nq.6!r(8CXƋ_y)pdiނȐHH$6ۙp Kn)d L*F"#H"Q5Bb@gu2$OUPCi`nYmNۦuuUiv@Y^Qmsm~{7vkqa|2?64G L-^08z9ڙVw ժUoK=ǯ3멡|mUCeMC=L1CտNe˻ݯ-I?cy?U8î {.bcEyI%ԛx,؅}‚o u~@`_qpdVy;߱WFG}¸k5؟%}ewY^Q\{caloMT۞ #X8OjWArmN$<́oM"輚q IL­&],[D-E-2!Ƚ[y5{aVW@ukolF7`SD1X3eU M~gTd<)DCRpG*bw//e(1P'İH"Hecn[u5|]a%燪9=ƁM1U.F$"5^0𩙂URS ܭ5@ ]g8+A1+ʖ/#$=L0 Y؍ -w԰~vɠXĂQڠ W*jX!iGPa(+YE42UȂ&¡`ϲ KMعT?xRO-$>D5Y1>L~ȧ%()jh!v3QYZ}^GیDN5m=T-2)Rx'4<4\Gf`4wBBZaȐ,Ax~}x3E8yEs|M|cD'f C|O~ >W=`W?ꂯ8%8a!s6pjDϧ t)Ap$'09l"cٞě\Nz Q; V73B2nF{˼fKuSGqFb#U=qԣfDy=¾%\UFr|F#a#AmD/y3ZFwFÆWBDDj¯L287Òqt.smA:$/#Y‰ܷNX?di_~:l%v% %dz+-HC~PJ2vg/*y -_Yb߅0ܠ# NQ27#^C:8 VrV9b]ΧbXZ؏ZL*lW)4ܩi!CS69-֡ BRr(^Yd~ nr%GqHKG=$ߵB~mJ`^V*+g릞˕? .1]S: Xc/ 詣  j%cJ<_]/QŨ of)~ 7Y.6ͻБ:Ia;&"$uW1~ t^)j$_|2]|Obs秊c|:(Ru+wq|}vc=W$g|6>ttcY$9_A _v-BS2*9[O =:"d-)lӟ@~ {jO1l_>>/g`R~28du&Mtefҩqjh/oKRԟ{@ t܊ROT/w?!r֛$Deecڹո. 9hR|JUIۉa`27]!ly3z&iXiPq6TK9i~#J2v?WI"8'NRv_7,?-:HO<$Oo^Wtt!6̫wb od@W4!5h}CX}G8(3/]?KOQ.}pfCWG1(u%mr+Rͅo+К"i4a85hw"ٕ:[V;o|^7vcO=[]vEGdζ< >8ˇ|8Epڻm\]NR_>pYR+[4FHIt}I7`Ev|ݬYoz. //jK)cZ}ѨTrXΦ )^y ̼FKP ]C]"(wK40h KzZI#5ߙ=}%B JĀ3|:7(YAnm.T\\, W0'{b;0Z:ZbVtJՐ9 q':K&)xs#ҀeZƜ%Mj.+ۂ hr|[Q~Z; qkE81}uz-bLR}d![-jqbtm k^ʰrUӔ yꤖC,I~;(%Y&i<&Ѕr«2[ts ɱ_MhPb\"?-; t_5 HdD,yk-|yy.y- fVuU͸K8V=ONmS ~a`RH\8iVLRhM89B),#6]b'#[v'v$3R ZPkeu,u蝱]/D[T}Z>[=8-fiGۂY:J `; aI;(D3iN_f [?JHtˬqL!CcD{h;rW;#6v##xd&=k.aڊ!Li W^Fh|2H|!2J.VRW=s(,U~ K׋[F(+ߏ4oE Z{ *X9!ԧ"b@-dHP.=2ym-tQ[= ՏQOzsG>|Z QuB_Edmx4pR>Tņ?RJ'̴(q0]͠NQk·$] &sFb"*ib3nPZF^DpڄWRό,ekUiPG&FÐ%r<ކ"~P|jdaKF%-^NaeQ5דAKTx5^x s;jBI%i Ow:i.fNXKwlauQ,rk I24>=}A>5~eGw)hH+ʕ79-.ة/[dji=al;wY1h_oPFn#}W=$ Wd@,NnmpLv0}QRUo{ݏRIE>uUG5/Ge U[Ⱥ?{ }qn5yZjY:H4&Eߜ-=Y]M7M7VҮO6!N# KL aw v3|oZb.A-JǠ{J  (A$0dМRtAuAwbĦ bXY/8\oP.B$Qekիهk| "{!.3d7/^ ֘Ek/Y ŝTLع+qWes˝'gnD++t'R.3ڟ)leHm%yMeOm"ÏLVL:; lDN^Ρ:S[o/kQjDwO}സiv/Ve dXy[wM<{&";TBo\%bd e`t4%-qdtI."ш v%@YPO\=|ǒ)Q^w ][ Hc_5,m=J_9ePl9j<~9.*5m*Kvyf=aU}fOc&Uvt(ɒ]8Q$}R6IJ9z}c-M.jJJϏԘYl[]lBjQ5fyP:LMS5ĐI{'s_D+lDo퐹f w7i֢v뚴=wW]I.^^j[oˏO֘' ?vԠHo"t뒝oA)7זn4U'R_>zNO'5{ PTy$:OAЦ D/@,A^5:\#ygBwEcQ]%2ё*h`Ԇū40{]m7=`""؇t>mA%U}cKrx`dpI NA^urvzp(GB6 )8UE®W70r  >*mv͜ިDz։|-ICr ;AH*D6u0l!o  ;Ju;p4b>N@!lY)S3 žp!~ʊq5VG!L gF|Ow{]MTËNGwb:XΝBBC^:ELC_BͯH<6]+5vgZ-L+}J62]nvv(uK瀠˹;_3WX>[buݸC~緬 }o=}sC JС[H0\ֲܾU=CQ;.yʫX2zfҹ|QgQu=F(̡۾$tjfw.x{8kɗșD-<,sty,i aoiI|~ߞ~zkJB "sٺ 嚞$oe<6K[4ɬ&/P -$X.ֹ* UycˇR"ƇdNv^:/B-|gX ?pe"ֲ%źX!_ۼ9)d%E/Վ#['Fu`݋/ߞ|y/~yrW_Kb;--4\_HnXؙo՛l2(2ڪٞlL` |# (uK6@EQ|]' -=EԊ?nՏstO}xqG gf+1[&.XwO ?f{x2z vUZ=oO<~jc[h=qCi2J\^7Bzn?|$ɫn~L:nɫS'glKz;S[-'OιZmٝ-OW׻eX+۪>_f;[rС{LO艓ל^ϖ|זvwʛ|;:wkW-mW-|7|Kѹ6]y^^5k3ԭږkۮڮ~G7?[Wky2oL /}9w3ݻw_~}}~ ǏO>;o߾믿2y_7% eegX4~ ALq8C|!Q&d~űaQ%%=wxtUոEWeLo~6IH1_5EuUإב{z̴< mgdc֡|vAx{㤘gA$fQ"9ԥII @mAI|y?%U),ܤZ@ŏ =SS1pX^MK6zw'zw`AFકk^7=TmE A۶i?6\aQi '$7.+|U>9QI0p <]r|W@Q"IgPaLr=E-?IZE׮eL[BEW&,U6d`^0ja+{0B7n`_3qDn怋('g[IhYb쫞E߇.Tй.*PtyW1X:P}.be5ۿdū EN'UIݠ[4+JBfjH3y z2t)P Uj_o\:𧣛c||fg?<<0H(1rIl?F.p# r܎@fO:,+<dKʰo5ûAf1qAߘDMqxq۩'Ȓl^4Lt Ԭ%w13I׷ͩ*kuL(=j oݮ?PU\oBE @  1df3[dA<&"eI}|SL0-dԘnB)tJJNXH2! o]u)ࠂu=tjעMO݋B(ZTB+91|($d.f3AƩ$|`& B WQ%k!|æV *PG<˶k`ٿ3$_/>6gIGޱJ@U%f9Jh>KS6̡'J]t:==mHz㉡4KeZؚLOw G'Pg"6VD7l&$'t VIc2A37)|Khr hs11}H'35$xXd"7xڨvr_,Ue^EP7[PW]fml_H.(ME dE9f&gdRN,FQ+bJؠ%-f<1X 9gG|@Jz|.\h{E(W ?^׀_iܺZm6\YuGf^E1vlbOF3%5fЋ}R8޸⏜Г_rV6(*r,6tMiTU2Ln c+:]BzvU=XԅJ`8~.. So삙ҋp̆תK!W(,y[0 mFƥl*lȢ;z#Bö^=Y4Cѵ v~±#|p2+5dfrlA3|ͤystӧOIl!-)|Qy  ft.z}'B纐۬\5Á$aaq>i۾ qͮ4.vK/n>re&L\D9!@lEN7%@.E2ۍI'Cѓ"TpхuXж!=-æpCя"Ӫ`#3]'źt+-)'nI#*8>qRgL!;<☡*|EO>?_~" :(u\OG-fT1fPNMK5vOCя$d۲k9Y+$ŸfLH7qL"69_sm?kwtyK|a-x &` a,_$ٺץЃ:Euq~0il{(0_ dF)71ϋJhE%tP .%!s1A1vzB!x@Z*tEOJ]u)P@ aSVz PUN9I/)bC\.Ou!=n =CK;>xe>f-Ξ㬊 PG+O95quH5pc϶WIitͼL8|x~ET4fMF19k DcY8K (gmUWS[z(N]bfZX{w b&֟]Y6o$ QrЁbjCIWd9t5>"y7(ar8?_zPPp鎇-ƨʸ_-9Fp?lKYYdW-˚`dqgY$Ewz:ǿ7{_ó'҃!ؖ֠SbB!u~_?i ݑmK-_~Lc b#LPWbԁ'[KRk+* KOwm*[/r^_ahKJւMp= wM!wuV7YP*Xm'R #߹X$⒐:KTv$`ħ1{nL_zPظԷ>QH > a`$'ƋC.ECxc;7feg39u.aBKɯ\D.G8qw1kFXExW$F%b7h13X>o #[y|_ӌ"ʸU|AanGyF8K}ƀZ6A7UdyH Hu4!'UkɎb5sg`ݔ5ʚLѲu h?K8~09'wbrLeu;T`^7);v~a=b< lM:<uz"" AX9hl+aٮOAe<;㨑>kA;hYǃ6Oq:F`l;YK:׻ D.m@!-k0;( ßh$AF{B)!Q|q{G֢?w$q$6lB1 H^8~ 4[&H!*T\U K|GV#&PĢm~H3Ҥ sIAmN A ۆplntt}{5;#ffEk"i@#o_4CG?_0G6l/俍a'3. 8 yU<8?8ѽgZRf-sʟF\h;l4ĉ`D#Sd%1v/խE^W )u$..r\r{uE{duhVO6ezFc'}Ax7-yB} N~ %D/|'t H*`'/]C&M"KB|j2},eY0ءy^XA#u1>=eca>%{RdO:MvFQЅ'+>0,3"`tSٺm· ֵIHa`G=xxu\+y\t/7'̖đ'(W4:3G»3)|+~*cFbbM7p!U½ p#Y`p*b!N 39Q=M ntHʧkOJn&/}Ÿ*gQnD>遥kZw.*p\e?B_KǸP.wVoTh@£j:ˬ̶kܕqbARu=w41]F31 }N/e \f2[NPxCX4D}"' {֮?pxBp?B4tG4ʏs^,EP.D|B¬rpˎ(& X5|)߲ <뤈3_|0Ofkட:46"2Q+,ArW Ee,g5ZﴞĠ1rN7:B ljz^#u_p߇vwNl a_}CȸICx,;a BT7< OxBXƉ$D:w a.i[l_"%&W+l^[x ?L$Da;&ּ o5_N%_!2KCQ#Y~F%D"zѤ>ZT}7=wkн;Վ-rs@be(t|zƧ}_@%C)|n࿙ A^ds9G|ԏ;|667;RmZ)T @BLr 6mJ~';Gݎoo68ۧ#BOQ)䶁=#4{yz<+>{M;ѽ;$DCo 4Be@h}֛mZ$TKaٗoǏSxӁ~||:WK~j{b@iByGutA9j`Kڳ%n n97DԘ.OG}B4/=Ө{ep<‚\@k ER4d3!!aS vs$=ɻPxMujb Uv,9-NeqU<Ovt*9./d(S+s%:}vJyF 1@zg<|=/[RXu? 6K4v;f1чvk']&gdTo.>7 ᘠzJhGp@A͗|Xm^-zX`l^e̦gV 1Ykwf L0y*pĀMZL/I/]t6Dz^as9oD 6 R\?a{H1pa&HSY`s#Й&ȞiwxCd;w>HC,6eϙz-`sc6jCޅ=k)N3 RhKRHXlim3un%%A\o68J_HC9_-v.Pf&z@NK!X)${[ͦh#`*0ddO "Րڋݤ#V?LC53?_T޳* G悶erR6ޡփufBa}C˨(ϗ!IrOj-U s"  pWY)w 7ѥ!% SC'0u8jP"cB?*YQ4s rDl[m8PH1͝zxMGpCD V-ӎc W}gA[HDp"v / 1X%"EZq4g(d_sڎAޟk °uYA@ӄPRW{_=SVBD/}f lOXXE7\l,lRz$q.&etc|[%?AuNϻsy]@+)?t:Hf.P4ܭ|lm@y9i4 ` Ă`eB-dȈ JCeF;Vu1V`B,tO i}8s3WBv 6_X`˴JY[~2י45"oz*gXuXkry3)gHf'K6g % rŒBOA UHߕ޼y e)8.{Q&I;hFgOPh7ʀ+^:q`J,D~URG,RĒg&WgϺC) "vϒLgW6@s.qln+(zIYHz&g!pSCvmO@T ~QNq;⒝ʗ؂kw$1zF+Q_ N,-މfHIl %*J[4` }WVHT)~/NHs! XPK;͜"uS*/*ɉRj;~U l'bZ4)ͦeR5!TK [@r'9cBz6EZ^d0%QN?GUl)' ʒ+gAwgSz,ʋ?{'2T7{nK+; )0A5R#H ͟lN^Ešlꁼ8LT{5idF7 7 sd3)Zb+HoH{΍k@Mo%ޒIRFQIz49uXXA74DTќ*/dzSC"ȈMF-gINϒ$h{mr'%ɋ%P] ({PHfD6|[%1.Vj;(uCPeptUHۺ'!`*HkH3" [P.3mF* Ul*TغV{],H.Gs%1X0Dי!51A t1bfvrT5*3+ 1%tfʐ:}4&3)\ %jh y6# J)6(" ʚVƼxVZp{v'N|Ï&Uء`!ZUD4 L |Ry2WR8T EWhI|tAY%gi"\_O\UQUS=<%\0OIx)kSv}]!?-mKi4}?\lIm4;D:u}p,𠹐ɩMD&Mo><@^d:ȨQv%(Ԗi  JqkzJ ԷKժǒOm\e~[noA9p"-i3|\IHӗF,x Tʑ} s: *4+ E))E4#-p7 VtZ]|Z~*A Xd/&*B2HgM 561_clqYoO")ZKXG4An0Iq s8nBYew \j䴫mpЍ}=.s^݈mNڔz]C෢{B\QCy\'ک`Z1d-9>1OasH&$cm725| 8ȷ#P5 FY<t2N"Xbrtv PfidǎfItXHx&Nvs6¯BhΕ=ّf`;,䨏fh1m2ϔ儒ŜX>]@tQY`SÌ헎n)ztHR/P LtYQO,uLOS&Y9`Ln |n`{E?Vm6SNTő}=v o@H]CD,($MPxPke+$I!ۚI)Tq-e6qAb*/F%hJ|Fsq󾇔\x>$J*m7$"Wgq S4e"lm։D+Pg7uͤg`d-,qg1Q6JsC'ma7D+U@UR_3rF'ۭ ]y)/*jY:~^~!vߧLc21L'Sū#!VGRH q'i4{iVؘ*2e.[+T1 0VbEgB~"h\߂ 4zVEZgj`h @k4NE$W@k+(^EeP.F^+)q3@gb7cQOA g·)P3zO>PQ8:|D| ("lDBLy& J?Zw"O53m'4$ow7^>?o[ǿ<>v_G/}@` ["=cR>WPѦ@cWUU )KE]4zs $*b*˱%RK$BF! EHfT$7`rNVHW 2uKnjܸBV:ϕэaAf̦7kn l|2ش_Ia hƜ[Ǵr}4s]8i^1=TU>e Ȥ2bQ: m{qT-/lzx o۞P"FpY>{ϔɊRGR#Ymsy)1ULd> G.N/H? cT8n_|cZH~ǁ@"_z:hpY ^4mq%][ovoC ! :zm5̝+. ya baTwJ=1lP RQer-` A4Z[#N\ORڅQݖE6DP KR_@dy=Mż}W1w7pPN.!R]FBLE6!Żp,Lf橵wifnVTvD؁sbj`U k z3R#ONF+ =nW3ግ5#kfd޷Cq_ : Q̫`y31Gh/=M Hrڼd{+ID$ Ig7)H__9zN#=G-K%~ߘ٨3Gt$*7$s Pq % x\u_>%$sU;]Z폡M%W?(Cc.cruY<F hAoo#'S4AYT<{ V/H bwr]B:`Cu߿/V;O0 +XFh;œ X␘vsCG@oO`pe^ɟpju[ uhMg$2`p<((gof/qi[~1<1PC~aUXލ:89.Z:W0Ri^{ŕ>j&?GsrpG%)k¤ EQ fN . F|()o0hwW:ߣɤSu}nw9iB|@]*_x*٘v)? ) endstream endobj 96 0 obj <> endobj 97 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC]/XObject<>>>/Rotate 0/Type/Page>> endobj 98 0 obj <>stream HWYI~_QeQ式}`HH-0evlODY=xgdy:+3/8wbeë??^Nbj:d*Wӧr>}/2L3j f:|[>Լ|Y6?ܼX|߿ N'M9n.yK/n&JϋDI*W;S P.Z }>Uk2I$ ~<VvXWm36? PEk =-Og(V7DM:Z nx7yWƢW$7穪~Wʻ=Ն`Gv:2Uetv^9@6>/}i |2}V>S ~6oM[@(;U[DnصG&%iS\3mѴ*&m!<6%%ޠ-سڤРAil_Z`M%޾$0,@@%X.anw_hdMm6TߗTOjS0XK΃AXѨc*`Rؙy /* :xxM1nZ -ોŎjqV5/({&(F+Ԙ<ʦ:M$Da2ܐ0"1>aP\XBEZ)55$(Wdkp">;\Ox2z!ʈI( X+wDuj5AؾYkZ. >98 5Ʉ" (p2=lF= c, ȃSykb Os@ 7y{ԳH-f',yp?C) "EAE߯ߧKDe>e1-tzUv6ɛ᧬AfP(8rE_!2∢bke.:xEO_YHu=k#_ bHTh-rn^)8>B9تduyoIR|zU?< J3CB9P)g-ŽѠBYS҉C _ ^/!y1!&l׭/(.4힒 L"^/yu}%8i9Z#e~:..2#JtRMk֫R{D:8:^U#$}k= ‹'fVƀo 4! ܕ$զ؅]\RQ~IҪyV=RCFfD<+>G1*l8X9FJ{ 0h Q|z8ҦVYo+D`W@,x (1QsR5z>nfV8ˋjkՋEGل-x07wb@IڟH"To)5urIGAOa"6NR|d\ή,>DFnez,,w&'#N.Vu_r)-vإ bDPfJ-[mk5=ǺWe p^h`!'샑M`}0kwA5"P@Pjhj.܎XQSe6<{2^u~<>vo#jMdZzA{+^/~>_*lo>3t{\?4B/yL5mH&T{A\EĦ >k3,{q7q7zsǽ>Iʕ vwEλM鍿gj aM&Zc ]m)Ϋ ֳ T:H~apaZPp ,8H`MK+J.>$%meUg tZ al3\p=?l1k!k63֏@R̆/Hqd.V6&j먰(ò3>z}D/x(Ykf`{EށF0?`,s (@yqevu#z Uj1-[e|7q }Ȫ#*52yyu~$ڈM{LRcאeo)HVχ{d #drnXYGh6A-CXJ%Ul8/ hE.4V@E3&讒I ;Plf/6:[bY{N{I x=N`^&?N 8TٛVJ%5ja(s[@Qc3Ó"oOnxJ$|Ƴyܬָ;ܹQ<.-lzx=BW*t^m?[#mjamy&'܀ )+cZa_1Jj%WFE)9 fR=䐃kBԌvn4`6TW#Qv;6CEs÷qڷw:AD;LЗT׏Б #'5F(ڦzR@>5]qbE8}b`D 9[<^;4l=(zkZ =nPt8_倸]Q]i}7QuOVD3-'^Uev@ŧ  )ljܓf!hQ<@:IR^]ХzR!Eba߮X㧥XBC vZ;0i 42߽.Q;Eihx|ҍu..%3E>ymX_XH _|_-8ķ+I H D]Gr J8oJ*^\pK*ra +č.p:/:%N:Fe\wcvk7^]w#g 8VNVp^lWayξV懤BMj4&qc\;k endstream endobj 99 0 obj <> endobj 100 0 obj [/ICCBased 169 0 R] endobj 101 0 obj <>stream HױK#o)v+!.Bb1]  őLh@⮹)ՕN$~{n$yëXvg>w< IoK]}T}=8|>V_+V՗XA׃ceoK]},V }fٮnngէE}0lDH[R_w.fʔI  ]KXeN0Np\W~W{Yji2"~'-%.U">_q.r|--F+訇[R+lV.Yz=0j_X+=欼\fb$O竿#\6t@ňi nLu\Y މ0B#EZNz+~4*w[.FLYb4!]W9kLt1bZ.>s ʉ\/+af;C"vqY_K囯~lnbĴX]|pRi2Q?w2]rpR@ ]Of|_%]by$ǧ>?ňiQlWAjDdlD}9SV.VrzL܏F[%>Qň)],lLX縮\A#$wqٮӃ0TOIEZ}Nv3wԧ 1%n ?M&s"׋|e,F# :]2f|o^YW7`vbĔ..ەL6;Cd0kOITY>x,ň)9],d,'Z=?:.:ѵ22w>ň)!],++ϲz ?D%wy ~4*w[Q.FLI]d0TO5S|1vq{Yyf<&' 1)vL難Ytщ՗ /_[AGCo5u B1]!p C@Td*aː!.r c%&B"ͅ@s!:{#g63ΣwYgw -FHZ->il/c\lm̳s] DAR-~-s>ŢZToTch1BJr2EQ_bdzX|ԯ)$T*7*7!!%FIǸZfv2Է+-FH u[b=Lbڬ/X $ZVbٜ?f3+vhv. |5 -ZVlNkE}3Rbrn.7->ZVבOǸŢZTO}C*Z\m֏KLݼ@\h1BŽ/l[r'7~F^}_)|p-Ofg[i@-'yp\W}N .EV;]?ުjl7Zi<;ȟskxQ_b!}FTz'\q=3P1zQyW_J!}˻\~q]ـQddgmlZhŹ2 ꚾoFc`uZ_}ckblݕl!uY[q=3P+5 l\}c;b$-#G0ŢZTo796ݦe>l:3 62F;+1V?PXC8p\*{ -Vx3$Hdv2Qշ:6-(-BXm;6-(ZԲ\~J}cb ^]H} $If'S MAx9 g2Enx],d{h1D/ c˲.W=-(ixϫAV}cmb ^]H} $DzQXOc\p&S$Llv\*5D -^wfv2wWk@?b0j>h1f>-^jv. | `b ^q=ÙLXL`7=8Wb-lz@QZ4-j{"@ -5}ߌ@bXǥRQyWGx9 g2Ebi|Nf'#kY= H-(blxN bYWD x[Բ\~JH-5}ߌ@bVb1 l} $rdu\8z,RX]eYgbb-/yV;]?ުW@xuM7#1ZEez8;Z 1g8)Xlv\*{| FHKulo .Ha:-f]="-5}ߌ@bTZԲ\~J=%rd(XL`7=iQbBu5^8ܿ~Uo >@-^ǖezVW}3RYZ{b ^q=ÙLiUo Gx9 g2Eֹu%_8zq=X/ c˲.գoFXZrtx|ꚾoFc 1i-j{h1/ǸLfXIZ\8B|yY@I$-fz[!yk2h1iZLiׅ;$-NjG/ CZL'iq5S8k$-Njql6_BI$-fZdsSII$-fZZ!zYZL'iq5SB!2-&I8.oR+$-Nj:⸼a+$-Nj⸶[󷅸$-Nj:K7i1IZtB<-$-Nj:wA`:$iqWӵGc[xh1IZtcU_j|-&IXIZ\MGZ|rvKGz`ZL'iq5]hqܜO/-&I-p~!~YgdZL'iq5m[!^X\i$iqWӰ[$iqWӪBZL'iq5Z!ii>IZ\M qh1IZLG:c$iqW3lj-$iqW3q|;-&IIZ\dZ!zxsM$-Nj&~!7-&Inq|ݥ͵b8IǗGwO6JI$-Z|kW$iqWsM-~!>k>LIZ\u8B<{cVb8I{ ׃h1IZՌ5!FI$-f-~|U1f´$-Njb!,"|?曏Tj⓳qs|iehiN--ߜbqjo5]jW3r/./#ďF>KB pZ!w|\zIkB p}mqxу cZ\wLJiq5GW6V(@iq5?bj2-Y|8jT&Iz㣅K-+-"Ļ-K-ߚ-|o#G{ --ޘbV`!~=i>eiq58B<33#miq5?>XC_Z\ 1@whq5^`Ho0h1@hq5Z 5Z\tW]h1@hq5Z 5Z\tW]h1@hq5Z 5Z\tW]h1@hq5Z 5Z\tW]h1@hq5Z 5Z\ٻ /'5<O> /~|͹ wV6V=bNipln~6^o׭׃cWhq7}8?\";][_apy&=cKxzoܗOi0 iU}'\Q_\^ŋapg1k.ܓap|p>YpXp跎cp _^w0\d-\x07]X`Gp(-7bwO{ul 02EpIow;KZ --@Kbhi1ZZ --kF2 endstream endobj 102 0 obj [/ICCBased 169 0 R] endobj 103 0 obj <>stream HױK#o)vAE#BSE4b#L7J00Fw]sS La)9+"H~ެ}f/|e ԗ@r؏;{՟͇2Hq{~O} SR_U/ԗ@&ُ;{zq;- {OCkQvqsYku7ϣhӶ +˽FGf|_l84 ] ,JXa}f5*U':q{~w>RҼiw}0޾#vFv͜)i~%/Jem|Zvc)avp\W0:R_?dP7mn>v?K@ُ;{_Ӯ3=C'/,HSo7 8 ΆC0_Xd2(U˛pj%,ds5 Ŷ||~WR~޹{gFX;tZmTg@՟͇d2(,o{9`t>98 bP"^O]XY}Q4s2H7Z~q6ԧ@ԟ͇9J1~v;,T-˥B}V$PmkP,^O˥wmgRZmT/n..q[jl8To帮3FGs@QmkP,ʻzc,n NGoi۲xy1a޾agázL/ԇ mV*өD0:G-~٬fYjd2P* +˻K"_=Ŀ}0޾xX8 dl8T]OFR},Jmk]'SOq\̙#izA0yq?:W/ðP, fmo0oEzvK*rc{UJv6SǓ[ݖ.x~U^B3H-5*U'𺶷//qq?:WO|_!3Q~fmZȋg̺9Ezdt*3\\o/߾v:L&u͜vw @6ikCZ4-0@I6BXo7 Ͽ}u#a6lF\=i),sݴm^s~\?4˷뾹eNzv6w$/gޤ>WA>4jUO&2|#{m*:<ߗ762їo_]Ƞ~t_JEC7 dFLYwےG E ʉ\/K\̜)0[ dFL˷bͲng3f8 bPk {7bXFG_}7DfnSXY}M|#,m-WA:ѹ~%ZΏ]} ߈)\ۨ,v6{A9E~% \^O&cdFL̙|_RW? @ڑoĔ|7|*']OFRTESz-(U5˺?`Pq?:W߯s\̙~<"߈)>'ar"׋|Jqֺ!҈|#4m- gv;r/諟 ]7bJW/n.KrͲsuWA KZHRё3=Wat܏+]ng3kɍd2P??@*oĔ|ۍ|~Zr"׋tni'7.9fmo_GS}qs)ow7 os=V*kUM$FL Ϸd3gוݔ=U?W@boĔ|ۍ|~Sq?:W_Fnֺ|#dd2(Urs=s"׋|ednSXY}$ FL ̷^3gz>̲ (1%-vP,P}2xowyͲJd~ ߈)9p&s+coޥ6 x"!v R$R0E&fmѰQr @6r`*O! yq8q:z?}x7cq OKo2lr+ϲo'a+ۧ{"i]m2h4cY. ("I7a]Ŝɋ\^V_ -T~8sݨ L.ݞ"GV|g''Sdzlo54lR b>E~k/YT-˅Qߨ@d7|8r37E\V_@47|2z9͎'Sùwn@rarnW+h>EY;,sXˊoeoW`7| --z0P?,Vhf|çE[d~Ri&өKfE iqYg Źwnǀxp]cM |çe'_ KdzlQs/YT-[BD"]s1LOf;\`yWT_@X7| 7ߗn/4MsaC[++ۧ{ GS i׃ܻy7c:ߊS߽@@>b,A)~x9cWGL6+P}Ao<ߗn/4MrI% |OݲsH4N0 >w^x2Q?Eνw>x͊na;ocැo|_d:4M#,sǀnm G7-P`>Z:e{B^>T^DW4+>wRt>-n'c- O_[SkcYsay͊na;j>}oB!wn@XlǑݲ_>*J!gөKY稏'ro՗60Gӟ}vwL:>L ܑoC'>(e oۧ|P,Sйwn4M3N]=MFx9c`\w;hpl, $߲deRP2K~wW@?4M,Zn,q/2ǦY|w,K> ,X3K #_)>ݫtlȷc>U?j7$HķQ <߲GL6[G& g皦L.z#@^O@d~ȷxpDڪφ5FpU?j7sl&5s'Z"O=w=b1v|@_[6V ~+q4dzY}r4 D} Dw=4d:uNJ"@wr|/u 6|@ηxdþAZ7$s׃A,km`o \G'c 2-Ӝa+ۧ{a%o \ՏZ;ABBoe- ˏ|@!["*'sC@WxNnʷO&9W OOF o%CWǠWǿ]` Bl0y !P!Xb`jAp!- OAyAQxk(A[J~Dj^W?{s|,Ro/7 u?|pzz$Gz=ql.,7Bv׻S!iϷwE^~x: >998yφ@طڊկOAMJ}sdI6=q:xfF/Ͽ6μ,ۻ*Zyrp~*6|II1-/_>SO>`rM?眙4;R7dt:9s*jc3??4&ƀ|śǟ|_}[NηsΙ97á)իlR_K=IRj/ x,V5q{'_!$_[ZY> o!Z?~MΏ}rrB3/n|~QWj>n'M@0W/Ea}_8&7 b7ۻw'gB ۻvsr|^|e vݏFjuqֻRy7 k߳D8[FYRik|9VME8QAEo/ !߀,m|O4K+G8 ߀,m |~QWE!SJa}%7 |[Cr:x3dokOݏFjuqֻRPVo@|/Ak3$ "֐w7KZ}RCYun!s>,!߀,m ~~P,Vk "֐;h6V[ѹ2|ȷ5Db>{{vE!a!߀,m rl.,3M "֐oA7Q5cM> "֐oY㱯Ra}77 |[Cuz "֐9*Zyw>"߀,m q5CA' dok Nrp> ߀,m m[fOרO_dokȷǫzֻRE!ߊ.]\#8T_o@|*Nrp q"߀,m N-|!6E! q7~M}%AY(QxFY47Q51WE! 0W[ѹ dokwb]tι6|ȷ5;GJV8], "֐ :\#8TAE!ߩp7nJ[;Έ ߀,m N?B·O}mfGY.~X7gFE!itl.,lE!)uE^BCY^/`a}/"߀,m Nn9o@|ghTVkz" "֐:ϢR=dokw ReWdokw.,Է7 |[C߿OL}ށ|ȷ5;c|s>nE!Y۽'!okwf܏FݍP}|ȷ5;| bZo@|gx۝o@|ofo@|o^H|ȷ5;*jo@|oweBCYR}mwHiF>|[;edokw4iowHi.k dokwIe!okwZ1WF dokw*oZ}ao@|'oro@|'E}ֻR_YE!I۝[e!okwbDow+:W_y ߀,m N&n\Vo@|'m}o@|'vF!߉r7v/Ƽo@|'ob>o!okwB܏FݍP}%AY݅bNC H#֐ouoo@|, |ȷ5[o^#߀,m VTVm;$߀4m ]ٯ/ "֐o\o@|gkk>z]E!1;h6iwHi'Г|ȷ5;>"߀,m m_X_Uwro@| t|/N "֐y^ZYo!߀,m n׷w>!߀,m Bv, gɳ8l/X$"SYi6ś:X-66쌰l $S,R|@ 1G}\pu̜g~8,F$j|ð9>|ð܇h˃;f Òj{Xڝ$0,F8aj~'0,FI Òj{ON/h/%EB%E%0,F"`e3~ Òj*O66?7 KK[[_Ko|W#ߗ^{KaX]|_BtG|a 5\ EEt>^m~p|a {ϵ ]|_MDfj]j;/}w~# M|'w5S7I$wFhޝ5K$Njwwo?k~XDI$Fx['$w|W#x9k~LGI$F%=c^|$I]|$j*&IQ;^ VM|'w5GG\"P*o;I/7{j$Nj;|>9volh~u7I$w{iyYLI$xO΢1Q|$I]M|GhwM|'w5~$$w|WS6kݐ|$I]M|Gמ=j>$Nj ;7I$Tw$cGI$TonjH7I$w &I仚"=j7I$Twlpޝ[M|'w53hOo7I$vݷok7I$pGw7I$j7{$Njf2'hW$Njf/=rM|'w53GGq_l5,o;I|kwG$Njf&G &I仚w‚vwDI$f$ڽ0ɓo;I=e|$I]M>=;vo;I7++)&I仚~~&I仚N󽶾]o;I1go;I.k o;I+?||h\|$I]MG~3CI$|Go>."$w|WEc=c$NjƟXҽ;Ű$NjFhOa7I$Ռ9[{&7I$Ռ6o;{Guo;Ig7{7I$Ռ0'h7I$Ռ-=$NjFGGqU_l5 MI$fCI$f v\XR$NjI{cEQ0MM|'w5m^Z^$Nj, h>OI$UVV,&I仚Vv?x|"$w|W$k]|$I]^{iKI$f[9o;If~x&I仚v|$I]tzf&I仚);v&I仚w{woo;I|oF~z||$I];}kvSM|'w5ה7ýd$Nj#9$Nj$j3&I仚a펻|$I]̀ptVM1~M|'w5C[Trgf|<>vSͷCGv~z[|Ws|Go.,h7@C]$ڽF*jhv4'\:ߧgg[@\VV`$仚;di|Ws|k7w5w{٣[]ͅ?njv?||HIv|WwKW仚;~#'՜ҽ; 仚s򽽻~]Ep>WvZ]j~7ý C1 |Lݯ&/ <|G;]|8:v>stream H׿k[ A** . \(XBltSbh`qR BlS puIuikBb;sf …kyΟ/@SȔn9E>VVO6PT8uvPT82%[N S8 8[Y=ِ@QSysڕ@QSȔn9E>LSledC~ E%[NZiW~ E%[N S82%[NՓ 1n9E>h;]1n9E>LSȔn9E>VVO6PT8uvPT82%[N S8 8[Y=ِ@QSysڕ@QSȔn9E>LSledC~ E%[NZiW~ E%[N S82%[NՓ 1n9E>h;]1n9E>LSȔn9E>VVO6PT8uvPT82%[Nrf-onS (pZ+->}yY^)XMiv2/oSPrZwjͦ<[g-ŎsI"[N@^8.d~|sE^"2Nz}+{g׏cyQZ܋$_Z/oSPfvEadb1g&\áy?nLg+_|-Y)F# XռZ.,6ᄐ/oSPZ_ ߿2vCTrXu *_/8҂u<˲tgpaYx|Y]ɗ7wu)q(-,,41WP`qZWl9^./oSPNV~ ߿.O{ٿCk-ܑ-^.!.Oj6? Z~83b ?n7wu)q(>[tg]v@ޭzͦ=vn1+>yr|Jٵ0i|C'Eoc#~܈;Hy$[N@ =}pf5voï^7u)q(d`aw\@'y-~w8\|H^"񏉶 ҽdbF<-TŞ?#yr|fdciOdtZwCypa-v[+@y$[N@7͇xyh$o ,=~n|sJ^"R_ZO}RM&^.z=+S8ǧ_=5ԶҝAwqQܞYu{:ɷ8u)q(fw54]>@n^+j`4( oqNSPW/}Zl6-) ?LᄐoqNSPɠVe0`iiZ8.<9LfMM"痼n9E>eytz]m;to&ɣef07H^|K^"[�9 4L"x6h2F̿l&{=9u)q( R>ڟ.FvvÌ>^{Bȹ&[N@}2SXPV8^|sM^"blvzm+{Z~<[ /"l5`V˹&[N@=}췱Q?gȋͦج5ar;w9u)q(0 ,-a.zzB:L8<.睼n9E>Ǜ~ Y{hTVjO?rSP`sO&ߦV3H2z?Im;zh҂|N^" ?n.6I0iQtǖ3(yzfWy'[N@Q/-6Iby}-!0v}q+q˲iJDhy5{XCu} @[ZCa=D\WjX>%IٶYFBg{]&ԇgDBo0/w5Yj*UTJ h"gKZ^ "hiDh3VBqydEߛf^(I,1a>f-!0 VlFߛh2&f)6/mz Bew\WjXnEFT8oyAL^w&>f-!0ax$8_(޲q`-z%?>f-!0+r}c. lJDwD,? DjcVBs<\ kC/C  ݧWɤrt@jcVB t5UrW&} m{[LySPBo IR|*o[d?$@zhtqYFWZosm z B3/ N8!6 !e"S6=ni!J;i7ʶ=NSz%b_dxXEjVB+u5Uҷ?v'z%"_, 2}MB[ZCaouVPE~KZ蕈J1J}MB[ZCalU̗ ץ!rn"O^_usmz BmoΛM~Te5[Q}MB[ZCl/+a8Mt]!}8af:lroBo<ޞ,~|չƟҫžZs* n$JIJA1f} C[ZCl}Gp <7Y^0u9dBD,nv;G0z;&aaSءW+^"RZ蕈ECXQ'} C[ZCi HxcÛWzbܾ^_ ;B/CyNmuPO;6 =nig?E6eۮ\u?Dl)BWArlT^=D QZMNnV9Z-yvo_?J̲,,\,Lusɺ"w ^ftcEmVyAC`['͛fnњ:V;O(S,D_EBh$J?7~0NӖm9}q]!u|j8/H<H 5E>-!TX>APsN OTC`Wk,)dʐ;8WI>-!քƺY6ce֏\EQq%RyI/kR-RtBoX1`$XeF*\`h.6oz}5eգ~jGz%f}D[ZC yg4BD6%ָ<}+EWA"]ls>cz%_GEx`O&J6[>F-!Vm7,.X <}?X_iBpޡW}bÓsMp#V+@?q|lbK"r{x{Fۗ;_(Iʶmp WQ/BoXV_4EpŮ;k_'}'K DTtUù0$odRV Wi>^3n$z b)>eY)5.OEX9{|*ɵ~B3Z% \ apTz;\.,p]vx#/_m;F\ 0IEe)gϸqK+v!!oM% (nU>ӿ݄ωj 3<oCz%@=k_gTz;"p!|7o~T=ۗ;z3b&UOTpzl;xx(~ءqK+v?oiE5DZ,[w+)_Uy貯PEÖ ?U[z%[ >< +Bo=?l&a9DɂO&?Tqz[Ӎ5JƀK* g`z;o NKiʶ4x|2>Ap]zf8|"*d2:u?zC`z;įH[IJ*c8SQ>vU/$Pe9J|/o@?L/X1BoW~$%-bwiu} B+!NAXKlBH%YB,@i-.),n# rvKyw9ML&y$|=SبNn_q ܘEVdJ,p+1'ZNQwܿ]6Ăcy^/tt-y{\Bg4Oss{GPv}nvNW#T1yHBW2# Nio#*pSE[V!G'?jb`1Vۧ:N/^$_h8pXhD 9vBw2G-/sU ~H\< ]5n_vΊs3(>jbc=܉e*"<)_prഹ+oep>@H4y#Ǽ[+l6/䡷$ѸԢz+&O׋|~ QbǿaJX7?4Y6>'^,xQJXẍ́r(lI,A[V!G+mf1mҺO6%k qh u؃\BD-,],h[;JA{š>s8.NGEyS%n^Ƞu*H S8>ҽe&z8Fy8&Z5}D܃8EF2Dpt!H*ڭ;@,D[V!GB@Q'8>syNu[Qx7}`@Enݶ?\B$/C<6^j3 Q?cBa3rݲ y8^7 :[rx;bVبN.S<؞TwOw >EP>K+ˇypnY<XOLm0j4tj⚰[ovڤMSD薹dsϢvt#[s`3 ˚=7GkU7)0sZW.X0ˡ3Б"~~z>]5青?zK-1u; a/ v rݲ y8<&ri*Jɗ3qJa>y1iž:\1R|v}v!"-W?v_ i5hW.#Kt󝹼0`eH u;Btj? u*ďa-o,sߣ6޷Ù tXVi3OJd @&Ytюn'\{;L}+vۖDUN>qB`pEccکt|]5fU IR(hds6h'K2_Y+l̰K8\B@cxl_LmםWQD7 L/}:}}]36yA,1_T(hdsk&rj!s@[V! ~UpWk1wfXgxTw%:Q+@Za4.l \esJ.*_'`GxB`}ʈEV4f2^l V\iGU(T~bz\ZfQy(擐F /3ףlSneA>vD[V! ~;=I~!0%L:|]l5 Lc[;f-_F[V!s$G;ꝿ5 hG~/CA~YtюnKu~mEXF7^+lԮAep9Q24^LwAq߇CS,x _L nw{jQ~rUe| j^ZY>l'Du*poaa{{1V+f+ ϟB+~eLuW.3ۗw<rݲ y8\!!+7;J>6ۤ4;;6M\Cs|ޏQ>孝|LF[V!Ո!5U\,8@3N΢vt#_[s_>mgԵ Ki0tX`( IJ`X{XaOe j7(ज़=JZzP{M-fʹĉ3O*x^C mbv&oߣ7A-o;f7]7i#eW.Sk/Sq?9v$(@&gٱ;躥PSA*:AEz^:لaŘ rE/#:p1of.қtR vK:JiDfLM7/{=_ѐ݉q?]C>5A͏3XКaI$RKݦW"\⫯~+˖[uňXa`bBELNO{ܞN-+?ݽ ǓN^Ip-XiCw'EwveCOG&^^ƐAYN~麥tRw0L蕄Y @+2٬7HAC _JomuK)袥)S:ݱ+-rKd1`ӎf^tXdubvxP8ż,&/z1сHܚo)ː~/і[u노v`k2qВVKh~~,bdb؜G$s s^'O0e@?,kՋq?Y^Rt:kF~.'' hQ  Bd%~ڑH&1PL8hU777AJ?႐d׊^5%^H6DAqs:r޾'')4cAp$ɵB^ɈƬ1nU^^VC/C vβW>Bs48@ rϺ]z%ƃu sy&RXX,6.;Uq?q?k. /l^R u ǎC``}8{2Fq?@AD2ˇ[uq?q`0L<Ñxy-'^dY9{DO/0!e~77_βG:D౒-oE9vt"Ϸݪ{H ӋX,FA/*8X7S 麥t |3܏^]R^I񐢻a1}.>@c2tM =w'ߪ麥t >&DL/6^z8IdDI}'҅dSp[?]nb?+Z ^%X=1@ zFfO"Y<(E麥t&w+ƈ?o_"G/ Iݪ{HfM/CAκ]X,6.;[JA15)x)!8~bUt7lW4EG31gY>~uK)J64KG=, JS5 iAj2Fq?]eñ``D [--麥;pОgd }yuG/i4i q?]5PZ)tR z I01q , a{ݪ{Hl6^n+eJzn)F d {F[苬;~Iߪ[JAёAО?,6JYwc^" u"@w3jiG~~xܰ]}uGo0{=?W2iwSe Zn) ]Q` Rͣmk``ѮȁY;xgoo^!vAM/cLBteJWRз#t0h@N:Eƨ㢭k5~-T*-<[X~=_Mh8% gY>~NOB-oG@p ?]Hߤ/ֈ dٹ m#?`rzjNRз#DL?DǛ^L_yTH_xwsk?^AO pYJBH&3]<~7`ӏ`Ajpk٩ү~&`erw\T hLBқGMȭ !r>0djB!o. ~ֈe_Һ}O}y/ᅬ_/.ϗ=Sy| թ'Ce:l귟~}ɞ_Wt+ߍ !.:p;毿W܏׺pN[.b?¿?Fy{Wۗ9)W~#W1%ԩggtL6;9=ZZo:UӇTz=?_U%‹Az!l10Ћp܏ݺaw-ض]./~sRO›0/E= %fg%zVn}쩟.Ǽ ͉x|U,M ^(_U~|vvv`^G&J;Ӆ2<ڦt(T~]Y}M°Ĵ|2ΒC q?`K?`z_Rжm˪ag$Чfp頡`C0|_;.& D2kF"fip,B [xd{.zFreq2jiQ@?𳅟$LAtؾ1.,fiOїz~v55¤3HL 4LD蠋я{=11V(~*=8}D\:"瓹T ,//+碙z 2$MKͣmzG ] 6} ÌlۘCLpy@/ғqA͈3rtRN:eb1~N@w_}r#A}0#^d{}bq??S_oE3" f"?ve\. Z-ӳw߳_Ʈmskn4g)1 ACwC :%Zb5:۝\/ܧBH4U4Ցz`uA cå#~NXR4C/Lв,k\[.1xԥ@wU7R1C<9C.-~QyDZH ((wjߥ-=|4 zK c⇬3{}CZ$%MK7ؚ_`40vzDOZ:t^2}h6~'UMK=nGYryaiQNpoZHoo |WKqAsWR4mC 5`X7WXnu8[o#~lM3n%u \ryaimST ?!3Ӈ1un q_:JZ~Qa/T[A?ޖDD8b8 \#~%\T-'h9'l9 C|6^-ح9-S^1Xd8<ЧL#~  [N/BѴ = 6vzDLM!߫[*(AorѧL#~ I([N/JѴ =s g(\mi5D{ٱ;3h"@fS~?\Q/J =)z\a!׃9蝙JtAfu%)qA2 ZrEq(E$L>2 ClvZjw&Xw6ޖiEĩ u ˲S~8}\V_izm5]m+G`L,V,2hm*h30qk)^T/Jt=f'Ap߇(b2syx>GbZa;m羱$?1|^M)!Aqc5]zi"-g 0񗻽-WXnuh wP!h=A?A׫vrF13Jc@Z˲胦 ~LCYZ/Jђzf_80evzDO?`+T !1`.W"賦~`n9]Z/BzRsc߿sv4= "~/cU֛mi%N_%8im~+,:=L~;:@oŋ"m֫%ie3J/Jђz& _a f.=uXIf _\>kZ wu4VRD`֊Et]H]#N~O?;3$3qMp~4 )kI;4=܄Psh ~zqZ>n_? ,U#L~zgtI7Is0_հiJi{eYp?le㿛N!wwvLt4A/0sei`=*~ Ċz{z fBOt(k.eYi];ՆG.q?AbEب>=Mrd8v'N PIwM=h#nAђgJ~8I׸KB۬9}hZXZ_OXQ,~g߿YEOԓk.PЕ*}4oWƮW!V߇Ob' mR\iD6v^yq?AbEt]z§$G/Upӈjףoaہ j9G (x'GUfDzDy_OQ~F1=SN\>O/M}?!F ډw 9֛mz~ Čb,&u?^L03^0 o_3A=t]@@N/fq{+ R_ 'Btw?A~{t֛mi"6} ^ AEH ~B׳iG틵uOu@OXQ~O?K5]пv&AH;Y)œ;hBW +*s0 w?X}.]fӎ=o_`Xz^KAew[Z ~?\nu< EV,^"'B(s8s!oݯ麀wzI=9<X5 &ΐi赽 iCH9o*d8O.,GOSfq8CzD/UAebz7M?,>zݎTv6W!VGK !(s)kbK>Miu<W!VN\>OhixrFg8.,y q?AbE |^+9oj⇣8} }e?fx[ v޿Es6T=af.C>}+ /Gb^COXQ~Fsv&3?,˚}+#_XZW&~ Ċ{0Qoq Gtݭ7ԚYsVF3b+2DOXQ~es(bu?X?uFq|z*"A` )D 0 z 7((XgBdp:*_`7W;ܺ4s.FsΜs㌚f! ߀QݯL9~Dj=K.^Et |F|5p97)|#"Ush7ۥ^IIhr2yrх{}l9)yB>{Wb9(_|t'*|F+T4|5XJ}>{Wb9OzA?ꭢ~)ׅ |ƀLr8']]GD~w.]F*'? RuF%)5 CLJ/=ۏTio$+{8)߶K%>':l?"R~>ur<Au /gs߆񰲶* |M!s߂u~DJ^֤CGm̶\Qӧbe RdkzaJ§l?"R~ϊS߇1~e)}}߆J7mLFnw >W7`*0 ᧽mLQuQ8|FsLf<'|n#"U'+G+|'f!+|Ys9-~Hju|~[H=OǢMƸW=kLߒ!|elNt3Rm÷m4{ /~ DKTStHjm6mioOO>9ab)߉1#S8']܌GDT`?-4c=OG17~ Rh*[Hj9?4K]>y.U1fN}?/jGDzf[B,YOVM>yj۹-fZhNyF[H^.৽n ` ߌYN b0 l?"R~_Tطt q.|?Lߒ+dGvs2kOHK|;M~~.Y.?x_)Vvʞ__:G k~DI]!'2]R)K`]qTGDd~[kAu cK~.Ǯo,dS1&Rj:fǁǸ>}nJyۏT)Ú6DW<fL%c9 J؟\t0&Rjg©osk~ ^ʋC&m Wf!;Y?^:|#"UJw~[k@Vdd\5-q.GlUl?"R~rïr~r' .ɒR%cXفo# #"My#_6zA w"QJ"!ry0 WVۏTieσ6s$P佭2dzsHFmano]omM72Z>ꉰHF'r]C.aweIǁyRl?"R~rʑ mvs8r2yrхox,dox? jۏT?뙤 W<…]*7f5|!jVNGDߛ\>-w]e~3|c^3o)̓.|Oۏ4o/*r׵`J7 K mͥd*S߇ʞ'϶ǁoLT|^om߫F~Dxݹ4 Cmۯ)ׅ?X$H:GiTz]SQ^F~Dl}8OA?E^ߛ6V$/ЕU#"UfçF&+{?UTH$?>MKl|!݂n:l?"Re^I."r4r7-de.|:GMGD̶߳bnn$$-Rwibe7cGD̶~qOT%d|'0xtf! ~Dl9iAuExJ}?ϛZRI~>H~Xm?Y?D0 K J*.md# ~D`}]*omʞ'O]d߂P{:GF>{G2>YH{R?>_$a(ר,MM>dW;*g|UNl?"Re?} x{+Vvhj?_'|Zo9s92 2~w.xhen_-)Hu /JnsVO}ld21x~DT<'|,W"Q*~8ۏTjgg5 UE4Z(库nfY~vl?"Re6 CxLJ1oRq㉶vTß|vl?"Re$ξs?6+{^nw :T']ώGD_L?*]"2XّwA*f3g&#wG4rZ1K\Y%&Z,.b%C!6p !0*8 ŵ54 rTK!7+ f]w}}_~6Gkn`p׻rMz_o?W/\.8ضPߝG~;<:bE@{ŋ:- T)WTԟ[5-_뛛e*~dFf:25;`MN^ @‚=~;<:b?8خT*'_^DP榽xf?՘k<^j6 [;;S~"ow+z V3\^:/,4֗+ TqsԞCC=<:b9SUkQT^صDP[CC+cWol^uЧ~i?Xh? ߫jfϡlV3kXG>g6bqe T{zⅽSt||~榼k3(7* T{472'] l l lcYj6ZɽIP察-M7T3sBUi,#`}MMMM|i6R)R)R- gH&zml 9')mVXK`){\MMMMMLݸ9(;w' lzfSfll4`ז_{tPEoz^[j6[j6[j6[j6[jM&fijKV-ysJrdwz OHllllg|fSfSfSfSf+r˳% kcD*~ l l l5qm?F@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>VV@({ne>Swf endstream endobj 106 0 obj [/ICCBased 169 0 R] endobj 107 0 obj <>stream H׿K+mSh%)t)"4N1C ҅*m4* ZVB `e!»e9lfMS<@,7)WFu1A:9ScrQhmno]v~! Tb$_d:¾|T_<=BS`9g~x\8[X`#[c"֔`9ӸmGoChܽ=ҩh7 bs{*bS`9oR?hc^sV' <.1 yNu0"-SyONqK&OB 圩돃_}WGISq[>yZ9F)ߡϝjٽ{HSOzM HT:<.'EH:yreT{_1|ySu#%OB 圩돃Or#|?z%'OB (Zg|t{T:=GcSs7,h6{;/X!XΛ+?pV,l~t3RCh3uq;އÃ|ީZ5!`Q_SS.od2|V_<='OB biw:򥌄y72oZrޤ\价T:ՌzƘmK>8B:9S1}Ux@fss{+TY#! VV6kkv wo+^Ch@VP,k*|xz$H:yreT[-yVW6`D.5%OB 圩돗v NGFӸmd}S{{zey* oWwS1ߗ/qZ-ŹҮ;yZ,MʕQ}i_׸mmd2á|c5}fR dr2o|c\ΩH yZ|ӣϓu04T$!@bh6+ҩKLyZ,MʕQ}{+rgZvo^>#OB 圩WG=T>fbtx\BRSˍL}8o|,_gs9aSj /},so~} L6yZ,MʕQ]{x|ci^*xērǁDžF),ACgv_!`ED˷3:(!`E\ܧҩ~_px;UW~Ӭ"OB I2ˏå1uovإux4NBu!"di8B("d qU(w{7 ][KOrϽz&k9p|<WKsQs77Ch9sf9W|Ƃ-.x`YQYU!!`ݘmfy`{wN]xZO-|Qݶ)SswgtS6U*sCh9sf9W|Ə [8oᰨN*oSuqiK>nE~(~pOhIXsT.`{w*9H i9 'tk!Ouޯ޾>, ̙L\?W;;iyxH߼G&񧂿OB 6~~$E]wu|OB 6cwJ݈i~?!GCh9{h;3>*Q/I"^Hu{=U^xZrΜYA~?,|.hy~AU'SQ"yBfǀ$:l_mȧ$)*wş>BKGh[uoycMs+Ƨp|Z@L ○OB t7">Ɇy|'~"!=m4_Ux+e *~X !9+>c)./5M{COW*Ͷ%~X! Ks ŲA$y?P>%bS1V0fݼFO ۶DHUY Ӫnwr i9X. -ozI8z ,jJٯNMaSsr&+/UxӚDu>T֔:LmiMݾ>_UP5"E6= F\V5ΕT ]^7xZU*K^D<~^Sj n򼴦oWӚjwqT=Ul!=m4+Du|.[Sj@ZS(nGJZSB`jOlOB @Ι3˙3VxU3 i8LkyUa ]RSCh@VU,$ynQRuTۻ;iMkw//ď<OB @_pE~m{QSB`O[ZS~?on_HRY8VaL|<`S溸㉵LYDOB  ݢ?'*ky*ծ@=m4VA0q/==^,Rg1_(.>>θY1AѫTe弇L'ů99@SBٹLxt ^{Z^k{@SB9DEyQ*ժeY/F0sZ_<ϋgrgEQp>θY1A0c2h BK}qcxZ@+!VChr :.ggì :Jݹqlw~^_ 8w[MsΜ9x􏿋,OhVh yt>θJ`:?lq eth-//Z&"UzSI;xhBh *ȪVTj՗yhк q 礬>Mlŧ^"ukf&'Z|soʊ$N$.\o6DB 0}q:E_Y_>be >^n&S)2QEhEZ*/e-\XuמX}2QEhEZW5e >,}-\Xĕp"!%Z-@Ck|^`.B P,?lM2Jo*io-\XuA.&QEhEZnxDh"Ţ { &QEhEVY_>bA,^n'A,-.A,jU/B Pl~x~Ah"TYOx~Ah"Z훫f/B PlNU;nt{=Eh)66_cEh) oS-_<*k:*x{Bh"ZwZ.Z-@ye#Z-@y0B (6ZXZNB ({e>ޖ EhZJ*Z-@CrxxXCh"rÇ@<!Zb*kxiX֌J@|?#҅v,f x*> ҅VEaV) [ (.jǍn'6ĭ4ė /X|œàaWg GX @<9l*a!>9"RTu{0EƁfKZwZ.^ x*>#Re#֔°տ Zb)BkgowaJ3*B P,Eh-,-~NaڕT (6ke>ޖ 0T (6kh>+ժx{ьJ@|'5ۭ/_ө>0]v: "f C}".$\%( $עN3jSVrragZJOGhZkEW❓@ru$\%( @ru$\%tӟ˿|ON<寿á'B Plr!UGI :JQH@ru$Eǵ֦( $WGI :Ju# <Zb3U =$\%( $WGI :J:JՑtX;n8'gӾ:}wNg:}9?Zb3WGI :JQH ( $WGI :JQH@` f -WGI :JQH--jZbCh0OB qxZ#S`(&:-@1!Gh8B PL>stream H׽k* S b:b: M,&AL#L7J0&3MTh}8pEJI+%]B 'A8rɋ~)B{?g?*^m?Y~$5TW?UoT/4C0xi(Sz?lGU]DqnwQ:Cu.ī;:8VS 0lE.ookQjdR0_?GX|3W dzZ1 n<L+G IMi,gj57XmG,P)WU=LGP-_?~&SkX0cz*#v4WI^w9:ju.ċ XBxhqu?CX/)`z"_5TW='X|30/7zWr=|q/{KL]Z@pdRL!j=X|3WlE!Gos`kzAoRfZ_a$ZM.Pm[<2d {-窾>Ly U{Ag2zY#W:~d+c8wr`AN$&Rf uDOzo `P),K< =i }{zxNC2VFM:!>(S^AboWSRfq]ttěT/,K< V¡m[w>LA9 U{o^3G"0Os`oɞH&+^M}!yq]Y9Hx`e+phF3kwTj-AF"7c}يg9T v/{ ͛zЕLi)9ɡm; kwad"~KC|߆P !>Gr=oCd*^Myq][}]u;uUs%~0ޅx`5C_ߢ˿}>w U[|? 0o:X|Gߢ7"8T _]wQ_Byq];|肧̴x`UT~&#~{ojUOwie[pB+!NAXKlJ!bs 8mN@ns!.N#XX<]Slw5ɗ/<87k}}7NROO=8jyR,6m #Mm.%paevz` B1m+srLpV5!A!SV tRձyW!HqҎGzs5W]Ӽi3KBana20r 2>a_.C!F~b.w0\*wBSWysYo Q0!0RN\Ic4/wfyۼ[ŠyeC&pae||~z`0B1|^xv\9:4o!&㺹޹tRձy!p8ig&\=vM2;63o!!V\{\y_[x6"!(J\uŗ FBQފo¼Q0o'!T1[[jydkgnTBwˋ策̚0r 2j>W=0+!#L+sѡyw !D_ΪȚ>Uw:7sz{ m&KR(5W]Ӽ^ pkgg5dP~r͝90_]g2x6:!,E\xGkǧ'oIQ_Kl.- ~&"Ia^|ǭw;fyؼ,\EA I,) J%po=?g/E| 7>|yQ%e*2hSEbIèX?掷$|_i jjX*UNڱys !uzKǮ͇}poI>(%D%~;gkrtHbaF-ͭa \VKAL,%.K)p>l^p^/BYe^K"wnĒ% '(} ڦ>s zpmBAfsbdYD{KA eKzgXfstulBA͕oI>(>%į%o zscBLK\6 !M,XD8"V$t-闠0rD)0`J3ϧr.!ėaE5_NzKA c[J $zaM`‚3$F^7b\Ϊ؉vbI>(KA%aGūWswi‹k Y7W˷d AK"G誷$,^aЖTs5dpW®}#:0/BRa#IoI>(WbI:$b`@8Xp\!4Y>:6?#BsP`bXJĒ%M9Ec!T{Ճvl~d'8b}7, qĒ|P[J86WE6^ BȹB.3iDkyKA%wKTs54g^ƫHt Q(GJ1 P>I,ndb,FEwqvټ9Ln[/gU0%m|Gp|-%>l.Sbаys]4aUD8J,%'4AI=@K5;+ go//2ɹub|8LjYҧze jի`9$QмD/ܴ=2ء!B\KI;6_).پǧ'vYðccR1/cxv9DF6KϤ^`>0swjyGC\oˋGyNM2axXy3-˹Fcȼa[02Ӽ1za2,Jfy4WisC>`, \gxZq^CMϤC􅚫Ǯi^ OOHyˏ;^5 bdnmK\yVW*$2ƝnSbfs9yz{iSye %r 2@d˘$XR4skg[/gՋks1x9y}f^Uūs]Y&H[Kc4/ū3'X*R"*;\ZݼI"paP"yrj>q^*UNڱOY5bA+犾xfs92Ĺkrtxz{ic H5)g6y|z2/CLīvۼie G\߁E#J* 9o2&Ǯi^9LeJya@[/gՋks#>N- b^Ƅ0r 2FLjFIpҎ \^l> GI4/CsKmncձ4Rye^l8EeWA6.0Fm_,QtBn*KP: B dXS@tU% ߠ> \.jom$؜<9Rf3014PP1 Wńۡܿ>9џWXdCXo@EŁjewy4osֿ,OTYD>(.=q%)!V(e7yP[z5F84@ C5(W=0$w~N=ߧ?M;e6=<*(4WEq Qfj :cz Q5XD弢ûoЫ^nӟbť>c𗞤>M{^}Y-cmcn+?/ |e[i⼢Л@EëMQM8z{5|5qrE! uɧcar^+ns^ձ$^jricv~y <^ۗzW㵬a?J˶'iJQAcjף(5aܾ<+ZxSMe>i ,pmL8}B n]@QR8NӛY|{rчMj1=F|W.aen_,$MR@˚J)?P=F.8^ ]>*$;( KQ.A5m,DŽEBq]z !ѕ7zq,^[/xXXcSmc1lcFnepnpIa<' <J%u1=FypԤ7'[hiAݖB+˶1 aOZcI!ak K88jzO!^/"z 1PP1khczBס+sd x1@#Z=' =Fj54uҺeݦ *VB>Ur^} ?wק!kogql⧥ jyQ޴nnʟ,2PP1gݦ(|k'zӊhz^j|1O14`41 wקwX!pռ(p^u\AѧnYCS~: W4m*rs!賷rػt 7 |+]^"Oggo*jY7Mz|:=ȟ$ \!\Ugz jL|zu6e!\!,,(K5*W(+T6K}VM!Dp^c}{=0az# CM=ƚޢ$jac oZ4U)1}& C|S~ Ϋc^!$EA$!X.}>7 I J !E`{C*ox!Vݮy-^hjis.iJazl{+{B/FQ@ಌVM!)?P=Fqzs{ފvv|a1BΫic|^7ͫkz%ºIB00*q]JBΎcwO}( CRQG 1"j1=F0)y$[&Q)}h =X@jp=RS{xMAQ ]߲m~Bٌ_u\{B@Q"GMgv2B䠌sX{;rPlǭvC,ncT|WI& 'Jq] LҔC,S~"zm cAh DIY{;IB;e6=E6ἢX(6ux]̏0=h#*v1dq!1l*sӄA[CPOM7(8a2;nj%uq{%gQ6dD<*ND(;3j6((XzPS*)^>a B}\=*V qZ%œU ET.[5]ϨˋN9BfFU杯_nkמ4lR8y0Ŋ[-(<=,l*X٤pZ%K0lvZI7Qʿppi,3f*I†:kڨqj}si88;'[o#Dr 5}EQU< NycjVR (2Nk80"iDE]W[f*@[+x)2VI*iX,[⭃(zy?~E<%N띖x ^;Ǵ*x )JV QշQİVRמNcgO"E*L*a[Dzeu)0Rd8(hydl/G Uu}kC~{Q܃c Y@#IJd3i)nyOjcpXAhh'HRBi*2U+£L_P" F"يigY"Jytm"Og%OR *=Zq8l}SɎ~|uz>>-UJ}a|:ᆳdN%qOӢC-RZD4GG`K_VJvI8 TͲ(I* #F#B&{w%;R2MB`G["fa>k󝾻dn.ώb1d(ppmuW.}}j_WL3B}%*J+%?ȥrҥ/1-mVx^g\ }?'^w@jfY8c.PZ1|i6񹵛 6t ØqU,K$V,b0dO{4ɥGQ5}qw! N yptH_k?O>eq!SZQ V2U$O︂زIyE/CJ< 1>T=WFOJfJz UZqz ^+Nz^nzA/CJ񜡗fY-}I֝_Vq[aÐ^lCii<^ƲlY~x;ɮE/^_.۔VI¼sQI$5ˢ/&AP*e6VYI? e)ֲ_,1okYٽՕNJ5+i6ԚAa0|/gYT.Ð!YaRZ+U~:/]t6F(SGii\^Fdžoi<phѻ"[ƾ6!_(VYL E-3 ?%iO՟au--ۮ\.{x07pN^,(~2 Jkລc W½OO0UzYٽoܻj_,s< qːշFW1Mz9x>}y@b5p]z*~_,}^F>`OgW]\U@sIkz(Ne2fYXŞ?..I7J/Жhy+|a<}{ܿ=[>7@/CV_0p]z/ sa0W*,7~"'U/B֦,I:x 'gOmЅ3dHZˠ4=/^o ш :< JjuUJ9:˰i%wn_)5]al2v?jx2eXŶ rBȮP׃7>i6c̶he2/IwI O ΰ+?V)%êJҴ2˷rT\}fx'6/0Zח8a2>V9Ƒy2aOZ22n_!r$#jUN %i2+xrs$%¿9}7 KXVU  viWϕQMʽ/6UEW 8Yժ<='\ޏOSnai* 9~d+"^ʞOK2c σaҧU+xJΰ O;/(^u*QzN+)=znR#<_voF#JҔ==rqʛhroK1Һ#n}?e^J<% ~<u]-I ^F5y.+xuo ܆?&"x[YJ6 ډ$M x|0;¿$폜rY(R,79%#|x|B8lFQbK+`R\%* it=o}x}#g +_Z]zpJIlǃ$M @x }wg%{pMEA>?Y~F;~o%7Q>Ddgv ߇SZyU"\gؕ˧4in8JD$X2H0m>DDB.cɔ VE!t=(wl_eRfID}x\cVI6>|2~Һ $KZRjǒ'*GYSUYFU>DDIT+૲M$M 4S- 0KдzlRQ$"ۗ;u; MV|Q'ykV7&lv_'#^Ro |y͸Kߥ $"~iDD_T9WcDZ)" |ƈn[A߫?Yvrv 0"]q굧 ]͢ZW/w""ڕQ6|EZח""-lawAtNe‡hRmoZSV놓>TDDЏW|ӚB۴ u} '"qELeW*>KDDsr.|Aϴjx^8DDoͶ-a iVaI#DDtJ{5[ZrT"":ΰ{ׯtK 1|xt 3*Ifۇ сXnu֙>i* 3|lܿxX[U+>0DDq _$4>-DD@˛CZm6JgMQeUhАi ~< 0JGi4 !"҄S- fADۗ;ulZ]zx ""4~E 0f3y§H7\)3Bzn>DDǃ^@t3灈H['g<DŽ& i2^OI{`{]T[sZ97/U{xnNPu(ˉlV<7'"vC|~󩏸oku?KQ6\NR Αj4?S|CFͲģsZ?MC.N-|_;~:r3!ޝpk(H|KxCjU`!;D>"^Pj5L!'>U@&rjZެ/>R1.bOxn.0GtJE<@jytJ|rөxU ݨY)kn|xjL2ZiR5L!M3]4*HfnB_(UMuVy5 D)/UsKS__ZVl7sjN"Z#U۫o/@j:ansjF޼NíU&mNVm Q<1Un|{ %PREqˣ`K:.JZ 3?ZWJTT5w:Zv)枷wj4t(7gٽkU4PjUj:Gʛ{H.'Ju*w`uQjUTN{`?tj[qݼyY .6ZRj}MK鷵*W*uP+(Hl6_J,Sxysj}*2ڡP+abZ,nPj8Pi+{^ j8nTl6DbB}j8\omz[e]7o}jEJYt*VP<>stream H׽k* S b:b: M,&AL#L7J0&3MTh}8pEJI+%]B 'A8rɋ~)B{?g?*^m?Y~$5TW?UoT/4C0xi(Sz?lGU]DqnwQ:Cu.ī;:8VS 0lE.ookQjdR0_?GX|3W dzZ1 n<L+G IMi,gj57XmG,P)WU=LGP-_?~&SkX0cz*#v4WI^w9:ju.ċ XBxhqu?CX/)`z"_5TW='X|30/7zWr=|q/{KL]Z@pdRL!j=X|3WlE!Gos`kzAoRfZ_a$ZM.Pm[<2d {-窾>Ly U{Ag2zY#W:~d+c8wr`AN$&Rf uDOzo `P),K< =i }{zxNC2VFM:!>(S^AboWSRfq]ttěT/,K< V¡m[w>LA9 U{o^3G"0Os`oɞH&+^M}!yq]Y9Hx`e+phF3kwTj-AF"7c}يg9T v/{ ͛zЕLi)9ɡm; kwad"~KC|߆P !>Gr=oCd*^Myq][}]u;uUs%~0ޅx`5C_ߢ˿}>w U[|? 0o:X|Gߢ7"8T _]wQ_Byq];|肧̴x`UT~&#~{ojUO2vImø9mO`.9 A bK!6_P`ߒKQ+D7:-_ mEx&zSoMAzyuY Bwu]杘UT1B83sͦiWzucm7WB,K+bܮ'HtT1׃B 6ܫܴۡPh|\B1R7k#ܨwPN̏>fx*|x}f !ff s%\-L^C!FfhnWJws!9bs !.7kE+W1>=0WB fhTubpXoo,$$, ݴfkˮwPN̏EVڲD s5䕫^_g1UB>B#n4+T%}tTUݾl6 e&_ B8A;1?F/HjR.ӑ O K+Ǚ2\uBQ4xGWzucqT7d*\$A߉\%O7kQC%W93B}Ql6H%?WMI@i//[#N) &FE7w$֜RLU#EXZIHrE_fMp @&Bwz&]|C:RE[(~$E\o$G2.8*$7-qBw0jn #H+WnHr7G[eHwm꽜QJ.!!B-o-~$(ܧ,J eD_O&Y Gg !VCa6OH“Z-lE[$6 InQF9އE6p-4m InQ,Hrҷw?0a|^pW2Y9J.r7 !Ø@aQHHbQZǧ#?XBuEOR9{̛OjKwN`'|nWr !> uI"-JǍ>"-J0UE[pΟ"ibN΅@I` ) ! W?ܢLHrRrmُ$ozbRIAXv훧[vnl~$(MG"$(wI٧- 1AXf+3Ur !^'F!ܢ[b\~$хy?ܢdeeL1o>AsJ@N;C_܀hf#-JX̏$r^m#i¡EoA!ha B B"^Hg.MƏ$(ͺHr2o~%$z*K ͅ{q.ܢĂHrݏ,J٧-c fX-:ZqT4#D(h~$Ee$(QtYI~4 lLe"Kj,RD[S$QY/Z$(a䚋$(N =W _ϛ0.10A(-~$E#IuA<>MMtm\:1wdV騲߬)>Di}aUZ-4O\,(ٛ߭ bC lRSϙcÁ>3ի /$ 3{STeX^KH\}bm-Dc1%WI2٬ćR3No/#<d+H,$J岹D/\65#ƎTxr֫Wj0x*yu:rV:kFfh.QۥqX{^HJNR*C75W˸}Zx2?Q)+LKCtaGo^a.q'=N5 W@7t$B-Tr,;{\0-(tciBHb}njL1o"y(*V,w/cx?e٩\Y΢K uzN=/^W =񻲀鞞Lw˶=/Dd_1ܤL!fhT6艋slF|/[zW$%~zYp\^;3ߧwZӴV?=q=fMxp@:̕,P ^H9Tвmg!^zNN遦zӳYR+ѨX97C:!7L -V\z"kdz3F8@O6\ÊK8e3?CAt } 2eێߥA_v-篟 @aSM8Cz~oʠ]kM2WAg!k^g3 8 JISNjᒞ2<{<}h8~~ZC+=_rH5 e3?CYq;'";Pmtuӡe۽i+Yp^K%DdlijN=ݮQgTxҡzN*Ļq$n ǗiPgē\ol&cZӠr]g(*}:Rh8u=~BbpI q#Π1NZHx o8g$}T~GM8ie۽_vg>F"8y:K:`A4H [>l>,C*=SN6/jMWvg>F`qG&0,G4as8V鍡btpI+̕,HWg>}d ;iO4ş?p&q\ғ+^xi Qno5CUo4uE=<$T!}z ;elwg$y%+bhaS$ķ:@'Y05 zv¢7R{ErDt*iR/cmQ,z4Yf/۝ICj/8&-ۦ"X9qr]g$Ϋш>Js=%epW<*7Ч'"ď*JQRti˘Kis:=!~lyjӓ?Pk[w.= a/۝Ʌ1}/=&3w/cMp\@Yse9 Y~X9|"L)e z/aX?= FC_Ϋ,(= KnG#z;QKq1}z^iУz/w=FF^^;3 pzN{ӣQ?=9}cjwӋ/ޙ+Yt韑>_(J2)#SL/eSyAODl:Zwt|E:em$Q1=qev4ךI+^;3WR,6\E7xlۂ0 .d,g!`_g3'3nf:靶mXLۓY$N@l~Ym{l,Vݽq^=ЧG )W~۞z! {HW'npQOOQkAһnS 3W?#M2x^MXʋ~Gf8]/O \:;e'e,,I/s/n`ſ3b(wa(ͬ,{HZ@ӧo&q_8W[P\<\K%zn̫^X!se9.3= ,z .}BΫш>s㱢Yݽ5M{N{ժ;%bpt`/Ћ,zyѠ7/WYqݙ蟑Ve:}a/1BhD8Kd-xϏU$nc' E\E7^mco뵦iw/cz% ڙ ?gp@/P 0 e);EfVF)?8|@t%2cHnggK* Γ=FQ8WOE)7\㟗^O,<QЧNENo^>pI/PUtiZޮ_L?j6}6o,z%$ ju|wE_a/۝YWQ$+"$MWq %\YBV] w'gC_<\k(R޷z^^.!Eu6wlY5 9`OZ ;X9N$ nG_mY+;`T $BF`I!Ŭcm,3O$0*K20`mI,_M 72rP*F!'/fi:>/ Kˆ z,r~H^==VcY֦={7o3\?~5aau>{ƶܣ}Bn4Rcp@ޏ?+%Hl-aHy$hF?}ɓ ^~}>:xzQ՟Cܣz}apޏȳ[;}vQGãD1@3MhLX|W*=?xbmLRweb_6-KkQͥtZ2|ixT7 XB;M4/oUK_(>we-hgLɛ'{-Y<]pSZZ=Pt?eTDഌ?}{vvv&^I"Qu7)_EGH&}kr$cbg[ԴRxWHZa.(jʹ,bĴ Z kQ?;EPRŇ%~^Z* T~Fn1>.!~v&<fJI㐻V%*H\D]Ѩw;㐻VzeZGM iheYbg[ :U`Qu;*r5舟蓚qn\>_1BcZVQ //HRźn4ď@^`Z֫nLT #[B4:ZE؉O^`Z֫\>pT\ :! :?L.lƴ LȨj<?ʹߏ<´ 8;/U5ͥjZXF{X><´ Zv8+AGx뇳j7ô XFUkuʉB |=ژVEn41j-h5-d=d#ՒVZ%>ՠ#^3+rw1=#⥒VQq>VdvQ/-h~ `؞i{Nh+iJ&![K%rW<iYؿċ$1U VRJK_D2ٰ+$1B#l.^$Gڍm'v#0BkahT!ŐeyX)Tu~.Lp4Ӳ޻~?kstoCv~t0¥aU"xIQ>Ϩj U`l/lxUDHiiӲ(ՠ#^i:XLb%k!U,i´ # UCbh~LnŐoVat|}QՃj%E^~?A~bZT2 i═V! K "aHnl{=)L0*VJ~PA"\ :.m_jU`Tq%7,ζiY*dDaZNJKO.mDt>qE]0*\p73:}auX)FlA;V;.mDxmUb~;( \6"b*{/WxU~8^r¤VrG p#u~E*,=Y\gYZ=ꌪ;C;nlmI>`ZEbg;Cwn4RkI䖊y Pۏ!ΎOī%1Bwִ/:0N=`4kLtf2k- z͸&eVfY$-]>nl{ƨj\؊cZD29E!&ZLڼlg񜆟/<Ŵ 8L@.jIl5WÏeT;L +u}kck15X -hG 0k)r7-ps_,ͻ]:JnR;BTڵB6S螡K~|ƒ穵Mr%z\:MDևAnUc ^gHJV=[!"runoK ߣER'_7m&=*iYeT4 g'HJVT:(anYDVm}WG$ JB hE^-!_ШI?Y&\U \1Ix\=;Jܧ>Zk>O*aIVys8G$8M_W,2 +(J4xڹc !ވiO?| "SZ`{kQ^=HA F*p=ik"SZQ8~ϲm _dI &,V8c|0DA^a|aF/6jczy< +&SZe}cT,CW_9uפ}ДV8OÐ>?&>ArI &C|gQDov7}}JiEƄ>@J?eQU;d+Fzd3J-zQ]yVI+Vޫjxk(PZq^DO}z$^>xWU~Ei|O喰K_9-z1W7Mz7&ʯ(ҀލEtdžah gK@^[U^>0_9}$<HPOrygvALOiˆyaLމx- +LػfQD4LPkX(]Z'1YXzxW2sG( .kRZ%a8`JfQSF/zvF~ˆeS^sY*)q..RKzƸeze=pdzeJD8~n]tWav=r^|*,siKNݦ7XrZˏVØFƑesm6(s-`}xX.'.cZm0ҋ/MTDHjOYMixLQ^|ٞ{}Ao*n?6w!)[}(n+E,D:<|oDVPZm0]Jq!Lhi{)}jc SFճEf p. <0*{V^Z#Fwn?Z:(=ɕib# 0cX7"kz|Cy}q٠_jxMMA6"keGo|4ߑ>^xS'+?,FӯF~mKoBqɹ-hD\ϑq Vynӻ%fQtT9ߔWܧ~43CHp rZm$0ɐ~__J_)aH|˜;~~G_7;mYkzwrZ.}rkEH7MwX!"RasHi\ȯz\qۯQQZzv<( I/dg޼(iU'GiYMBJ+Q렷DaB()~Wn]Ӥ_>{xf((4RGhZS,XM!xLoZ1vTUwJŇ>;L (v{۔?Vᓋ/}p~7oNoLOPCiM\"~qү~gTk55p~WM%ER$tSLd&0(VS,,m7]8\=r${}o WRj25N^G\گ(Uᓥwl_3U ODOS{W~<5 .c[T0 /MEq*wPTcrH\eǭ91MV`K8IjN>S].+ e~&~׃LtzCFI25&/>gMlH,%o7YJbN%|z `&jNc$~8n|!gUi 6ۭ<5|Ķ_~w=EB5 _gBɠI,雌mahW*_ 䝃QxA]B;mήWi Eu<=?OۅOL*Y m%n{.cYgg2y`“`,p1QJ-\~>§_rP]4n5V1`៞_~Է+>5V[x$dx['+u{w9|n[Hz O o+9_KOL S An=LVYYҀL&r)oq*< $=.Uk*o.M"0m 伇p݆&&Ui @NVہ'@ƶUiHɧv+g,gx$e=;=?c>sK+34f备gEq,<a׫&Яzqk*Y,gANx6@; ߐqz~i l+ o篔CVۑ>faQLk+ I :?9!dW$wu }8I Vv:OSx^ F!<$W~G}v;zO9jەcsj-n!cIdWv Ϗ9iVۉp#x>s(#jegO> g>BN3xf@JYJ_\ƒdCJwBzW~.&Vɚ)v;7Y2 m%{ۅ>NI,z&8IOM_$ŏD@zJO5Ux~D(L_\j\ѾjNlAzw:D&/v"W1UǭO&ܛ`0/ImVYzY$"&dɚJ=.M?3IDS\σJ=89 x~îWi _(h[m[p1G7vߙ(h[wsHDG[ySĶ'IiHDD)n˳ V2qL@" ﯻ],µL\_9=?{].+V$UxꈈV0 /M-nzJ#"ӈb*P[]wW~7"ϑc[Nn9봈V4Ux؈BN^Qm%I0}'苬2^-B"r3FDu~w=W 'm5O3xŮWI߮Œ:)tS, ]%mu7hl`0s[.gPzlM[yn+R F!uJzyϴ,:čl[ biw:⁈ZMf3+ n_R(oD|HuMF?+ j^⍈Z)6Ŀ[2 3"Zˈ c`♈ Z% ; OCy۸@ VSv+ q'"Rk/ ^ʴ'>}8#z-ދS+t#>w8/ Um^Z-P<:f 2-=' !U)߈Η~wx5.V0L\%_g KERx8.Vn=AyR,[G|p\fZUz{/\gZx;.Vn-%)VtvlV2N^|paRjEZkԗT|pyj^Z(\Tz9ZQɋ.X{l[<"[M)(`2wLkU*k^]|p0iۭxJήVf.#>A!nwͦxJΫVJ)zϑJ<59ZU]?JoeKA`2SH~KX<(v4~0@yOŃZU]q'>/J7NG)q^?SkIODxVb[+~%T|RռzuųZ=4z@KA ^jfħ=L/Kj;O[qvp\JV/q2 W ޺mB/qiY'>?B≑U)VYޣm'FVN˓,:l&^ZX7äaWFVhT8#ttCsZ=JǗ'BW o)kU|{T.dGv\f9A6QwWw3-K<7'"k^])Vɫ>>d6:yl*6Q$#J4jWԼzuţsZ鏦?%.^xwVeį-c`ZnJ~0^w:y %ޫUuow FzћG-Zˈ*Mk4'~cH\%k}V 8*JAJ_$\f27Z% ;_#PtXN@۝x2 Sk˓RjE%ګVeǞNի+^kA\f1ڥV0L\%J(~i{ehZl=o XqHGԪ+jznœ:qx|y+]uūm7V?uJa(ѨXqn{GW6yVJ VSj%'xT*~KZ~äa74u6jtlwJDRj:J<*5yV?5.l&Yy*j,@*U(RJGVt=ӲjUuݚwbiw:Od6ӛP+[/OJM2Um0yj^꺧~mV0Mѝ; |Xqةzh6owZ>0XMRRTcP+֣wʴ3z}To>=| Z.V]dd6Z{U\y_j  ~*33⃨+nwcU 8} .li Y,3Ò8IYĢŢUf-+nV <o]RZ+j@7jgU5[TFh~s>L~iCN*6S}ȾZUnSVӪ:G!'6Uj@ϗzkmQf˳iUub @0R+ݾ=ܽ?ϪS+ʧVO(ZP>|j@ S+ʧV#ru@ endstream endobj 112 0 obj [/ICCBased 169 0 R] endobj 113 0 obj <>stream Hֿj$z~>J@,P81 T* k^a&1XYhdpJD? òϬsN0L{>y?] ;|<:?7?] ;|<:?7?] ;|<:?7?] ;|<:?7?] ;|<:?7'Oρ|Z|odYVG|bј?݈hR7)1`}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (QZ/-0,~PZ}iKPC_BB%J~K C_RF:(-ЗPIk>BiE(-З|}%J ?-$TҚDiᇾPZAi*J ?-n3_@}i (%_O/Wo^]?h>C_Z`XJ_~z|/,B_GtioޘWblni&>/^|nisxZW!Gil3eYmRگ޾50oI-J,50'^e/ ԍt?Fi)-~e#7)SH>JKifj0CAi)-b]ccci'PZJ fcKRZ_yeqY p~Gi)-f>L| >ƫ,OGi)-[5xR7ҙ^l{b1KB%QZJwb]v1)QLk l͇Az(-|7]_]JHgmz\V&*Rڝ_\e>|x`2wZa (-5ǫ|n>ITJHg>Rݱx緛0($TI;l6Z,'6y{Q,$Y&vy<˾7*n3Fi)m., 7= p~Gi)mzn$^̇6&'xZIw(-MƲ1yӚTJHg>R4ē7]-|*Rڡuf3ICi)pn6<]0{PZJ;Ph$OQJHg>RY&ƯW+aP '}K|Y1,EƷoNk> A(-xPF|UJHg>RZ}?Ov1*RZf٫|)(-)uo4|(-fy|˾7fJQZJ|e (- >xZImֲnHr]aP zY(7o`-8X;mb ܨ ^\CZH%c?fюzzTwvY>U9xvs] ӛ^ݼNei"v]UHy~,u($D`iYځu1!u eiTzo['>H|׏>WWWI,0m2J;0m9Ԫ(kU%> J,PW4d6XZ%XZv]s4CfNXZ%XZgcO2?,,-K{m. 6M#>,J,{ᔝ V ,;V|yci`iY+X*I4`i`iYubF V EfćQUeiKk&OKK۶͝6M#>N,,blcD V Vaiqb],M+>r,,-"KKu4͝bz,,Ү]W$tKK;Ң($tKK;v1a3uObi`iZ{c $tV v~ݶ2`4XZ%XڙA+> 탥UMi9ܴОXZ%Xy1v]UЃJS/-HUQ?:KK;v1!uðJ-m}b-1XZ%Xɕv۶,4XZ%Xi/c<EV v*k7XXZ%XI)^|t\,,K[Hܹ.F%ѱJc.(uUNUgiQZ<IJc+msuķJ*ҎƘy<KK;nfeˤJc(-8hHci`ieK[swHci`iK*uUoJ"E]iҊdJ1wC_ci`i,m1;_KK;Lim2 i]xJ XZ%XZ=aZcL$YZ5XZmM, A|XZ%XZq;gUU[Zb̝ćщU\޺kWE!>B,,-KCiiO KK! s](*Ҳ?WSz/>,,-K{צiemV|yci`iYq;o7,,-K{ܴs-\afUeiV}b-^I懥UeiŸ*E!3',,-KuU!H.+>L(m%Vi4r->LqJ[ U"FxSVBi~}I*mYOCݺ랏\VBiv6MSTJ(DUclŇ*l>۸'*ܜquw~35*<=vۇͦ$RJ(YvѶQLDi+J;sa]wisqJ[ U6M\R:(ft8ܯVx,>̥(m%Vis6ۛyJ[ Utb]w]~s&*mRݢmJ[ U62[|OPZn? uםƱ0/PZ qm⓼ll*x:ܯVca>VBiq4MPJ'vlJĖ[|SJ(ުm/6nxI>@i+J{Nr? ŇMJ[ UڛEl6⓼Oi+J[ꋶ俦R:(c? qO]|<-*mm⼚}IF*mb_Pv*mb)m%VikvuCJl6w~.X*-qFr#yVBi_͢mxAiOt8ĕ[wxsJ|8iιJ[ UZ;jb+m%Vi9߶c_K?PZ"Nr? )Ҟ[@x?X|m s6Zxח}U|÷Fd?=;pW.>DWq\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\j(޼fl^iIK?Oyg܌Ͽ~Zjvi@iSSZ)-Ԕ`jJ 05LMiSSZ)-Ԕ`jJ 05LMiSSZ)-Ԕ`jJ 05R_T  endstream endobj 114 0 obj [/ICCBased 169 0 R] endobj 115 0 obj <>stream Hֿk* 8Txq,1Ls rq 0S3R.B i4iL*4¢?$9mgzë{=hGͺhGͺhGͺhGͺhGͺ:_~Uosg={`/N' _}|bJ{*J^H1`}icI2)(QZ/-.~PZ}iS (QZ/m,I&|%J ?څJPQZ/m*y!|%J ?%ɤ4Diᇾ@PZAi*J ?M%/2Diᇾ$(-ЗhJ ?(-BEiᇾT(-З6$|>BiE(-З6|>ƒdRPC_Z](-ҦRPC_XLJJ~K C_TB*J~KKIi>@}iv"T~KJ^He>@}icI2)(QZ/-.~PZ}iS (QZ/m,I&|%J ?څJPQZ/m*y!|%J ?%ɤ4Diᇾ@PZAi*J ?M%/2Diᇾ$(-ЗhJ ?(-BEiᇾT(-З6$|>BiE(-З6|>ƒdRPC_Z](-ҦRPC_XLJJ~K C_TB*J~KKIi>@}iv"T~KJ^He>@}icI2)(QZ/-.~PZ}iS (QZ/m,I&|%J ?څJPQZ/m*y!|%J ?%ɤ4Diᇾ@PZAi*J ?M%/2Diᇾ$(-ЗhJ ?(-BEiᇾT(-З6$|>BiE(-З6|>ƒdRPC_Z](-ҦRPC_XLJJ~K C_TB*J~KKIi>@}iv"T~KJ^He>@}icI2)(_ogw>o7_2?~B_Z]Jjm سヒx?P3dK%c_~UosWü-o10n-ܼQpmMoq(<<=5R߁NS/>Q3y߿yc`[Ow (-,NSv={'yд`BAiq^WnϺ?no24L((-Ks֦~W08C/tgN'yд`BAiqV$4omu{L((->󃃅ŕ{_o! &+׮>{dJ'PPZ|Wy'yд`BAi ^܍M.ϿϬۛ ; JUN$th\0{y|\_˷oA0P]MhZ0^-,..Y~o>ޟY7M &vcʵ֦p J_ʽsÅL((-~(Zy#OѴ?̏ JxtdݟY7M &>9YY]|J?L((-ީ_G)=0^0xqtT_;Ow̗MhZ0\$sMM}u{1д`BAi/ +n %^@oOOFѕkW=2^4Oww/|D#1д`BAi/''+ 73?no24?L((Q?NۤNh`BAi~7o=91Q  [$sֳ9[Ѵ?̏ JGG Kw_Ϭۛ ͏ JW]~_q]`dm s0d]_lOIL(b,O?M}_u~k7{ݯ|qD/߰}u\z~x:7"Y)-3Kѧ[k(:t =p5I&}ݯv_~)6gwSW_uگ/mg^Z鼾-3 pfQszϟw>̄ݙNGͩ% @iL(Px^>o63PZ&2 6Q(jZVT</mLd&(mrCEQ'%_AiL(P$,0l9@iL(P؉%^e[.:/>622PӲJdt0BiHu(Pmc+rSBiHo(Pڍ̓@kvПݐo s(-i J qīl%=l.(ƦzQ^PZ&R v'NT.](-i Jq|PZ&JU5-KF? eBP۸E#1(-҆2 ܯ eBP^|SL vcSC6j ^'Bi'(6lQs=p7 eBPxq|`(-@i7eJų9"fPZ&Pڔj8NB 6u\aZLy!^(-(m(.EQZ.͌@i@i2yϸ_;n2Ҧb9/ e|Stڨ]/Ci@ieIS(K' VNPAi@ie UJJK;WŘ|`PZ&PZt:jN. dt8/Bi@iwCi@iw9PQG;HeahV)2`īl?2&:yU^PZ&Ph;S۽.]iLI pŘPZ&PxNP*PZ&P8|^|BZL pM*e3@zL PQ eҳ/~KfPZ&PX(i݄Ai@ic*U(FReq:m@i@icIT{\JJzQ^o1 eMn(u2H eMt 0LsvПݐkJJo/-JJ.ðiYZLrHJJNVmԮcmءL8{]xLi< ܯg7kqAi@i5Pܶ\<2Ҧn0lZV)2ҦtNB 6n g5Bn((c+ wYmF=ryן JkPPڳxv b4JoJkPPӽJYlޗi5BM((DqAg}PZ#ԄҞv}:\MOT7JkPPڳs}ܶ:~( jBAi[aX~l-F 8MoyKUJkPPLǗnP*f}Մ&eR??M6sՁ&b8Q} PZ#Ԅ^vc6\MoX4JkPPs?<vB(NAM((hת^5}ܺG}PZ#Ԅu8[aX({U BiP J{ m>_~>l)(jBAiKE5BM((Uy[˕c6̽QZ#Ԅ^( ^jQZ#Ԅ^hתگ5BM((5s}ܶPZԄ^~ Ýt(jBAiEX,{hޗ%(jBAi8/nTF{GiP J+z]TO<@JkPPZ8:W) jBAiznݻ{lֆsJkPPZ3 k5BM((thGoHimP J8Mǭ{OB6 Up<°P*f}~( jBAiY,JFAM((J/n&~( jBAiz[}l&{9~( jBAiu8ɜy?5oFVl6 5b㶝(5BM((击ެNAM((56wJkPPZ^BPZԄҚ^+fm{?ڠ&ָ(s7M}l?5xn kjv?57: h'2EiP JFpeAM((-8Moy_ڠ&v8[aX({[PZԄ,rR~~nJkPPZ(s7hx?/CimP Jmv;ylֆ~( jBAi 3x~}3JkPPZ|~_o4kU/b?5qv3t5 ]os5ryן<ڠ&'zv b4J.JkPPZm.W*d3~( jBAiq.QA^b?58-Vڠ&gެm'&Y0,?e.JkPPZdg{AM((-2u8_B؛ϹJkPPZ\b,W*f~PZԄb8QrPZԄ޷[7fmJkPPZ\{Aϧ&^zq_~n~5h֍6 _R7`?5Uf Kۯ=@ ^7=C2+u߿.cݿ[ZK[o4gDi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,QZBi!,Y(8M)-]p5SP|^ip (-d@(-d@(-d@(-d@(-d@(-d@(-d@(-d@(-d@(-d@(-d@(-d¬ 0gs endstream endobj 116 0 obj <> endobj 117 0 obj <>stream xy|E8^U}\=GNf&L I W>LHC"*JXEQQ<O&!`@]z뵲*nVv_ g??z穞a "M?e!6g񬥩y¿rE?_\ݸ!W\v՗ydYs_@`+%a@xʛxŪx/3+u08Z0Ҹۡ1xŬ5K,_:_ K[:)qkIa@ O"En_BɯuZotBhz/@ϡ|ډrZZ~#M$8h5$;P1z0:}/Bף}ȉɯ{ZEC݊/L^f ]@Kqk!y[cq{#ك ȋq0wOɏQ_nw*B2kqA]sXtw<}jn8x8#9=?ßǒfHݏD&Xi/ǿp2O>~?Q-Fgw؆b<x >P2,"re~ M-Wā%K7@kaw`e{!GgXl#Cx*?;`35'>K"Ʌ#Lȯb\9W5rK`Vp{C|\"#lv'E+hOaϧ ؐ'ўHeςc!]lyq!/ q ^oŏ?_(}9͹)'x8.!H L$r8gᲸBn$VpWspq34#I^|.cH~&%%0Cx[8!b&S4P"M&JM=Uz}1n-WFRC~O~<To 'x:G֯m4̍x2ZH&:_EKÓWF|=V4vH%;?FGXFUInP\ &u ʛA.L%{.82݀?n ^< ݆Jj%zpX(f7~#D`u8s݈#t%:īSY!<7?)LC7Zt_8< Ec Vs%|5 UfLܽPn,r. b+_RCB:eA;1 MO>$/CW$D}AO'@'h^-E99 0"ٗl$ Ў`7d"&@ ah :;0Bq-9[ =&&L'/GKqI@>|ꔡz͐ WU(/+-п_ߢXah$/ r>rf96f1U%Q9QQ]xDs0mQ}yx4Bӈăͬ[:g=TO\OQuߢ`]8?Xv~km1fMP`{~m0u+okǵԾEM5@+ `V!6dL* =Z:857>abC]/j[gQxXc]p6L\0t5`[QM3 ϝ5!jcXc0nmuqOpuAzq`|ĆWC4olg$2yz~rF#x +Jo^4/ ƕ 5ލq4P׫MC޺) PnUosу-jӬ)-Ի25Vci~9b:h xpNf5 ټAhA >,+Û7jU"Z8_( [f[Ĉ/DNΑ\X4p s$R-Mj*Bth6['6΃hű8iW2W++no%w jf蹯EsWűܵt-nHF| D9\gz`vJ2P%kqyT*oTCIz+~-=xU睟7=F& j~.єPpxMΌ35F_\ RM:FP[4ƍ#7LƽƥuL`5WS4-7Llc0`2yXc[\kDHgFz'"ۉ%" C46H!} I"@)rXN5rg-Ԏ#0w+*KJ8] D/]9K:$ ۇ'8$!M i)$j@ i3D-H@CI&aNr=:,0 &A+!m;V eosh#GR ䷻lP+ @^ xH3!I$In܀ "z iG_ =:h,HhPl[p[{)͢ 5Eo5EY 5E/_ 5E.͢gBfSY'y腼@E88B(]P t#ӹ^X۪Z֗p$n[ǭkqk5npV(Zqiƭoprŭܚ[B$ѥcŮ`HC!?)tMu2wWaM_Uɒȫp㫀WQH< U W!,@ ҷD ȋ!@ i o!l:B"hIz;ĊӓOȫpP7DBzb(v?9RN6lĦ=ߙ΄ ܎?d:}C(Õ(#PBy9˴,C~ %ip=Z؇=_; T0̞{owRC/Ⱥ <.lm\O=#¼ԅKÙn LNg=%TrzϞ@B,U-A9S+:|HGjƃ\"I!) eK>!dM6FYeYyHvt&1g"S7"Os5BsRL'xT?;?=9܉U!0գ)bRrR"V&\Іm'@wNiIڴGc[},Xwkc#r;WָklC#jC֜c?}ճOn?/dvc}.j'jТa/7nm66wi @?~r ~((mM/OQP( cگmy^]m[^ rWw"'a}--g+º%Ϻ`/.~e]ԥ8s]nf#q>TӱL1o?bx93+9~x`mNcG6Ϟ3jsµ3pmQ7m>}>.OhhѰFYTf_qS[:z>0Hv 8"FpjM襾C%3wӗK4[Plŕ˯Dr@ӊ+)Sylku(x}pr}l6IfxU`;h#ǝH۪i;;L)wa=@xN`JڱUaq /9+tvAN7Ykd?c ~KE  G842*Vj~rZOE4&^,e}>KAA1xr%JS6T4PKAMP*R9ࠔ{?+^_;duoͤkxHzHN]j&.N5u&OuXw]48WvɡWsfc3$/F\f%$Z(~ n:(F hPW,VnmnG iX,5 , _/JoF"\5k7^^Z&&yIcHRlysTMŷ^^8L9Z'ylx+ӽ1pX01]u%~EAAѺ$K“}$naTy:FIJ֌0Xo3 jM#Yh`|h8`i )ҏyt;\^x'_ydFs u.끍C}\/=a0nLf҃DI!b5Uc-F5PXNˆ~ pi%|s+s$4II!l3Z/7`%u:Oݭ~J,1jQ̼JPͳi.Jռ:P%5< ؒR5&`nZOO[lH{8-kL;bYgD~~Ez b^H# FB ȫ`|txl7ΠMJC堒C|Տ7h.s:tY#ȿnԋ7yo>2;Ggt m2\k&>,H˷ZNSrC5Pr%9Wi OQ{? ub2> G*V !)3B 88豫ou|Mat l V =>j[|D#+ƍi>њfloweXD80Ό5އh5jxJi}Z7gf@UYm`1r  b0#Y!A5ht=A~gcjkbYSb:cX!_Z$Ny ,;ôFq"抑*%:lE2 #ـd.>UC^$Ӑ `5M7!6bck9U| NbRI,kƛo(-\>b*27p+MMriyv!(wjTԠn\f>X 0*0 ZjtB*<Ԏmv^zn{ϝoBjj\ܴ݁E\7K.Ș< 4"@37ȔͬV UB`\RBk48]+p0އr< /&L4Q~<3l9,r (62mt!Z p$;$I O"<c+cp!It/#禠  ͆V` fv 9tNg$™">-ۿЦ2lRGZS)&4jɂAza(~S8Z&! n/uM;d}D%,kψJY/IUK*\+xZp0+%cjv ,Z-+:R  p @Z~ l+s@}"OZCs8|.5ap|S=̜`noҽ Br6:>5={yr8ΖcPA KT}R$Hi PI EKok6ζD)^躔k)G-u ,aBC%ZF@9x6LGbC};'>$oW|4}xo%2ۅ w%Nz^4ϺAz` \B-*tݲt] z1|nSwjL Ъg޴ :Nka=R5W} YNh8sl{|K5]8>mޞ/&zz53n2QiH&(' 3ۢ"?>#B_W,:XvUE/.t6 S %µ5&np7=G;On_Ba7 w#h2:=_ G ֩Yӳ. ^@4kQmۢv8 [@>WɻBJ ,ं E{BOcሜ#)ިM1aP2E0Ņ=CG(Vc7XZH CQN7g`k9=^f٨E0ZٔSܲ, (C4q[)WD_VЃK;MJW|c3@%>þϸxރM^܅gGv'Zl]9 @%tnH׋N|u:1~A bRaq::n`. P,C?f:2=[zYjB9"A5{"ߘ ;?&}d[.ց>ըoߔy'Ne`y?F^iyB"!*(hrNfB,3)A'iv.u:9)TQv*ch5js i)|sGmʢʇQJzc5j )Yx9x5-A;ԒͯM}3K_uIGoæ?=J%W۽c>8?O%W$T*H_H1) _U&SSBӂM7) NS x^,89TǬO Z'Ρd@h.0~*\w,͏*&7.V4`!f(3c^++s}!}mYfi̙9f(t,28Y13Ϲ:{w;~ N^Fuj3B"H(}h',G];T>|56P^ :ź9_GQ- @Xf3L~UT2c''\ֿlĕ.:􉮈;8oxH$F$T4n:H'#2"rE o2O4sY;qXMwT$,տN2JGUj a#z!t9NW8Q@ЉwΗF.UenÚ+߼ }}`Ɍ ?;ag֍[;a6y"}/hlqRoɳ.?)kcG5_`}yXc1tQ '^CH5Vi'Wi@ZVRߴ,b^]u/ckfVkMKxk.`ch8[J0WݖG->n\x^z곘o対+LnjGNS oL&QLQ'9&/#syG+ ǷzN0s1/ez/]3sVrS=3p_N3]f:!~3y뷯yY=H,d@,p&eaHX3YT eCEDk~>8N{*PXPD $,b,*qUirڭ!'\ NjyqNe]#)fYp]Mu)fJlM Аd$ZFK}(UpjyWXT S)39SebSllqpb-L:z<Θ ^FzjeK9)Ĭ=2%]{N|ǯus6!ݼ)7z+Cw^}UqGtY{?UQxTd,~ArTcDK%ܥ`'1NA)`@NaP8(J` t\EBaAqv ,;O:RvgܙtN∤$}"s ,P]KSfL>F=alI9.k^)zY%JlKqY4Kha |hxs-ƱҔtfYVF1˺w\h­`ΦI^ۮyxTI~2`Yٮĕ.rRP*ʶt1%l,'"rc$ "RD@6~;cş a8L3*gH6>)8[V^H1aeݸiYK%T6ttt=tl={%l t!itG8-rR Md*J¢쭑U*A{L'd-L65X~#R&!2fgC!sCLN 1 AN7NeZS?c ?u"(/ +n_Pp_̢Sb9=B".lVy&,me(8"*P+a',e2X3Nܤݑ>c{=Gwq> |Q^bJge"\><'">0uIQehr5͏[`*' s%"xծC&sWhWH Nzͫ\0A2&R1B2:Q6SVF!Mto{^bjً%O,\yozzWxƐh{*>zӓO|fݏKW2@/N|n8NvhܗiS[ sn>(; l ,:Ml4繙=fYfUY\փBYfU)tġ. _87e:/0'd{;rnf9oZS ga9KPN7SS8>I9k)ZUV%(x>lQmi$f%r:Z 'hjGQ˟[:亞+󝞗\ >r>`фFҹF%H2!FVIОdWzUt{^IApAGS<[ͨ.5&@1]U=,{ipsPrUƸ勍3\3| Eb"_W]'Ow9La>Ų*m?F05;f!b7ٓwXŚj zzs ܙͦAwTXfO+"p& kO< 6l@Dp`dNmV3Bՙ q˷r;o8ʣNyr'nJh-V;x~C*K+87v8̗ ^T"+&U1!N|*e,NrtΪ^i"#tW]{l#t\k:8BL^ jZ2'@${dȂ/2lK9|QUO揬i^BM+ Пs*eR7-w^j6Ƽ'™__K𑩄h%Xuϐg(3BeаиȷG ̛6FkͻK}xgEwL}hc: 26OnT2C+L%/Sɦor*{,/K!"x{fzvzyD'Y9=2& EuW4|\ a2h.,U4[07#lϒԦsȸs_v`boGJ,N唯H>,,!s؇r&G|Ecl3S{c0vZK@Q&%jHy(:AcL]Si|U呻^2~;&_tkܸ|NgN[u>-W{A)vȫ Q^4cRE؟mWJ1}ER>K [ i/RkQawCM*SSbgh(l#NJrR,-Z@GoRtXkYN1*l,e+70ڟjDH)EG"7v!㝞jjSM$hwYlKmv۝V*uF.jzUb]L|Y.G:䙎k㢖#].e'5'dw7Mzy1S FJP9Sx%8s#SYT> Y )<94nuNiD^^3,&"J( 2чLՇ[XT0ܛ'ʏL\!:WK: +&Nmp/_Nu뀑'߾T=Ҹ(`Gߤw`]TYĢE0۞űOjҠڎNBQRdT)iF@K:JN @,%7R~e((QHuFR|)Y /PVUjyr'7q7Kʃ>Y2zAjSDSտճZQȩ sHWA9 /`=tc mpPaD'1 1T\SP+TI#Pqa&"˄`QRa؈JBNۭ +A\744yǛ?9VJr# 7<~.?7#wo{Wў/[2e%ِNZ:ԡԑe'HD,8Fiņ-'x*[Z.KzۢXtg+Y&V kmv(5 /NhG?Pm4 FdZ&`wR,""&Dd/Si/EN"b p [,&NLΨXT5BR)1f¦s(GDF#R۰mzcj%**] I w=m]} .BvB;E9ќ1BDDo7kR9YӁ;Iή4*9H=T޲*qnRcif1B R% ߘG">L܁oHUkR??l{<1 %&r4:,{,6 u%hЍ4xcO^F f:34NM: $XпLdTlNۖo7[[}hoZ`[`_ut5YLl7;Sw^^s|~Gd(i7}rxM?e*tTa5qb5F *g_b~?w$StCM6bXp.477rI#1B] WDDN߃v{Z7!7U{)Igs>n\wO"2&BWxР4YE{**܊J3pJkn}FH {~j7 a8wcpQ(5*_$}ޑ|h^=Y-W],:aLL$wQ!V;҂ lk6"6ȜNԧV@y_X8 b~ x:fߝ:UbB*vFAI=^niXtpYA"(F N_k]t^:30hv>CƒdF<|ʥhJ[o?|5R;AuCx jꗱկ[.XwTT4[ W  ͦm*$QeUcJ|M.-(Vc꟠pߠ`@!L!#ץ|0i6,a%dd͉. pfu^P⾛'c-G1Xsx .p)uW:LjiW e>;ñH]dxAUiҾe7;YQxoػw.]ُ! p"ımO"TYGMn$ֿ~g (Th ^22#tc5}xt y }I1 Jd4_TF MCQ=&bH *P# G4 Ch4h69&B4eJ݀#*ߟ2#zLא"~:)$.4Atڗ/GG!U_ ?Mѥ)={'it? V94 õ/O~Jh ƱC9 z:@\ 0z6]'Oup˃M' MYT Gqi7R/ٗB#rLCN ^ endstream endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <>stream xzyxU9uz5Nw'td#    (Q1.x2\q\QFprwzIHgTNUNnH:@`.H}C3= fݸzĹ<)4g܅{GxlWI? ɧ j1xTQQ :^AZ i=>ýp|g (XE44S`/8 &J@~Wv~ _ip!H@K7, `'g`:n,/+9BA7uXO.$KgPK9 ԤV<%V ?.xGr7 _M^Ÿl?*x@h/~#" c L\>Nw`lǢ*UZNFMG^M7Pir 22p!.V T4E"l~(1aͩ@/.rh8$Ye=2004PSQC?Dggu S.WVdfQǚ !W8wPnrdħ59) `#  xؒo#ĺÊ~ц~<2u%tއ9ơoF}%97ffyk7un*: vzY}ɡV3bz5E/*sE>kE9 >C}\>3rwПz ǡw9tzCosM@oQsC5W82^^Q!=zCO9ѓ:؋zǯ߄8x|̌zCދ=N=Ҏ9 [=A|nu%o&uu};sft=Խ͡8t'v̷Q;*mcA(r-C[6 -ZEMn[9Ե@FmEZu8k.Q7sh%zZmEj'W MZفn -Ez K8 -YТvjQ/Z8ZȡItuh^ނ{|#s{9h6P%ӫQk6CGɖiSme975m* q¡ȡj%To@ZXqj8TՁ*9TсF_/K(^CX~߁PD7ȶQeېCY>S!/mC^䐣;Cf.!c2pHSQzTH!CUJ!U)9,@^$dZ$| x>DDEl߸5/%PpD}BL !B w? O eS2dw/O7>\7gp$&N-׵LMKeF}g4.UCH~^Fy4X~~4q{e9ZIB3ZPYURHdjϵN;!~-~oP%hML V}ZAwAYț_VXs%ew !]ԗ@=flmmS0 Fij&;{_~>xՄZūf70xyBE"USo+(,_u[|>兓c&'m4)pDSȘ2ml'I(RK*Zgr)WԾNh]1Ɩn,gѬup|a!s+{ݤ oϠ*]B^XzϾjI,Glՠ a-,*5d+JV. zEbjf)<(iR5U 7m;T@CjΥ]A-,n[ԥ@_o $wuC=-<.~6vܟ^'Z¥]s痖냮˧EL;d?uCV6>!v٥RE:cL'%C巃-tgK9Ӵϲ=u oAe *GGsnݨ1v›v``*G*gHJci:6fV,Gi/ށ#ia:М]tWVm8'qj:GniDƨ1.?u*vVt,N`t:dhZV2pϯB"Y˽a\%|$Bc7j8 |i]N'K QgGjR֠>a2@10UFYn-VDLz#IJ SUcoK{)j45?&VakN3˽囤 1y"m5A& U V=kZ"ޠ@ldIXIJR!+6=>5$SI]֪\(T{UlT/{,aA`$5cP r[M ˊa\"@)ˈlqRXnETl%xqر`Ǎ !À1D>>dTz}|/w"ntjb %V!!M˜Y9P0N>oԳ6~6FӎUʷrkspY:8 JXE:٨Q[$29|孤{>cgDغ:w,@!f{STw+.A&653:ϏNlR3 TQd=)'%19D2 3,BC9戻)4 B==܏X V* ƀRhչ/^PBms@B˖zM}E(IP!&S[Rbѽ\ GRwÊ>hQ "AW *O+X7N%"Ve*U&Prӭ0r`/LF"aUJecPs?%pfсa.fe`\"AZdfRNs-QhCG4_Jx6mY4a kT4ʤ!jN"EK/͊~v]OLi̬1 lބN |"diZBTU>7}ΚƏ,X~eM_M؜`dP.lp"#5 8[?%ZN$T.s'tAl+'iϿFՔsʐW {yr҇7y0dLa^pzacW4QL^{tڢOȊ89Ңo#i|:0ޑ%jϐ͘IXВX\X w,+@*ô-/,CRe8ZZb y𔁕H0>PvFgy7iiITԳj @HCChQJQ3msj_0+7mU1m1u]2<&5Y+mE7qIRLǺ.HA@WBw ݖ bDŔ=TgT/qE:Iѯj{d%CbREqVUh3=tzl6oMG.x-V6]^'6i3vk5R-0^.rvGE ZZRoUj&?{6VxCfȞƜpĐXiWs=arkܲ" d%pE]f'<8]{m3|`^7/kh`xNT\d Q*d %;u^~4)ZZ:,q$!6ΝͰd!DR4iZD`KKһ2uwCNΖI6t ,UͪIu(i(}YZ7T;Ũu36O__W[Q(D#Y>UJըͱxeקL;cƒeiq?˹Ǔ)2h80Geiچ FְѫuHS-K_u$**NHc!:g 5)r|E,)+ Ebqi`B4!n\,gxvnY]͊I,Q$%ԚktVUL#I^{{AD*#~/[:2DB4Om -V-i%\_2nG9;H8u+~lmr %6KkF$vg.)&PxO3 WA8k< e[ Bly%'t)FȢ"8nOpgE^/}ʽ>+Kh Y=ŧW3;.3niU\k(M"mko9yO^f yijL^ӳv%P5GG0MI] 1X=f +*@`f=yQy€j1kY B!(Eө/tgf>1Ȅ3a6~PM;˘bvֳ*7<ֱU-xFAZ9[&$yN]1 e-vVҐcǝM\]9ɠЖχeP 4[.ʮp:~;R@ 絘ETI!SafvFYPǞLz/˾֬S( d2:6TM%iW|\7]ĶH F(HwmfcuZK7I"j-kdr1)wAK/+vfEKL0f =$ܱB쪅ǽncgxriryDA?GJ2E= %wq²җʃp 'Bch;wE,oVzQl88'f~LdZՆ6%)̴m6FFW⶛W₧MYLtD< >in=ۿnQ=*w4N;erUIu"S+P,W=!$-G|Mc#\?T&0ԀIԁ P4`ɁOGvP=~TYr:`P?Z,<ЌHvs01?~Vx>&Wd PZ7u淟;^Bq" endstream endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <>stream x{{xTExu9H2{ gILB 9If"& țtI@j@@WqѬUz]q!*+o2L߽~I0A/0h~y ,+-m  V6|v;>0:]N^c 'vɚΐӂJ+|,3,]u}H.Y>=Զ߈N%,m+X7ʏpڗvAZrU]tZ?0@6 4He@ @#5Yq1XGGX,Z ؓ7C&|[yh?S2Z@ fHJʠH" ;X §{`"|Aa=ɂd@#$@ v˂zx,8 xF& h >6*>F"AFNp @fN3aY oY`*Le'!A  '6R C+'A\ Xð>$fR  V{} |gSFdG+DOQ=_z̖VAK7ÿ0r/`"d j=9J>b_QpCd!YGun}i 1%\ch>©`iEAn'q^o.W=ulP o,Y ~8CDb$$XH)@Gt67ot̕6&a$GjDn'w?*6ma[xA8+F/9:Qz :a-:Ex0BP$25!FO%]dy )Oj= }ls07^҅ƍ>?z*t Oh_ u],^5|/`q8ka6%GJƓUɣe9NR4өt6@gYv=žֈ.,ŧӺ,kg;: Gna.0bqB-T\Ѝe_`b*W5aO(//J| `P\O|Ǖl\Pl l'0o9ͥ52QaCt݋ ~$d6yصVl/W`jbMdq8G'n_$uab}Y7Ax'/z B'Ay?GW?{H؇̇94_>fO [cOS5x^ 'L]kq>|0O`)] #1fDы(9'ӡh2Զϲ&1YTYQ^VZRTX7!7ȶeeZ3-rڸԔ$sbB|\lLi3:Q`@Zm>`NvhIoe&fXRA $DTBenc_w[-2kF ow[[-Zݫ 81/p[gW/ܨn d`1:}vrN'=nD1u-<9t[[QYz4pэ-~MZLBzxooZ-$at59YdŚNSo$Œt1'7g@v 2jaiB'~>/fIVK ]txTCuw8xpM*]:@wX$  4al[0|7 PsSTP~㜡9WpN}V?PQRBgA$'rkÌY-Oo, B󼱚?бMaryah YO%ހYK_Mְ@4 ;/nW\ԾȽ> 6S#CvSWM{ݨd!%l-٣¾4sRx!9[ q(uCl!&WM 4}$C {KEEh7?evW:=6AM;= 84Eja7o4kJ]Pcc!bP?']Wׯ۩<}^ kԝzk5I !ZۇKk+q>!XQ(׋q>o#X#PdR)ӒIt&ɤ̡L:TSNh^A/h^G4GP/ܻ(&.wi5qV"5j-IQ;!0C\\k\nGms\MA$#DB$U#Iɮ95Qt܆*ޒy+8Dn.U"jJl=#ޡWk=LVB9ZMFXFaي({*𦏉6ua{Ud0DTNjb)؛I N;4|pn5jzjzj S!Oks /R"3Me^4=iz8t|HW3Lf-L i\,`8&h8UIZLYL^Z-r o44|)4ɅqO&rƃTG`Ft՛$U IQ3$HbUrF|#i$0p:#;ϒLt+($HN>USѪKI"?G¡S6m|P WJ@Tv$䯼s/|-{| EVaU ?t?̐@ %Ecmi:+4ΆT {s|)g pB[ TѱF`[/_{1N_#/sCBLyNZy[i_x]HCC6)UcrL=@F5g.: 䒺+Jx ^!:\},}>Mg1HHC!`0 4.Q;#N}n.QwJ ?5Іk%Ά>8_l뛮n V s-.H~ÉZiZ3 1 A>bc ~ $g)oVWc?|cv^xNEq- wJp\k?d?]BybNZ[tg&' ܭ(VA]blb?'bdUU!d ᦙ Tm"uPۤ =2@?Р KtK413PS l(0`si!o9;@~-lQ?D'^z:|Ms-e~f͝jkۿ Ljv gO2ТtI$:ظ"[UgJawsv#mus[Jfaf-ihj0@mka[|)魵 RWu*R@pg?Z7!pVnMn gH1y]EzKhk-2{J|VʕXCUNGUX[=(u+1*tdaeS%~w;[W2tYk/ ڋ~.3^6#hoCv?0oiljj y#({tQ6;;J;X`v({&B%$LHe.]n"Vh_YߕT3/I7H_sEz~j)E-{a{cdg(j-T5UKUH&Vp+H,;UA\A̱;s9ٕ 0`R(m7 DAxW)3: j0L35faexnH1tX\M6ى;*&S}ЖGJ0,瘗w7동253Y T9'/:GqgEeY4 Z*p)omZ EƑjRQ}ŊזmܞgJNIs-v7 [S1>=)wwq͢q1xiV0Z}*Ryj]ý%);2$䈎S&_R&iHD)ح8uH")Z◆٢Q5Q0Vk,˓V8hvH4{L4'񃡲R:Ώ'*+I[hiKINM:͒%d'")aݪ'ɦ4H7h|Z/.c'sqqH{'kx_ºZI4_bхmx@h\`\"f=7}i˶gÜf]ش)^)N;wnm[)CxlFlj :訯Z1w<)fgt$HZ^/Y/Tf 9wiV^m\"اb qX_J; $>Xd0` BG(I7'OG/Ͷp}d!<*D: _WR5J10ď#d3"*UN.a=UYO,͉QjQ[wu"Zqei^c.obȵ/-?8yÑ_VxD9?yJIĖ7!/?=w*s7ίNJ* 焱?r3[tV>T.KRT.KRT.KR-wK8`dVz>hX9 /"ao /XӁ 3*~MGAo[7\< u OLfvh*yy Qf3P<=mPco endstream endobj 128 0 obj <> endobj 129 0 obj <>stream Neevia Personal Converter application/pdf Les A. Piegl Microsoft Word - CAD&A_3_1-4_48 Neevia Personal Converter 2018-08-23T15:57:02-04:00 2018-08-23T15:57:02-04:00 uuid:e0dd3828-2312-4e33-bb11-963b628f2ac5 uuid:9bf0ebe2-dc3a-452a-b77b-5c75feefffd4 endstream endobj 130 0 obj <> endobj xref 0 131 0000000000 65535 f 0000080457 00000 n 0000081160 00000 n 0000097841 00000 n 0000097891 00000 n 0000097926 00000 n 0000099358 00000 n 0000099393 00000 n 0000099805 00000 n 0000099840 00000 n 0000100194 00000 n 0000100230 00000 n 0000100617 00000 n 0000100653 00000 n 0000101214 00000 n 0000101250 00000 n 0000101843 00000 n 0000101879 00000 n 0000102536 00000 n 0000102572 00000 n 0000103160 00000 n 0000103196 00000 n 0000103797 00000 n 0000103833 00000 n 0000104398 00000 n 0000104434 00000 n 0000104791 00000 n 0000104827 00000 n 0000105214 00000 n 0000105250 00000 n 0000105646 00000 n 0000105682 00000 n 0000106247 00000 n 0000106283 00000 n 0000106896 00000 n 0000106932 00000 n 0000107549 00000 n 0000107585 00000 n 0000108157 00000 n 0000108193 00000 n 0000108796 00000 n 0000108832 00000 n 0000109403 00000 n 0000109439 00000 n 0000114966 00000 n 0000115002 00000 n 0000115420 00000 n 0000115456 00000 n 0000115855 00000 n 0000115891 00000 n 0000116309 00000 n 0000116345 00000 n 0000116761 00000 n 0000116797 00000 n 0000117206 00000 n 0000117242 00000 n 0000117677 00000 n 0000117713 00000 n 0000118084 00000 n 0000118120 00000 n 0000118483 00000 n 0000118519 00000 n 0000118905 00000 n 0000118941 00000 n 0000119318 00000 n 0000119354 00000 n 0000119754 00000 n 0000119790 00000 n 0000120210 00000 n 0000120246 00000 n 0000120622 00000 n 0000120658 00000 n 0000121029 00000 n 0000121065 00000 n 0000121447 00000 n 0000121483 00000 n 0000121851 00000 n 0000122131 00000 n 0000130803 00000 n 0000130854 00000 n 0000131110 00000 n 0000138701 00000 n 0000138752 00000 n 0000139051 00000 n 0000148782 00000 n 0000148833 00000 n 0000149137 00000 n 0000155638 00000 n 0000155689 00000 n 0000155993 00000 n 0000164311 00000 n 0000164362 00000 n 0000164642 00000 n 0000171157 00000 n 0000171209 00000 n 0000171496 00000 n 0000203186 00000 n 0000203238 00000 n 0000203621 00000 n 0000208042 00000 n 0000208094 00000 n 0000208131 00000 n 0000218324 00000 n 0000218361 00000 n 0000228257 00000 n 0000228294 00000 n 0000247644 00000 n 0000247681 00000 n 0000257270 00000 n 0000257307 00000 n 0000275473 00000 n 0000275510 00000 n 0000294054 00000 n 0000294091 00000 n 0000300960 00000 n 0000300997 00000 n 0000308463 00000 n 0000308667 00000 n 0000325110 00000 n 0000325441 00000 n 0000325688 00000 n 0000333268 00000 n 0000333472 00000 n 0000333747 00000 n 0000333907 00000 n 0000334081 00000 n 0000334282 00000 n 0000334395 00000 n 0000342066 00000 n 0000342184 00000 n 0000345745 00000 n trailer <]>> startxref 116 %%EOF octclip-2.0.3/doc/octclip.tex000644 001750 001750 00000013663 14332203657 016117 0ustar00topotopo000000 000000 %This document is distributed under the terms of the GNU Free Documentation %License. Please, see http://www.gnu.org/licenses/ \documentclass[10pt,a4paper]{article} \usepackage{tocbibind} \usepackage{hyperref} \hypersetup{colorlinks,citecolor=red,linkcolor=red,urlcolor=red} \newcommand{\octclip}{\texttt{OctCLIP}} \newcommand{\octave}{GNU Octave} \title{Clipping polygons in \octave\footnote{This document is distributed under the terms of the GNU Free Documentation License. Please, see \url{http://www.gnu.org/licenses/}}} \author{Jos\'e Luis Garc\'ia Pallero\footnote{ETSI en Topograf\'ia, Geodesia y Cartograf\'ia, Universidad Polit\'ecnica de Madrid. \texttt{jlg.pallero@upm.es}, \texttt{jgpallero@gmail.com}}} \date{November 7, 2022 (version 2.0.3)\\ March 25, 2022 (version 2.0.2)\\ May 16, 2020 (version 2.0.1)\\ May 11, 2020 (version 2.0.0)\\ May 9, 2020 (version 1.1.0)\\ May 9, 2020 (version 1.0.9)\\ June 16, 2015 (version 1.0.8)\\ April 28, 2015 (version 1.0.7)\\ February 13, 2015 (version 1.0.6)\\ June 20, 2013 (version 1.0.5)\\ October 1, 2012 (version 1.0.2)\\ November 21, 2011 (version 1.0.1)\\ May 24, 2011 (version 1.0.0)} \begin{document} \maketitle % \tableofcontents \begin{abstract} This is a small introduction to using the \octclip{} package. In this text, you can overview the basic usage of the functions in \octave\footnote{\url{http://www.octave.org}}. If you need a detailed description about the Greiner-Hormann implemented algorithm, please read \cite{greiner1998} and visit \url{http://davis.wpi.edu/~matt/courses/clipping/}. \end{abstract} \section{Overview} The \octclip{} package allows you to perform boolean operations (intersection, union, difference and exclusive or) between two polygons in \octave{} using the Greiner-Hormann algorithm as presented in \cite{greiner1998}. This method is an efficient algorithm for clipping arbitrary 2D polygons. The algorithm can handle arbitrary closed polygons included the cases when the subject and/or clipper polygons contain self-intersections. \section{Installation} As most of \octave{} packages, \octclip{} installation consists in compiling the C++ kernel sources, link them against \octave{} library to generate \texttt{*.oct} functions and copy this \texttt{*.oct} executables and other \texttt{*.m} functions into a working directory. The automagic procedure can be easily done by running the command: \begin{verbatim} octave:1> pkg install octclip-x.x.x.tar.gz \end{verbatim} where \texttt{x.x.x} is the version number. After that, the functions and documentation are installed in your machine and you are ready for use the package. \section{\octave{} functions} Two types of functions are programmed for \octave: one \texttt{*.oct} function and one \texttt{*.m} function. \subsection{\texttt{*.oct} function} \label{op-of} This function are linked with the C code that actually make the computations. You can use it, but is no recommended because the input arguments are more strict than \texttt{*.m} functions and don't check for some errors. The function is: \begin{itemize} \item \texttt{\_oc\_polybool}: Performs boolean operation between two polygons. \end{itemize} \subsection{\texttt{*.m} function} This function makes the computations by calling the \texttt{*.oct} function. You must call this function because you can use different number of input arguments and checking of input arguments is performed. The function is the same as in section \ref{op-of} (without the \texttt{\_} at the beginning of the name): \begin{itemize} \item \texttt{oc\_polybool}: Performs boolean operation between two polygons by calling the \texttt{\_oc\_polybool}. \end{itemize} \texttt{oc\_polybool} includes too some demonstration code in order to test the functionality of the functions. The demo code can be executed as: \begin{verbatim} octave:1> demo oc_polybool \end{verbatim} \subsection{Error handling} \texttt{*.oct} and \texttt{*.m} functions can emit errors, some due to errors with input arguments and other due to errors in functions from the C\footnote{The algorithm is internally implemented in C (C99 standard).} code. Errors due to wrong input arguments (data types, dimensions, etc.) can be only given for \texttt{*.m} function and this is the reason because the use of this function is recommended. In this case, the execution is aborted and nothing is stored in output arguments. The \texttt{*.oct} function can emit errors due to wrong number of input arguments, wrong value of the operation identifier and internal errors of memory allocation. \section{Caveats of Greiner-Hormann algorithm} To do. \section{Notes} Apart from \url{http://octave.sourceforge.net/octclip/index.html}, an up to date version of \octclip{} can be downloaded from \url{https://bitbucket.org/jgpallero/octclip/}. \begin{thebibliography}{9} \bibitem{eat-om} \textsc{Eaton}, John W.; \textsc{Bateman}, David; \textsc{Hauberg}, S\o{}ren; and \textsc{Wehbring}, Rik; GNU Octave. A high-level interactive language for numerical computations; Edition 5 for Octave version 5.2.0, January 2020; \url{https://www.gnu.org/software/octave/octave.pdf}; Permanently updated at \url{https://www.gnu.org/software/octave/support.html}. \bibitem{greiner1998} \textsc{Greiner}, G\"unter, and \textsc{Hormann}, Kai; \textit{Efficient clipping of arbitrary polygons}; ACM Transactions on Graphics; Volume 17(2), April 1998; Pages 71--83. There is a web link with some example code at \url{http://davis.wpi.edu/~matt/courses/clipping/}. \end{thebibliography} \end{document} %Copyright (C) 2011-2020, José Luis García Pallero, %This document is distributed under the terms of the GNU Free Documentation %License. Please, see http://www.gnu.org/licenses/ octclip-2.0.3/doc/octclip.pdf000644 001750 001750 00000674747 14332203702 016077 0ustar00topotopo000000 000000 %PDF-1.5 % 47 0 obj << /Length 2017 /Filter /FlateDecode >> stream xڭXM{6WHmM{lx'm{Jr)XfBZK`@} 0/̼3 O O.3]_,"9q^$j&MWuSou^dtȤMqݵM-~Tc{|w7$BEX&uNb.BI a!j5We_-/D9^[6;e""@jfH4SOi *'=>f!]zqOKRQr)iNPw-I"e O@bv$'h"Gs:f=8G5fBK0S {w橄6{<21)37-8E'&f|'Dg v?+و;Oc}&:`NxƩ^mh_ U/4} د=<`ˁ|!2{ /$Ch- ʙz!9>=MeɴTEW7ؗ~3KT!X&[%}@ܸ.dW`֮:v .8rr Mp)TD-+ua=[dZ$}/)$/|Rj}\ Ӫ +=.r+N-ME2ӥǻ fRRWz]~* Ҵ¾/85пzWm]E+OU_"ZybV~ilKw>uUnt:g&=t)gN#"yßpòw/ ӛMWб7go9Aa/9w?  endstream endobj 72 0 obj << /Length 2347 /Filter /FlateDecode >> stream xڭY[s~ׯ-lʋ RlWOVkק{Br|JΥ|HDHDp}UQJH*8LTyt}>ǿMrtuVy,^v{mhT(N~w@ F[*/cqssv]oL,2Oqnq/c㢽r:IR&4Z;ćʱvĉ! ,-\Ud]S뒆n%4v/}EMeҐb_C}z๻ ]P/m[L]qENx թ&lB:8V u;D?Sy>9w%bi[mxW9osC&SW=Awox:U?ϩ{Ҡ;oW=notuoG@^gL(:֡. z,w]yi*Y1S*? }.%Bg=Β=zC9gym ygs t"^usǫeS]w*#m%:oRh=W5@m Rҥ;TV9^=P}Sݜ/tO׿vNݲ9*GP=?ݹ\3з j~+`,&#۞?^|&ChP<}]L[1N0R ﻞzoub姫9a˛e$9$B!Q|_!s EDi+Q\}IDhMt{ߵhWے\xSS!zs&UL3Rr9;=tiÛ@}Ƙ; K0$RSUwL}h:gNA=!*g(&*J- _CS<K|@"-,B5AV`!hWhG#+S;!N\E0εJ@^iiIC/A.v5e>AW@͡"qGEr4=5.{xk:~$=٠G S!-e,oѪ9>"Tz1lFhTpyRM8dV*qxW`w=D"<ҩN2cX.0a)F169!ޱT&֬$Ф=[8&ؔ|ؽ,3{ D,KM",hѺ#b LcԺ_@!1#b71T?!by"D -3OPqfbDFCD4SoOe2_c WS ͋9_dRIds E61~T,{!˧G-Oo in P51@f"-Rd $*q[m1`Tg"xH&@MH\\.u 3@􃞤* ^KtR ͔X?x9pbk !ˑu#ϣ6AVo%iƇ5HU1_R|;1%tT{}s4913bRy,XǬ?+Rr o!{>u U]z@yL,QQ wKSI*yj w{/N ܨVفV7V9HVPj7p(=olnist,kzi'&O F}.O7ꑀX _R,U1l}mA.LҦ0i9kOt+ s(PN˙V& Bz:G1LUjN3w Sׁbz| W$}H_Rg@fQ_k':B5G"!핏BNǮo'A-7S]7ET>0¹y*y&/jK`x϶N( endstream endobj 85 0 obj << /Length 1161 /Filter /FlateDecode >> stream xڕVKs6WDHԧ$uiqĆ"9 d%әwAB {[d 0$K %92,L:nHgMI!YbFI#힊H'E,!cî;~<2Gtw4si5 \|m!p` _Sdzf<u3zW]O%RݽL,kB"GTmapJjOk\bEIaB1 K%CV/dVXorϚ` \g"}!0wxTLbZl`Tef9l#-ۯ m4oq_Sq*N^L )#L CUW>V<@2Pڹy ϰ 8} OIQo J4ŏ\-." endstream endobj 114 0 obj << /Length1 1871 /Length2 11895 /Length3 0 /Length 13062 /Filter /FlateDecode >> stream xڍP-CpwBNM.hqww ![p@Gf̽WWTA׶s>]Qٛ89:\nv.T:: ?vT:-0 bo'/ r~Iv9'7O_!=T rrv`'T: {(>MlP)r>W4M!`gJ(l lL7%@ G(lƎJа8P7wvAg lbge`? XtEN#djjoY!6`3+dgq 6 gbd 88;;Al~$mmvN@r!vf0sqjA]qM,^~>v7.<y  8C]>^v7BAL&` ?ٟ`?C!=gq8~Yafv6b&_#wxrظx9~^QAXY;s{>ZvK-s)?+ `GϿ8Gg ;v'Bl?w0mmr>7-o8Wŝ#9%q;+d]w|n_b2uB?Yi`;uaT(ت67m4&6h-&r SUXgM)Ƌ7^-aImwF jm_ ' (^i~p o풣qtyw+^W}4tv[uOl-F3Z?x.$kəkn\ A wW͌rS7 -.1$^ќWIQ\hT9lhȑkAldb}QDdhNbܜ:N|T'BϨР·*\a_m^_0F K'bO|{0er831!cQ\ݡW!0%UG*'kQXҘI8yњU.O̧/JM^/ ܼA[sv 7+OfX !Ep}K7}=Zh\_]F16Y_PON07K-z-\|L#)y̙Uέ>KojB8MDq耺A4JHR8@1}#&SIת2o%Mѭ&}=m֗JZSJ;;9q0^a;*4]uz{v}1ppTeRq, _mQ2,!njDFb+dbrmQ綪 r%{${ka+2Rƌ@\a]H ^uX"fRz ۆ*ڥ'>D!'y0W@τ""(>,.fVvc 33,P1 ¸jLx )y4|ϨU:л0ՕqOpDbL.Z ¯{Sa)ހeB>ɶyu{v!YKR:*}Z{Q>ա(1WdVy &ISciUeLKt+>4#C$6]1;UPvC`ӥRtIn^:XW)lՃĝ"ז(/J!L0x`vsw4wNEZjJQ44mvW`8M9CktaQַU僰վ8+LD2lF,aH﹮m3 ;7Y0К҃>Qѕc6Ttamhl*%|d 7E"RF:JiȌŻDfy+:X*0(S̑NbsY+9*cn 6}ibpC (>6CNn GlupfXL hֶ6USWPafC駚c%wf!q1ߣ{ey"i{:(*uRtvCuz_j3d(99wN_NA3tj{LtuU4{1-hKٓ.f:,BXoTL+.ic0(UtFV=M0uCM|͕6Jl_v ZyG h+Zo+lL7]w.5.,6f[< ?=KM’5+\ICv_kG(]G)0b|RB)KO_Ì&cƨr06:\xwe"V$ӡ<{%30sn~`^XSznssE׃*!q$6x> S+nB X]8nACQYf%N7EejI'U۞ /w+M\UZ$ UJNSwX~tAѧiXDwHȿ_~5Q9h..galqlٍ&-)[c+1>v5$Opܲ"Nɪ{$}.^H+i1\fcе)鵱ھAqoC &:gdYݕ}okA~vPQXSQ2_1MA- GWq#j(Uj ^{(y AlqP?ȚQޣ:`6'fɤHCg}͍۽Ο Du)I3w62RHe LZ[U/76Yߜt2^ gkb_b-$oT 6)q8-v+ӬSDRC1o2Ao!?vb9 fÃo"0/ nZ ^O--ylod~DyS+؟kSqy):iv.ӞԹ_8* +lr@lIG%j}څ-Gϴ/\/[z}dW%&D=^g( "ǽH12l:1a 03՟Js[`fD)/Ζ4φuEKMZ_(eNG]Sݺ0qe|OOܢ9໙z -ĕ@&XNL4=j]#dJgר=#AQ7?{qXH -ʖdv*3+Me:d:fjLnGh}IXTK hg<ұiFh"^YRIsO@psnzrK!b~ڶitV47ͣ<,)/֤/rnKMhjxhs|C.o, iG|F^cCCɌVu>SrahN3[VD/JV|=3aԦ,i==ȭ ?&$R4dU^^V1.INЗQW`Kkφ5Jb'SG.%T H {.qcs?_}dz eN킖X\Sӝ_^gnz,ryͨ,-oЎ7mXWemJd(5*aVqBT%)Hf[ NUG_ xaNҺKXe۴@M:Suv*ӌ\|WKJX.FY?38)鏘J.7,O hhfD'4.(H}ԣq|@K rBL~jdQE}Ϙ ÷/dsO^{|_332/jX)+4U|y g#x[nڍϙŇ bATBMm#$(g-V3X}Z gr n:|W=~_yEH]IzJh ͆SA^^.IrΚab߃0x~U ͷ[d#*MGSp/m$UutK{͗\~)@c` 'ut|ɘ0_"+&ɢ&^@u׹Qy䳸m/Җ*6C?Ss8`(6?>OAPt=u|FE6,=o%wͧik/_`B_&2߅iJ[+5u3RrKuli:DJatS`pYEynE)0~9aQRFI ARMz˱pyݳ۵iqExXLO{D)gjüHzATOfap_ 8Cq[*dY}La|^ W023zSxourб`j3ɉ\h}%(b7|r06Ět/sH:{0}GUsWԣ T,Ց w][24!uʉ OdGW$`0g n4R _Wޅ.4hHQ SawrsmO]ߞe;vSthK#i. %_DЦ~l}t Q4=WL\1@&L3Io*ėpqayNƬBZkƦCK_mIoa3mZNdr|dDyZ#]6(!6vƸX.R:%/l Ȓ}nW|7} @۔]d9 %\ PgNX ',?uRիɮ)h4ryY!MW!TB:y#k6Z=Z(o}hhnϝȢLVr>wδiᄑśŤ`bhgC?E؉@C“RTa`.%N]by>08N-/ż5P2/qGF&9v!QE|4;B;񯍚`/#Pl= lԆv|_c}NQC~՝ty.9Oz{oi_A6_ d6 'EM"Yrيm:s>dn"s9ԣ&"<#W.Ny8*_bWǝLP0Gㄢ)}]UXm":ٜ_{SzO.T(n*I#rGG^s~o@>@NO14 a3ؖ9RFp\t&- ;]z2S dCo1m.ଈL[BbO+ ?K{>V})+F+1,V L蒕S7#l X4t!L/VI`#=x=Hjbl5<A/jCt>.-ګž0S"|䄞MhI!JvR]! :'!gV]{v~S4g61äõu%"\`T4ZvWixz-ӌ%gA{b;ӄڋQ[p%DFH=jۇE*>H/P#N) ?d {X8M];FS'%}\x"1CBqeҁLy}om R$?S91ӃPÿzkRޔ%'*.[DʶN~jJDjv.|3H:l#(v, ~876ƥ0X}=:R#ֲoatd}c&U "Th3i_&r+kIr -8FYgrtEg}Ũ6^c h{Kۜ,+}DoxH҆;qfv!;MI *O]; ҋ eʑC-3I` ᒃh[> r[ ޭ9-Ȅ>e=P}j9>3PU" a*+XFIM68 *rNM S721mA 57/\W-zIzE6^Åw|T-(hcӅ;3^R6rt0I%|-{Talrh#hʵ.TcmV6;G3- !EۛΧGK}jbUt?nv(qLbsɉըc049LY/bpuuc_e^AR8kO$2ŏfANY QZjȵ]ZԔ0J^] ^/1POOw2O2)-W44' f'j[ͶJKUlX@|HD>arOBm̀;=F ¾$iה _=+3sn$Uj7Ԝx ѱZ'fYVR]oGh4i;c]%ȢXOn?=@4;4Q}"AzO)K +3vN 4놉BŨB*8"1 nggnZ2jDq1gd[77oO8ǹWlItF~ҿI̕uFl5K,X$u0_ = Kdl0븸Z RIONp+H,ʮ?aWy9+{X&8]eLyTxM×WO*4we# 5e5܌:3(}4x;ޫFMwg쯹_,دI %Aȴ񢷀vUj fC],u6@Q)Qݷ ĭ!O~X2\!P.m'3c 7r;wJ-C[JemZ$lVnAv[_G3 %i I_tbx7 Xh?:ŲrU>>:7^^!N}yOS%EwS PlFEDSiwq9יϰ`"۪쭃AlqIf$q=oC.Rf~F(Bk)MC@7(64#q>YTG1dS>]rA~wyZ o66ܶ)_tv\Ud'&M(ƹH%ʖWΠS<3PDVHu6VRZh ʬnw,4?avKdPM(P/AN뜗묞Alvr~'3y^i r!?5K(gyJql"=zT=T{3R:YȤ0J*A#UC%\܇BbEeYL3Jou4B='Qo`F]-4{"Q(H-5=ZmbI"] ?a1_sG٨jW̲n4ǠnU9dn^NƄs2x >āV0^Su7Z~7V ]"XE}O^l2T;1}DN@ˤ슼ӛqIZWyfmfͳoZZLDM"I~V*`u9J (bftsPR$.~%N*V}U+2]vB^v=UR8_x7s#5x[D*:%EK$hP ԀP ql;T7,шQi̻ZGjb07 %W~Wf& H3ǒ{w #4>}ܾu9ُ!~6b|fT7^C1Y2<~ -^xt2ev7XęPE\mROn\h'-swM(YOQvF.$N11~o? :ՀpDąqA%)}^>@Y_ ztdTXJw:3DGׯJ{MAM~ D&;hQ|(IZoHB`1y>N\ hQƇqi |^T AHG8fJ̠ظw}{mM]K;6:JFEZK+Hg۽";l ?_Ô9E܏oE|Ve&;wjez/o|v|'B"wʘ2@M,{}[|E(hFdVxc .e0)uѻ.mphS!hI}\%_ Æ5`P}}=dk@o.?y(qRnz-K67h=#3r~ZK'aU"` ώ)0AH~ utu~4AxO ?Q<KOsޞ(c'ZÖ6qIeXνcQ媾mv Qy%(|UI(XI/!;؄Q\0YGK)?E0RnDWA*e'D5L{>kfʾ4W^Gf=*B=/V$i_2_~׽ƩtڐTgn:lh:Hԧ%'-qďu~=:_^LK.n%f4e,9`=e &h(~Þ{D!sS|sq4en8eBwbֺ6(6Ukqw˧+WB/02'>SƖ%ɇLdK_I.;l3Pzp-Nޝ: WѯC>69)&L5E\QC)eU6ӓxa$ƣb%uh<;.;>Bdi®Ҋ+#^;6JfkKk_մ=,ַn|O6Y~z6$)y8_i-ѳIuv!o<a}Ot\gay7Eg=2u}Q'CAUFfRX\7T/+4F*Wz٨^؎Zr$W{N׎?T՞H.׵J>q!!|!N_сbn^Bq7V @ :,Å#$c-vr-ɺ<VcAֽ\#@斐8Ss}]#;QR(dVGЂn%2mIXM>n6EohM:"DA>ւ m'4_ ,9BD<[ǧ߾V.D(gP?1 0p+:nJ|]-%ҮJ5MzK cU YMb*ڏUQWƊm4e<05@0}FCT_x?tL o.+O:Nz "_ȧ ?M^}8ch1;My"xVsgp9.N7n"!;|>#ʹTxdHx$^}2 0i%1k7$( b3Hy _ײF"닞1 ӈj%ZtuŅ yb)L̝U LQ`˛ԡͦCB=8SCw9FvQbA\F(CΧ퐬zcq-S;?H^ϫ$~:rT7k.||ckߘBӺoًd]/sw H*esCe({ТNg#J{r@UЏo>1/wYJz@<$ p1걭>Z8v99%>IihHnHʇ+쳋b|-xH`~U8#ƀ,D]BK,Ќ cK[#FªBf|tK UfIñ / )j:2G0UCۄȯp`&b솱չXXE[l!̣EM=uv8,;'t\",5cȡJж#*h^|3kB^3)+"#>v&!urҥ?njշw&)VS}QQW8ܶ\3 \7͞dAZa:(t8KNw{XY~ K)BC b!22JFR.&"gf8ȓG?UE`ԜMն> stream xڍw4]6тDFeFE] 3 w;E'z zD I>}^ksvgƬ#AZAW>^8@ASH  @ll0W8/1(D vEh;M$ DA ?$/C$JvA5$BtBl\k pv9BQ0k0 v:wzHk!8$\]ā@^ /e+ t.P;U0@ S/@Gq"\n@oS|` Bs{e{m|J54To<#$ Ą"?haWaݦe8N?ci!Ѭ8&Hd?Sῢo$jG v2@=H ghpT]1CD2 цZPm ץK,k&o=7R a0~!a{>|I@=SE ].tq~$y rDV#1߈ODDq( Bo6K}7@PkDgrt<_F&پr̡.^rVe<[BȽ|Mq,vs^xKN_Z fǨ?l1nt}Ռ١Ɩ&JG~ѫYW:?6EgJXt' ,x-*s>+dS'dn^p ,??^,we5a:&gFѧ(N-,ȆbQ,X1'Y{oOJuV}eӐԊO{OӾ;xOH"PռƁD{V L_nM, Z0U}>Gډ*J{WEP"rt8Ho5:!ֹ{DC%ڗ3Fzu9$3 goM:iEMΚvkM8@uРV45rS@k|U/S*:;# zr=/Ea,a&QP[ Q-z{'?_짷OvRe20){`ȶVRqU,G&?|ׅ2;΅(UG$'Ho ۷4Iy_SJi}WRE"}&:g{ѠQ(m߁Ҿl-~ҙ [#CqEǹ5,ɉ&簃#qA"iۤP5H"Ԓq*H{ lJ|,@H;QrѨ:pe=` ʐO鑔Ҹr[]`#F-vR-uNj%cOlZFYIore utl7aE݅܊4(rT'*OyF\MǍh{bUt*'SP$Ҫ âF sC-KEDQld>ߚq Ȕd=QӥoqQL^ E8uEpoઽYZD [F5:%3N LwB>lN/^5Y@>?(-+u ˜!ieaQ>(nadb&n~X\!Y66O,%Wχ^drz <_86X?ר뙨aB"?]-;}LD;Z41s93EZ2&(|M=MwkpBBum .ّc)F=U|!xsy2;oBr/Ec2R(]x0 ET#h"J, Fլ=wM`\'DsAƮ8 ^:r!J,<`b_ta Ӧ!S'Bn% ^3Z: 1kyrvIOVKtᶘC'ƷbӨ)5moalW'͎g[%I^ߍ"XYS];*lӁlMc{ yZte>>KRzJ%6Ke!1׋5C@noG%d cM)ڪzOxGmG^KS9E׸ne1#(>)M1aFclkqtGj>S?ۜc9}dJw8Čթslc8m2G,=ih<,k‰PMB5QFC=y qn=X lM&=am;pbō'Rzǥc8`p+e"a/SV}7Y'AlOgQf3}WN,gӥډOwlݡ{^w΄3w 5,#ɡ|docjT@ jwֶٌ_-{ЈQ {E͇@/,?^lUme7-ݳ.i<.R_R)*y3sK#&<4Cԩh=(ҌQ~w|n)6+ZeqgGvKN֫oK_}V=US;3ͯO9V x.Q< L\?!BuwJu9x"/8ڷҥG6 awpاzuq75x#>ty܍Է鬀1ZT.s{ƏuDd"9>8$NŨb4.f[c$f^|>ը>om햴C #.FJLod)p53áB xM9EqD'WO+*HɅ&U5aoW7UvX}I@YߊOVdG=U͵T1џ>58'՗mA_1j'+*%HTnGWcQitdx3g<|[za4Ve. &-ci%z[K0dqu7P(?_QQىq;-c!6ƥk%vt|PK-3~*oLHYvȏ.:e _^{NM' tDj|X.o庥p>6TMJ>=`h3]Bd 3l. _32<8,Nܽ"w1O%?],Ȼ%w8oIXaBzI$pdjMwOɛJ %}{Yz4(M0(&=Ϫ>:GXu'dzYeD]I~5qxFP,LS;k)<,E M4~QbC5YHHM+4Ť@{ޗy(E͍> ǯ SviQneU!EzCBS7. 8q$.H'l#[UV.(;tDpn,U*휟GI$JZ#>0kSCD9-{FG-g3o&z:GG dֺP?91p!eK|73x8TwٻSghtmF ri uVK'psw`p475U^/KuG1{D*cw-Bɤȳ_J#e}ɽ+9v6b3' &'OHEשUS=Qm~0 .qܺlk7"Q +$<0{22CM|fzԪ,KdT.BZa61ŶkŋȻvϘԩ*B*}sFWlJbZ01)'stil bxLQe 2⬰8LTEZ4If]Lx= '^1D,/>q*׈=ۇ> L1((|^<8uyZŴp+~Żi|':t"sl\>ZCX994 K9#H{q|[L9(*qgR8ÃNB<c=7]*Cv2+j2c=qs,uGv7ojpY8My/TXŀcq̈́OLGZyyl [Lr9 dJ{8%df4mqB>fUAbX]:_+OS6\8|o"+I]z57n-ca^[fcG(-pJ醥WGWECrҥ \ eGrHrp.^.4I 75/`9]0) .D,kU~9Ei19 nz}:/#~6nLnu`szMT~N(|ǮԘlOai_CYZApMƑ84@4D&z|,x40X3"ɾШ~^Py3] PhBuz}3!ٮ (}DBOG%5t-,^ Pft,C!11]+'2Wl4y!yƓl4p~-e){F+}=ۼՂo/:=:x1=5cV^s(T\Q3GKԳD;_(vH&s(QӓUQē(N>MS e08+g~Yb1.wDZa/PIFԁٶx)dM/o䲕P␁ ;;N:JP?c@3J$ eM5U/ʤI[% kL0ev8fƏ='ER2-j~V &qa.E`J+ɉmgisd\eA!o8Z,|f4rIgMEMx;l3 8QpMNNC* ۉ/\ HZ2ʜY!fM?4hK`ZqG]ʻ#K^F=['L#] W+7(}1s9E͓Wdw@.ysazNԤ:wI57\]vS19` Cr6K\~;O\Q!*|᷼U=;W3@Vm<`ȅL0$@a@V^t4u*/b<}y PĨy$=)wkz;cU""IX\3Zizi.~xNY6-,avFnGMdIqShÂ:٨Ht`خ?K{8fOc@@v&"Ɠ]tDӔR Rm\!_MOӍf쥍v^yF?,duФ+xnO56>(0=#k҅cb=J*[8% endstream endobj 118 0 obj << /Length1 1629 /Length2 9509 /Length3 0 /Length 10565 /Filter /FlateDecode >> stream xڍT}6NHwĂ ҝ..ҭttHtww7HHH>>}gϹf4Y%p3,.RҔ`ssbiAl!80t P8L_)& rzd*aEg[WO.7 @e6"qĤۻ;@-`c# aq`eDs-@n8W a+''{A Օ dwedBG  4@d76L:O&<lc3 q<TPC`$tEN 27ك`P%j *99@0o"rAmAf?jd%jj$w9Rp;;w}P݁߯ Z@a`ߍ0[g_Gl';?7;'q3>B oO{=7r!ޞv7N3%fşQP7!9? ٺ-uu崙$ `ap_;W UYsqP ZF'S?`؍yϒ#O鿳%:A`!젶Q Dž/U+CPg*8WBfi,P7X dnfk7[( wX9d6Ga9>nCwKrpc>#y㖂!nHdCz,om 2 >P?=$@A?Q@ȿ h/ Z ǂ >f >r|l_F? qq?>es3\(:R+θ0Q'xt>iXŲo;T$^eΟznPպs_R~2l%9gFlDIJB>5pN 1e&}uB+O|*흕ҔHtoj85 j=ܴߊ0 MRIy-~Z>0M!y<-ybDH(xGx׀M cQ+jytY)dC%2wtNYFL<S3sPL&ѽOS>y ?5zÄ{J TGbU͵~h?5r3gD h}m g[;ꖚ4rrG% ?T,yGW!A0iN"H#["%_~̙N yGƖfnQ]2MMSe4pΥ ;9wgRBЪk0݂^J5'w)U3epsCpSN tV~a|A@x>V NXߘy_bWt'V*O>syE,%k갑n\3LM$_08Mw#y2yI+!1U\[g eS)Ϡe9ԃ$rf:㍯n7sh?G)/_0IFG8t_-TY][OtV91I6)2i1K5^XNΈJE#9yvb^sie7l:_ ف")^gBK@{қi\8:[_B |(W&1|T c̳'Uu-u~^C0K;OZ 9mKbiM }`N ~mRu!#=Wg3kpq\k |z}Uݩ S^%4L\5AJ'ʝDbD3։؅-ȏ(gU6E)az gw~/' kblTGm2̪X:q4j XT%t^:vFD=Nky]Mۨ@AޫVg]ahL3OØCT%K-\Nl-xhmF^do#<:^ГqL'ko MGi.>'SGqabmgЮ^&M~ {mHZWS`_ϲ c/1Dr)La2Q)&{i5)"db/^b,hm>4{@%dI=s$⤠P_Tc~6Aqg27,_mձKW̛KdZQX'h&RR"n==DI~|a4#\`#%HI'zac<~o~<#o#]I& *l:$l+JY%Y 65Hfstǜ2yq=R``SJP^gI̾҂EB8Y֠:g``,g_+1]MFl74E)KZmX_Ck g%x zܫ#wH6[fte&R]a xh<0UّqV0*4--*]ZRA !4yFG A5 ,a\ y=^Z;rmjv6%ϐEǛ!}jV?4/DjѠDpu]‡:JIm{@2Kzn4{NgƢ-czd;7$􌥫9͐ߕ_KnѶ*vgeU0wR$ObHC*D%% ..BYRg!f\L],,q>sΞ]5A||QƗD_[ː'sxfpnMj$yy1v= zrɔ D-"M{X9>h$ϤU7Ӄh*Ee<6d>@¥aAM;uQe렣g , H GUlPӎ"Ovn w{m_In#qu{I '+ @)Q##`qlKA*X,j{TK} TwF.IE}sp [y'C]ʐtdθG8v|eEZA FWaI. wj(dmsjSd楕:R勿ّUY5J>,CJY B߉pǮ}2 ])ԞB՛}kfRpmK$ ulGɄX7V6ڈv(\"͖F_Rsoλj [~\e ]dz'l۰_nQRXa-ExnzNj}PPKcڻ"DAS;흙-R4}](lW;﮾+IUL:[j7g11:y3NT =ک9ٹId^WR,f=ݻ%0 s;MlKSݡ -N^ }Cmh!K/gv0Qwj7.*GJȼM@NE5؇n z?ɲx/ђx;ٻ8r/sbF}'TXhCGAd}@%IeQu(YxL#z=]fɘUׇ7 `  kxʬ!Pyk~sDGB؊y(-$0.x[0y?z2o[p_ TCyqhpxVo.RiM0B.q wȷл<ئbT'X#S F>:6N!Io{*#YS*C,6(T8K~%!,DmݚiXt{tf̸eLp%cYt "x̻~~Ք!7b(t$HI^@wŚ+1(* ^ 3T#-Vng/Lw zwn[3qAtoi!3,(bJҨbUf/Za--l%*qif\W^50lVZ?a&委*9~5ӿ'#=?i:/u$>t~n-&&*^zBfUȺeGL=ށP2^1-M#j"QudXV@]T(EH2^6$ÇCT7L8DPoqfIʆQǚ-ݍIE9yI+|z?[KF /ePd璣<Ȥٷ,լȾnw%n(-h.Z!v"`V&{ǵ>GɡͷuT SPLUaGؗqŻ ^;$o]MFIT="*|$YNH⻥oKWV BZ`xڼjk ύ/ hlsQ [V{"O ޘYZ.7덮o+?ͥr0*`S̳R+)t,չyˊ^bͧ>dY/\>>8k8Uvm RĽE䴝+(جJ!r? > stream xڌPj-wNCpwwwwƝ]݂Kw޳L-'$SQgp2J99YXj,v&6DJJ =bDJ-#? ] LStrȹX\||,,61trHzXrN@7DJq'goW+k8|ИXyyuژ:MA@pDsS{ _4 33'-d P]= (: am\i 6@G7PU(;6VۀXXCo￈lljnlmh@^ _nN`SS{S327HL<7sWg_%2EW~6@sp۽￁_EX;3k:ڸe%m!YANn^v2f^/%_bpNKp@K ruS`acl@˿1x6^}X'CzY89{1|Ued?:11'//# גq?7Ϳlm=4>Zs)9,,_ϫ/ ;!)w{iMlm^ZwgM"keACuOmܤl*6 s뿷o_WfoTqrY0Gt2?n )hd׉qrL]]MC#N/+-^Zb3trEk\fѿD#n`x̒Aܬf? ,e ')AxJ8 YS p@׿2ww7n@qiɜ?̶!NГqoBprO;wɵڬ [/ý;47"ˤ/}lORx{66ׁ8cb"F }?`;6ry.<*X^_*V"Tk䑞+f4c K(ͲÁ0Ͻnng1s'H>#DZm?Y`sƧ#;L{[VcѫM4!u-F-Ʊcln@5ݤlcWre,P=ZVm*27ߧFw-#;=ڥDVtѫ+|ĩqnm,6:ògXpߐ G"=>1S} 3;d;~thTd ;AW4ѯѭ뚞Ds?Cc0bu` Mʩrl}EI? ָ4cW tBRlHGjB;%8XIkSK9C0^?'z8,2\'#bG'5Pç 5,v|0Fz j)QT9Z&إq 9PU/7\W=`?e~&]0J-XyKq&P} vR8HEB6 h&ae)O8r8klyXZ>_ ۨ> oj7Nd<O+A 2 ?Wz[;S8Mn azd5`,Ƞ}CÃL?Nk3Ώ} KE\]O\x}(\ rv|;l]yUy_ô= G}M#ĤsIWhP#ؔYfRkdU((쟎Zowˏ-PQZ%|Ogpw PbYwOL8EAW2ЋR9}lCP>לotn*TM%\?۳+i"B@5hbYv~RX͋DžLbfw.s쐘H Kbn`eaϭ-6C @񋰬(aé{&VT !ouJY#'U9ٺi2_xCԉ4c/Jʘ4Vh86M%TCǿEZFTU;Q,=d~ןlyӗmE"ɖG%J./P{ʉU!#Zqm_;ڍD}QQ .>" "Wm)_=ͮ9k"1l6+.]7ʼz;SP)2|l fvo;h Sz/kUo>RprB5@E-ObDZ 0C+6 ggj]Rq]*L] 0A^0%x:ZUjQ4Tn8u?*YI*v0k?)9EU!Wji/wG΢`(3)l0tTΓE[ nKm>Kk=}oOcoUӓl6SFzX3˃)*@%ﶋVqkX1 ">sƒ"y"|x W₊P%o1ܼ 6TIV[\ސ>I)7] #V/RH \/:h[h^^ .` d0 ,͸## eDfj^WWd#;N2s/y&ӛ@EJ@x=(oʘ\x(p[uūYA"x >AvKzCZU.*x}:LFޠQeg+ ڭWIIQfp?%j҄TJW4Fh EEB4;{ ^GHjjce>!ٛR8P,#bp*6Or{}963ϵʼfo{%X#}tRk%&_z *Vm4p/ƅ&E_?ӫg> `;cu?<^#NHAjJ_ƞʇvDnhS@]QdurS}{γpF?ҥ[1m軠q Hgv4v-O"p7:XݤD+/մrndi+D~ŴH3m9cLac}#5"A vKG hsLl3Hd1ᙴHY;"m9[YP0NNeR)8lEBk l9|dOi.%2nq&1 fci!"ĔxVKdtE .sҫ揪HS=X[C6O%7L#C,U8dp~~n_&F"g\z޿ߒ1 ԇgMH?1Tpb{jrc>n.Qe@ l'I QraSE>:x4G{ j(8oA7Sfct,V|G5Za`mQR>Io *myU6 81lQu'BO%] EGJtc^xo; Q%XFǔTaXu\#+ĦLHN>s{VIk?" %WuAPY8KќT|N٨o#Wo+ ۫k$ D;Ί T|`uy:@ {0^A5I9Nye8Xx7fʇU\P/8 6^)<Şb8) [Y\7Ikp>w] &Mr lR~Nwl6_мX)SPliL֐0HjuL_5BBq/$@۔+]s&|.nLgP4 }g!Жa ۏ;n88!^)LBSv5T)3. ӻR>&--;"2T)o0@Gl" +jQ2oYzsBsؔI-fKߣ%;)ԖnHu5_oZZu⌐(md(˼Ǔ?4~l -ꑏlb] p0g@: qh]υHR5^6BiUc#vhytđ6d"'8W+& S+&~P5&Բy/d{7*#ǾpigΦFHֿM[N3wyܽW)\/S֮#Zsx~$>Fdʣݷᓹ޿BSc T>"2+T~(u)g@IcegosT,Λ2HIc]Fp\=.,{΂jBd]̛A&Lq^%{gR<$dݛyGMF͵ҙXK@̱sHqc爛QՎOBpVďe"g&F3mpE;`ve]]D-EC6t1lܫzv.ώg0u]я%nn>-[S+^$03V$0`nV [oOϕ'akȗPzZ '5+oCy zҤuڢs*Vv7YtS|ҜMЍz8;,b~d&4q":&ř_W1_F0cZxNH M&e&)k߇*=F;~[H=*0r23#3PqQDȖV@dW3Rm`-` y%!/]T5z!ѡC$Kd~hN5ZP ^撠 ~$ CPdT^ҨUه>Ɠ_UؚaP>cW~;"vZ2k>i2 ~t?%ŏΠDUFeSmP#{)37~=E-w"(u@ 靺NK@m<\peDůPFӌ$᎞/ HzJ8S׵wHHqj&޹sEɧRƙ^=qК9~1:MäE4ѹd HVo~ɲ6.k.vߕʲ[* Q(LA y,z9Šq۴PVie8 M$QZyG=ޥ_xaFub ˊgՑ?hYLz2XKRMtk~7 f:#S5{LΣA1|zBBbsjX꺀fL9-f=‰RǪ:'o}hWȸVGkFfp+4 tXOCZؤp#l%2>]b&̑H.QK,y`yF5b= i~_f$dT{גj36H cJ*~^0Υ0`Pm؇6"9; ,v_UE+nBF, "i$|P:RT'NĢ7x X.>8 B@.MMS@ʍЍn.&?s ќyːur0 %\y#1qpK9\Tb5 ܼxYٔK{F s($tcR6o4FTbR;gX$-lj?O~j.Oذc^&K HMh[YB}) sQn'N2Z\Sos ^FHrX?| wZoPvšK; ]g ;6 }\NeTW v@ V4/ސ\0TwqTSl}{N*ͿhEl ?ilt fn(Ha?*h՞q5ϝ[pўUp\80l0Fagkː4O[)%ҧ^3Fu1hr W[sWp`,ewm^&~j6$#l:4=O+y]~vHxK%?֬ҁňOO9ނ_r9q; {*i͈ozx'uT]}(E-.'(|;4kÇ_"@Wv|oHOp+\Q򡞷pjYa$ܛȈavO4(8\U&) PbW>rWoQ(J|Cʄ<+ĺX|vMX DS(Uc4,nɇh-Ѝf1'| k$kF}K)1N`ˠ[Aq s^'-ȆkTl4e!4h6w;8,~nU194K'l1MED$@m\H/lT/>6e'@L}N͎mmH~MvIeyWfҎhʑܐ<$4𹺚h\4 ;D{ˣ'G,ܫST(^IY`[@nJd5ު},DFbCeeg쫰,"zk'W"q.)iRkҐXF0C̣m>kzwJ% mD\I큝?61 ]Wz̡M_:6da"- CoɓOkЦڃ&xw&dcR6i Zy PF5OsG" h& x::xѽNfg\^Ail3;C`QEq~C=4*|L_lX0|rdd|>bou4HNު;=d6GVh+lnNʆn֕B!4 u^o\歌}+5tG$܋({@ϭ e.;KCf -yF#T`nѠiibǗjycRbn D?0,Ʒ_@d\|(`UnUt+UNmtlb~7[y04Oe1vM8)W$϶\qwW()I#s@{z`jgK/t"HL8еvUaZ-A^΃A*T[gkoN<Pꁰolp\MoM,Lov"94>-E#K&΅$/TBw#̞ liMݨ0iIG~aV -**ң0V .UdtXj6|KjAܧ)&2\ ]m-Rl BL[X-"[F|/cKknoy*Ǟ+0 Y}\0R-y.* }evTpUs}T@#oGeP$/y]1 z`jV(X ]Uf@`|e~ &";J M"089A+]#*U:fmqiSʴܼهPKBI#dhu@祉/oW)o((a VւH!Q"Z nK=XmqXʁo4dǍx^V'! EV؜zUUQl4cαsVM_Qq$.성\nյJJ$O/Bu;%;-jV}H7!da?DoO7s^f)|*9fGvp0|;xV"waS{b>1F1Ov'ҺuSQxM((+|{rJbz}V} j[ WnO־djzPR 6ǂ+m,bػxQk6Wj%^yӜ2ʼn2\ZyaFh%3)vw{[jum$)6eR# _&g[l2Y{{gPSo?:W1[5c(ٖӞhS5i]C!T"͓4y|>TX9ˍO1!arԇpOE|*t*e"Б# 4am9vr'ug6?w*̅N(݁Mvb5 )N1O Γm- ؤRK/X"_ܟWV e;} 8r+fr`eny6? Hz~j#' lc9Iu3vbc$[}7WFӲu)Ϟ!]l0PhP(r#@t4.Q.] Çv <ݦ1G﹠RbRbG3a2 !S31D1fV\N3"2yf'UCɊ7bIQּLRg*qf8@>^( 'o8[ObJʨB(WK#7fժXf FKOgwيg@%NlEnr]vr҇pPN~b!SԾKDEKB@:`0Y-Ԧ!k]$d @~1_abHٖ,< *SUh O0u^YAPc{A)[y†J*-^fl+F/$YXB;#P})&fXt"K2}./8[;GZ~x[XZ{{\(X4!CW A((uew.9/mRIOJ c—{K,^4,zRGC6ZYYXvJ{,B G7dlu3D{!?~JP1{6B.i =@kaUEx}ſM.MUM#>w {E R*[ j+* ^:Islm_ LSKȳ=e>yVn[aaNiέ=sc׿iPd,z:M%L` rfD5))n+|UiU~wlzk97ڦW!ӥ X!@uBfA׃, urɄXKPF1Ǧ:8]dzUO@ J)W4؍bTrsřZDUy۫u8"i7yCVt9Rf~)Bp GyA pSꮘ=AICTvWD[+iޮ6zZiGϻ?!mJjeyb6k(v*a6h=x]Y7XUދrX=hZL+?$cRQ^U%?%Q{e?kp.#T23&T5J*@x-"S&nޱ.]3j>QzԔwsKY_Ep7]{j zB8d_=ˠ؊n`q PDTִ6{jPѫdN!10,HY|ŞfNM݊-榭FN79Z=n۽y x$̜}&JHɑ?ЈG˛z8x-*=ц?|aƭ{(tRXg qRL[AIPAվ㷐mVd1TCFywR4<_i؉ vFշ1\Y)U œ$n"#Ժn7%;Wᬆd VPS׋e[]Zx$nhA_3JcVba/+4?jZ=_CN%L T U 5IŽbrY!&Im2cr9ڶLe#?E ;܈/p&tHDDS)Tґ川Xb{խGҽkϭ6U=ffW6nZ4r{A T~'?Ztl"!ےj.S &Z5j<@?%-T?. ;RHogg@PLط4舞|DAjoL_Or&U+`$>RRpFe+]}4N5/~D#g,N%1,vYɽt a.S3tZ,#`4֝]=Vfca7{FN.E$EV͋ Xf&%Nq3E'w Y.- <&To~4l%oVHB&VN)-)#;4XfR^3?>8<6<:ژKWѷk9sXV{:!46@t-Ht&׆Cҷ AAs&ݶ'{U-P`+Z==]Ue蓰1C1!ZrG`#D%VYeؓTf+ ʷ/0Ag!$,>7ˡÃx tg(2IӾƒ:Us1D~̳%D:FDD@5Lq;b.ʬVzx@6AU D`1"ؔ:䰗 3#E^*= bEk*6M'<*)x9oE8vʘT*_؛&H>d[JNCRՋE73,#T4ޕz>H&_a&"0 w&ZHݣe =ZS\W_S)M|@ tdՎYdh39.K) P@M|&~ x*nCVN,S& W '- nrRTM9y+X;|jʫ!߷JU j b5FPk#M3&ycb{ !0741@kir;MS~M%MWR* L&s5& BUc[1r$hKY )DUtp4!BoOp vxmB{?v\Q*ϙCj,ZKRʨG2{VGGG9w9<ߕ{"`Aӆ2Bxz!. [gaD럹@ܮT }I:cT-<$+aJ|;}lsJTD uא4C(乥a(^m$֨k<_a~G^+%ՅLCR?lF[&_ksC[穢E7x5Tш1Yk;nRWh"d{ E w agT͎z(o0QL-lUxsZ5&\[-QikQ}HYjҁ{^X!YIQMSoy7$BeHEc @P]'#äT)Ka"iqt "j8a9Fȸ~vIH w@;aT[x7rDy|N"yo>l^8to6)\#(qF (4:K:G.ֿ҃ɥ*|]TQ7e(jgi"bZJL>If%;L빤Y6_nAZ8dk%<"D5 2:¨v91-Cg =RULXJE`ߞa&^N ;vm dF8> nϫNIcw<ӮX%o(}s.Kf%RK:l;ꆞhBqi^u$w%ӎ[HlV. {e gQ, Af=0CF dNⰙ\t $4e۝#]@B('Sf!ؖbFPt٠BQ٘O+s n`=%!\&"lJr케ea #lzIcb8akg%lC9&92"єl3-oJeoBrؙf8\/q<iF fx~X=,k`=]S-:ml:뚟DIItG?3?e$:o' !C1j BΧK4 Sv쩭,MW"8reTJ9Ug \LA>\M|#`:Ja~t Ar(;FhNM??gZ.sg%R4%G^JUΣ0ZHQӯ~=-S&·=Vw<,} І&nǯ*)x*$OŻPFJ|n+ zRK{{!G***;;Ě}2}]r.?US{Y5%׬YqWgmsYmFgHTWXadڵ)Qf|h^uY;#;3 cAIN[n6M 6K> 8AEg&}-F3l[G9j t𩧓@* 6RC}4c&i@{r&O~_99ZMHӍ.8\7xjf7գk|8=u?W]I4{CuMQq)7nǘ#+4wb_5ZTn/XA`eЀ751 PkH`a~T}T8E/=uWZ44>WלIrbe͌~3 <F[q[U5nVn-4G2 5;#OC%w h&]OW/6T63(X? aq)ҒR؏Qilc*.v[B}6TwyۼkiUe1^`3 q@2a$ÑiyJc? uak؄EUAVA9#$DF.ӸuV! [L.7X$?ÅUAF,}0~q]ޮV>IZwc=-ge6' iaeMYPEds<ƴj:Yˇ<$"АQ`;m{^Og|)͸4ψ%a'7_-^e G7lyDjeOů!C۲?H#Ƙ&>*=;`:KS^ZI/3qLuOK[W~姀[:SPjRegZ s%q HKjl4 8A(P5"r9B)[(XąJaHJAءֈ#XGŘN)OiTWO;s U&y3";wgh [hXS?t+gbfQ`]=UFDKl! Z%Eg@NJ$=br#,A-23-Ld>:" ;@kfa$(X@/mWQ[~F)_E.*RHKή_s L|gzY 9ꩌՏ1GX6قYƐ3^"زtjJKn)Ӭf/ƅSQR5(+'Y#*֥G}w7*s#_4[OV|6䲴vI!7Q5u w|(=Z2;XiBWTI#"Ydo1mS;Z ag^wU"|n]rimyit_FWOmXUaNOqˁ%$,h[YCF( jN2msVWG0E0/ H0 kRu }sW4 ZFiI +F}XkjoJؒ:MKp'}zmzYEr^kI6.zmIdiZ҂EQ/3{m i =gT/U%s oc@ 0`!SzLnĆ#u1g\[10A+=4jWX0D#.0![Ee5%4Un1ּO3;j =BJŦ71HR;o>M~=WnfKʼn1-GN8#i!ɫr.4˚>/WůA%S уeLo.W܉USs ƛ102#ѹJ Ebnp- <ؤ?ܗYbDJ}][uM/q,27ή10F&P#GШ-[kE.6GK:s" sTa w.Chn s$,K#}@[m4ɳ dAIO8azHy [$-vöuRMI]G-F"a3i9g,>~ yn x$m$UvrLRSwfwLI]o&Lp1zY#lJBA|d4aӠuʎZQ5d2Шc {/{UjfŢ&RA>ViKUM (. #4݊<}l?lLVq9{ 'rULNϿ~f5tG] %y 1x Gn{XJח=,N˱ Re(5dLi!ITicfkC*i'0k9LFD$s,ul 6ކdqӮV.[`g"-'%PMRk+u e~ہ!I$E#%kV8SŃXS[mG"މznn=]F9yBw1[qUvq<}Udֆ(x+6c4z-Μϒz5jyP8$fဉJ0iO(FסScɈQ+vhavuj.lu3$v,f|Ji1Iiz|SEf .FǀAO B=/.!lm֊y Wtڷ6rXskV'}Rr+[+e+k:ߧ)Xb+_ueɳ#3l>[BOkX&\:IaXhEW=UT^_ocz=hSz|in<T‡$ 5ɉy:c!T/Ieq& Gm,3҂Z,N)+p9a>?ZlEJp\J{uW[Q S.*oGx*ul0L\g@$n*]Q|6{'Q1&M*𰻠d^[+UZ66gVv2νXH~aJ̴ԹYDڡQi)LdѡPQ>?98!rve ;uWl x}P. j/:v\? ;߃O+%cLmϽ6Sǃ:s2( Gt@Qz +R/w9 :qP+u=a4ajK۵,e:8άv+&\o M0)ႎ MB 8?kyD{#O$v:; >dw2\}z#U2_Kw>gNg4 TJ$dūȿ:!_P*1e:uASGW8+Mw R0lD TNQO՗17T.FgsvdZMe[>zj"!ۏ rMvHn &;RvOy·ߒ2`f{ԬUQkR"+4q'mVo6GQT%'|)Ҡ#|:& Btdl=a̒Xtbɚ٘47&df/PϫMyQ}sh[sQڏ h gX ym6N쌡RG ѨXrPiє*>\zO. kFypㅯT ݺvvvv~Teϊ9uėKgNuy[N9(^݁$O&{ZSjBU[ǣ#Gp/ēY2lfmXKgyhTْg$Dk2pS}TS<$<;?9%kjM 8\Vnez+lS}auo-m̂>)bq `]&VPlO90]Mbq(Շ R6\dzVWQϵ+q,9װL d}tcU}%K#i˱[&\g7j|ANyba7TܾEp*_ 핤>Ò젎BFhmd^clAMYOkW5D )(vNzanVAqf%DG:׹; pG.TgD9l3G9S Acщ:ɲ_d=j L4@G} p*îW6C}/Jg:.xP?5p(q]Z1e>t=ep~L!@.w51l0MQ5j畫%܃Er]X <ZǕ`2 1sDEPc 9MG4.>f~,Ʌ3,{U jЀ N7&sdh }o&,ie=Ou.LΉN"q9 ɎŌ;xB79z(j42gRh}~ui9gQ+dͦ؎\`hp %K.n%\K4NŢO2~p-Ϗ ^qu]"DVȍ3?/h{S/C,DN Y3רAasx<2)I21GV@ s^*v we"Xglj@\q2tH~T{E{ir`[!%HW*"qFk@k2nu?Y?WEz~IC&Th;Lqɴ_27Y_ $0:@.X:* I,}?C ;DX"ʤD~Ev[c~}BxnqqS2J1B7쎢G.)Qy@tgfkzPkuE߲tDx(7:\GRW֙2p6SgfZl gGe(E~wp\DFmc[]4*Fh2hZP/[EWĵN6"Zm,83\0ij9`3JC*kNKHVVo1^sf\CĕoPT?i|$m&%GKC-!ƈ{d=G$z %=J!8y6(6KN:o6eS961CP3,J,O ~p{k72e5h]}<[` &bX=nnÐ*ɶnnRb-ԪN|j٧=Ї݈,5u>魿;KӱXfUhBhF:~E}vYK'd; ~DSJqpFV$Q:ꚠNJRH.OUH܅K^ml7HH=}=U\Ϯ:,fEDD)xɭ=hqQ^kηx g1E:18ZIP"a= d6*x=e'KAql-+!?yDUa7iR6 endstream endobj 122 0 obj << /Length1 2017 /Length2 12785 /Length3 0 /Length 14022 /Filter /FlateDecode >> stream xڍP-݆:  n58{p $;'ޫbfݫwREE.TTss"hmi'=X_M%N wpp8x9 L\AEV=L#iYZ9z3 ; df(8[^N43ۛEA/l jbje`j@' hC0@2Vd/ x1؂̀` 9x9.Pv V+wog Xl &N/&& [ӗ?+7P[C"4/]KN'^ڀ^ .l` PNo%' :fVlkx8tra~Q`xY_L\g ߎFs3h #f1-/_f_/enikjh*1ߛ7/.n '@oUN[*K){7ͥd2@ga7{< ,߂޺q؁l=xYWjYE9r&/{  w aˮǒق@{' |/efr8L.`3{?6`x 'é0lx q<6?L">v߈&q#^o`SlJMr?H%ib&o~偱WKM/ei~34+`+`QV/=/E Tir~ ~_ʳ-%/8v9<`[o[!%EˆٛEɿq(q] W/N/`g+_{)_ /]_zrx. _Sny;S݁f fBAֵA%HXvEivSX .w舉 Ukk-i+EGÖzն{8ɝ6o%ɐHY4wm`[;ir]Up~ɸ.VCy(bҌ/5N#Owig 8&d(/u+N]DDdWأ^o 漊 ;6>q{(L}\k+G,.wbĬzVQCˮGǫ}fXG %ήE߱|"X4[Ymh@7&k۴̨u?XѠ^v9 s=byin?й;dnGdH _ݚ-D.Z8*1#-AeȠv!j WX-Rg H1ѷM0c.26VC7âC.+z.ƾ\䳰 Z@Up:Cb(Pߋ$X-r@гWo8`1ԯtVy(ޱ@Ú00V}Apx;uXCwXʹn+_f~a_]'fPkœݪoW;hv]^%؀S(@R+3 \꓄he0P 䎌:iH8r/ \#03Xe'=Y3?&(^R0, 7E>L[Q sQ)8|nz{cRݻuon9!>=ZJ;V -'ŬF8&bLlBM FL+x}*=ČT8; oGL5?Oo!3qjƼB Tkg#iL?&W $N [x4JNn7#\ #ûW v.OMX|v|`yIYj@ cXz>OR{S  lsxџ|-ڻ%Y'͐5RׇVF+qEsgZM9 {{k1Nl]zzI-?N⤳ܳ;h>%,:iZԱߑmaB$%+nF_]D/X l䫵$-S\>M+yr34dOh Q2]gz4??Un$NY!q.5|ˎ%]wռL۴mWalF:WI-BnW)dD?Z @W5&9Zџ o(379EE 7}EYwr|)1 GPASMO5qdχ^ڶLb4o֫$nL۸K#^ $o\6%YMŤ7L"n1|5^ N'|VlU#63#.C9 Pc<1%;)aTE[sԸrWKG.RQ_y6Tnbc  dK]F>sHW9js”|c\Gg ]HY$)3wj}⁊oy o&k~v]<59pccŽUzmxi+QL*6cK7/F)%51G&Ȕ[[pϚ*V[&й+pQ| čd`*dMŢ yÆWX9c2 Cpm83ZiilF3LB_KɃ||,ƃ pUk?~{:EV쳤O%amg)n>so "Րuc+u"w\VQKiНżEkZHy+I ô:AݘMlH ys}i BrḾ+z >o;[Y_IdCDGX}lݿy1Kڗ{љG)rV.Zj$S|JxgYZE',0*kƷ]q 8Cvj a >a?%f>|[z6,T%’3Z)z_Q[r?GN@n@D6NYxج.-bFG?cOșAJ৬,"xݑ@)VZl _m҅헵-rHDW6O"H|!qإ VS3AyDR1F3/sѠ!W#Ih_m5] #^xQkBA7$_/ڭn\eMH=,q.<^kd ~EvZt]#ESg)79~q ^Xdž0|IL]PX&*Iںhsgbƥ-e]Ftz7}gH)xJ!nʍEUm j,$o>4=br1צ С<:2^ YUKU 7װN)&3o4 UP!dY&8xLa Ȏw.NҒSܪ`\C5۫\4NPseqdQĘ H+Dmȿ!<$S+AymRs[CXhG2=#c WQ:C.FbrFJEMLXg]zF;j)SZ2U:]hM{ jVbzvbTGpnbuM˯6]bA&.ŋ|;L{vc,3~G#ki!%>|`i0_#L3Dgs>|"7-WXWjny+\U6pdvTi0j- hb}cZvm-%l7sEg7(|Ì&jK.qin"gr c9wAF%o2=]NI $ ̘'#[Gn*wI[Cnrdž(./ZK 4/fMN!ы_ErX {T/eA6sPH5X"'ބ\#CsRMGSsW7ƹa{[7~]xO)5GW*ygZ~8؞۷/<#[Jc%45w1E:\/ֽōzB%Bnʩ@ gZ-woOc'"x$KOo`XOп۸ÛeB dn.^ =OWHd,X( XKԴ!HXQ7en@֊czVcs4dc³!߰0ǎ9T\m*W<-)0* Br7L}ʟ(q=2/_= i@#"NoҠ+T{-2OiaϤ="6f6,-Z/ < ڙ9Rń߆n "ԜojRu~"ԫ]+ƲHցUڕN̟oI;eOn=שmUk:n^DO~$%Ԝt@Km+3bwŻ J^^6h94~&O~*2f˛k̼~x>#zphdSMr`Y+2{ dl.12z)XR E8fQ\et9ED[(&]Xld"B'3 b5QS Y㾁$*' 79޸JD3_)'ϣZo{N6OلOXͰn"@ܡgHH(k;`-T$Bvc_H>9=s^SޣyIpEgVT'&iWXI9|Os&\1X|*2KٝH-@9+1Hq)v~G1Dxj;kϯF>xaPyfOMLI-#➒"qLd*$D2 ?Eqx47`vgjSu|q|6/PMhymOwƔJx-UtH"Ҍ&6doE -~=v%!tӻCEG}_l T"ɇ5ii a&mN ,}2UaVggnG*KJ=M& ˼׼/0F5 0zflQlD ;-;qɹ}^E;B,c a)#{d5H?\orHt?OjYw|Rf::YC~ &±!0lgƼ֮)G|qe>`_9PDp+ bӨb4F(Is5Kű=&!4yjl[DEYɀbx kFk3k'6~l߻# XD2,5=xuheVbou+h++]TFKvS78M-)h_3 ,~=ruϴ׷\G6(e2u!ƴF2#dy9$1hGF.ibk!A&xݐ]]B JQ0t']$͊YyB$ [np-q4) PxtF&F@B˩ 9ԠKg9rwqWȆ-#1OYEAnKEb(q*dxM?2R1b^G'w>gu=omn^*_ޣx#Tmꄦw-@.0ڱC5=ZjU*g]!mC% lZ[`Mۑoj@F7uiLe󕔄haG4 >Cl93uto=|ւ&XLV=ŹFp)Bv'(2b!C-냠^QAXPɨ,ZQJw5+Q/]:Ia[#Au0.xhO'@7lw9ti+F&R6)VCM25 c$,OR>0J}.f{=ﲯ!+7͙z*;V/p h( g琻71ib.MG#6Y(SnCnqrl%+I)(̭ 18$Sڦ<1$ʣ.X 0(}nzWiEN]JE]oPgn:^#Ό @-ws>^r9MXw~Vw_/@׷?|&/ew^^kyMrib.z5Wcv1Iey71Wc̜~zSI'7N0ɐ/U!J\AOanC A!9'ocH}7GKOuG+9M[Q :|=^p~`=1FYʂ?K:U4 B'(Zo02]޽V^eM͌;$?nS2q{mѓ1Ԭ'<Ќ- ۏbBjKb Uo >daD?w4"dı~W6qeٟ^E) q]]y蕘rfGrŴrgquĠ95ʐ!qYZS#sƋμ^DSc[^ 缄h|a1Hedt(D'4st$$\]w<sALZlAXƲoj{+QJLyq`EͰՉ&$peܥxQ%䖐 COqMXHuˊ=ngk?F9ǎ oa ȧQߡ SN 9 vZi z^3q}tnͣnұVpw &`8Ao!Ƚm5I@B̂;*V5ª5([n$4@Q,e7,c5*n޽`UGlp®wZY+B_r>Э=ޫ-uU8l>py<2XfYPFv'{jiBKID׺e-s[QO|MT|R Gn *s" V\wSZͭ.<<[pT=f֞S%IT+#[QG et|^(#=Hf C1V~8Z ]˭VѓꅏXk~ mw3U,Ue^t{enEf]%" =h!˱QP *~*~'l1q2Ku 59OZbIfߵ*SI $.dRد'A ٍH9N e4Ȅ@o 4@͒=( 79BmѼІc;5;TȉH `τ`{ոɥQϑ*scߖǰ[c$;5)ld W'-D2 ){^ ;`q'*A6b6>&Ƣ>('5}kɡ%co1S9ЁJGk;v!#SvCcA52'LWrt q-7ĉ'Nd^|a_I]L5_/5# vfxr&ۢЖ7 x j4>OIZxpb"=TP\(E!uKQ3$ ݊Ñb<<Or}f֙MRȵ-?9] xs%x0bY&=ƿ}ҺC] 0 l$a`" &%hZ_E7i&a%6S8 +R|dh򱕢)!`9W>79-Yj*\99]ڳ.k4qjKQD +As"}ѯuu} ׏}=11ԊڃK6 tNxMw"&Sg(AXI{>W4BЖTYM'?13ĄDZI߻ SFeF`=dIj qd=D'Ÿ[kӠ> stream xڍP\.Lp wwwwwmhww 48 Ipwww$CHfUթs%kojZJ mVIkH qgdHjq8888Piiu̨z W70"iWM9N (y88|BB.B]2`k*@ JC}\vdp NH:\@K@" A>E b,fucdxZ 7'`Pi:v`?Pw/KW nk+yq @3X_pqMW/"0w%ur!#.X tt>[zZ-~ ' |.܀`gw767݇ϓu@ ~0WHQ毐g?6[;_rvu|A9C6E6' *'' tXl؟ ?Ểpz2}5OeVVR7d}RRPo+77 7%]psaϿΟ`7Y ?7>p?+w4ptf->ϙUY=׫n<[ǿv{5@?]א9! ׭`dogEv翗ֿ&`j,$.^^(Zk? @]Q(?]7j AH7|f=GFϪe rmk:99g* __/z @W⟛A@ԕE(P8ܾ6Zċ`Rt@?oŵ 㧷[WoFzd.%V)#Ej?'k.O N| C!eՑKCSƫ_޻n|meYxyB"*DwV2d&3o˫9' dfԀw~F\o|7*uܺi.qg+.nf*zT5=A]Vd0;TA9ڎEv}@D>kGa(#I Mab]u,x+͔f19:7[b_tGe3+O `^.<-qh21<Ҙ#ZT߉9C"G{1n0SM޻2U#4xJj[\\# KGvIH[^=KWL޻v[>*=D<@7ukMUYZ;þ-PX ![l 0Xߑ*j H0/>d '֎Ogη\:J9se "۩zUk. 7ILf&k{cKha8'ۚOoOVe.hl$lZ ˘9-,o!0f=45`o>~!8M5`JQxl2.5/V~z4KsUlCw7P)e:ajhuG( je/Fe6ZO奬iT\lQ&2V='R,`$yL٠mt_^+z.KzH$aX=u1@rˇ37E9@$::K[S)q`GѦ4b`=#Z ϝ`/A*r?"CYɋ6\? KکJsjnIdKbᷦ{f фbEuE/J CHĘyBAGId8\5dsK+D %v7wѕv6Q9AƜ0~r*a5t&)A".vCoZt2ˑ> k /qu\nMWN`^;Iaf$&eA,;ފ 7;cM~{u﹨LN>M7` 0S|xm]9OxC]X+W w<|‡r*RGY#N>9_k.*T~5O:"]R 0 Pɪ@[ ;_Y;wA_g-|gMc [>( xR5ױRxZvm8][Q]W+2Y qLL+g=Nyծ/w Fu_whK{{p\Z̮d?{@o)tˌsv/I*v*^}jզw 769mX<6/DMOhR!sy2Y?)V^*zJ!j}k611V@抑r]7:] \hȀ6Ò!R3)hMLi=F$"14a@=Gh 7Gӆ@XUbA˷ =\1S6V.} 8ODuoQƳ:zk^4{Ƹ>)o;EZo|Dū,LYrb0)=(EQv; L F@ 3G.⻊ҽI4P^x#0lҶ܂ƅ`J$|egd1#zg jF3 Ԍ OOQ|f^ M]]X4uptx7`gKtqUv{ڋi'Oj6~(t'hwV)go}M-aP';I;g+"w̰כn)޳xezќ2캡UcunlmȢLjqo}1i9)ǃ VBrifj"Fs&,w|\tA4Km+'b0oj8(g`J{g.6VWP9z/Dyˍ[tˮ=o 2b#RLe-2k؞*jb2Q6!J#zqmtZUj zZ ^н[)T CtIy>4(ۜ:O# ^p]n烠f&n2|+)~Fg$-8X|LսR8ǬРc7FAT@n> QwIpb1n0n:aO4XyWz 9KQBBVhwq8Qh$^ 1 'rZ-Km Q$qخ84Gvl2.-'d[5z7JҔ!.^X!oL;!-LTXXpР95e1rSf"8.%/o_|uA$UזHWY?1KoƁ%{P/=+3 g23 !ߧIb{Wr RnZiTcU#dXBˢaHi6/᫘_3gD^ɫ[WY Ȑh{*w243 3al+jyk]_R_Ɵ//Agww" ;Eѡ,gFL{~Ġt6zLǀ7 ( ^c!$3u!&U}-*@c{B3x_1ޢД[uœ`AMa[?xι <4oTh{nw}D.; O5!Po(3(+#p.*KJmG0]]r >NXb/ۣM/^$J88f@JMp.3{_%]\hgiN$10Jȱ͜? r0f낸0;"!ozM/2rj z^)rJŝ6O!P1X1iyVOa͹bBs>MbĉS jSc4k (O% 2+r`sz`nN)6eip)%tڿ*E^%H%"PZiK\ lq#s)cץDk.~>.E " @e\v!>k)YaOf4ək@ﳷ1 4,U["Uӏtn/ӿ -Lk9Γэ|V390Sw G+v=v8u|ڽsw/D@"o{eVgf&g[YƲ*Vo5 oF$uU6}J>cR G-X5%{wQo|No~+qƌ<|9!jV=)Ddl5WMց̿dF}~9Ӕrf/u\rE !~\75I..eo|쌹-CCSx3 i ҰBܽɨuP9aܘU{$`XrFF4vxԾ8_j0{h, c`EA)0S!dt"+7v/6#BMjf[Gg.~*6V mj\܄zRmfv.I$gDT?t5F0Mԣ*:q1O| zSX}*fpB-~ܮTC:21h`:!U7:]dkŏsKAf */YSr#ճb3( _/c&R3gy5~L9‚pŦB6= cl+۬.d-/ EI}mx7% ^DΝŀ H`=h~Wq+ro+Ma&S^ո=6 rjh9хzs_Y]j\ XdY X̩g`3rgKՖc&Y4}x|̚9V%j/:Rcg* HnVbn6|z\=nWgr,[J#u e 0ǣpMjd@EjN_N\$%t? ֣"Sm4V!_gk;2N6rک;pC+7wTԺSUp(MV;)-6h`wq Z(ݮqdtate^-3} }H\e-B޻b3? Eᯅ_KDuϾZnծc)\Ƚ#OeS J] '>4R|WڝlTx鳰y5vzQ 3|Ta\2;g7c'`Ovp^h/,;|uQ55 2l4KZةsXma)Dнo55#,uu{/R^,q"wwUhˊRif)Q4ڷU#P=ڶギ8yHxhwqy( HEfՉ@+4TO2CN30fgT.+OG\@G9"dGSBϹf=潬P6ݯ|o(3t]3?DvU7m6ZBO5p-H7tfQ%3 .^_3E 1 {*${ d8$LhrlPgO.Sѿ~kSty!P%4vcNe6LcDAur-#Z2y۾P:BW 2jt A5!AFi>\#Fo{p;LhSka 1OT{[QYjs%26 ^OYMh1GwƒZn[8 uO{(O;f~97=Z.S\C C*#U}amժ#{S@EliS]A0y`P/nFdӥIbPoOK $ɞH@[DY"4>12*O9 9g+9FCI!bjxzo֖7d6*ҷ`Zva;]F9~~eςI܎|Xn\q\Ӆ-q8kZm!xangtu$lOsYo}Zcooa)dSJ?CHq{COdfp[:KTxq̽.9dQǪʡ&bZq] 8Hif֨Hl>Xfd?zM;~,Q?4efËq2Vj֔{@‚:NszDŽL?})*џtQS%wj+ V}FegLi9ۦru{Uym z۵ i:5EPP|uKMc<?EWwem((2lxkE*jwހR|+|0/#J(p:|N~/&5`ָÕN$WDC5'lz~M.d XCD$7."2E{xVu~H}/'ЫXw=6Pa}x)3+(cȗ-*Y&ݶHZ#bL68Z>Jo$T:Ɇ`-7Z@w]Kݳi7B+3pn9W2zaɨ$7"ʮ[βRgrt4F^##@gya!GQ AbUS8Iom2+DazDL.Դ{8%NE\-_af%_j^7^F=GZ{h#{mZ9m]t!2?m':f:[k҃L0hoX᯻ < 06$ +͉$| KV>lE}6-TӔw%`l(1?TBAEō%cdy~1Q+FKs.LAP.҂s(QwWҨI#d!3 sJY7\\~0/qbg\MmËb1瘛%zP-[E(jD;P!9 pnBr4iQO|O oXaspƁ& E^nfO vJވѦPO}:`ũaBʋ(CQ8j9Byb=7f,~4+?bptz|~&@֠x'KA%xlN *F8z=kAĬL}5{'.Ǘ3"RkjԄ̣K,ܨRgNR'۽ ^DY *zVT$w$],$@(Y$V;ȵ} q/ vOd8 #4߀K]*~3_hr|$.@\'ktF>RCG\೪ D[D424d!UbR endstream endobj 126 0 obj << /Length1 1373 /Length2 6096 /Length3 0 /Length 7038 /Filter /FlateDecode >> stream xڍwTl7ҍ #FnPBc6F74 !tJJ7H! !Ny~;;gw3 #E@5}I$&f0/- !ˮQ:qG:n1,d@>0G@z~H S_G "##%'E `8@rc*BnSE# !+,+vB y0 E@ݡ"\`^MN(_0 (`(  w"Sm=_Ww'!;`nP Ꮏn^L< s;`4h y`n'd  GyOB0[sp/<௳ {Goas8FE3@R2'Nnc8aF/BzCA08cPd#ah5<'[ p7\f:VIU @ sg#0.@Ն;!25ҿy&/ B< H|O ݿ?hz6V;o;( ]0ojD& u4 .A/oP#ˆahxaŐ%5ovJHH$؏sI #a!8 ` 8!$S\ y~+Ș:(_ H$f_NCh(dn|TvVrWpmDafW0`0:'|S%=W y֫ǭo^%%-VK|GLy=3"C-MnTHsQ ]]0=f^-KzY6!`oV X;NKG}ts:oU'$h'A8jU4|LԫɊ. 8WFLPi"n+64M,lgA-tejq uY<J |~ΌXz^Pij<@E{H6̒z*֪r6YwW͔%IOǘ=OC SAQ|`jo0(97!7q3TX ~(r'QDREE9/$6Z#Q QiqJ :uܮq=.gmnXN|\2~eZ/ SߴJ*K[ "`AOt>>{{\S*gȷ ^5Z踓݋|lQ_tzO`Qcvԥ{c5.qv]_$[7(4$ZyP,l#l}"kU[/-uinDdH>pG+fܚz`{AEWrkl>^yӏ&IqTt>V48˳mXmǿ`Uޒ|9]\Ti=&Fu^V—LkvCÍD9)'jgVߦYwqHARK=O՜4r$.4me] 91 ts]4)Vyv!9_"~ d|* GM5jH3l=xZʼnĨ; i8=GH=y[B~u:od-t$х>gv-VsOzmvJ/11r QqΎ!enIdRPY)/;<Ig^\]RKlu#5dFTڭ`B"#ֳ{ 9T#t,E/yi-i;Ǘ dZiiɒiRה"& NJA3(oSK˞01/|bCFCE@7{3ZlR}Qj5ʊA,Qx[4GG\8Yg3X^b%MƵ^8ٱڰ,X斞Ѽh,[gp0ߺj)yq_DnPOgYҷXaBs+n;'h=uo ﱵUtxZɷ,#&I0SZR=. Ӌ)Qw([r}FsVoȴ}0jg-@B!˓Tn]/Շ5)ۜZ,$Ģ'V6֪vt}v pgJztCXL Aw'*dw~in0>jBL[=lz+A`FR~>,%fC3f&n)K"ֺEyFM *VQg)&X*pǀ #Ȩa8@Gg_(*1lF V_Г 1ՎdT[E+bE蒋:y`=.Tfvt{ }LTzJg2U2f> <}՗'CoB19BųWFsXKUw'w)v zkjsȃZQBM;,/o#v6>,l "" XV?Ɉϑ7AEY ?0Lj3U5{ȜGͧW #M0z^#{1zD(źMU>)PY [5οДEG>>PۏOj:-%OԾ\И~\8 sXƭrH/} L^e}NO.( į{? qp3;|+q,Y|(G^Cq/&?gIU~Hgn›k-W 2K%#[j^%M#҅HDrin󓙿\K5r} я;9Y4TjP1c2>ܒ_hL[_^:cKMWf}pjgݚ7sD0T=[X鷴9I UK[yV$MyS8gIYܸ=̈́6*w) ]I t)Rut6Wp8W' /FUT\p+s?zm'JUDǮ9WvMhNw/zY -dp ќ{ONU)vf63V{dHDBt~A0u1WcΉ~f,Dǜ4/kn_vM (mF簪ŔK> 7k^?~\& !i"뭆l*Dە@NȚYRGEѮBȻ .Ⲩ+CTZm0W(dI?r>aV1|R43or/}Be$yى9ْ?N >#~H1*3j07}iON!zN$WX?;Av5njsϿS2PpMJ'OS_>k:qt3 NOߏo8|\n%T64*xƓ䫂g@S[28$7]oN1X.6=ߛ/$9 ţjcb!+Gfd$7t/y5:)vTp<^!cq! \8AM4 Xy'Fgؾpkט(=9O\rB['B3N#y &u{YfrHT'By^$."ו3O.`l8aIE@\z1~W<<iq9<ɧ>}X{ǹg'cԀL|}3usnB\"އ_ QI0,p@v珆ϵHkgiάphVoӉYJ9abV:Brc٪=]Ivo-b D'񎰇l,bɧ"صa{^6W*8{m;J&i>e -`G ? {+y^PZpvy*s%gSE| 3IG$^"汞JQ~e!72}{D5>Ju.Cϐ+%Ҭ<MHE_dq uh;߀TF J4U*7-"yXz(!B>u|.;֧H4]!:H;AJOqNJwOWXyRjYiiκriJ#nPQiYA5Vb w7cfwSY~8UQS!6s8:&*,p>G5K:"{ '2x+Ԏ1%_VthE1myZYDbAogogܾ3,楶`U._C@襼֣x VQrw7?φҤTo HW"I]:Xh@wɌ#83E*4<;;A x3Q=a×@ ~Q8 54~lFk+m{lv(V?mxnnNl:"Vtٽ /TnkΖM峣q)mF[6Ē)CFw?YIXȪl](72)-ORT,^| [nZ5Dlqq|M> stream xڍVT]$e$RPSj`f`r DBJIiEii) i %U@;{׺wk{Ύ}k*;hV"` 10XgzX|po~U ԠX|>B$i9 eՠ~gPT^ʿ@ "++#;c0( źaPO)c!p ŠH14UAPM>p] ݘhc6E`8oD(|/j ?zD] "7_ٿP (W 4`EP@"5z X=PhrvՂk7±@)0,# ½Yˌ?[ \_x;@ @g t"Pf˟=~D6O<-g43誙[* n.t'*.!qq ~O#(*j\@?o_5}!'X8Poۂ0M)z4|=={~Dx>ZUEW k@KDh F,U }>(@Q>`]phy: v.q)i #豈8^ Ph,>o/~ b0xY<kShͻUwV* ʏX>Ma}i_fEc:>- +Ms6^E77:$4&z\I!j|lA@ت×{(пK3l}ĊKi]ӲmË򜞎pbE9ɅvhFr.t!$ q6 GA}XyYmX8ޏ\ǩ0ĕJ|j# XHJڪV~fLt3;^DRk;t۸ 2*g2_^ &/ϟʵ?ǥ0ͥǚ^q- DeLA:./} Qڞ bT.8pNѱ/J";daZcff NF8ít&ŮuUŰb`WSPE1))9(xtƥ9n=yQ K4eLPL! &bnIN>g{WQԎ9l4EkK>bw$̈b{dR#}g|c[fMz |k.H>IƢPޝ/t/|՜&%2TXmL]}%ֳK:G nC&?,Y-z0jg6(𱟮LϬ=, ̫7xHZT!eh"c#{SiLͼ[΋iy7rt^\NX^tڽbHr8nx9ޕgrLexr"\h 7RuO$S dyYNj?=ڡ唶SX>p">.E9caIR<ŏ4vRUOjC^=PwiFn zx.,!feap7Hz(f9`ڡrZ.݊B`ǽzp"OT1c*I\{~̌kˁqzWfCp*OgY zP .DEE_#.3 nڴDD2;ܞG)HۈV_zO{M7^IR$c)SHuK(~^@*6ಲ+s4=2b6&LL `#2֜E[u8j b<}V,:d3=hk/V{\.ѦĢ>ڼMOkxkxJc[dz5żZ.~|p d1s ֋7dcVDM]?]snyxvVNr>HF3O{EiZ)&+ةm]f4>qK}`$JZl׵ߴ#r[KXS5LnJCۀ0 L[+Kn5<,bW?"8q ||mg|- \SnYuU޹99Rk [Kf3:z*ڡki~$bVy!,UB-FŃ ӼWIxWFijsgcB>q+m^WZ+5Hᴛ&^ZB݌RoS9R.xmC_ hwu =- DeID(Z9 gM_ AB79 GYȤې,Nn*款ү6cXuWn%d-eHQeN aZ,ׇ ߘr.v輁qiIzq:N9Oѹ,L LO'yn\m!^οQRB8v߈u[LjK0d|4/:ʗ- f]DOˆDi Xt'|k7m88gh6 *mgO .sʸ2T1$B @->&8s%"a2@o(gꧾ4]Q;m:r ~o{W 8I@d<(Ҥ+zVy%%wlљbɵSd~8Oԋ:S+MRiٓ;/,mi]•GTl4O{krMGKNݫ6RLl Gdw' x.72(Wo*w͑F+zr{ Ў}5't)"(t4h9E59@.t+INzq5$;6 4dj3QV[ic6`Wy_>?Tcu/h?0p'|MU\J LfKƮjt,ՇIϹ݃ -Cf5nwNbgJK"_f꒞tz.0X.#j3MHVFX{cЇ# WK`bUwm'c I sxQC2_k5E;+z"<_"'o(* BT,dlz;MfM߱eJdMTj. )nDhkm.樛E\2_`v]dG:HO%e0%$/K,Afvۯ'@]VhcRhUD.&R[7JՖ?=bŭR4y7tR2 kté95f~Q~ʿh9MK3eU/Ø.d$(i$pVayScD7N˛WPoJ Ak,FDWz[N`R-ݣjỎ/{E 0+V "'U>#%PuǢztC|FD-N^b_jvk!l00^FSSP跐V9䟃̢WD-%pw/Kk'Ć};LE9c!mÕs.%KZ5H26woo8N$oF7YBo ~N6X<\}/Qp}֫Aflg2#۸$y)Xb_c^D|'P9A3LخUԾmv;K{DcZpڋ:6SH60}y2Ԁ*{b>r`zӳ׼euHPrH҄MtbFI)p$W /B/S@zvUwj.SXC綾 Fe.yB4bB//L|x+v4!r}bnP?*ƨ|\f Jԃo9U C)ME/ 3T\ =iH$oG7H?G*y8M؀CJF;JORXFo?N.rk 4T>, 9 Hw-^c vk0q("*ML֋08}&~`pdr%[L-hXL.'2V3rHrኍAyτk<iU+ӳ[ hl%^]#'8@61fk\"w(.3ȅ9B"NTI[3á%[5eM\ VLgRy!|$alJKShyZ51R[$]kV#qBGˍAo~3)րSSm)7QYzBL厍 Ta¯ۿgdTwksw6HO͕ ]\Rjt KI-giB;dQpUMNF^0.8T* DTNQIsdL%zcfO:DiG =W6>!Q?JC/;OW'#]#i=Sl"ÌLچɰ^=H"'k2P(n(5Ἕ6_s"95QL;wҾ墄 os& F,aEri#׿{ӓ ||ě(xUKl `P +&J}VX^(U |R9AKKX/&Dƽ,aB\mn* 9<+&cQ?nr\BM&q5iOuƛ Gclw\na*.n0ݣ| }c4`7y/]jO}c b\Ky3/ *oԻQN .MgY<$a*fn 1U!ZtX%JA}fs:HjLUnGhY0tw[8BK6o!Nz-r A&{V|Zߒ\v )zq 䲗bJ']RCB?ib74gcvxBp^f~5 7Hx|ļ~GkJsdHñ2U2Rp9}s8 !-Y>;ijq1 bm vj[p1?#Xk}8A`OöỜ^Ϩ^Jd$*jIBk U7gσjAjȞ.~''Z3 ;h$;k)>$_ L\0n'@ k=?Si7ÐKt'H!y$X^eT-J3B +T54D f)b\*gS4I(@ endstream endobj 130 0 obj << /Length1 1958 /Length2 12622 /Length3 0 /Length 13825 /Filter /FlateDecode >> stream xڍPi.Cpn}pwKvvꜚjj "f&@I{  #3/@LÅ@Anb K@ trK/4vy)؃6 '/ /33 xnVfF=@!fdeaԦ4.?"v@'+Sc@hfojt..LLvΌN4w+K*4Q.@gauK+j.N@r~wpj2% /c 9 #G +ПƦv O+Pgtp04u7v356y71@RD`^s6urpqftB?¼LrqF=l ׳\4@V@XY]\<,#ajGpuO?}%}́?n@+ߊF,,3+S Ow1/y'+.>[f [l.'u ? [%*jf`0r0X\E?,x"~JC?ݧb; 37D #jkGklgeϾ'_4rZY}VΒV@3e+S˿F/ fk*;[qX}Lm/ yS|_N)27cX98NNƞ-~Go54z9&F˻ <_0! qA<&0IXLR 6?$zϠzϠ7~zb08L##wƦMG7}~Lfwfoggټ d0 S|a/Nߡ ӳ 9+O¿D߉8Sܻ]#eU[^vwN̝=\ɹ d}'5uuzg>|9@S{S`:w YO4 KN()4ٟ7nERHP/x4&=<&N!,>i''dPyq lwtFQ.ļwh\ ]SٯC|aш ,(0ə%qa Ÿ@ț|#MC=a+d}ZRgu#%=LY./pK߲Kf=STw:4eĒhN+Þs*!sbLhdՀbwe1ݘɷC9- 'ã[M6O,t>%“_79N|c LOo1j2T&mE~i0>])؊JkEnnE4vzIi-J' Q= RqUwvs].',P^+z)=>`ao4bp["X0n ܐwPj5Wޮ?vK੗z@=4krTXKvAKs_(\X?BuwHt?TL9Aja"jr8{\+ QBDrT-EضQ&ʯB4Mラu?rX*iW s@bhEbtޮp$k= XN<+E-f`h:;} ,j.DS]"zq!tv0dž*cqo?ѹ6!YHAтZ '$i;''=DWsÆLIdVH]CPPt ŕ]ۑ*.ף}-abNMϸ^EI!Ԙ@c^\8I0! l$C"[fҐ:Gu%p}yN,*>ؔ/$yQ3~AmX\4cpC?5XK<6a,r8ɇ:©_Y-}1Q: T:?HZD%&c`gh"y%Kf1 q T/q,W_eԊҠ14H άز%F4a22 n mʜMd3rāc:sՀGmrhTOD#B0V8%uƇ]oJ,%n1!iX}}$љ+_mw= zjX8 .><*y77ߐӊƵ2BJGWI0{YZ 8\ū v6_=7eHuԘ8pIK*?HEM\'HY .;p'V+.|0o? NKņ;";n$͇! *e7R ؏Ue6D*BqW4)$eXs+j(GXN%hiW2ic*m.1Ӽuk 7͠AD/r}ׅo .+q8Y&g(nڞ%9Nr[OD%w2 iTrQx;]$ }4p^2%~oGIG$bEOWsgFћ'K_+9ˆKU)ھ3 X~|ѣ|6̩lΗ=׹6C dtu,ҧ'&#佈A7{LHiTbAqh{.|zѷܼ /Aj[Vۈxzn dsX'YxAt7R)0m_>KʼKoI%fewT P2{˅ET{*>>vxrԯ{!,PmL S.u~oU5em_Gb@٭4d3Oɱ1#m(xf~ae~'r}Ԯ"YV"e$#+Pr`߯}/: nToGX֙1y3WEhA!o nC:%}%Ƿ <d7FWQq5.χ%FsCm#"o[W>ǭ_\Uv ;e͜<)\ҡ"ij!Q"z[uۉ׎BҌمYqϩ$SA5~v҅#|p=ǃ:oLY!# >Aihrx?KȎ3q!Yg4́!$Q2e(?н_h&í9jeXxAU*i&h؉lBq~] u9}qj\tO(Wnpܻak6[?u捜zt.}0rMSKO>.XURbh7;.ZID@bz$ؽL=!f }_YU;"٣b£XG{ u87LB "zj$sYbĬ&8Ȫ&Pvsm P i^x YYuC 5J|rì*'/ E-C$&҆ow7 18?oQ/nS[uU֍^@2f>Kl?~b3,4;jǀHlUc Pb?ʴ6u㑚ª7ÃXvO[bxrVNfFk1yL.ayi꣰ lۅ0SR$H[Vn˛ &+t-$tRug!] s0>L am!UX[l{"]{EKJ,`b" >yimZ^o%MP4[ n+}wom.D!Kxߴb.A 8ڌZf4 h)w]dvڷ,5\Au$x'xg9)k9"uDS%dy&5:L[uXd pf FN<˓S5i';!]+~G"m[̦,At•AF3 :Y,)gVg:'p!P3:=*/qcȴ3xǻK=a0ɒckP6>>/!pSNF`Jb+sJS \PFs7xz $/)#E b@nˎŽߕdA4Fge:j·KOoV>z8q]ogZ`7u|޷JG|ݜs}2 v W+#q3]`ъqbK&tEVmYt_A设9y5ֶX_ !s|#ZViY"لy*8f.j<(fWÛ%Z^R!2ʖ]6s]]rL1>~못knW zd[gR,4T9Fhm,…o ˛i!q0% ̿c[X}Evxk#6 '>$-(Uطtj<#:I!4S^5A>%чƀ:m8)-|#`e&%IV.]-&A+zdWAXfJ?\gIOfAJG!tԥ CvB7{m]I10x丗'['peoN4&h]'G.FQ79 voZ*dҍQ$N 5TJ߳1I,'_Ü6!I "e%Z v q@LF@ Kxňz ZpL UEDUTlkևЙϳ|eF$SxV?%3ť2E] 9o( vx1|y͌⓭(N~dL-Lp(V_{O;gsNr c9JDOљ5܀^M!K{U` fWasn;t]ab^ܙGpmFp~xM.|Auq7'=]tr+Yq.!^}L߽Tmsm{y~P6!"}y|lC(kr+r:l=qc}G9˻ƷHt'vSi/'UU>*Ssd+?8b1וܩAI2o!\N+i_qj=2ſO'2!z-Ef/Goa}-vZ(ːQ㵧pfdGeEAtk;L%tZWG2BCx6$Na.h B~\Ro ţEu/&?}z 1S0E.: 9$M&CIjw9(9ny6jf_o71vj4j5x*r2)%.4&5;z4.e#Zch׹]`D&[17Fف+$>x[bTJ&/W_yY}흱>8_K؎[sTK* na#W;+JOjN`W$D~rw-E :Z)-<D @Y0gVB.Ki75+8Q2.Od_ 駜_\N&aH '(gHwR8W#JkD6PZIĤa7l֝ٸIT\؆z]uBM'\Q[AKBj1nmMLJ*L^orn/\"8Zz+oMf+ׄ sp0<鸒ÎҺ,l44r݁N[f&(_L)oB3?U C>*N' bHiC)([:aޔ@u=u2X01[~O:lK0T{ϻ n9Ÿ2E&Qo{iuF̫HFh^pF2I#Y":!ejuS LjD:/}?:r"G K& U|:3E4BSn221ç઻]tTR5i;qlŖޯP"<͙O7ltk8yj`'4=;80ѮR>txAv%- A$}4upU۔ӡT~xbZjS!k2 e5Ȏo4 E^^P%{Y4yoQ gGU<^>uf:-dUdRj+>C|t<]W#{{oxAm8]}*g6!\^KPȽRo-" ,q`/4=$*jX%950BNtsoć$mkU6X)-'V@1)?ԭQ S܄}~b*e_ղ:t>CJ~x_d>@H)f|~d?B2"QPB {%CFgHI}99j4lt"y0#Z~Q5%mhL&x;=Yd@Pޟn[hWEBݯP?lJf0-1;̡Ŏr`U!ck pAݓ ,g&mڒ N}l;WjS6J}@ GzX-0H9TNvP&+Ql _5Ƙ ;=QMd.̈́,^ 7 w{ '0=49i@|.5!]쒜vYϿFHqCsf+Wf[(32&kC Y fI2*CF ?aΔp9Xʫl)əaPM^̈́;V{_~4Cn>) DTF=C& Peϴkj\-s3Da8R+$1WfBШ%t*#JW"X3}e'[F&?]kqrÏ Qѣ 4e3=@kҬcHqWbVd+K='̯2_^^x1CnBsN)C%ɫ\eNS5%crc1Kdq0=FS9Ia橝E5萞rȯ̈F 8p-k5>l&c?v9R| J\`vܘ$0vu(I DZ c.nTq 4qv^̸2Rh LO[IV hv,GTi7fG7|%Ynў[Y4:oʄbV[^/qa|rąȲy!y0.|BSk'{j=xfq7C~X=*@Qw3kg udaXi㲮~$BG D]?ܻ xUk \'$w2tVe3)w nPrǗ}SĆ'6/K5j()pG Ka;Y|OdKq]Lpf1LͤIK1~Q]+ׄu#-Pʇ> Œӯ-EK=]\D컹zvAi#vB ʥAl”c b#t+RhkJt}rf[5`z'W Ԋ p)9O +y ԛs(S/aa8 ,kLMd%2{Kf>wODGQ)LuIQU2e]d$)!$+{);7+J63\ټ^*KřE]Pӎ^\~=EaCS+yRg.\ À$^2N4pݕ1i5l 0,K=%,t; FMF<s#$'ൂYߨ\ƍzX-FZ򑯕:kȹ-(D8 r-%P.ɛ~V>g|ks t}qV)Ėnh֯m9|UI] 6 j /-@G"J?wa[Ƌ2Ju9-K%\f.1fJ *v9pjF27+/RLJKg&3;".ʝf PO#htкGqל_DvN(FL4wx*@S.)`18iXpyjlp#v?HoӴ>~abK4F'.,~m/̼/@0 ?1u>1s-T=},o^#mv9lU2!nՖS?t!W08Cq| ;cwsHG PejXb߅1w{%ԈE~hDritNb% ViMiѡ\MrCV@sK$eeݾXJy03<+" ¦[d25pp/{Bd?~HhZ'!G{VH1|P={C~D"OW'ix+0U>?fEj hF-n^6քlI@'iA7 !02ZoZZnCE@ 6hhKBrsjytyCRs{X,4nQ$cb nt@iP3a{lrְȉs^uWW$7Nt1pBID>~|>6GNᶫi7Ƴ.z7Kݯgwnf(Ӽj=ӌ:F1dM "A%@JnP5[*{!hPs|sJƜl`];!(u(Xbּoap *Zʺ6O:X++oJ.={yp44(7^vVeS"/[h=/M!KRu_?ĩRa[A]Pg DQv1*ao 1 &ߪvƖkWHex+s7n:)6K2:N=]%`n`{tK|w됂/Kǻɔj ΉDrSOyuCʻ&nT1Kj &%'a633=Sz{3!ǒ4`7r*&E04NRŸ#]x?ߖ$L&gr8M镭h}K)<ӄJ HsY%nse:{glSoE[2v"f 7D-0!IP*!ɥCb gǷzWA7o">7W^էP X~1vgh ;A&=)]ų8n/؞&c [V0 낒ӱWI,EnFGgU,rJ~͓!z^W–)7G22]#GCC bx%L^\iR*707Vﲻ_-c`OA @?W8<-: jV~&d-M~~lHZ>Ep>`a~>i]wWY%@&xi~q@"_%qyJ!2\$̼&YW ZbI[m>li[-5> stream xڍPX.hpww4w%\ݝw;s)H> %\x&&V&&8 UK_R8 u?N@#ˇ@ `aab01qމ ffi g(D<,-\>20sss:Y\,Ml*&@ Ag`d`d.@Mpt(Nn@SlGPtKbon|l,Mvv@'Gn@h_t] ?G K?LLm<-f6@ C#g#7#K#?$F:g'KggK?*d#%ۙ\'f4uO?%:0Y:e![ft311qrU=*vw}4~y;.N@_*13L-M\@sK;fᏗw0}43Nzejog(%Y^ςxӳrYؙLΏGld/LJۙ"qK&ק`P;GT7.;sD4pSK5_]]>z_cT׸M-]mW+b1v6DKg KgKZ/fcillB331cL?G?~ 37cX9FNNFpOch  v..|fNp''3Q_(7b0J #nQo`T0>>;X?r(>Қ}/ M??3HcUXx:X|l->dY~fo>6?3ss|ѰG)?8~x}ML]?~0u|x{~0W癸:9}?7G[@ ʢ oU]pc0;$Ł7jzg$d-{^=q;U7IJm/> 3mpXSgB>o>ୠ]2\H%=C9d_fcԢu)g-BР]y ϡL&I=a-f}ZڨPeq%!C9N^.)\\h+$AK]Ga8fɨTku_dMDO-m0p"UĬn3Bwewl߫Yr,p$"fGOlht#~)q9QpMZj WMMtl\`6|MC.U^o]Dcoh9b\f0ZPbbI& 1DZD? Kgq~"J%Vc֡QHJRހum_U2TÄdxIB޸7( 90LNkzD88=]G4k08͖w5ékFNA=ޕ) GV43}LɓMW nFҚ@sQrSy+~ZҶ$/ڔվbhe*Q`$o< ׇz)]je< ^D Y8hJ{5:|ɆM}y~$@'.n&cRׇHv{VZkK0].~[8+({:~%?1fh >C{l}㬚#~}Ȥ)ZGP lj16o?~(7@.r#.Ş=C׍қcT l]쓜ݡS%Sc+R_HckBAc;7e, j4'zש4JO-A[r 6;I+OGfֱʠҳ;{mq׸ Z!%K ML@'H H`y4л;F@Vxhk oh&RRZxb,~o.Z1#(eWѳ%a@\z5S7Moѭ5t/jR]jڅYRT}-Qle5vd[j{]m<6YaQ.\RRSi10biwDEr A7}{:iEخloE_e}^c_&UTsH.SAD)^#z<&&ׂoǂWȜ'F+hzJAtɻG;r.mu<>6)j5>D&놱 ;I/(ZqB|l8O.A7Dzh9:,Eᔩqy_c"'q%٣]d'%߂Ohnt6_2ձ}:l6)a{.д/HǛbڄu7"=g>k&nBxsKk`Kt{hcJM课.!bD̤ssZ(g*K`Ag?<1* 2hL2S/ ,c 6[is&ᐸv|TZ)K3V7ǽlUٺK1ap`)ke"HQrGC <0[hTI &_izc=}io׿fH %?jA MrDG .ESӨlit%j.{L9!WB|+;+1T~Q,LM#)x7\$6KڋP`#qb$Mo#Bs?UE[xIXs1W=UzS)H&3-V)q\Fl]S7o82LioӎÔ8_KyRM<`h9*fp *g{mh/+5 K]۲n(:s ci9qw=&p}zyk z?wvZn#8E>"\NOܰ u8Fy#~rTrl ruZ;t8|Be/LZ0 !pj=Oq E*؍:h! #cz˛3P&t*A3GΉPt ::L<ДsM_8B&IU!IlQ$DxBtn$k!F-X' Vp?…-t+E8 x^EVuK'jcd84]|TǖxRG +Ȑ Vi, 0Ⱦi1Lue>;" O?( _Tw8=$"[~ l\n}Sh~'"Kۈ9\an@p{ĉ睗)kRPwZ#Ҥ:jlKa)T;;8wl`| @ $lVwu۫[(e%Fh‘01hMܓsvՋmsog/}=3  SĤ3YašbYː e˴}E,<L d(Ϭw\O͗5 7u x U%&z\¡US7bcHl8e("f&üĨw'-V*c)4ilp,zv^%3f*x`oB0wK?g57Uh.4S{7%Jd٧2e#(˲Jf㰯c(%|^O?N[Ȅt,eWeJ+P93f}AžSdS7'\(xM)A% ¬D)EW 郘py cl>{"LqH׺1ѐb6:-(mV'2Tq%өa}/Aj5[m&.T7cDPJ'Զm '?:,7@3G.7tuOv3~>m)Hxݮ fb5߹u>>jg+i&$ e=`X+-=7F<KNZrJZH+Ztp.q6cT%6[oMXZO.)?F.:GTHDKI=1*- Z$eu!^ %`wF$: IZb:9N31U0BX}@lprsw%z\)O4ΜMu3S YeZ}Zr@.c^l'-5gh%ty|˲g솽A%G.ב.h<%Z CS"!* MC MI<3}] q;4˷E Z>8!Uj-*@߲pD mډ3c^7:yjcy䋸CrfiH ^u.c[( rFg͟>+[%dZgPm*{FP?[ o$}3lWW?K7Gmv^$Ql_~WPgMuYV!t DV.Q'9m@1|½#b |b+#(v*ٝg9Z Z6MȬiK-w􆯨_'H }J8`MQbݫx9?*c.( !t'\g71XfրY_l16kWBq{]iAFNfߣ!W-l^̙gCJԋ5Z2dW|kd6z(W`CĞP^a}NFْ-IX03ѣ#7iFH,?rjڑs51AKPO+Jޱ+r HJZ<9xI| aT!&z;S4vuJLMKH;zܥ:E6ߝX/O? &#:Tku#Fߓ}' zM mb+W~_ 6鉣qMټ]vފ ZnIrHuC 0a- Y<ʑ@1oOa;(1Đ)(&w4ڕ:|<Y"(@k.b(U//92ɕ,qګRڦ2 kRz𧚝g"֦h)Wob,k?56@Vt!g5U bn50ϡt狐<]+ZWN9<)q}rAh-CFc6Tyb5?sj{nZZR25@Guvd}bIoyN7(>-Z3~)>^yG( $\5dCszvY_#+Kד،szD^j_mC%-JUMR|X.h]\1ǧfF]K]Fgj-?wl$0Y;[s{7o{>%XÐG˗_[E^} 9-kHc^a!u ҫQh8+VgtYp2 ~nMBD~ch>^4+sNo8 iW4$\5 8MԓC [qZ9!'@q NV|Uϲ/bͯ%N.^Ƅvaǥ ťvv[Z9 ,ay67c*'o@Rk:C!X#KuލJhmSZ;i`SCi讹W">VrYvچN+cb LBDBDwP|M`ΰKeW&gzw`BiKDGn@D5>=*җD'Z&wL9^]9f-) .ƢD.d(uN/U%{JٛcU wm|;GtWQ!!VJC^-b8%'+D&hBIpnER¥r@ J"oqSEF*aDpv̝cT7;ZI$غ>?s"C`r RaFr>Χ).1Ll.=irZZKoy w}h<@UO|`wO2Bxb3Us ^꠭zuye;ȅnL|i45x? Pkrj#srr#\tyz f!$wx_19A:.c7֛EDK Uo,f϶j!U$[x| '$-Gzbi5LJu؟Z07J64wO\v=L wjS-,(6(U&LkryP"+%sAv3z3ſ䪻V Cڂ EE .ni5ɱM1%O O:8!5=q6{2PhB09/_Z)Fύ5|V7Mrwj]b{ N2!c a@}U+|V %燠]6 :a{Xo05zaZY=ghx^0n6\V!E,3mQ:>rpQ&S;j"/J#\C,W_X:ٓ4]v[iwd*i )Z:6},:OEf"iHr|P]b i'_Zu9>!. $lwy1͚zݕXcBwܼFy8?vhp}F4{\^1,7 c}>7 4ik\d&;M)vȣYLJBܦ+$ϼ){#J~y3Yk۸ʾƗ21U[@β덦vSw(o{~M#YW<~6i@B5WmҮ,JXLQ]`wZFJ'rzJ(8P``()Y!/lsceE'Q*p]m RQ"č*(kT7bxCUpDJd"*Dz[ /# TCn\ƏD硵d,dFZ&r_m\Qqu|YͪKd,S`moλ EĴn0{ܝ<+Ch܇dpg^ר9t47E.|l(墽E^c/~V :=[? ˁzFX/%hqe6sX? 99[~ly!=*.AVx@9ܠ>9Z.P|I#y]Iiҭfm3nbNeavT&,ݻeHL-tIy<N4]*WN*Dmi')(ڝ0Yu:TV׵d5uu6Jw1!^S`D&VړHuh6XYs;? p^yN&gKjҺJbN0FLTw~oճѬmq3ř9yZ, "iX4Q@t`Bh_&⹘QHЏ?'ߡ`%+f:JgY,jn9as DlNZ'@}pUFx*kcg{*OA){]p u S VSc;RF>Qnu*yZYa޹fJxdS"UVo)U(/לw-'7FYL/.4rza5cv`h,^c/ppM 4S×Y ߠp@H-!7y43 y"?u_ewN4"GCk:@;} 81#bEDKˁ-⺬k~"\7]@2,q~9ZĐWd{xɒ[k^DC܎,0usؖ PKpYlo{I[dǷk>_xbHA^ͺw|S\YT͋{CP=11:` e -ƽ z㪍tJtJ )1hꎍ9^=ZWռnnn/3+)RW+_aXֻGk&q]tˊxXhdP9ш3_E噒 woHx| `+$e8W@0L /qx_SxS4FcΎ4ԖqO~ 1eLyﺪuP6wW6ZΣBۨs<3`@'3/ hTp2Dc>_L _[(:B5CU+ aye~Z cD(sΉ;`'耻e^%l|zaуm1&dFnr^ F#Ē ]*twrB06z7) sc%A~\-Un{~Swq/^$|I}7Ub-Tϯ{ޙ7#R‘c}e;%AjrYiEX#W#F~VFEDm(yrrq5wS.%߃s\ΰn]`FQ@x^KP^F_1-TH8Z}jB/BVCNҎ(:,|ޅ~ 0憈%(m[Ɛ~rC+R5qgZ^vδ0ZxՆsh;@UHCzNJ.܆sЉ9x]Y8K[>qki{]ΤElTYPMe6xrů!k-9cϡ-E-mʛj-QSTS$d(1o4ɣ(O"AiW #}F==h466#`Jq}+;鄾C˟ jY%. zRcQIjTja&a*j&MY퀗-t|u >ӛ&'{̾Ɛ6BF+ƕ(wGleyO&z5~e}hjG>vBC|l2fgZNi·bJuFw^qFMֶd8>[$%2d NcYЈ,2Ifœf{\EJWYr#pIX5ޗPȇ>nL.IJK}U+87QʤjiȳʒsYOlrڰ3h BmxAGDĶ l"Ife>un}M( "O)U⮔ޞN<>m#cTrŃ-^̦fiNI٫ Exisa)NFߴ;z;d4-mssJ-:{kԷwkDRCƌFH U~thV5T;p'x"RHU%/^ci{sOZB=KAmg*$=XxLE#A~f+yGY`XZm+b)9""OꙻDA51i6.I^M{rԸaF"jL7Ȩ{c7˅k&e}G*S24@*&M)Wt'¬57^ltVd^d>P)ܰᬡ ZuW&}kbkF#{Y/+s\aE Gaŕؘo@{CuyXODqG[ endstream endobj 134 0 obj << /Length1 1633 /Length2 10279 /Length3 0 /Length 11347 /Filter /FlateDecode >> stream xڍP[- .k4{p0lp N$h5s9~W[S5ݻ^:*U7f { @RISΉBG ڂcG99!bH:L/6)S Qxb p`gph$2u[! g:I{'5L~~^?v ')d ٽT47h؛APJ(d :nnnlvlNV"L70r9, P6 @Cfl K xАW8 ";D`ȟv0 ` Td٠PV)K)M2jӗ ufs#4/, A(O 2w߇kwxY!aԂ]@Rs^L(ج@P;;;'[(/{K %:|oCf +0/f_/'YCl=ywjRtYn7\<7<Nn˃Q5C,-ed׿50;rAnn,?CTGd\lm3EM3^}%YoUY]Wj2 Efcv,TPsT]yC@?n(v{2s[E@/3u! '[Y TZ3^zX;qo@?L"~^^8^D  r@d Z{8X10^lxm|5_I w|/_-r׾89\2˦y@ si{s7eno~srw] lJnK ݞseϊNn߮s?x' U5"Xmz;+pn)pA,{.&YOO ו\>Fb9`C G"B lOm*(lu>>#ٽMY/d%;(\|iK`2 l&yPCF0M~sLl3R^ݪNg+ ^r kf F-R4s=x ۋdqe^vξ;`X7k霐6:[q51fz <) *DaxZ؁)JGvzOO㯝CvhP4xldaʏ{:,29λ;ueC:QCM\L5eYm|5y'M\ʣx/d9c-'7>>V y>SmNtȵ-cP|F2#YĊB*޶<^ {RQYzI_y=P@F]{N-Ftfi欨mKlNFuى-;i,p&z6H|e)&j 6?eNR+Pf}/L'(W27e,2 vr b3N麒0D8Gz}$e2-׍ڢpGa=7D#)E%?>X1 J>&g19e J c'iJ~40.=-Wk%5z"'y)p&VjVrMʫ4Ŗ=8|~i,//ijnӱ _߲aj޾rᬽ zrnxJP\?-lAqpxs-pvg[^ƻ'z4<&X6#!\䱽ϓFVʶ{rw9xwchپJ.X8mbezsIQS2/z.9;KAK)xȐnn&ss,t. 3<6(V"ÿ[oP Q@NjOYT"/bG:R|M)RE"U #Nc_}16ԂȨiKܣCca n>FYly$ϻàɘd*RZ4fEi޻`@j\]TV*7R>M%!11Ȓ&U>KzѢAߚ0~ tHڤɹrE etven*>XwPܤUyrɴ\If~ZBj܂CK1aR ʚvR0' N8.dfp l׶ӡ8yfCv,F$VN'>ϙ̸~O(wB'7lgkF;_ztSiwK$J}pn 8խgJNEn<Q$*WPIB4k?g2?:;?ZE0,#xMiL'6 lR?}\{B:j)5I`2 Gs1cbo:}v긡mkeݑ;|X[ΪӕзeLc5*d\F5fgzoov_tbMh}lyi܆~kr(]"ם%w=b0lu::s:e²koN#I12^MZnY(hWA/ĊVd _|F"SqZ3CV4~Xy{Vծv B÷{`9_]9:p7@Aה9 X0 H܅[Q13!={* 903~4TӊE.P3QL=C  ZFRn^{hKhfD?Qj7xqms6Ӟ58Κn3\iu*C@֕I5XHHyd4*ݕک,8U>Z-l&?ƱUUx-C *cpLk[V(tA>kbz:SF%ƎNm.ѧnqʾvʹ.V4 jQ|XP&&j[D?>K Yb^BO;zmϢH7$XvHot v)rt.ogU[/)Uo3MEhYN@x7 p"Tv#m hawCR VF)X>jfe\ڞ$ef*ч/Hia gLSRX$0$Pׅߐ4s~νc]]W5"Q2yW^/&2JRͮJ]" J};;j?Vy8K\N@Ś3}yn݄:0o5}}8`J];;~1!ɵ  K%TsI5g=c0#LJyuΗ"2Lؓi6W—lג'FWHA# &9*/|_qe jVG wߖǁ# ~G6k˚lӨLئfQ|3`wRaSMϟ!4x^<-QT)?T{?CSӬ+jf*ԥajp *sM.xV/6jRBU6}8cӎ" KtK>>B .bJ% {3D(Z'޸<͒da~ _KdW-2zeRYM8${5c߸~b/D%<Ѵ8PU14T,uJxo)δG;|'Qzm'vrhOy"7q.CѰqTfc*Cx.%{X=EEeD7 Tu_6H(KuF 1"etw4<{J0..2+ s!@wJ6 e4꣟}/Vae#xZ{iwe5^ihykh"!<:)G#ɡϪNEKqF "ŔRA*cy2$))~I#||@öx&ER>2mفKvr+0bt9OnBϷ6"2)JЂB5 [Oo bU#扟( tE89^u~{l~bSRFb&"4IujK8PtgەCx6jƕ2<U3Ou7Ŀ7}V'a<4K7(aX:P, &PmЍ;M(O/Z?cG>yGm {s(+&r8l#D,87ATEuD O<^WN5{]o֢n }aKE5ͦ#|_?M>L]f3͍Hg+XAOJp)'IȽPު#)bПnzwSIRM6F\ և'uKΘ pt4` B]"m æ G'% 7kDS~}vm8{% 6ܧxmI-)U$SUWETT1W½NTʣ ϩvwsи꽶.I4r0BQW;z*˝@NMc+!UɴU] _Ґ+ʃ⳺G:vf_^RLYs‡ÐMcQ7X?8^4N2}:`@xP xӥJpϪPAl߱Y^ڈkio 9{xf$5Wvd~b -L<Ȁ@p/{O0T?;6w3?t<1du0;jYĹ.ϵP34Śwjn/cѭ&ZˎtBU}>9""XbaƷh,d)@"?97zNJ:# br/'d/ ް-0S%Zō v:%m"ֈ?RlU356COE_${5Չ6/ =w4L}teB)h.4tqfrm,UZb#b2>:^855W(L4†n Uؤc{Hm #Μ͗OnIZ;.!͐$L7/w0J쫋V׀n9ew./jW 6stcv+m^oC&X  [݆}WLsQړ@4m[.z[ߛDŽX8%K#Ơ,Xj[2=p8XMU;$_]d>֊MVM͘@1X?խ+D(}r]'zChfk6NHRpD,'4 pkvg}#??e1@-)J@r~6ww2It"bz6o0QIƽ0JرX3cՖ򜵊mɰJpaL{hjͰM?FJ1Ө[]+!lEy I GnXoaN.iWɂ-E M2dD0PћwaKƱ$#kKZwd^JAY//A ^7B{b^݁ks 6*N@X i8SLhe֍b+Ǣ<~!+'t5:f5 3C DN%79Tiy֐ \>oķ4g#ك´w_Q\B>$s*uZߪUf߻b\ͬVdB.\$Hp/ޫʼnJXnm\ܠ6~w\>Ql2!I-:B%$e+fol3'F(Nk"T!K/a(adx> S.^З?jIsS2f1mi6"pR3$‡/l-zb.B>G\ 9f`7-wjw.Z&)^gТVJyNQ"kKUĚUO __槣L z6ߪQ:GtI#5uvp4bb7=nwS(yh-k0|F{%:>KޠikĿy%cK#4FU#LXk=SYmͶ0TvcSCxvY2yCzQr2ԒVd*re W1QC,b(:N8l]R& Sc@x^ʦblO)-uV]z0Ɏ\[|÷ÏSͨ'VmQ-f;䨾ې%LF)ӑLq>o& GPfŕ4\!܋1 pTOSpoVQf|W {퀄,z tmtKDup{'y73K7->H<4/ T-"KH3gIH,2Iq,~=Qo8<ӲWȍ#1qXYxCHV2XQ4͔H0_:)5T+*sNkœSG$Jf ]J:Zx{C C`[vN)x›¬Z(t/K:\ ]Dݸ}tɐ>4h-8F*BJck\)%J]Ey1>I\SqC3ι#P-}s--<@>鳈vt}!.~rY+Y\ W5 {`|(ڪOYCS3{rIQXTV{)H[rsKcwRJ_KĎYqi8gm(Qle>-1!J1f1:IjsːXove[X1rǗ<¹zq$h+L3w>CXQupns|n#h`"b>iftVߞw"Ǔ7@#zB} JPMCy͔j8T9Ax"Jkw2Z>k'@ 19ַ+n~R 3s_2ڜX{uG7fTLM_Չ1Zl*dqy\ |9"CR// n 9ɰ@r:+%D}E@o546<]z|L49J^=LjKh_wѕuy=F_LC5Ȳ=0(>* {/E3ۥ?rFU& 1Tl;A@r!(Lpuw\8"JP;bNF01,REE٦80 OTT>"\1\ Qw@ 3^Rj+ʓr{XJ/ԄbE}^؉NcakGKLw3}Ja)\ӷ?q6+T:-5:ugjKD3Ui҆Hf駺F_z4-%B}g2x6LLSÒ fԙm nQ}s:\t{g!/]즡@$c⳸Z^q]վ<.OJ_ԯiW(h:ENbn׷q]3#UzXkolo'GHrJ h7rڂ#;ɐGG#e]2N7YJ8bWCKi엇󲘩"[(?|}Ah67Dh9pd 4wHaAK 1G='/sK̴gbzQγnu}aμ[휓3F-Ż}BBYM6{ 0&*w`Q $ endstream endobj 136 0 obj << /Length1 1974 /Length2 12809 /Length3 0 /Length 14028 /Filter /FlateDecode >> stream xڍP c\;-NE;]{qw(Zܝn=w2YwP((258}`f`Ȫ03XX((T@NV(Ԁ [?,DNoONo6)g+3+ _C['C @ ektsw;W1 /w5dlh5t2Ze46(NɎՕڑ r2(.@o9Ck(* (mM\ 7hlcte(K61= @ m mA6fS /&D01mhhhob24z3tC"@vN yk5w}@@㷾3}66E 4LUm@@OۼLLL\,=fl;/%ooO;[; 7h898=T/cfF@3 ܿ@wƏ7ݷ 3r#fWIo(mXXY쬜nFQ0]6֥P4%g6@cdyr7㿣H/=  +-mdm6@J:킐?9܀& 'cf?b{f*:~,LLG\ƖoHf15d,CCw8Ibagx2m !02:yLm~)'Q/ `qeEFQhh zeeG[Z忮\F[7~ke01r)~og  ߐ9όo2b?V2`7ۓ[vڽoR*s2t4-ֿyu;:Y%?[%?%? ׽6=&@719[c wUBv?NS쨧|HSp#8ԍ%J}-Hy\4 0?$TGKAEpKC"ޙ I!εWܭti4dnGqCLJ(H8NӢ!\LeMKyGxj|X)Waq%!FOž,.\8D6G5Ar£-#d[|ܻ_6cGiUL6Ch} 5mjLV'`d\Ӫ +̎f۟A܆NB14m ӮȠ~0SJ.<ç<]^tS{'nOʨtւ`edMh:'tJY^Rn`{ص)9  (û~iiZ7Y]oˈ ;1vL:82V{ML2) AUI@ZgX-S/aG x5=[⭜~K_Mb )RZ}W@ g)1L ѨصԸw.#>j#,p#'\Tid .:3v}֓延䏡żȺ &ڟ~p&`<(%4_JTNK"M?;ݡ̘$we,O`Kߐ˂$>J >66i<)vP}̜$:q%Wq*'FLOI į݅XA0z$f{,9lYMe:UKS4S.#D4ZKoČ}?XlBcǸ2#D=ݍeIfw7|F4)Y>9LoֲLwz݊U NGĞAv%*̂?JS.9%p#]}n}%#_Zhf.[m~ce8/.8ǀUO .Kj14qMBz`lؗj",uAv<+*Kth|k2v=j4hˬAǩ*O"6lZU]ZܢYs36cٸ lq7|62L:5LōD\ySm;a e,-=aMߛ=у[xQ~$;hH7C~ÅlSw #ԦIy2u92mP}2BI34"2'j82Tb?bwg8i&|~W pn`Ja-iH ft3uF3WB3:+(QܪbRhv#;CT!&f=rVeBj ⱟx#x]?䨿Rj$]C/` qmՉ除 I)QshP=a#Ɉr3x_y2,^ DoBjJI %M~(Sj8-f; B80d6D1 I'na ?sBi닀`hc^# l~W[cmrr=Uj{%2;.9*Ί<+Ͻ EFGƘ;*0'HB' 2Κ|Z^\]9m@߀6f [t#f&Y@mNAr"#YhM4 Wj{ek4 -><=ppΏ4 8,Q:t "IBEF/6GdV>T6ywI+؀&zg]8֯DT];%4I1o*ngfF&y6O2"'!);J|<=ƌu79l57_ ;Iī, z2f!fKĨٶosN/o*6Ʉ}yɵfN F=(&c8n9mhRkSswAӝu_K=鶌Y; x?eP1BmICg W˭ ]Ϧt@M_3YxXb"EK]>pRBvHp7tD'ow8^="0r;ƅTo(`~ӂ[NR]J?{ m".J3y*.̡Ҋo$x3!T/XЭa_*KC~At =iθ$REWqtYs Z^wuz|ԧ]A@.q=x|b}Xd:2RO"GVn{S褽R53T֜*iU 3_edvpޚ0}aӷB)J 0 [u#0q84OZ&1"AŝllwL v'/2gu uՈ w  ޛ&w%TcBd1{?*5TA:-irLZ[G-VTfHxU(wWU6Ȯ;`:Fv:[KkSAHXg_]$~5UPRTrT S²& L1g̲ [g^4 sXh<׊N竲cˊ=hGJvLhN-BK0 \ۜ qpX ;{>B2*_:^mSIAn [ 9JlB"tl-᠔LឳvxPv)~Oz!J]f&[WSp':ݵi$)C(y1m9Ncdv?l)jN%yv-7=Hp=MIm7sB% hu:mKky5ta#Ԟ"ނ=֬z zmhݨ,(H HmebPdiw bf)5V fx~Ac/}(D'u nkEswɉk$쟕W 1#ϱȈBaC<1sQQ[Lye) N~-N:*k-~X=,@cn2)sCKx25Vs tc_) YL[QD>0C4z, R:xK7Q)ANp\AuHXR1rv'p>VŊܫt{dow6`%Vqx ymP<0 ,1Mi(S4t;$BÂo-Ccȷ]?܇ggH>2W$ʢJ~MjB&2U220geUsYL$D{BI9H1%mX@L֒]˶vc86ivډx7BX}Jvyʖ.(zdJւat iQWpˋWp LЁckV1HHD8gĬ: d%zp5bL@rMo9-ժ;.ywN =O"&QHrIwv3RKС8YSQ >.7$l|($_ҫ>!rӇTT3=dRd+|ɨbdKT;2n./;]jVSou ! |H.҉\{dϫ5\3|0ޢ_X#䐣1DV *4D<^^r0,baҝ!3N6ƸL3h`c9|~i:6Yc@ob>Z)%  F.FݶX9fiN~C89F6.ɥal6#)>^Z/; ߳;j7CŇS)Kw `vqvR=fpHyu;qP)k)n#4'СlxRF| y6BK\ ?t5[=2ۄB~}uW9ǻ/Tq*\}œ$3c)!ςڃ|]nH{UxiUљѮJgg :vėCwuzHD*Q/@B"# e\VU&obJ ¨7hz/;]=4#܃I0ig9V553hW7Nl:C^P^+k]Qv0cۃK]e!1CO>)+2#Eٙh_t)XB6tKD%X+<,+JG8=闄~cc KMH[%!}?P>a[r 4ycIE3Hzb^![='^b&kɦZTgi7vF,F΋D5cڎ[|\zGh>ڡnDW<{׾Ȉ}L5!el݌/}s\U,@"m:80يOx]| 79.k0>G{[V_0 ǿTg( #Hi?gl9ʫlׄsESIm#)XX9" Uz76okUxLgVSPkȸȴSKZŽ7.v KdU9BP,S^\`LCmӶRctپGj uOBဴRGl%Z*9:TQӫa,5QJui#^9$A_EݮAM6/A|5 NDvn,s 7F3>njKU*cDw~#Zu=mk!PU b[ 8o{xR:RVB]S_OCS*NI>5P[5 &SOQzDIG4;ڥ^i8XdN^0>@]2W& $)6⧽8$K1(Q1XvX7tĦjvòG%x$1!QekwW0\j*a" rӕ;:V^cC vFhX\Ua9|O/Wyc [C\CЈ&t7xAt |g^ AeZRQ3ŗ:hOs3'n.m"7iilp3FNb@%s gϩT}{E)pV%Aޏu0~6/2 Sě#C냤X8gI{zLi{bB Iĉ}cg]HrsH'+M C5ߪLдV .P9xɂEBމIC/~D9qۻÁqFQkgWs4Htq{>(M]xr*NVc;r'ٹ˚GI]INkIs+#'\Z!l>ePN%}+9gPy&uB=9;6|_Y`/ld%>mBd:| q9X)C'ҧ|Mփ:z"G&[*0}Wk#$Bu RzJx u>yaWH=c/ 7`O TlYj^n☟GJ|p|DjbUE(7u$3:M-UOc.F_O ,ȼϣ/,@_H*@:bAƗQ-;:\Z^{r$"aD# 6d^6i}]r/ ]җ ,fmk;zRI}ӋPJ RM՚KvZZM3)\N*QK93Ljjd9=}+(JJ΅ޑl </K;6,LQsPULUm8TH%eRpuӗ%O g39!6t"0ׅ&](tm"n=M}kfudsrq +<aJ9KIR2i 5̧_B" "Z?VD|^'IMDNI@O/a; RN`~Xoa|`jbr;WЎz=?5WK&$S/+]6˞7Rj; ZܔIin>Cq/[DbdW2m ȂeۊG7ze^6:ˤ鈴K9Yc-Qy_՞=?u]`G) ?ʹxccS{2Q4s%ȅf$LkϻG@w( _Љ*ڱ`KTի#=O)W9F-,Zqv)Q}1/)mroVY@^Ѿ ~QBW9u2'<ىwG(W.Z gSѯ b8jʎ[~RF0^b-rLKpq;S?& bD|=6P\E' =Ui!L|7$dsZz"l chՖV65~Eګ@9KiOF[W૙D؍9! 㳠Ic@re ƕB˺m,S>p/j]&̦J8}Ç8KQ8:Lyz9u+9cP|rn ( >.`4IIG6ud24} [6s{jZ%?5+Z_, N3 /%~p(+W;'=6-*Qk|&4p.zԁdRJp񒁶A΋V #u*t5e%F<'> <^jTFioeX׵NPɮ m(jR[4Pz> G(O7D5~DP(x'۠_~u!ק p6 KG;n2-UCG'h]Uiyw\I@T%o+r qboWq/$LBK FHoCjJ;Vcu8.sveZ]D˧۶L$]`TFe^7=ow͐XNĥچ.У9j]P 4al.GZ6p,^M϶p%O*{Q4^3Ż=CłFk#Hd4'x҅=)թ11jv)p&0Wo- 2IϺbQ833:3N?ґLtk&,ʄVбޣ~$%t endstream endobj 138 0 obj << /Length1 1453 /Length2 2038 /Length3 0 /Length 2966 /Filter /FlateDecode >> stream xڍT XLmFRhڛ$4M:i3tάMI$Z%$-$!!$B*kFdT\9yyy~s>fL. ;bԌJX/(:BD_D* DX,A0@ 2Қ:ߚB4 =p b(,!Y0RC:!PH+r 8,MT*&r9 01)#p #O( D D2xR9$ )2 :qq^BL*p&C&H";I!5U!p@8`u82O8<#FR I3emv@,,, F?{D s}$n(ѨA<\""b?]>>, ŊNrH!<* QBLxp4ƒ!J@*Q jTE8R :yC6~b$,gC?GLv\i2<򏠝̨F74s`ɰѿVaCp.(f]p0 a~ἅOXP8}0q\Ye`pq( D#pʤ<0\ Хp=`." ="p-0QF"G$)'dCn? 1 YB-!ί+:@b1ILYX(*F.1Hb@&Otр #52$E$Ƞd9짉ӗ0-Yc ptWL,;H'|0,H\smXea;~ [&s 8m0FۆFhjE%97#w+嗎ټyϧ>qu:Q^\0=z]i-PvhӮ5+NdţHiZ:F!+ԌW 2x.;J1ܨ҃ ?E9}0&[>}aөU{>Eq_+seѺE)Sq_LQyaDwF-Οunjwkf巔,f~_ݓγ;M̜^έ,I^i͋_1+敌خ?v8Pvs*)N_v"sڪ{zR^!t˜5 N[BS^;߻PԀpl[H#vꪍ-ӨzוkNjJ(=^@kHJ0?}w˹c%L5Y]0+%PbNC//ZlXnGiBZs 4O>Cc.r5()|\-*c5G 輯MpZ\ȹ+_m)fUz[|ZsUKIa_?7\laE۩QjVeS Ν֜zj?\QWG5.0tXGU7|tjJlvҵ׮립/IS.!b#BٌAn E鄚3g ‹7 ³-fyAqwǿZXީzܥc{i^*ҡuߜGfXM[y6;7N&Ħf}ޣ:}wl]v)]5lM51qx4Oz;]<5D*!fh>Teh"ҾRʧڴ\s8f-QƖ-z}۵xiqk2r&f /.d!ʪ$'@1jQg3:n598Ԙ ,Bݎ J)eU,?Ϗۭ^xDF/*?WuIQcM}=zv _0Սy^D:}aV쎤s6^ Ym4<8WwG ̟Q\b)%peA&LͮSQP -7Ʋ^0qtՊ*O/;O3.acK"XcewkVOz.r{w6oۊKR4$֤=#eJr&i$G#{.ux > <,)ǂӳRu[3w|>Zyxԓ_7xmdt>YbynVd.F}`ZyQ:OҘ'B+ҕSFR}EQ;9)9smEQ E4n(&;{?i=9qu^[ endstream endobj 140 0 obj << /Length1 1684 /Length2 4223 /Length3 0 /Length 5273 /Filter /FlateDecode >> stream xڍt 8m>%4lV?3Qؒ] 3IyEH+;YB'Y-_]s]3ss<|Wĕmpu(*:FFLJDG/3DOqX}<ETQD O.:p).#?'0?D^PE6p *8g UO&rIkBVCw.]E@a? }/,[[hQN/EDup%j:^M"X;Aw>HD 9X>)8W蛔w@ CYElvK!xF$x)hqS0∔mTE4CHqpJ)rbA)jR 2adw)G;pw.e}}P:Ҕal1(AJ)?; 8jSrA uRj%Sݡb04w(XS&m>v1hxTmWETrG嚮Y$w^49i1,w␭AUrLJ kcw|İ)!;nRCA$gWBN?/xR92UOXTjy̫>=EL1jp8۷#Zq.FOpiYNZ|+ YZ|yP8X)0-ܣcOb_Լd *j #?IWһwP))|Wpem1 k䈭vu~*_l8p~@>s9an᱃G5 dj.-?s52da>܃:_s;ùn;O#7yYh"6Kq;>s^ı^0ynա iin'Z,JiK$Kbk^sL\yr 4Z. KBI'ՍɩK* ͨ㑥&Q|qJÃaWl*q!XXuTʊvmݸ PY( WKcMRH͞ʹ=m?Zo] ֓G;7ļ WEN_7sqqkHއk~lNH4*Si)ᢃsJQ}.si;ehg|JTJ8}R}UG(>xڴqW a!,؀|Q܀Sɏ1 L"sռg[S[ /$XXgCf^%%z 7LRʊ6'<7` w{TPt^yޣ]di-FrD6:{}(mjs@C2n>43!k^r.Y;}fmS;e(7\ϺջR_w4J}3|6mi!x/-<5Z,̻pgzy@ ŭtg"@UT:\gY NWEUrOsy>0~sT.HnK_^ȘyjپU3'qߙG0w+'&L|D⪎KSԘ  vpU[|P &}jkv;])V- Sosr_ yȏ CE7eg&lIQ5V%ٝW2יqt}xSjvvUEkLR9s5ontb|j^0)ƞ٨¶XjB3 %(Sm4_X?߷^87&Qs4"AX ~bG|*usxb*:f ´{/dW0tM ]y%L^sUXEVZ*|H_E~4ST_hs5p)= GzyV{2ƺS_A4ޯ#[~1["Jvnn"h6slǥ.+>^K\%0De+\u.f{6',?8ŋi6X#qkDh4oPqs[:|eKrgU֘ڦz̻0CִuEmէ'/U=EJx Z ט* sRDD<rӪrST \U⪳ ɞ|Wn㐑t;2ۅC+'3DyX1ݸy.FBvZ1ee E-87gܲ[W%2<\{˔Y(E94}hu47lO>I  df^c8R.7!2j Pڷ\ ư\s\!pnͰ S^d!Lb6-n{>륡L%8]uxx-t_;6wVEՖLWY\=AđTĜ"ߛe&zcY.7n#RY1WRk-$RGF 樈s,9K`]O_9}<ijDIQ{bԀ֌q' R}ucˀe]H׌إ !;wv%<9ZUq4yL+y\܊JHv=1eH>\^۩Ú< \H?w7CIs)L0)CsZ~,Tg/iIxLhs<~''ZRYd>Ho8t-489ڋ#/ 9  Kʒ7?~pvPtr§`"l ~&USse&^N|mbUfe[zM"El=E$VBU}?8ʰ:U(V(| |SܪG͉(ӁǺE47Ғ$}vZqxf|')xҐ5pF뭋?Z ﴨ/ymVXi9Y|-!ֵ礣0P9^o}Ec26j RÁǣe|0 ~caqƾ&֪A3\[/eFg RRʔ$Y^dK=~ݑ^OC^* 9x-˥kJw՟̒;o%`^C?|o$<7~_>p?Om#;\GǶp%L%.4 ޅ]V=rUE]/?nT8M8?fΧvJb7Գ1Aee|VłM)Qcv!]Yz4G)"VN)nMLT*W~],_Һ*v*ǿJYə:*Fɤ!ņo[]/kUJijts/ߞxRlvUxaE(R~aBS!pss^.wЪImcIT;vmC4QFˀu9'{Y{28`.8 --saNMM@vёY&oӖ9`,Ӭz#E8:[ԱVn֕F3:7˛5$ >RҹR-bs 4b*[?|HS ϙpsDa]^eGdm.'ya-8 VB"=BJ;g?'ꁖqxjd^rP(YD4V/aIĉsTmud0loI, uvǰ=$D=ju5 }8O =[X5q{=nI/}g]Ĝ3Ȉ"]P2SF+D^C.`֡}zgM?3-I^XXNZ| `MJ94e;LRpPӌq=eǐj^Rrt(x)p?x8mw#`=l endstream endobj 142 0 obj << /Length1 1763 /Length2 9585 /Length3 0 /Length 10704 /Filter /FlateDecode >> stream xڍTj-Lwݭt7 0CIwHH7RRҠt#H+%ҍss_5k~z~^F: mikgK(U@ #mbCDu`pSuv<y"܂"@ O@ r9;ݱe]| v0xXn+@;;Zmg+_%X`0..///N;+; hn`k/5#/fX;_vmg +;<7h+]Nlܜ;W!d d @uN7r;A d =9 M st@QU~NֲΎ`';֯ n`+puN^N/.\NW!pֿ6[0 x`WʎWyoo3 N|A`77bXm!NXV6aA@_e7r)7C  3l ? ,M@+Ww (9B>%_NkeU*@5vsw7Z-̺V qk8C~)n |rp=vk坬e/5\N0x `B\L /K_$R AB@?H^'ܭ p^PkQ V ~!8r‰epl|.? ? WFo#䃓qɸ& rc8nx M[y_߫g [a}l%fNʋc{B|q[?[-z*kmNȺەtpʦ<˥~[zd{fǝ߽yv}Aj:R;~~zm]=4 o+">nk <ǾӍ5 .c,̝'GqPc<%:Ɵ%z=Y"A_ /Vtx{((ȩ/Ʀ|e=#[-+]_r",:X]qP\` 8+Fl0ACX##]f|fto9UkBѨ>eO1ܯ>BUiڭaSkȵu=B1ɳ[.ao6hcZyܐIuWR>@|S"}9Jl> 4tP.垎B׿.~`UȪ x&w&™V)T*Ei9"VtkΪݢYɛ7O2Lwpӵ@Ť{CW3|Bzbj9ogV:G;`@К$Ϙ<.S;Sa@X>$ӁǟSEL?%P8L ^UiŸPBZ)W}՛>Ӡdsmet¦oAQ-FInr鶾5k4i?E1W2}IDFTVSݻI%lrw*^WE5V)núN}kJOdžocVTliQYfEFieML;߼yQz]dbsǂPE\6B=VN'N?6򊘱:B &(Du`X{hۛk -9ZYM> !m|)<N4m(xB4 [ z{F>P/,oSv"nBga%;itG97Qe]t" L]̰>[ru:ѣ;§|rN,b^x\G'0`p'J,jHM{iCI窑ǻuz~]׷^7:6{Ho?A[w e loci?KD =lGS+3$/$KXu/ yqߓɕR&}ƴbĩo]\}&+^[!1 2R.3[F7$W\ߥ$m1i!6{`^fzc=*w$ޢXj&qk]ϰ}$~$_}W}JI06kAgLc`S3a@-})`uCT<*Z:, kt|֘qQj&2Hݯۃ˴9ep;DCg8u'ËsW%'.WQ'`4_iK,/:8(ʾHc^1Ýo1:F#(n2&/ޖ_n*5d=KJP).t4pbi]OB@~,0yRfSy,V%G}Qiԧ@&fp c⋍B1=ePʛxO)(`LFXaT_%lbNpNj}~׶nY"_= (.6徚 .W,(g 4vHuj> ?-?]}f"ryd^7L+<8n錒 ϥ裬 C7DVZ_+d9{lW}!Tz^uwWN<:ιf*u<]Ǒ!c[+1a?xQ֑j:w';x WgVPr+RYB˲4G?&D<:O YkOdsCGʫ:2<(6k.O"^VG%X 9n>{ `/gPW>2ڭ7x)҂wP_/zu2yR=-ےZ2YUU0dCuQԳғ~)s(9" gq7N]eQ)Ӎd๘%#gג+|p6.B~bS|5OϽn4-I!3y !Jޟ=y*cLGV<; ")y  &mj~FcƜ \ʙRFdBur|E8v/k-_"ϡV}df(;|Sz& 3yn <|>* tB!xeU?H7x]{s|7*{oEu2H,/`~HF ,~Ov W "o17jM90l^&8v1\'5hKsdLs?؉_}PBWL {`9PJyX!܅aG,Lbo1/".M2inWA]ê]v*7&L/G9x2FQGh1SN)o^Y7h&#k߷O%OqBcʞh|'"8 <{5sDdJb!\q0._6"|bōO]g%]5kSAaˤY JN4-Y4rgL LD Dwھ>2qtT >:{'dDmA6PN̍Fq;cʖ񶤯ݽ6t*KZX•)"``c} o%s(k&?}C_wڢ6tU:m@F#Y?-ǥٙ V_PH۝6L{\!(El~SN}C5TOVk;sb #X_:ݹjvTd.*R=grhۻ6Gp^+}W'plʫurIf[$I(˜MrvN_sJYT} ߹WFPm=ӣM\8[?=+Q/ʾbH9,<l@BRd0t7?C~rcr6\lin?!U? E@T'뺯LJ5e^(. l-"&Ǡhm oI( (i)8JNմm-س؉}xPoHA02N8R1/ܞIRk3UC8Y$\YlxTsl}:sQ\x ۱1-5h=b9C235ݎ>}`stWO,X:_LUT!ξ{q}\ih6wVPxC/zZkGuȌ9\j$O{OHG|(|ֲt 7nPa0 #N4%m_ N*O̤^xm$E ax9K "O ]#lf~wyu*QVLSJNI+e#߇䫸=x7ROqU[U9ze0PSY,;7-R+Un"1kYk{ؐ2ϧΪ\mz;601ӠQ:N0"UzWm#’yYY ;NJ 3YXWAIDži_cmt3ce@Eؕ݁N3啅% jfCo*y k W։W5'Ht.8W"28zʠAyb]ڹlycS( 15tϝU;i4Nj%fstմQj >+ٞ/CHg$T#{``1L/IH$ګ}O@J&"QcT& SU{;s?")scEaG^a3*yJAUS;tdYKd-JD:Ȑre kU-OZP5l j<ا+_SR+\i{3%*ݺԍJL4oz{"[0 ɣl#.3M$*GunJߚq3k|!0%IHkJ )#Xzu;b(( O4IկA!OAi4TmH[}tUE֥*XiS KAv|U%sT* J̳U_Pn5wіSc9W8]AM+F;W FWb@-Ė [ a=1jUZP+UQ8o/-紦["½KYm15Ō lyxȠ/'_\ }zI:,iT"t{1!Uc"j&^Zq aD>F+<&N 86͎@Ziu~qM92Ɋ)jN%(e3 1Ɠ.h5;v2lEjR;=@[V? ph`߻ <:5=\Pdȟ^oW:f9Ig3;,.B&go/%;e7W~jy,XD3[^XwJp5%8o͋f'"yA ztr̅ TT WOl|Q'\a>Zt3E^t[?dP,OԜGAGue!^zy}}i-ru'xVm"QȎsNݟSG[(A(vR۔Et Xs;H}-6iN# 'L j/6N~EI8d8ZFt.a.G0@[Eo+Mߩў9NsRh_͚Mֻ%SG͔9Aj8Xm>;Sf{ 13.tӏRjgn`r 2CNMP+1 "@ rjT7̨>?nq(Yrݘw[>RNXBQl؆}MZ9ɂmE8q7jf^e?cK$TG_(_XWOk52ן@Sٿ.O*(pw/%EIDz+Qx~sp9yRO4OQK%+N4Z׏Ab?/~5ΑآQE5tVAaO%g v(5dVpv ɓ$%k73F\|Oy4iz8țRoI=PЇQ/7E5"C?8,}%rgp60THo5f֝n01x*2JpT84Eou 除h75XEoW|6rf|eMT \ BbL/NqF 'Ir Jv0`& A~Mz}^hJqIΡ{.|r_Q}:N MOb16%wx{8yi|J|t89V?~| | =;X?JNhzRKJFIG1;:W|xd!ovٷW¸mģkD%X\/\k2KbW?!γ#.QXp=]C뇖nMw\ytN l [~7^S{Ӵ7U3^}HB$O$o;>U`&[˹:mj2ewnZCKB$+W#Λ' [$c`7f)Wu'!Z-Kd>oZŦD?4m59"\#;Qx J;̝Пuu-C;X,qD#Le'JCj"N6 ctל`pE]S!]"\٢7l"ntzc)PD>4n>)z#dMb^isp< N0,\էN㎠>1E. H++(WfZz O:j[GȖh CW{NAR ,Ԣi҃LB`[V{Uu 9|4aEO){ ޴ r`lyEp" G&T;HR1d0̕bnրDc K՚XҸ8Cr(g -(1]I7wqL[-vBt½ĒkGO@v)վrvpc2as[E)ڂ,XtS`,iVr-DXQ݁ivgpROݟ2LrDcxm1*41Qu >IGjb(Xf1f {>w,TWSeԈ$M;ƞIk.GRe0D[ =M&ObGl8*j1ԻaX[UT2{N"f,3,d`k(i]IBk퇸*bilR3m=44E+pNĝpH\yho]yF)9m}6ey+AQpuؕNm }&;p[ꃟWWS:U6twL.H{Dž묧n_ҽ.^\ˌqWw]3LҎ{ұzeT*XCG_$h46YH r3?i>V2ϜRtѱ`܌}[#޷߸yeD:IW3aHOɾtxusP QuSժEWإ):ңW$vG,ԉ$5{߂%A"lb}0Ӿ7=s"5(4i^dR.nn[t0'O) e|`>"ɶZje˹e=0]5w,v&0,R/zܙk4o5$VMe#*=p-᥎?ǧ{w^4 ʯ"m"aFn؋:v@Q'BhbK7I om;Q2E [0(zi|A3Sq;|k[`FԠaUFӛ˄>\`6͋9%fMbjEpI7\7,,tzP@06}j/-v,GA#lJ 4ksWGeFCjM\D1?ky@l-yOK^fmZ:Ό2jmIޅ gvgh/~&Χ$Y# ?O7F2[ގn"}D@8)n' ("$}1.UThQ椫ߩ1@nq\2SZ ov^Jt/aIpWSWK!rsw{;­$2 6rᘋK+$MսW#ʬ?= oE =FaΉ'-9}Ӛ~@t`j_'rUecʍC«ո"lX#e$5Q"բރbE6YL0¼,옵ۭ-āD%"׺(rU*1|!Vg:䛧VԒ&bp*\"4FONv&&s>1Iy7FIj߉n֞_rFsXFFdecAȷ}*.g\y[9K!pHEJߋH5K+ڱ].\Ɣՠ+> stream xmxeP-d$nn{9n-kWzWu?= rq4U988lh. 70"c聬Z g' uvڹ t-N`.xxxHx-nv n&`Wȃ  G# A\A  +?  l\NUYmIjYivmi* rqWwZ,k7o ` rXl4vwO/!׿L5dXl,@&i @P' PN`G/", ǿC`W9ZWj ǿ\TA`w׃DG6ِ]I_QFGOZbClZnpo2&U-\^#ǿ,z89@n.'? @еrwqAo/$ dOo(-@d0aY]>3Y휐]j{bPN[nVlHa2Y J[aPQ>AJ ,-se9DOveq?/^CM _1@[,8Svᅧpgfv;z-!=~*?ڪ Qa9*t`x|lمpG;Gjw1f;X"l=JBe\8ߓp+z _Zݟ8ifQ6ۚJ{lhuS5X T4jH65$eБ͐Q}{i0͗?h0i<&xO _" wb*[̀vٟr{1h=x/fgѪob.w0Xdm1[hֱu;ݝV {ׁz5g~AnΒ'S0ӈC 6 V:jEEsdHǢgOY;~˧6d@3Ki-W@'SEYI0 e?"zdb|r?V!۟f5A1Ξ(QЪ .7)ګSZßHaܿz}/CtO/IMAfL;Ptd11ZY^PԇA3n!)&a* xi(.4ZMffo>/P rqh^٨ثqI`!aι6 )} :nztp)& ðvn̹_m,CNo;ET%|%h/i_wlVym1r9E2/s.cNLn$ H-5lgjÅj\RJSd $dR}S1noys9Pzv r_H?Bcr0QҨBs_ ]`Be&2,G-vs/ON! sR/ { L!Uhw٨+Y;2`JOXM.tsR{v}vm]5Ӆe⠄,}"R! 5Z?vR7|ZS{ػ%$Mת M4L|ehu+f}peeWg'Fz94[\tciJ/(sD!g@Cau+d0UXcWv'nR>خ,yeHtiS?aɩ.Hq)KRćXؿ8dig5$݉.#n|RO+fU~:xq=0mv`WRkc/͹6D2үG2]?%e2g^-f]AͫX/oqҔßhӼl/q/$n ̐X{Y^Zdw#ChfbS߼SNejMG/ QI}hR Ix̰Rô#&#QČ赥o$Y.k n<@ِ!̩xg'ks#Uq[=׀%:읷WRڮ8c^~>@~3˞NTInHIfH8xC>fr`I?IްvoNaN&fZLH/AZJ6y/B wƯtۭNJqpF}] MMyF[5N$;OsZY[HsaLm]h7!{3v۲$Ij ,ⲌR/_3t.Q |0٬wA9,?*j+1ujBH;W?+~ 9o_Hlu=qPl`D&,3J"^I~OPQD* c] uI7g`=Bܝ: )r@I;:Zv4["|c&Cbc{MLhE=M:OawgZ j8|%Ǚ\iC 6<93u~h*w}[O.m[ZyʰF]JnE-*뜲ה#1DJVdڌ,.dgkV%F!Wؑ+ta Gg60%uu$T5IVCoo1vU(>}eҷf⾟$"<۝&u=a, W 2%D8XLE޾f.˄ ZRDėQ}SuWV=[<ʼnz*]f&g9 }櫾DiYьݤ(:7<cJOFe'-.p,'ۂ6ʤVEVof:eww@9UnbqB[ӚkZ [h+  .X!bM:4Du6iv _> Z=G49R>Z1/.+%y(vұ舂?/fz(m^YI%+XQ9:]阽L7g|N@b %%,@7^&/L4%O*:WxX}fNɋC ѴyqI~esdd!iRNa8\D}kdD898uMiE-m-%+,fnIct2#rJ5~x[3MpFAZR~N+dA!yG&q w&[?~C9vUJxkDzʍk2i0;gƂ5 ) IK_"{ .DKQ1CyPlz5l^ 5[38v>'||1*:zdȈ5e ~/н '^a.{(!ܵ}W5;k39aVxOݷ(`[ό#B,q&} KQC Wh߳e&g'nۧ-W>'u`2,\82Җ%v7a:^M4ơK=HʚwkUCh?Q^(,wq8/> ٢((EV^=r[s ˩1 춎cU,M!<""TPm`FPU(DAQ&*,ʄ=nQz{/QG"Ęα$/bEҶCG.Jc{[@ԣ/[gVmerCzR=O5S*r-W Ty(H9{"VWv5BX P:mnAw}b nefHqF?idj*]=M%DD4M)Ko٠~|9(|[>vp>j .tջE\JmY{4jZx!͈a:jMY4-҉{x-g3ύDZ\aFCB7{- sR+`M; tB۰{KSVj$T77h.`ʯ#xz${;2=H ƓruP+t!}n!ʣ~Y_W=iģtsFM攡 ݇դa'^.(,8ˮJiOwD6J~M*^^u1m4Z5y&3;QPM?kC6 uS"hcx5PewoF:YՏxQwnd,#uXYĎ^J;LE@ɊrA wA7L?e-k#8y94/&kF(|i}lJ,lBIH﬍abZɌJ0ILR IN8Fy^b}?};*29B^NIAp?6hRO9"( 4u:4jC8ȅ4.DSǞII~[\c_茔vi&`%]ݐ&YAgJ:/VI uaٴT&ݽa pavor17 soq1Սl~;cWRɰȴRȓ$EAZ^0As[OdC;Q-GG/O@)ҋ o 1U:[Bҳ6}ס1_ &\O^Uɨ 5MȻl;b3dDʎ٣; &%ͤu  ] T bB?X=i%}d}?]ם{#4*IPMF@OwIÈ3+=@o4I97@n{66M H'Y>f:7o -ցUoHbU5z3qm#a>PKc*SVQ!*T )XM5<-DDr\b'T{IDU c ֢6X?shHGyXt*TY&,܃TmKA!BU_#g׻}+SW'#}\(w.6}g84זǂ߱[Z⛞Ak]4ȉX!͒\L=l"vً&&jO KE]%_iw +'O4#E"Zb+^PYmz2ɪ;M[ ѦN6HSPn}^Eرv 3uƒ"N"QMJVRiC5w4k|qqkj-g#T8m wr#xImg0$p("!]:hݰpR\1Z'0guZ#*gԼ =.=zZ-9/r&YueJiPp!B 6 L$CnWՔhnL^YvgUW8x^Rl >'e)F'..ePF8 Ӛ2f E!fL䢴ڸAԜsMigFn4 uF}D6˕=|PegM)TBob+2hTJd[Fٯnqe1q笵< U;}rcu0?`~_6p;Y S[>pEYCXڸ~wϾ.m"B>]MA+/iIfSJ7ӊX>#Mm*f&ⅆ2-8&V EIůY\%N ;mНQ] [1A r0gE:!x IUjDce #Z!f!gFj)ݭ8D65 ʖǾH~WŊo~o46O6.YakQ64hc|<@HpWGFGBqo hi07}iU7l_o9o)ifHxvЄ؈y*>AKcF&!hKNz0F?dϺƗyJ?)e5Aarꡎ.+qyb@(/%:K%~N+(fAu|xUSݶOog4 Bä&7,ӭiiaռ/3(`TI>wuCm.U)5Kwrɷ.Gr8AjvN~";|'MTK ̉Hhx6Y 2 s*TiEG4G`)W@kF>WZltY݊{3^7J(kq>.Nb3+*O~H:)2)`%V~%yQNƋ5i͈f-HIyU:|2SNW4pa%8 }=%`uΊD@NBŏ‘njMo\aX"X4ş Ax:e|pijNxMa8^m+OxK.KP}.DSkS>4Nk[E63HbM7}]Prݤ:Gv)b viP7FUټȗ·-$Gڹk({ QWbΕ1&Nci*3ゥ{fw-}vgRdVEՆ6iid'#Z,6.*?w~6د-鸪0w>=~D$~j C~_R?'ceu-/*~*LK-&! L!.,4uoW׶wt,Q'(On;1>CV Nu?Lc|wxf_ثl|u5\ ٠=Ro( ,MWņ랏ÉkfrHG8boA3@>3įew(,X 6.E>M?fD; W*Mw_7`le-ג nXqAm=EnGrǍn?r=H#IHWrJIqG#k* 4N.:ԟ0? (t]"?9? &_ٽhF_?b4}XGFg2KA._kDQ=HrnmuÏ0}'" ƸW ͇~JmIZ'ǤNs3BҋA=pOv;wUoDwlS'`]%GAe%C+|0?t">UNr橣l˲k'ʗv/H$pR6*n=%~y$FvsPmՇ)#v.Yh3Tbx7ՄڸlgB^ O{𤋻$4pA0+dH$^=3=U;2NaoRu\aPclJq&ʹ_a'ӮFAX@^#f,{]@I(JÊڌ҇EBͽ|0s"pg>严$"X@OQ048;{WhSSXo<&-d\޿KH1ЅԔ'DPLN)RSX 7 |,r.Ey64ZKK (d@jsz~ҸP nm;kq845ƈGcvL$ȁ9lەLh,oۉ*u=CdŠkl P0Kn7kGtOi.ޝkKcL->ƌi"[>P|8l1>(4J?2T K57K3zk\g=]X@BХ3cRCSF!g7*}5a skQn\0 endstream endobj 146 0 obj << /Length1 721 /Length2 10037 /Length3 0 /Length 10623 /Filter /FlateDecode >> stream xmxePܲ-`]tpww n{έ[j^צuhz:9Y98J6n::)g`/m t # BrptY@ m;3K vspY\\ٜ]E6i `TT>)䔵r@{@d ڻV' {Kп4# + PєUQHkJ-C\M73odUgGl(K`٣˷OVÖ)WᯇK_`r;B%K=@lfd7ry-UAV[\wQZ\Z:yϕBvUe]Ee.?e{ K5@K3gU@ޞ687W28<lZDF˒tfrsq8yyyG3gO"@  /-a~2E33SZ Ћ=ؠ6&{$7$hӁ"[gnh1TF $4~5Ojp` ekHr*OVISgiYG? SnkrZS .!+dۘaeӢ ҳ(72e 񔴋f*B#o Rk,dʂ4DYij/2ςxH7+UވB]Oa_Uj7Nl"(~łkіǓ 1%~#Oz܏";3p4 G[XhK3 PI`V&L^+Tƕ^?@V*LdҬ(쑰ѳO8"zTN9k ^lRø7Lsߺv?&7Pgn#Y/&Qטȣڟ5vUx O7=K>6Va9`콳Iey[DT5XN͂pK* -L,Ƚ,9)h;ᔀA] 홛 fZBڡ7lJ^x<$69Ѷ;s6̷p̭ϧtAE%ka2΁ˉݝQw!lonmwC[㢻`D$ƟQ~Ho`)ssD'6ӬƕT#Vqg'|2ָ~[NGKfoѩ9fǒt7eW޲[Wy&k1XiϬr> 33a" zZl*rG!Sdz^{har:8o7"TzQ;LNN3K獪HVVwށ+pl[i*$7B"sQQc~Yߋ?*Csތv_ļNHd_4`-Hd\yٳw8\MߊcUEQ'EP-"()XSX>3g}0q 0 `k~pί)f籚kBZ.MTZR+玠If G>{魚X ӕ]iigN릤vV{EܦBjTT=#:].~vg5В5'8l=VTȭt8t}TT5+,̕? *[!ܠE4TAW\qE M3S6Y ?j@W*Y~;D1X=7fڊ%zrrYD~I=ӭ-Q+kc6T}29REQtC0/ඬh{Ӟ:` 4]!N= DqXl ,p1Dh`s4Ϭhˇ ',.-?A.exRTUEw=i0 ԅ!_tܫZQKN L|}{N~}$t!1`Eԩ["nD]{}YJ5WXD;6/5j0a2ˆ6KOg>XoH]Z]K"ՙ"ozwY`?[%-sd6wk[{h ˷ ȻRN3B&T#`u6n}-! w)yc{09 a|91Sz uUځ5u65Y/lRv*8l].P:dpC4:7\B-gXgЊRgtD̬!HZBħ?;Hy,>2|itCNRR ն,>y$GOoYʕɫ犤~(ߌΧhI}pJ6AUEóKʂ؅B?R-h7}"Ȧ5%=.lNAgjޏ*4A6{*IV$MISgxZ@ _懆<21CWFE 8<y$ɡen 3k0{([4 np1ekaÞ_mV%ebrVXඇgG\;|-)nNC} eELO)J |<)Йb4^2SUXв8_.9wGIxvS!:&R 3w-OVёh=)wB\Šx(M:HX Iw'KnmTU4X9~RjG FR{v[%x5z7Nk&bYҧT?gq3!c F'u]@^"j'ϞÀfmQ_FKb8mʅ[L"?kh˄_o:E)i =k17#aw\j㵫\Sl,(w,UcPⴗU54WF|B61VȆnLm>Q,5[~(}- 2if8 fK ǒO9v3 YWXUX+6arzsRA*g& ;IW#wqD|ݝ jaspi ҋ%m5;s\ o,QqA=91ßޔ+7*L2zSR/sG.oU!2ve&RF(9N;K  U@-jE#, WUh@AD.]\Az|S*/g?k|>˞ۭrqqx7G^jBba~ux3ߣ07?,ۉ<&p7MYF-1HLN\Sq ]1җ6ȁ>jepXYϚpp.P_H5;.-iDAJ/׺3fm'۲YY`@nN҈y}p0{aT>l;&*9DA Y@l y::[h+i]+[]Q y[Ǐ)USiq95>$3EyZV]u򄟖+ jO)hEoތǦ}QYfSCH78ZBۣ\ =R(@5ktێ8P#rfά{"q".A[6T򼖰%PH;;Ed5rpD3VNT)S f)3| X\zS;kE,s8* "y=灁S@[3Vv,!1r^mѩCvN M7Y4m!R)1I{ :~Vl2G>/^bS5U#/$rLl8 S֡s*Ở g?e _}8׎yV~^eUY^%xTI;X?B}d8 &ZN6R \0^6t=1gaf] sXvy7;ˉZDba5HN5_&vfxيg{xY.}'[.nי6"7Ɩ&c8JQi bOhS/f+RҊ링J[IƧ- eX{ ).2/}#nXuPGvF @+gzpx&du[>e: 9[fuUm)T5k퓑ʿ2ܳ1sZձÌcpQ:Plf(MK#[yxVN'(aC%.W;=kw:Mk XO-6as&4<+|ן$S)Tԩ X9/`S.[SU%R8=}q:i>v&,1NUlk͚8Ǔ|8ETNп 0#&MyVߟ2)QEs7_yQYla{`MD ֫Q'AUA34 {aҊzQO uʹ#dj乼5UwZZ|θfP22hEJЫk.xeF`8+:aCom-ZCp$B$׌l1Ç$4|Y6z^4I@kc[ c\nc{@pcqBKֶ~H ^(/BHͬBx>tim7RՅMCR1 JG@N'l{4K#& 4plСO%=I'a2=ts <[qH(L. ^CQV^9449n08HB @3*qo q"ܬ/o` A k$̎;pȉɐ]δPόW6z}=.Y7N%kI)>~1Pp!`҂ YE7mirO׆OƾI>j?pvx _|(+j& E<tr4wT  x[hhƿ492bϮBo)[u`+F#3]C"AKPJ-gU)qlL.1BK%E5uAUesC*֧~MQ1ՍGNi3"؈bnYT~xtw1 ^I[۹_&B_ [9V02b{3CyQv}grYҗ`HU ;;h &rAܵwZ6ǐx8 ,%dr 2 5Y!ZtTy]>:۔ty( sZB^X4'/dd@QyHg%a-&sT/ÊYaG- O*z,O댳E]U190M19#5?'&xmjf;UDL?%NE}#CNTkt8U^Z66/herTױu83*ʍoJ3p"E1G|;cT-قG:f,H~EH^&Ue[0k_8Ytd{a) :Zۣ*h?J1"njxۨsPoW5Y4}eaB#u8ŗ0'KQ3 }躗bv!4[0־betr Z&_`1c׌;o!] a z!] ϜN:Mcٞ',aVvԨy8uْ |diْl[SOo јU.Qui%.t؞)v*͎/,:|+G@+W _Qgx8$wDiޤ1> &ϣ)33.q\UEr{ert :X8(O\U ~/BfQ/U ̨QmғA^U Y8Kۺ?)g+,^(\+2?n),ǗO#ϛbu֕dx&9["ĦL{+~Q5U^t{[3D  Sj`Q$T&|EU&ǣddP;8_MyT~N}>%s~߂*]cz~orAބi*s4yYL:lKٱv )悷gم1Yl祉nzi2 өaPkp!{1'$ܾLhXhM=@jш$;c3ڬP$ M%~cL!D$G }ax#W7^l~+q{HS/jPuS9 Ӕ38?S}8.q$96*Oo\^9a ت L I{[hORt*$lGk"n" CbKHdD>xW sE!W=A~I?DYl7K·#7.ء2 u?19LI*0S(5 @XClB]ciHreyж%|\S 5 Y3o>\Y%ID^%p_IV,5ȺOL|J6< uR%MCn׮}V+N Acg^ѱKwEIADϹ9xZJY^ (ɝ@;5Dj9jt׳^v}ljiV4cMo+|]// ur./jB(pe0y6'سL;0iG وzk2{m k(1'-ZYpΓX"#Z%i? ˹{(cOdtQ9xW>%$ebo]ZsJKwwl5B0:)* rȇ+˔ufQBN?:f"U',҈ TEtK| {A7 >E|>eCJ,KBDwTc49SOj_ .l88|p=`]_$E;MH}.aZ "ư`nWDVD5IOtVnG*I sENjB ӐM?碗th\$#jELXCu k FM =7H~O0fF3lT3/4FA!f壖x樀_UܪOِŅR]֋J<Ȓ %j< qQ)7R#n-J79w{K |Qeлdi1`9ORMh¦Р-sDޞM.vXbYΆLzЪ (Fðb%Z*79G;Yїw.7>+vVl34HɅ򚮁v{fH NT#=ϻ袨ZNJCgOy9(|zlK`weLVs@ p{^k3m;L3[Ü-ʐpSԌ_ro}|վ4gWp,e6Njv1u)³i%}sgEisrfJ40U:(N|>!~Bi󇋘eCa X^wD(=6~Ŗ]R2a4؃%t?o}-fh pSX1tiH鏽Wnp؁h+w;KaΕآLWJ_p-mܿsU6㒁;kUd*W;?f덂\jD{e9´irv:~O3ˍe):FU7}jG:,7`hB Kl4Qps^E".2M,IVf:hczR66h9'Q@ͯibEh(8I\qQ`j'&#Uut(z 1!dCLsuy> stream xmrg4ju :ѣ D%.E13 3ѣN"D'щ5DF^7]Zz>쳟˥A!0HDT`n `P<V2`pb 2^ `@D!c ȹ*➋`+\7"=`tBTʹ @F`N6NH@ CqA- p'0h8oM8?Ю,Z-A t4x5â>_//u'!p$ A!dM m<?wt-w p f?wrCQ t1p 0YP_z9 $N醀#VB- ]O?ڏcN;z?<50 ⯽bP? \""X7Oa#i|žc4׻9$ #d |r o Y {igKX /(lok} (V{"B-XOΞuZjuӘ'OM{$ަ,}'OίmE3;1|KyzI!TB3`eda0$3;6/3?=KqrytnEGu2rHtn%MbԈpsڧ BJ ;`e`FX(8WD"Q/]*\ұaRƨoV@~CM…bԙe3'3'>]}TJT!{QyŦr؞{ } 2%.Evpz#J, Jc9u}-*;\pf4ѫ&wϯ,3o;!@ LGl** 7$WWpYQ5Ϛ5# o9-ͰEq?sHf =R=]q'b."_{88  8ixxs=e26R>-MԜy$l$Hr*ReK\w:(_``M:ǦBԲmhR@NP >ѝU%' 13atLjgt4O ")<u@VoYA38IG 4_?)o~[u.ᅬpLw$,ttQ[ \6Qb})Ŏ72K@w>T8~5,N乁c-Tlv#$I2<-fJLZ摳lru^Pd<=.m1MMf+km(=[3/71,(m}!\.·ڔe=D{ωM^ E2 !w/3+H6= M4A'Z,Dƞi*s\F. ONޜՍ 6 ۹,W!#%Xfo߷90 )!Us*@>i}ޟ|Gv-z C-d9Du1N,tA po%ǞMݩvIeʾ&Ĵ6flVk;;v^-YlM.#&l^D3 KYOhlu9ZM:IQtf\jwwŶLaG|-;+qm@٧ N4 8$ZTcg3-KVn*?CmY;S^cyס8'"R\R.E(/^,j&Ny[뙧}x0Q;>vdJKo7f>!ʏs5hr\TesnX͈S)lY,W%!%?b:I9;D>b60*/꘤p&8y\/+5D 8ǒܚsϩRXKIHdݢxN m& V}ih6{͎Q z|yń'<3reh;Xy3E ="A`.jbZ_+2f%vI^ف7Ҥz3q|Po_-g畈 eWGߚ&PJ/$/32pDqDwu&:`O#4) =lp7X\~\m+r-]hQ"eG>xTh "#Ud5i\*!' xAE@}oU4gnş5Y,tl:/IZo8io'"v){gdXߟ;ٺE+u7{</&Uiѝ*v|0l (kN1S#k>w?{Y9Ay|'?8*Yf dW(jP ]~:e!=0iټ౱]PEf-|ѝ6%~R)'ryhz`v,z5bphѵ1[$1ʪ{Jb~Կ s;_<9|9t*ʝX|Jy~>M۩^L(ݡ ֣KHڪzԴDjt³ޘy&m=t9+r[lS3΄QDgy+3f^x_hiޠdd357hm Oڻ;=F!}7;\+9n"jqK5T灁?"(l ,A]Dn,,fhaP)Feɻ3o52i@{;H8dg%lo VUÜ{#gZ#K 2f}{UZIݴzEW1M;7I^_w󱛍^1cŐ=!m endstream endobj 150 0 obj << /Length1 721 /Length2 5420 /Length3 0 /Length 6002 /Filter /FlateDecode >> stream xmUPmצQDR];%Υvaaم$T:A. i ogsssgfeTD!]u@ /(@GyXYPKW8 )o @m:P' Xr('/4n#,mp4@@í.nh7I޻&(j(@NSHEC P"hK@ H(B'k&?P0PWЕQ(,65vjvk:n*]VP[8/T0@oҝ ;};96P аtPNnP4@eE#`%#PqAi{E тY DY7}/P;?nDxȻ16Җq Hk i qm/e {{6-]pO ?_Od_,ӛ\#D|G E1n?zB f&Qb)uKGr[qM1ZMH]v64tizҍZI|]RUd%\d 39֯bR;C>~k+-gEJH\cY-!td.$oJ|y+mw}Vj]^IZё {ҷF_M:m vab% Gt<-Aj-'˩5;kQa/_gU(6ō6\L7LAr K\Llb*a1$^>|:v8$POtKhE~r+gy$KO+]?1>Ey>/萱mtzձ6$ZSzօx<=TDM7eSr 4X~ γG <+P" v(WEv<ZzucY,[@fpwU'nx- ݛpƲ1ItZe4$Z Cd"z1ͥ>O @5ťJ=fFTv>S[Ś yw|bJLC,βɢn<( "F$;pEǀc@kI&u?[CVhVߧ54J9h0a=[ȡ0{M$Pvs|5u)[$Ni]yZILې wiU'g'Z4B{oB qˆY n p*}1x+&<Ly(aaJ>@WX D^BbKM !L0HmdкF0G"k>ŝl oxƥ<] \B>v 7HKgzw>bI%&.HZ/.3.HL`:l.eqakˌ h`E `-o-`z`dRFh1N\^}vc9&i̦Uْ/˹n;p,iU+"7e;Bhaqc5>kmJOt _KhK3E,gƁV;1(60 sDlKd5=U:GͶp<OCGM0{3_*:+W2aw?RI5pN6~šu4JWdNAKEy0G|nRfqolS+/+tў’f!i0^oB; C gާᆲu뢦ez5ndӒA#iqnPY1kAZG ͌,x'pQaR *.B%vq7]@D7#&1/x+z\=[,io֊jywIpAbN뗉pN+FqQ}y4!k 6 SPyi2$Ss'`tHU3C [?~HⒺpVV.}poqƄS5"АȬ+$hfF=rTD:m4y;oӦ|\8Gd0Ha~0NVBn\?}sx'զ?Q̷ U6 u^ b X;(_9%|e4`)FA$12osER6YY L #ĵ|VҸKס {I00LRԹ@֠@-zԩ//ʠ/8ZMW~p8S-j]z՝WRε91jq滾r+J?h1?sW;o~}(>_%ڒ$BybA#|㥯_LS|!x6p/xT\V'{X}82tK9e#Id`%Eg 9e1e 0IzFQm   #_{W $LoVcV^ᇫk &Ga#y{# )%<>c/bTz.5][WHzA (O'=rY>쒴[۔,B!I"ƅR_%uoML^ 0A! @Vj a YoŮm~Êb4-"F"ڴ)n d}wbIdRƆ.Hy=ąg-AsL2Ft= gʘZ XpYŔ(oѬ5l̤ 'pW&w?0:ƧGh3,mI*}b{r^<Bʛ%gc<9p:v YotVC<{8H{۽wD 3v#* R:~W4IP DYLj o1y:r7~b_L 6ERW?+ɹ<9܎HRTR ow\yJ=:et@OLPp',tq XsX;gX˵@B j"rNsh}m2 ϧh_Nb0\F^};{/Y!L,y^yDVqquR70f ,*W\ˏ<"F3y2\uxGl龿] @2Sόn0Rι=y`j}I#6#$(&P/&bN9[KzOO˓R(B7xZ^u2 | DD}n#?*[gLAgr.md˔Rs𾉃{`BL;꾇p*P␰d2h3'uJѭA;_@ vB0~1 fhx0vթw׀z^Bu~M2+UByKW=QW>=bt-~_E]L5씢K$j\UQRZuYIBy 4 b1,,k.R C}%}O:ԷTWe&8dP;W_!->?MЏa,\q^Lb>N[ WH} i17\Ra96#x#CKˇ "e%\Ҵ`m533]o8 nG˰Ѧ%[>Tƭ"_xFPg/o <'5Y HkGI d,}&)R2nYI{:m">t$j? X=c/mϓnxC"jrT&۶uGoYe_4/P -se^)*\@qr40F&w>3ȍXadNUl>ZA&[9.Xu:ϡ>~i܍gpK,aoǺxu u_:M>ʢ899.74}&sCHhǢfY7q>4{&9>[ OR 5n\% m}i<ӀWQu%4LsDc+$sԧlө4QM.8sZ=OsZ8SBq=f^f4L?Xki腒0|xc8(:gH$;lTk9d]S^ʋEkEX">›yN)VQ3aEm)uktqqF#1:v dho^EoyT [(;cA&\`$vifN!,jUa.7 !7n\98g.^8R>1~C>ѓ޽tp>E?ޱDo)v7>ĉaH?~eF"+%r@Y8Ep2 <:M0g:hh'vXz}rxw8f endstream endobj 152 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 833 /Length 4606 /Filter /FlateDecode >> stream x\YsƲ~crN}9:Um[[@SX"uIvH-Z򩜪T` BТpEE, PSh _hg0Q0QGJBFU(W8 {g.ѫB{`W@,쪬+ƶ@e8/|a,vMFJ(S&. &CR#d e.,wpXB(\*IwDX7#y =dA0`mi XF iqR"\CȢ.`,z\I:@MpF2Q@3-A),:R@ĕD,hnR[>JOZ`C`GR!E@18ҘG,CЍp8KJM(z$J IHJ*tt2aM=kGE@BH@ё`0n#Ig"钸 *$ k6VXOFF愦1p~o9X:!!Fn.z4ߝe=YMR\ߣ~B555vڎ}y 53jԬSs6v7MMQ=j~FLۮyk9kɜ\F  IgZ.?)[4kԛm׶=.N-EwۣV~i;v8msq{(smCfQK_ݧam﷨ygĬrm·EӖ(0"[\ \f~ƒ>upC8vQ=۷GuQ֣|g%2z9?[L%3yVOw_wx%,C|? ';3b_ _ΦHŗ}hT}X㨺;_ DWO{$U FS*$#mDf zzԊѩ\MY>©MiMk֢sm1pBp^@]N.di?,|?:V r)۸xE ^;( rђ ph_7C h!G+8NNuɀ1z7\cݐ%#їVj8?%[ej&Hb~{A 4~lE3a%[,AL'6C 4C} [) 'jx$l&Nch"J!Qq:FR+y1Kb,% \)E]w_ے9 ,+< QyB&v-G%'M@1]HPra:w]Җ̌H4a;Eg1g [ÁZQV_03c}T2Fy_n7Ll2t4#{U8JuY w?*b֦ DM#N ?o/MK:5tb- NK iu >L-uȻ@Eš@j-~]`L@°?.1^,&qJmS=눀emthOj#t:`&tfڵMHLN{RN t^pv *t&(/Eb3OՁ2 '``Oy[i?%~Бt*wSo}rD>%FsZ"mHmg5l70Xex%RS ;PU)j\Mx-Yᓺm3;== @<< =" F5xҺ9V[8R#b'$O_N=r[Bu=Kc0݇5d7NPE$R[(/Dŏ*; !KwHQq})U ( "4l:XPUo6fJ UTM1yLe0G -o40פѼ#cBJ%*7JB fZO`k¥홒4ɍ8͊ ]Sq! 5t;7nqIǦ&yE#/q:ePIBh^8$\" 2V_-np퍍p#4I^W4VK Ţ-Tk@z.ܒ9  BiTEΌ` !Bi,չ lzTdj%XG +ےg^wGf#Tgdצq-ӈ'ivq2 =Qs*Lܯt5_7'уݽ{vT8. .n5зT;儿?7>}\Opܨmh'trgvx\bTp?^E( h7?U#~zQmW{ոTU]TOauTyzTϪiu\Tj^guuZ/jQ-U:Zu<ΪOWEJ~6,{^<}RB $$>ۛB|X>[n^m)=).e rJ| |Yy/K 0U'-<͊żլi<6O.oѰ)eJsq;0oUT_w]oÇŘ>8VMA8x>C{r2OE.!9޴gy ?Ouu>fM=ɇcZyZWF5NϖWu&S\'Dղ ?TV[/=*>{ZڤCگ(!U=m9ƓUN54iu0;jcXG _~6x傄/D;lx+KHW'xeZݕgG,Ք ȀI\N9ʃ>E׻[o.T61 %(orbg@q7(u#@w֋W\ltmj7Êd%Elr'_X}w '۹Wɑ{E{o^>{@XPeiw33[WtIdHlIl-NzҗFqo[!'CHUO9A=ȅWݪ7 "I;^@\G`Zk03,egmyVJm^c9t9NW]*4QcMl_/^%}9n{$ǁD =חpM l9YT4^cƺn \>4Էww2e/1 o6kt%Y|?wn?N %Q@ѿN /"R>=Z1X$6~2^Uzgl_' cBgƬ0v/Eg{Of^ @\ x:zCxpv|\C٬$|75̋z1(\#{IPy0C8=8A}FΨV)dq( "每/<ɒ rE983^MWGKz`w{36>?@ endstream endobj 153 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qg1]C_7[,ifkܒ;m#J#<頃MGeA AZ $F<ǹ7uoM_>‡`Uwvl.@j* ۣaӯ ^)o'ä RU9ͻ ز(ViZۏR_VRn-`2TBXXQ`  IF\Bbu <\`Gc)y ,<$gsv1ag٭N)I&S?^`qq5 B{ $.  SqdAEBu4$OOB:]*N:qJ(sB5Qύ}nTsύ(Qw|T~'UIO:y҉ϓ<ϓV>OZO:y҅S}RJtv3wtMxG^y: =tx\S{*qs$ endstream endobj 155 0 obj << /Length 711 /Filter /FlateDecode >> stream xmTMo0WxvHUdCmU^!1H$3C z̼ïg)>]Ͳ߻swչ"ںQ;4m_%= uS'N%Fwڴ.HS1ʧ`׮o/x͟m/с!ZKNN~gEʪvyW~~ r-Ҳ\b&jr ACu ad)Xy x &I)RV˘.LI@o_pi k-cp [ ncXz3N4ִWYf% 9%b*ԩB+|A_F:C9QY5KE9rW8faD>ϐSG&xV_kU8!80L5#D ԏJ X'9Ł?: iYIWF܍湛n endstream endobj 156 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRx=7i'Էf[7̖s ~ts[(:0p l:5m_-tB}W{X8 jw]lj'OC=6}Ӿ|< D0,6;96ݕq4L MUWqS~Ӿ |Ҳ\Khv7RKs|*Z -1 b[d08A  i$C#.CZ\wF|TT<\`Gc)y ,<$g v1a粳[ RHדL1>g~8 䔷5 B{ $.  3qdAEBu7js"ܨF)EYQУ.?yRmTy'oOz>OZOyʄS&}/6>zչ{ZkZs}=?Fey endstream endobj 160 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 161 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 164 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 165 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 166 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq9;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF ׃ endstream endobj 167 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{Vq5;\ظ{32bƱ)`Pk IckgUPSH@"7#?d 9aFm-P!.@'1 c09SGTX3 qxryB4 AAN8pЏ}% Jxxm_p?0䗒䗊/ TB~RtА3~N>|T%9%cQ/G:%uF>%WV6G]$ ' $ML/?mwTkW XֵdpZRF# endstream endobj 168 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5e$_FK6Ӈ~GnM|&/;M>u/tFo1C,RAj]IH}=nCbi$wiдK;!F ;oG+5~~VhVj;zk)7b]϶k+x; v/)&t,KK@F(.$ +.^ ] C@F 謨fҤ8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz*m endstream endobj 169 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hSu endstream endobj 170 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 171 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hS!| endstream endobj 179 0 obj << /Producer (pdfTeX-1.40.24) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20221107142730+01'00') /ModDate (D:20221107142730+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/Debian) kpathsea version 6.3.4) >> endobj 154 0 obj << /Type /ObjStm /N 35 /First 276 /Length 1139 /Filter /FlateDecode >> stream xڝn8slG( vul'v腛hSJ;-U oqf?%) *f$dL# ) be@q*~ d )4(j.A*811s`HD`!(LTD-X@LƱ8 QTD+VgthYbpXeAK+s-DZӟ"|OUy9,_l~9|,LP%ugkJ܎ɞ7yr J` %عlJK{nfԝt1 ItdK$'>'D4P_ 6ynH@ͦgQ <@j%o DH4_.K N@ZLߊ&+4xd(rq8l)p|q c|Z&'vi8{"{ӽ_ O qx'vy<޸ W߆N;[DI{hr"/%':YnoF#A&j=5!M;~zZyZ8M-gid(rtv[yZ@i/f:5SgNEL-ҧ4EQF4N*;$wy(Ve+MmKmPs V-ژUW1%[ˏ:Fcxf?lu_Ϯb6g7]x+/->.cXɄGN,ZW I&-ɪS?b endstream endobj 180 0 obj << /Type /XRef /Index [0 181] /Size 181 /W [1 3 1] /Root 178 0 R /Info 179 0 R /ID [ ] /Length 478 /Filter /FlateDecode >> stream x%oQץ7FQF RUJM(SCn!46]JgIHO+eocg'6]>9s !B IHکm$eP@Z ˠHm=i9Vjzhm֑ R˓VJ8Dm-)R3оA]oZOwZ9 901GbX=$O4:%!_bʤ;H`3B!m} &z`ݰlQ .8zF{`:p q0 'i8pJ0`&,_J-J,<WhyҤ.+]6+}U*4e6ߡtKٟ_JW-PfWiLusmJ7,TUŅeyeE:7g3Tѧ'gbuUʙ~T8YN͹?<|rBT8 endstream endobj startxref 227081 %%EOF octclip-2.0.3/doc/greiner1998.pdf000644 001750 001750 00001150374 11563471227 016426 0ustar00topotopo000000 000000 %PDF-1.4 % 3 0 obj << /Length 4150 /Filter /FlateDecode >> stream xڭMsB=Y H03=&iI'́(]TL*^}$%zń ?+Ztu_*N]婎3[nw_oKvXqwkτ*)!8MG$-,?01tTɶ~)FS_;l'7s:`.Q7);z?Ȣ%ofi$عƤ6RnO Gw( 0.yY?{&i{ϭo5;2ɀTM SzU AJ| it‚}gk"hbX[ZvgkYj[6˦!3]8mZtOTFc 9OS5w[$[=-D}5ʮъй/ ԥFk:__%j|0pI48*4Ea_fB7C(Hc)k 6 qW"`[ԕF~G03U 8ߟp8`wv"CM #@PX䣠jEyؿ{v[1*OcuJ5W&fĉB ``~ZWyl'Hek6#!qYt@]i{>f!*-17l3|kNj GR]b k^ #kG .9f2׏Ar'ϲB0suYoA-Dqzm)($IQ@^w'~„f>Vұvko|KO< AD(*҆C=1cO :ϣ=0n$ d5jC= ʦv7G4X xM"n}` ֆC{}_vUD/QsUea #oUҙ\IMf)\K#;"hfbfu'~`q@w,~Kj\H)| V}=du+%ŘqWȋpjz:-_"fq(nI2x@R0vk4pY xܠknOEK'N5EⳄ]9&;3m}L@ԇzduv-@aYsʁ; ? -T%u e$hvVPHHSg~eg>'IXN Η%fz4S:ow-4>T-B İDb!ܘ`f$t!IE/c^W?NBq:lTn =w QSǵb&PD5ݯ++2ݨvd&E 擗y:HNyXǤqr~-oBUœ3 JC͒}v@7 p7X+Q9ھ{y$B)HRp o> endobj 1 0 obj << /Font << /F95 4 0 R /F96 5 0 R /F98 6 0 R /F101 7 0 R /F102 8 0 R /F110 9 0 R /F118 10 0 R /F112 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 2420 /Filter /FlateDecode >> stream xY_o6ϧ{  @ p}pf4{;{6o_RlyFdPER$$%?JV)d)VDbS+ũm`M8x}}eV0c^]Vbì-V|6[Yصxt3,X ת‚0Ht%Ү=l0 !նdeBJH;7,)HZl`_"y|6az IUDh,~Ww@L[ǻ0*~u4Z}t#ZmLERv ;/v'_1dep15J8( <s:-S4{֠Z;nW&zAbuѻbRl ԙH\J /~8YmO#ԟF.Y Ax(}XԪ(pC!7.}^*_0P#ѳxl]|GOVȊ预*~Q6"H\+qcA5*1f8+f{'e= B|]O 6}/ I"m=Q 3&;u5aG<'|뎮R O!ۤ4aB -++ah .W Tbn ĆG, OWs)rIT/O hX|J1{nS@X&30Yn_2zɢz/hǹ-%?-}9eJ745gs*kQߜS?@?*xRNIU0pfBu)7__nG!r1Ի /MݦzَPI, gr p\g1Gzc1[MHC7}ܔXL2#]$=Mۼ$o*X9h= = #ucxi?@2IbQ/ɧkt/ skaJ]a㖽yv}>̋bBv 6 㡑K"'`e=BcrV_[YsN X54V, ї%!S|+:*( ,^7A ex;9@:M-5+gS2JFڀ-S~&hb, k<BܰIs.ϬOEA^5=?8An]}ttЯ]sU Λhéu[-+@ua jn^JPRyNAH+C [ghdVɺ/gdpGH툰 4MOPgW>1)#Q,1 3'b!K)l N7P v-)τX @K_X`?38G6iVwa"  g@{~ >h>k|2VG^Ho~نy.b1lHW)F%yb_$t?v[Fx.ȎzLEwMX6I빌4q`&BC0? 'nYc/% F%vZ6ߒJHŤ]U$vˑC!l36yR<\ctqy=ćMDo⤚k֔`@50P8I006 endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 595.276 841.89] /Parent 12 0 R >> endobj 13 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/winding_number.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 22 0 R /BBox [0 0 160.999 82.162] /Resources << /ColorSpace << /Cs6 23 0 R >>/Font << /F1 26 0 R /F2 29 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 30 0 R >>/ExtGState << /GS1 31 0 R /GS2 32 0 R >>>> /Length 711 /Filter /FlateDecode >> stream hބTMoSA ඿rx:Ҵ !J$"gyiCU"m̎g-.Jg˰xR x c&oL*U.h f7bv N^YߢVךeHpv0dF7 ? J94T[vlo:qc&|4l9J؄T%²5g>}pyDJqk5}bUXҔ!]{񥔌%45=YݖN9T6qTYyZ,akH_u`Zdz7~^#|o'x{Z~D0%(@*tAW[HQ@R|?EBfGpSlT;P:+lr K mIJd "WbE %4*Gn%y{sƱq/:?60[pu%qry%AK\ KheFH LhQ+o@ᔘq2]UobiFp\e0z݋%B^":%εRƪb ]Dc؅s!#Z^*hhR ٶsU5*_,rpN*%<M39x*Sw%/| :Dq)@՟1cb98N9pˏ{B;|=Ea pVpMDl2`g endstream endobj 22 0 obj << /CreationDate (D:20100829120313+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100829120313+02'00') /Title (winding_number_.eps) >> endobj 23 0 obj [/ICCBased 33 0 R] endobj 26 0 obj << /Subtype /Type1 /LastChar 3 /Widths [ 560 730] /FirstChar 2 /ToUnicode 34 0 R /Type /Font /FontDescriptor 24 0 R /BaseFont 35 0 R /Encoding 25 0 R >> endobj 29 0 obj << /Subtype /Type1 /LastChar 65 /Widths [ 624] /FirstChar 65 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 28 0 R >> endobj 30 0 obj << >> endobj 31 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 32 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 33 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 34 0 obj << /Length 224 /Filter /FlateDecode >> stream hT=O0wyR"ݵ/%r.ΐmB_>,ݩ#A7=FY/l8:Lܢfdu8u4xh[!Sq~ _";aw?>S_B )BJAY=!Ȍ.k@hJ\o9hiDhF%9(@k!iO% Dⶎ> endobj 25 0 obj << /Type /Encoding /Differences [2/gamma/phi1 32/phi1/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/gamma 161/exclamdown/cent/sterling/fraction/yen/florin/section/currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl 177/endash/dagger/daggerdbl/periodcentered 182/paragraph/bullet/quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand 191/questiondown 193/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis 202/ring/cedilla 205/hungarumlaut/ogonek/caron/emdash 225/AE 227/ordfeminine 232/Lslash/Oslash/OE/ordmasculine 241/ae 245/dotlessi 248/lslash/oslash/oe/germandbls] >> endobj 14 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/wn_change.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 37 0 R /BBox [0 0 216.25 101.35] /Resources << /ColorSpace << /Cs6 38 0 R >>/Font << /F1 41 0 R /F2 43 0 R /F3 45 0 R /F4 48 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 49 0 R >>/ExtGState << /GS1 50 0 R /GS2 51 0 R >>>> /Length 1218 /Filter /FlateDecode >> stream h̗jGǡۧK9= . razd)Z*}ϙ]iWZ9*ukΜߜc?ew ߷Uw6]!7 ȹlVrzsٮ?u֬]\Ӷ 3XWŏ[2\.@".oV7z~?f͝$(6MOe>Ll"g~n21Zp"F W)TSP͸KYw7ێ"޲UpTC41 Z <KIHmz#]%QHT&(g6H2{6 $G1UzբJ ɉft fvJȦIVZږ,|seb(_Hod)<!g CIeԓ OzR>'in<|8 PDP*➬~@^n>ƬD,%0hFз600&QNmE(ƪ{#9xFoDR" a!wcpq[<}c|`IEAw J7w-7 OΊW rflWj+8[$PЩ4}ȷԃ L}ӌ?cpSbE4"nv+xѡLF$R_1֩E3d=A|I3 "VS *BQv(]8XҖXz#) endstream endobj 37 0 obj << /CreationDate (D:20100829121045+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100829121045+02'00') /Title (wn_change_.eps) >> endobj 38 0 obj [/ICCBased 52 0 R] endobj 41 0 obj << /Subtype /Type1 /LastChar 152 /Widths [ 530 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] /FirstChar 49 /Type /Font /FontDescriptor 39 0 R /BaseFont 53 0 R /Encoding 40 0 R >> endobj 43 0 obj << /Subtype /Type1 /LastChar 114 /Widths [ 624 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 561 0 441 587 453 0 0 0 317 0 0 306 0 0 0 0 0 402] /FirstChar 65 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 42 0 R >> endobj 45 0 obj << /Subtype /Type1 /LastChar 3 /Widths [ 560 841] /FirstChar 2 /ToUnicode 54 0 R /Type /Font /FontDescriptor 24 0 R /BaseFont 35 0 R /Encoding 44 0 R >> endobj 48 0 obj << /Subtype /Type1 /LastChar 43 /Widths [ 748] /FirstChar 43 /Type /Font /FontDescriptor 46 0 R /BaseFont 55 0 R /Encoding 47 0 R >> endobj 49 0 obj << >> endobj 50 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 51 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 52 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 54 0 obj << /Length 224 /Filter /FlateDecode >> stream hTN0 <ǃ˄Te{NHԉtۓrC~ɗ12~cp Xg5 > endobj 44 0 obj << /Type /Encoding /Differences [2/gamma/omega 32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/gamma 161/exclamdown/cent/sterling/fraction/yen/florin/section/currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl 177/endash/dagger/daggerdbl/periodcentered 182/paragraph/bullet/quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand 191/questiondown 193/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis 202/ring/cedilla 205/hungarumlaut/ogonek/caron/emdash 225/AE 227/ordfeminine 232/Lslash/Oslash/OE/ordmasculine 241/ae 245/dotlessi 248/lslash/oslash/oe/germandbls] >> endobj 42 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 40 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 15 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/ex1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 56 0 R /BBox [0 0 133.906 181.459] /Resources << /ColorSpace << /Cs6 57 0 R >>/Font << /F1 59 0 R /F2 62 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 63 0 R >>/ExtGState << /GS1 64 0 R /GS2 65 0 R >>/Pattern << /P1 66 0 R /P2 67 0 R /P3 68 0 R /P4 69 0 R /P5 70 0 R /P6 71 0 R >>>> /Length 1116 /Filter /FlateDecode >> stream h޼WMk$G ׯK蚒To!f!a={_S`;`t'zqkZ,/KZoiqʴ]_OgLn_S9!Z2/d}HB7x6~u_̕}LXշ`簡չH] -~*>%u@,Y1 VVWnfZ-xBB( {Oa?V_O8vGlV]9؍}ҥ7 ָ894jscKWedJ"KJg< ,`JH$1 eN ^-/q|2+cz5рPiӊ(;'lt`2IZIO^KY\]vXHɲTs$}#hh4ޱLc`tux̝|.Wxkq o jJ jLd^pxq@z#GbCRXsg`ST~xdnqOK4z 8X[j9S`hUXΠP` ȗǵlE;nDvjW$ywx|3?{z؀='4A]@Fh )l(P}2Z8@i|4JPU)ꦌbkz㚵hwloML -N$^Pp%`Ģz2!vFr yׂ%_xo{~qGZ/|w/ 97a/pHBއ*hMU爛CH4l2b:S窃CkMYt&o:1e+ 4C|~ȸsGq!W9E"Ղ) Z t̿2G퀳c7=[&a tr>"ZLpTfý7)%BV>;a)iAl#}Nk8 `]>v0F;'Kl>+ endstream endobj 56 0 obj << /CreationDate (D:20100829122121+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100829122121+02'00') /Title (Print) >> endobj 57 0 obj [/ICCBased 72 0 R] endobj 59 0 obj << /Subtype /Type1 /LastChar 51 /Widths [ 570 0 0 0 0 0 530 530 530] /FirstChar 43 /Type /Font /FontDescriptor 39 0 R /BaseFont 53 0 R /Encoding 58 0 R >> endobj 62 0 obj << /Subtype /Type1 /LastChar 127 /Widths [ 748] /FirstChar 127 /Type /Font /FontDescriptor 60 0 R /BaseFont 73 0 R /Encoding 61 0 R >> endobj 63 0 obj << >> endobj 64 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 65 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 66 0 obj << /Length 152 /Filter /FlateDecode /PaintType 1 /Matrix [ 0.212132 0.212132 -0.212132 0.212132 57.0224 109.523] /PatternType 1 /Resources 74 0 R /XStep 72 /Type /Pattern /TilingType 2 /YStep 72 /BBox [ 0 0 72 72] >> stream hެM 0 +Kvs =xO loZD<͋IKx/y9AQ5ddW鈑4wHֵQ FN{blgOxp:3l6> stream h޴MK @ M3L׳ 2 JANt)$>39`3i2uQ+CNGLc\;x,4z͠ǭlw[^R%4ݟ2d 0= endstream endobj 68 0 obj << /Length 144 /Filter /FlateDecode /PaintType 1 /Matrix [ 0.212132 0.212132 -0.212132 0.212132 61.153 100.706] /PatternType 1 /Resources 76 0 R /XStep 72 /Type /Pattern /TilingType 2 /YStep 72 /BBox [ 0 0 72 72] >> stream h޴N @ zͥ7ADJ9G1 y/#LwPXW (fBGLԦGp5VаAN{b `<NgƕmmΖg z\W]_qjPH~4ݟn|`ZhAP endstream endobj 69 0 obj << /Length 143 /Filter /FlateDecode /PaintType 1 /Matrix [ 0.212132 -0.212132 0.212132 0.212132 50.4701 89.704] /PatternType 1 /Resources 77 0 R /XStep 72 /Type /Pattern /TilingType 2 /YStep 72 /BBox [ 0 0 72 72] >> stream h޴A @ E9ſ@I:,…RS(]xf*x1 |HI9DE1qVv،tDmZz .j0Q J;t^Vqpvf*Cаp{׃N֫= endstream endobj 70 0 obj << /Length 154 /Filter /FlateDecode /PaintType 1 /Matrix [ 0.106066 -0.106066 0.106066 0.106066 59.5157 92.6043] /PatternType 1 /Resources 78 0 R /XStep 72 /Type /Pattern /TilingType 2 /YStep 72 /BBox [ 0 0 72 72] >> stream hެ 1}y6{: (H R;8Dm@I݉. F *r-􅟒a.>IPR(y+mBku"84?mDcCWCW~Q慙>13F[=rB/ endstream endobj 71 0 obj << /Length 141 /Filter /FlateDecode /PaintType 1 /Matrix [ 0.053033 -0.053033 0.053033 0.053033 64.1585 91.8738] /PatternType 1 /Resources 79 0 R /XStep 72 /Type /Pattern /TilingType 2 /YStep 72 /BBox [ 0 0 72 72] >> stream h޴M A f_Xo! X)r+Wf-k1L&ffrY Xz)&xXRgb ex\h\Wubs`3H87oіG"`ʠKo? endstream endobj 72 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 74 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 75 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 76 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 77 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 78 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 79 0 obj << /ColorSpace << /Cs6 57 0 R >> /ProcSet [/PDF] /ExtGState << /GS2 65 0 R >> >> endobj 61 0 obj << /Type /Encoding /Differences [26/Euro/thorn/yacute/Thorn/Yacute/Eth/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/minus/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls/registered/copyright/trademark/acute/dieresis/Lslash/AE/Oslash/Scaron/plusminus/twosuperior/threesuperior/yen/mu/Zcaron/lslash/scaron/onesuperior/zcaron/ordfeminine/ordmasculine/onehalf/ae/oslash/questiondown/exclamdown/logicalnot/brokenbar/florin/onequarter/threequarters/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/multiply/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex/eth/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron] >> endobj 58 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 16 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/ex2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 80 0 R /BBox [0 0 133.729 181.459] /Resources << /ColorSpace << /Cs6 81 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 82 0 R >>/ExtGState << /GS1 83 0 R /GS2 84 0 R >>>> /Length 458 /Filter /FlateDecode >> stream hnP y @< iY@@Ae@>ǙUeJ=|v9~vQzvLh"R.nqڼ)}8MJi#%" V-?dPIq 콯Vf`w²8ddAsu.#sa-+D6g 5xu B\% :v@#PZ6xf+MSVԿlt6rGuv(zú$٣,rNB3=}: )iȪjPRPEa!TY]:k  s>5%e81$o endstream endobj 80 0 obj << /CreationDate (D:20100829122121+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100829122121+02'00') /Title (Print) >> endobj 81 0 obj [/ICCBased 85 0 R] endobj 82 0 obj << >> endobj 83 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 84 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 85 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 17 0 obj << /Font << /F95 4 0 R /F96 5 0 R /F112 11 0 R /F118 10 0 R /F102 8 0 R /F137 20 0 R /F98 6 0 R /F101 7 0 R /F138 21 0 R >> /XObject << /Im1 13 0 R /Im2 14 0 R /Im3 15 0 R /Im4 16 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 3707 /Filter /FlateDecode >> stream xڭn}B}*qHCMI-6kTD*3sBrd{€E̹߆|o"/9RO~}i Tl> njGpvз}}]lZm>oJ+YltCLo>6ʾru˖ 25lƽJJpVg;p,3h.jV0 3@\WAh n`N5>׻ɾ89A_^Ur}y8>? }}[0WRǫ2/ DiUʓV.]M#M +38 [F;/ԯ#1BY[X{y+" UpV(P7)qیjǬ#_}uՀe[?Bp ? Z]3ҙqLcl2x^pG[@љ%4zq\\5N gjb0#8EtHGbte1N_sNJb^v!9vw^[+2`n}GpS@);eҗUt;9ҙp F o & ~0o⭒ H3"Y 4(ak><>6hr.>6FeC)D1/o10$sG2H\>2S؞Zۇ&jky8MM'_v2MoV;r |ی[HcZgҥpߘ^j&9[K|z!, #s`qio"zP揺Y{c'DIWR[Cg]p Ɣ=J*(2Bkq=6u y&74:M0iJ2Q2t8p%Vl{*d W@[,@՛ dcLY0ue$j ca/#%"k49x.j.30. ̫Y5PY9CwJ!}M1AH|p L֎̜\>޴žz|]L= K: D?u$g[ҽ,g~C!t ! z>`!@pd`وhǧ*9rюSw87 dYgr;Y[|x0)EZrI9_br]/\աmy)d% p*;QZ[`\J[`dh?e]4ANҊrkG N'e0]iᓊ3i{tJa%߻D7\Q˟4"ОSۘbaBNf frA` R*BJw@u=> endobj 86 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/CS.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 100 0 R /BBox [0 0 75.5 98] /Resources << /ColorSpace << /Cs6 101 0 R >>/Font << /F1 103 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 104 0 R >>/ExtGState << /GS2 105 0 R >>>> /Length 301 /Filter /FlateDecode >> stream hLj0sLZkg'-R6zrnwRj~j 7M#X1ia6O$x@,6i)xxux.d~Ձ> endobj 101 0 obj [/ICCBased 106 0 R] endobj 103 0 obj << /Subtype /Type1 /LastChar 83 /Widths [ 661 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 533] /FirstChar 67 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 102 0 R >> endobj 104 0 obj << >> endobj 105 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 106 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 102 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 87 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/S_in_C.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 107 0 R /BBox [0 0 75.5 98] /Resources << /ColorSpace << /Cs6 108 0 R >>/Font << /F1 110 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 111 0 R >>/ExtGState << /GS2 112 0 R >>>> /Length 387 /Filter /FlateDecode >> stream h\RAn0 <ѢH5޴@-@hE~)oQ[sÑx~` Kaĸ>o 9dݗ1ŋ~ 8X*`7O+z$d*PG”j!ʎHm($187ɑ&u(#c-bկGg8撒]nTD6cXh3*WcHD~3wlרxA1!e쩈1cxUMC> endobj 108 0 obj [/ICCBased 113 0 R] endobj 110 0 obj << /Subtype /Type1 /LastChar 83 /Widths [ 661 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 533] /FirstChar 67 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 109 0 R >> endobj 111 0 obj << >> endobj 112 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 113 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 109 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 88 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/C_in_S.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 114 0 R /BBox [0 0 75.5 98] /Resources << /ColorSpace << /Cs6 115 0 R >>/Font << /F1 117 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 118 0 R >>/ExtGState << /GS2 119 0 R >>>> /Length 401 /Filter /FlateDecode >> stream h\Ok@ )tLGͿki`CKNnvno7`zw?ߧ/np$F5_gz!FiO<}sQiA3W%d 9|ZՓuRDGaYLeX9ŵpDJkutw} B9u8|t_RK-[p[hĸX fTl)L9 ѩ‘Vb;YQ,)Q,l@)h3FKX j fD(: \\}}N B&\ҕ8Wk~-]= UqEaC i,KE/tgv{s7,bڀDvfh# endstream endobj 114 0 obj << /CreationDate (D:20100901104250+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104250+02'00') /Title (C_in_S_.eps) >> endobj 115 0 obj [/ICCBased 120 0 R] endobj 117 0 obj << /Subtype /Type1 /LastChar 83 /Widths [ 661 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 533] /FirstChar 67 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 116 0 R >> endobj 118 0 obj << >> endobj 119 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 120 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 116 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 89 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/CS_clip.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 121 0 R /BBox [0 0 75.5 98] /Resources << /ColorSpace << /Cs6 122 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 123 0 R >>/ExtGState << /GS2 124 0 R >>>> /Length 400 /Filter /FlateDecode >> stream h\Ak@ +i$̵N)|a) e7%ݖq ^_lYO:gws:נy>% }&NH2WoçE銦^P*!+֨WNzIZح$TWRsVsѸXVEe:kO/s䜅zlF~?N:(Ytc.\$51N87|ePr9BQolXI֨Nr+Fgp{b]]d$ &!k^Ik`mW 7+tw}FF m`^Ɓ`" f;=/ gD]=8 {gEŶ\^d }?> endobj 122 0 obj [/ICCBased 125 0 R] endobj 123 0 obj << >> endobj 124 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 125 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 95 0 obj << /Font << /F95 4 0 R /F96 5 0 R /F102 8 0 R /F98 6 0 R /F148 98 0 R /F101 7 0 R /F145 99 0 R /F118 10 0 R /F110 9 0 R >> /XObject << /Im5 86 0 R /Im6 87 0 R /Im7 88 0 R /Im8 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 129 0 obj << /Length 2240 /Filter /FlateDecode >> stream xڝYKܸϯS"͇HI^M lN 9xF͙Z-uZ TH=3b_Us>޼$L~#d:7Y*vv|X*%/x_sfF˜i^vu)+2I rTK`ՒyY%3^+Дg̘uz}*$fs:5uw8,Y-YWƳ)4ƤHH W%W}c,8O"3q33D58eyFvXhi[[Zk+bni]Kxhp蚗,vx|0W1 ۇ8QZ4gFp*N'H1Z>BK.{CrIzUHFbc_[0&:*6ٷ$`$Qu`Ukm홷*.lrES(zQyR#^BA >o$v6HST2rfm5a˙MFtΈ͋gN%L0a0rU,@}Qݹ;xʾ$U D$.%5J €m8џc9уչdtc@O9|TiXi$rh6 BAo6arJ+2aTBrRZ{vڂ3cnɲ-L:4ok_ݪ'.[w| }Ds%H_o1H7*@C>: `! G%wf$ qfbYpk[0z}q(^zeN6[ڡkB0){v;i j76ZZroAd[$U(G,Q= QNpgQL|#5?57& Sɑ`5/7?0>Ie~B<OIz4/͞׵\Y}iumbsNK;t"> endobj 90 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/S_ex_C.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 131 0 R /BBox [0 0 76 98.5] /Resources << /ColorSpace << /Cs6 132 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 133 0 R >>/ExtGState << /GS2 134 0 R >>>> /Length 366 /Filter /FlateDecode >> stream hތn1 yIL+$EŹÊS*nQ ^'EC+v>8ƻ%aY.@ G}%ޯ_ёL R-x5HbWDB) bdeh=Wxd[8@RJޜ8Y)IyF3%ᔚ8mԹ{ABD3_g];)u]Ib0#K;1 (*Ge2q^Ԥ!ʾjG_Gy7k9cmdZ}yXpm.3O+jNZc2>w6)^ݏwt\oЈ. endstream endobj 131 0 obj << /CreationDate (D:20100901104250+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104250+02'00') /Title (S_ex_C_.eps) >> endobj 132 0 obj [/ICCBased 135 0 R] endobj 133 0 obj << >> endobj 134 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 135 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 91 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/C_ex_S.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 136 0 R /BBox [0 0 76 98.5] /Resources << /ColorSpace << /Cs6 137 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 138 0 R >>/ExtGState << /GS2 139 0 R >>>> /Length 356 /Filter /FlateDecode >> stream hތJAE]SU: DYW1(1Qd4 E=ν5cyya5*nȱdQj-owK/nƉd>x+Rz&| W{7\NFG(%wst,pVi|PV`,bS!fbV[wp789NXg`.r m[m;mܴ)exqE[groanFX:L'NoDSm=Ⱥ 鷼`V`zT dXJ9wO[H 0׎;(&] ?E<+ը |7X5ebj?S.V#_ j endstream endobj 136 0 obj << /CreationDate (D:20100901104250+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104250+02'00') /Title (C_ex_S_.eps) >> endobj 137 0 obj [/ICCBased 140 0 R] endobj 138 0 obj << >> endobj 139 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 140 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 92 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/S-C.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 141 0 R /BBox [0 0 76 98.5] /Resources << /ColorSpace << /Cs6 142 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 143 0 R >>/ExtGState << /GS2 144 0 R >>>> /Length 419 /Filter /FlateDecode >> stream h޴S1 +;N\EHHEZTj8)ήH{b=?{spvff^ xvx WP/p{?2>D| 7;/}Axtobh"QCT3=I5ab aJL*RݓbLQQ҂c{zcX}x KLM1簗$_^uWcJ .+fNɴS2Es4:JD<\_xX@]mZQ;+LAN!j Yӧu/h޲S̞2%VKwR)V[uOk$|x{oE'չj!F }5jL -Ura;J_JM_2~ 0Sڶ endstream endobj 141 0 obj << /CreationDate (D:20100901104251+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104251+02'00') /Title (S-C_.eps) >> endobj 142 0 obj [/ICCBased 145 0 R] endobj 143 0 obj << >> endobj 144 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 145 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 93 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/S_with_C.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 146 0 R /BBox [0 0 76.5 99] /Resources << /ColorSpace << /Cs6 147 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 148 0 R >>/ExtGState << /GS1 149 0 R /GS2 150 0 R >>>> /Length 393 /Filter /FlateDecode >> stream hKjA u)ںm Yda?Hq:!׏T~/nhI->mNl6ڰ_A]ǰcܮd(^?!Dɤe 3i]rUȠ3}f4Q1KD)֬z#cCѕgS+vKL1fy%vr;5/-_@S37SmK [a6jBw&Mӈfw. )a|3_ O'lqqpar~y5p|LX74 f5 Vmss&1lu>PJXs[KBB|WS 6ťg,T Y,ByR2v  endstream endobj 146 0 obj << /CreationDate (D:20100901104250+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104250+02'00') /Title (S_with_C_.eps) >> endobj 147 0 obj [/ICCBased 151 0 R] endobj 148 0 obj << >> endobj 149 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 150 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 151 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 94 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/C-S.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 152 0 R /BBox [0 0 76 98.5] /Resources << /ColorSpace << /Cs6 153 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 154 0 R >>/ExtGState << /GS2 155 0 R >>>> /Length 383 /Filter /FlateDecode >> stream h޼SN@ Wֱ+)BB*Cũ<jJ@>-j*Qk3[m>w=Ţ7)C ,lۿ?;؛"+V]+h0ֺe'x0Jy0 0\%fע;#w`9#[c6&dqD6edt>ZI 5'RV3͇Q01QmKVj}EbgҼ&FD+ҤQkS3l9I Q*r:[ـ Xu"A,ѻX QS%ԙYꌞu[[Gȳ>nޝ9eL*`F]/qYUU_.{} 0 ~ endstream endobj 152 0 obj << /CreationDate (D:20100901104250+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901104250+02'00') /Title (C-S_.eps) >> endobj 153 0 obj [/ICCBased 156 0 R] endobj 154 0 obj << >> endobj 155 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 156 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 127 0 obj << /Font << /F102 8 0 R /F98 6 0 R /F148 98 0 R /F95 4 0 R /F96 5 0 R /F145 99 0 R /F144 130 0 R >> /XObject << /Im7 88 0 R /Im9 90 0 R /Im10 91 0 R /Im6 87 0 R /Im11 92 0 R /Im12 93 0 R /Im13 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 159 0 obj << /Length 1421 /Filter /FlateDecode >> stream xڕWIS8+<7+,RrHHH1LAL[&i/;j ,c䙊$Uhu3➉}{Yɫs-#Et&\D[[0GYTgZG-`Ϣ:@u0heR)1.LzwCKE8Da(k8'2:`8QjȵO09 $5Dsϑꍧ|B6BA~9)3ê4WfC_?xl"Й*\CBdOQ>,h!flc4@)&X* Q  /ɖ)"Db,@pj23Uuą L#4Rd=XM mK,1h^xC%gkʔ[HXj}CǗ-І:UkX%<0 97>X,T(U>Y^gA `xvvZcXDĦnS`~n%Į K~=ޕ&0|f#] q@h9 &'$b0ue~fǾX|!:tVO>'6lZIs*N2V  endstream endobj 158 0 obj << /Type /Page /Contents 159 0 R /Resources 157 0 R /MediaBox [0 0 595.276 841.89] /Parent 12 0 R >> endobj 126 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/data_str.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 160 0 R /BBox [0 0 338 266.5] /Resources << /ColorSpace << /Cs6 161 0 R >>/Font << /F1 162 0 R/F2 163 0 R>> /ProcSet [ /PDF /Text ] /Properties << /MC1 164 0 R >>/ExtGState << /GS1 165 0 R /GS2 166 0 R >>>> /Length 1694 /Filter /FlateDecode >> stream xZKsHW19XyhtŁPRvHIȒ,ZLR7c..7?oś/._+%>J?eJAn-eVZ.;'6;byzI]-BIkmΖp~:S*wj‡X_fgK}[2\$[*:[p)9W I7W@HkEZr"G:փX@n2Tbe5>ի NU 3hY%@^+PXm(+ץ u~~_??>e{mYgJnމ܊BIF\c71C!t^[}C٠F#=]tƊmV^H|w:v[ )kHgaN,ƠANpʣiBjE>ل;쓳Ex۾d8ttߺZQG h%L^$NJw _P`Hq&DFaUM Y$ oLBDDj:/%h ,1L;q߆8WueOn0 0khj ;%V46j)aDiܡdcq #Kf+psFH9MH90Y:=YM8hɎC8L2z̄#Oh t+G9Rp&u'KVh!3[&{^*-* R:KIO_#YI un*9qk~ri˲ai]kݞ e߳qR9bۃqbœ ,䴛|Yw4eag˻gKHh4PLsl%Bbѵ4\$McKt _5`jMzeIJpx#8×I;c<+̕aiblc3lDsDz T7.RDd׳49Xb596}q2$jxreR~ǨYC9 Lz"Ν0,NJHfV'Yvͻ,٢IJT=\86g\eı=!i9Hŭgb6TdxE.42sq`~Q@Qݏw7ۭUh9@3D.,ª@e̳\:"ҒhOeeVj#6G9HkDysK_m8DsXidL:J%j%2P Ytd4$3GIS|q!n^ut HBai!W+qZzˇf([J6~ "\)s|ǭyFmpAS6nR00S`[0[-'%?25htw]DT'[NO;bvwZ&s{.geL9Y]'h!6 Oכ5:1J[akv fH3Lexeg91#=\Y&ZɇEV\s!<'VY6T٩H5*jRls4sg*ĩ 7l aǑjBzAj7Ln= endstream endobj 160 0 obj << /CreationDate (D:20100901092524+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901092524+02'00') /Title (data_str_.eps) >> endobj 161 0 obj [/ICCBased 167 0 R] endobj 162 0 obj << /Subtype /Type1 /FontDescriptor 168 0 R /LastChar 121 /Widths [ 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 0 0 0 0 525 0 0 0 0 0 0 0 0 0 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 0 525 0 525 525 0 525 0 525 525 525 0 0 525 525 525 0 0 0 525] /BaseFont /NOFHMG+Cmtt9 /FirstChar 32 /Encoding /WinAnsiEncoding /Type /Font >> endobj 163 0 obj << /Subtype /Type1 /FontDescriptor 169 0 R /LastChar 121 /Widths [ 531 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531 531 0 0 531 0 531 531 531 0 0 531 0 531 531 0 0 531 531 531 531 0 0 531 531] /BaseFont /NOFHMH+Cmtt8 /FirstChar 80 /Encoding /WinAnsiEncoding /Type /Font >> endobj 164 0 obj << >> endobj 165 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 166 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 167 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 168 0 obj << /StemV 0 /FontName /NOFHMG+Cmtt9 /FontFile3 170 0 R /Flags 34 /Descent -227 /FontBBox [ -8 -233 625 700] /Ascent 610 /CapHeight 0 /Type /FontDescriptor /ItalicAngle 0 /CharSet (/space/C/one/two/three/four/S/five/I/c/l/i/p/o/y/g/n/s/u/b/j/e/t/d) >> endobj 169 0 obj << /StemV 0 /FontName /NOFHMH+Cmtt8 /FontFile3 171 0 R /Flags 32 /Descent -227 /FontBBox [ -7 -232 625 701] /Ascent 0 /CapHeight 0 /XHeight 430 /Type /FontDescriptor /ItalicAngle 0 /CharSet (/e/n/t/r/y/x/i/l/a/s/g/h/b/o/u/P) >> endobj 170 0 obj << /Subtype /Type1C /Length 3295 /Filter /FlateDecode >> stream hޤW[yn- a-B!`5TN}E?]EauQoZ 5&WgԨ2ƚ"L ZVUU+k$X!UQ2\_D>&M9bbH^}`\h_/Ž[mlg[ol= C|9XϜ~X2̉V-WT@ [/lao5w{Wn\\/RMEãs -iMjJmmi-۶:6Sѥpr%mH W5\kKG, K,|>/!+/ߚX&BD2 TEt>?Xm?9r] &g@5SaY4N'V0FkXj7n%C~VqĆ?=>.D+k[V7l֎w*#q lqS B"y"r8?|H2xف 9z{rMt6mqbsq6IA",BZ$1 &dEҥ:trF oz#kh'eq$ /r-$pXՎd=NwA+Chzn^uM7E5P 4*E7f`%"("p]µ(!hכ`N&a)*MW(@-t,x2zEk^tu=Uwٟh;@).^9 +[`M'/ۄ-+kfʂǃR&J AŸe,p?] ޔvbnvdμ%byz%Jσ07*Kw֣{4H 7{;lR)Wß+Hy^J>SSǮ[]]z]Fِr vGu@H*WoƟ5t.s@ ]/ѫjF G_6I{{>?WR*^[-j [- kELȚE/&eK[m;}MtC[4I5-9)f"^Z4pDD S cRtj.QGjJfaFuuvXoQG#뵣SEY9EPy:Gr tϽ:"3AX6|%_–bZ=I$WPjY;nR`0a? Ms#lj=_8 g7{qt/2]LJGIBWs kא2 mG endstream endobj 171 0 obj << /Subtype /Type1C /Length 2290 /Filter /FlateDecode >> stream hޤV[rvf veTxA%jŮ"v;f8N|/qd6;vĉ䶛a$ @zB@EJ=l:3:j$KGO~\sss9Gg]Ey^[_}[hO`.@GOxz.pOf`{κ`?'_oFn-o__:-`pwڇ7 X`sMJwں`4Gذ692ƛt( 7A3|F?Lr `2f\[]:n}17VDk ΢EiI&2IByɄB wB ; Zt_|o"oZ`kndݍq\W`8QT1o5ʹ\Ʀj5P!RyvIVUIWT4,Fj̪Õ`. Kf )֏gI'ؕX&)8w[hh^/@8*vG̦tR I)'ZKD u{` <=ƙdR5ƭE_S_ClN/_^n^Gf[d5L\p4qi2.ZlSO#Y*&ʎ s)\Vhr$N`9yvO$ /툗^\c}kMaoVP Jgl6dPd_BZcq3Y].x^@Lm+`A9;C=b\;m2F6z%u ѳzV˶]`N~3scah= LXJk(FΨ¥sjACBT@&6i7ZpR(=hbBQ$=dșH,:fj ve1*KkIIJ@bj^4]ab.A21ґrL;L<GtNC|їC!2zTjvFޅF͵e`P8LlGy w+v eCKa2kare?6[ VM#vMUԀ%TѪRYK)" bg}pZх݃ ]R/у_CN̔dzR# d //.ƭpj[ye( |d76""kYZb1>N 2bem >i.J?2N3ɳbavPp:$Ip>Ocg%jsZ. 4!Z;}G$ U SM'Q՘?:jCVȩX8:)+],%d@zR*eUh&Hl$/6{uZjfG6n-OT~hZ}PA+ai9b`tI5S렽ZTT)ພ\J "Ʃ~K UH+#D.IJII,Lg }fGÕrQNe2r$N#GN^1&\$ ?q,GvJ}b+l f `~{FZ (99 'd:Š,G3x5 {~O]P=u=4W3A{o?e$ § P,9nEl-L_ {B5M^"}Y,C <*RNT4jޕ̓f6Se`х נS5>9i:c7{yst&?uN 3y6D7\o]}w3M}uݗg^瘟1d,.OMO>}{__D* ɵC2sPiɯk&@FVЬePN"46m;% r^พlR¹sWw endstream endobj 157 0 obj << /Font << /F95 4 0 R /F96 5 0 R /F145 99 0 R /F144 130 0 R /F110 9 0 R /F118 10 0 R /F102 8 0 R /F98 6 0 R >> /XObject << /Im14 126 0 R >> /ProcSet [ /PDF /Text ] >> endobj 174 0 obj << /Length 2659 /Filter /FlateDecode >> stream xZK6ОV\! A؜z0,6mkGKOTiww >"zchF,aDre \DݧI\Eg3sP!pq1ʈP*dJ͢u)42eit;:,hTۦnmǃ}ǟJE )7nbbeݖkmYX,՞J:vEwr, d);2Zr5kIýtr MZf3UynecWH/AoegMu5m/f"7}I~sr1VGH\Ja!-JʹeaAY\nOZI LƔ}>g"ǯ# O5,ݒ1dm|3îh]_wn"IO9'TI/JRyLZ Q}Uuj;#di쓸v`Y A/3=6q@C7$M> 5:34aK.BSItӳ۷*OW@-Qk1nMAEC;,Ы~W3=8Z !IQ-_K-Je~GVDy0 觢ˀ3yo_)1b,惪v̀:=j{=P$v^oAx3a&an: &w:helFHѤ@MBWڮĝ֥V>Wi'7*̳CId ZE0 #@W]&`} gcmPn"aӌ03̝Ң3t,bed蹪.8Egx8꯯AO&W@]׶"vRa{MD"^ >6piyoܻ?S?2\+r².dŬta%dF,.o[!$icOFule7{2Ox@Gx0SJ)`Ee oƮ; 4NO6HJx! !3Ik/(~+OdF)'8'I󸱱g}8=A{7NsBkKщaK>j0EPEP%0$>Nt`-$糘kM/E=\g `UT'ϒ&tVf>"-~oM$BҘ9%zD ɸx|2TC9vs{{6 BDT&h 1[B}0)IS̼w>kY}nBQp \KadH&BNRj4'> endobj 172 0 obj << /Font << /F144 130 0 R /F95 4 0 R /F96 5 0 R /F145 99 0 R /F102 8 0 R /F118 10 0 R /F98 6 0 R /F112 11 0 R /F101 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 2819 /Filter /FlateDecode >> stream xZ[۸~_Ř]R,Of}HBckjdk;?<$uF"@DQ;7z~b ؂tǒ-|iAHţ]_p&IjwWn^aR.R"8Y/8J$Zv>*6?6@a7zd^<|;[~ &J.Vb$uÖ+U->w}>ۚx ̳xSD4r3A5 3Bidw\6b[7+ɘ(a HҞ|$3LIe.;I80'7N:8.5$cGenεjؚb _ 4, ^u1 )YǼ=+=rhhD$ke|M[`5·>/㰫iJa7UZ[P1 dp͒x8Frc1I ۹L-8)nY-WzkqG;7+)aZ,V $Tͣ숃ǥi_ _xf-?K4}u_vYGqɩߒu/"jXWw?vy3 %YT!56;j͒͟P=+'.??lkvZE:&ZB``]:2̷9,#xS kәdBp BuXFyn Hsx|ʩi[U j(fJCxBu+GۓC9cRS?VJ)'wk"B# 1؄FP[TDh;s(*6R& DH)Lt/ހphH !DZO(Cދ3W9ZɀKh̒l UW63(ُ.'B+_0 uБ4T=rR]b' =/" Do_Uᐶ]؆5Nǻe4){{4e39"Q^Oȡ$M]4)LO hT Òc 3PD;Z UZK/|&x_eovg)g&tgI)y'P!˘e:+jkqqͦڢ:uXK" Ƈ2D\V7!9P}i"[ʔqZq*%`ow@jxz}n1Cx|oNef%:M.|$"ʻI1c_U*,OFزIninܲv|53OtM$ %(M[ ֐`Q;n1@OK6mgt4ߪg 0TZ'GʟZBN?u7mz7o<|&f j0(NP{h5MQw?")GZsЮ/_mOT.9=$ _Q5gU$1hlr폒.=6^IDrrX%jӫ1lYz&<RX8 ѝgbJIWZtB51 s)tb05ˑkfG, so=,`MCl~3 !~p_Jbb>˙Ɯ$I:bb5Ћ )61eD<^SW(1&./*.?($#i)gs9W!W d. Hg0s1Ӏ>S{OΠ5/%> endobj 175 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/perturb1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 182 0 R /BBox [0 0 78.75 120.919] /Resources << /ColorSpace << /Cs6 183 0 R >>/Font << /F1 185 0 R /F2 187 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 188 0 R >>/ExtGState << /GS1 189 0 R /GS2 190 0 R >>>> /Length 632 /Filter /FlateDecode >> stream hWn0+Ds5rZC b[WRj?b.P-94~k-?i2.+OdUws/+wbR1y%cEZYGz O,:4^̐Gq/;z^(@ $F㚥vts֤fY9nr.}Tj~GR>E'29̭4 hJlj yO{Ll%{KR%6LOə_rtvv>F8% ɚl*9{Y|(> endobj 183 0 obj [/ICCBased 191 0 R] endobj 185 0 obj << /Subtype /Type1 /LastChar 81 /Widths [ 614 753] /FirstChar 80 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 184 0 R >> endobj 187 0 obj << /Subtype /Type1 /LastChar 152 /Widths [ 530 530 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] /FirstChar 49 /Type /Font /FontDescriptor 39 0 R /BaseFont 53 0 R /Encoding 186 0 R >> endobj 188 0 obj << >> endobj 189 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 190 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 191 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 186 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 184 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 176 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/perturb2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 192 0 R /BBox [0 0 78.75 120.919] /Resources << /ColorSpace << /Cs6 193 0 R >>/Font << /F1 195 0 R /F2 197 0 R >> /ProcSet [ /PDF /Text ] /Properties << /MC1 198 0 R >>/ExtGState << /GS1 199 0 R /GS2 200 0 R >>>> /Length 623 /Filter /FlateDecode >> stream hVn0+Dsk@ $'5).Zȯs$Uc8;g{{~Yp9Ť^: C,k.7?A),B i.*kRATKh'7&yw⺰M?0{fiP nQ $M4 IKnRa$WJm#BBjVmEcJ>Lj>XEtBn7!1[n,=r!a~r画 eUϊ 3 ? bD[3gvǐ{FLx'q||4m]A_8#`$6?FAd_~ 6[ .U6Mg,MqǤ{ܥŚ_ XsOҤmNn )kV8n,YC=:D`R6:VLަAw"_z+c)_mNM{8*8ay ߲.LL ,'\,'"ai(uf Q\ҬϘ> endobj 193 0 obj [/ICCBased 201 0 R] endobj 195 0 obj << /Subtype /Type1 /LastChar 81 /Widths [ 614 753] /FirstChar 80 /Type /Font /FontDescriptor 27 0 R /BaseFont 36 0 R /Encoding 194 0 R >> endobj 197 0 obj << /Subtype /Type1 /LastChar 152 /Widths [ 530 530 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 400] /FirstChar 49 /Type /Font /FontDescriptor 39 0 R /BaseFont 53 0 R /Encoding 196 0 R >> endobj 198 0 obj << >> endobj 199 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA false /SM 0.02 >> endobj 200 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 201 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 196 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 194 0 obj << /Type /Encoding /Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 177 0 obj << /Font << /F144 130 0 R /F98 6 0 R /F95 4 0 R /F96 5 0 R /F102 8 0 R /F101 7 0 R /F145 99 0 R /F118 10 0 R /F151 180 0 R >> /XObject << /Im15 175 0 R /Im16 176 0 R >> /ProcSet [ /PDF /Text ] >> endobj 206 0 obj << /Length 3869 /Filter /FlateDecode >> stream xڵ[IܶW%vE  ŷ-r"DZJ9pnFl=d{<>o4g(5Uj-EBX,HPWZߥtz]o֎z ի"SyW.R(HR0^+x&vr6iտ~ 6qcB7]3LlO ?{iM_ dmǶ۵M2apWo٢8T(;zEQ'(u= ݱ&5S$qpJ8xP-ݸ-ui&CAVzjE;~$[n=ۛ4ؘp1Qd䉲0WÃ̂F*3a=cĒD8  v{^7?DIv<{_ r7ˇNgBȞprZTchnEӒJ%.ny}XX[et<]i1\uY.4Y0Ea9,8UvqgJsJʎlp+H ғ+[Y|DN'3dXa?2Ű'8>N e=<9C<i_t$4Ķ%+c +LP;X(t\(j0* `BuPʢg,M2)jBTLBPs Ťh;ѳX;S7-8]C"Sƚ8ԝ.&py#Ytdk6DpNK@\) )g DW j_qaV[{k A{rIi 3\hCKτ.d%hWYbA{M iuδ< C.`s ݓswfqp*XQY:Wyb2`2QAF`&k.Ŵ:$n?e hyM$L$9hٝ_T6JŔdV㾬s<`?ɓhص5!*J0γ?ʨz?%s~ ?ϊ/pUNQjy㪅dFe"K[9t8?fx:亯y|fi}hҹ>^,W ]G 4@Py~PĘ7j[s~IU]u]vUGo޼O]ސ]/pg֪|(Ύ`3[b>R#`P[|MpJ?wX K:[4Vyp$XO% %#9мcp₮cu,5 /\|gȋi"8\A`HA`1 c P 8X uV4Tt86"%BX1}yUj8Ȁ2c"eհA\/__{ /F i! vyNw#6fmuJ,&RT>RAf9eJAҩ2x*t8xw~ ى tMe7HV>b WpQ@S!=MKkn`I rǶoRq'Xq}/Dˆ:*婣͓T죸|/bW HCMjPѦ~XШBh1`8$PPYB%%*FS1&y̿U\ucESIAFN@W+ʌL┎PWm٬xb+Ta'ItruY3M4mvQLQ'̽\Q2u_{ ߙza4_c-#M-H=ĵghnL?)a\Zu^ɚ\#Lz}TZkuy᤼j$_ WʥrvKJ?3 =~*o7f: DjօlPqSf|OXXۓXBZQPgXUu1d:b^ߚx(pDW`[{Y92OI&)iQꀑ!h2Ed?r g*gi#/"0ޝ9❖@1&! LMӡ#i:N5±'ŏGZH A,ə='PzR$Sk S #1 r"tӯB6ƅQ۷ endstream endobj 205 0 obj << /Type /Page /Contents 206 0 R /Resources 204 0 R /MediaBox [0 0 595.276 841.89] /Parent 181 0 R >> endobj 202 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/worst_intersect.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 207 0 R /BBox [0 0 140.5 84.5] /Resources << /ColorSpace << /Cs6 208 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 209 0 R >>/ExtGState << /GS2 210 0 R >>>> /Length 241 /Filter /FlateDecode >> stream hތN0 Dv4ɕ.BB*⴬hh)7CL~~ZOӨڍt&+%Z q:o8Nԏql5wn &<$xfxYϚI$Y_TC4XbqHXJB4Vc :!6:d#t/Fw œ+Z$];mSCۛ( !y ~VF`\P0 endstream endobj 207 0 obj << /CreationDate (D:20100901125210+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901125210+02'00') /Title (worst_intersect_.eps) >> endobj 208 0 obj [/ICCBased 211 0 R] endobj 209 0 obj << >> endobj 210 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 211 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 203 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (figs/self_intersect.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 212 0 R /BBox [0 0 140.5 84.5] /Resources << /ColorSpace << /Cs6 213 0 R >>/ProcSet [ /PDF ] /Properties << /MC1 214 0 R >>/ExtGState << /GS2 215 0 R >>>> /Length 211 /Filter /FlateDecode >> stream h$MJA 9Ż@5"-H/\q{dl ${ yǟt4w͡Ӆ Z4 g=LS3Hpl*"xnxbUh֬(x+ȩ>ynIC4P"WeEc5+y.RL79]r .gV? KmpFV?Ӹڝ9CJ;=- 0: endstream endobj 212 0 obj << /CreationDate (D:20100901125209+02'00') /Author (hormann) /Creator (Adobe Illustrator CS3) /Producer (Acrobat Distiller 8.2.3 \(Windows\)) /ModDate (D:20100901125209+02'00') /Title (self_intersect_.eps) >> endobj 213 0 obj [/ICCBased 216 0 R] endobj 214 0 obj << >> endobj 215 0 obj << /OPM 1 /OP false /op false /Type /ExtGState /SA true /SM 0.02 >> endobj 216 0 obj << /Length 2598 /Filter /FlateDecode /N 3 /Alternate /DeviceRGB >> stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 204 0 obj << /Font << /F95 4 0 R /F96 5 0 R /F102 8 0 R /F118 10 0 R /F101 7 0 R >> /XObject << /Im17 202 0 R /Im18 203 0 R >> /ProcSet [ /PDF /Text ] >> endobj 218 0 obj [684] endobj 220 0 obj [524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9] endobj 221 0 obj [524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9] endobj 223 0 obj [498 276 498 553 276 276 498 276 830 553 553 553 553 332 387 276 553 498 774 498] endobj 224 0 obj [752.5] endobj 225 0 obj [540.9] endobj 226 0 obj [659.3 640.1 562.1 647.6 560.9 591.9 653.3 562.1 338.5 621.6 645.4 666.7 538.2 619.4 684.1 705.6 775.3 635.4 694.3 760.8 662.9 848.4 844.1 492.8 610.8 987.7 705.6 536 732.7] endobj 227 0 obj [327.2 327.2 0 750.8 0 0 0 469.8 0 0 0 0 0 0 0 0 0 0 0 0 0 750.8] endobj 228 0 obj [660] endobj 229 0 obj [265 392 265 270 530 530 530 530 530 530 530 530 530 530 265 265 570 570 570 425 794 624 632 661 763 596 571 709 775 345 352 650 565 920 763 753 614 753 640 533 606 794 637 946 632 591 622 330 390 330 0 500 216 561 559 441 587 453 315 499 607 317 309 545 306 912 618 537 590 559 402 389 341 618 510 785 516 468] endobj 230 0 obj [469.8 0 0 0 0 0 0 0 0 0 0 0 0 750.8 750.8 750.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 334.3 469.8 320.2] endobj 231 0 obj [750.8 244.9 750.8 469.8 750.8 469.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 1291.8 469.8 469.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 750.8 975.6 975.6 750.8 750.8 975.7 975.7 469.8 469.8 1272.4 975.7 975.7 750.8 975.7 975.7 582.2 582.2 1272.4 975.7 975.7 750.8 313.2 975.7 638.4 638.4 863.2 863.2 0 0 638.4 526 638.4 469.8 793.1 588.3 750.8 750.8 646.6 986.3 984 803.5 769 596.6 876.8 721.7 988 720.9 792.8 930.1 881.7 1177.7 894.6 645.6 834.4 908.3 901.2 763.6 680.8 905.7 668.7 922.7 892.3 785.8 802.6 638.4 638.4 638.4 638.4 638.4 582.2 582.2 320.2 320.2 320.2 320.2 413.5 413.5 357.3 357.3 244.9 469.8 568.1 582.2 469.8] endobj 232 0 obj [610 0 0 0 610 0 0 0 291 0 400 0 400 400 0 400 0 0 0 0 0 0 0 0 225 242 458 530 530 838 706 278 350 350 412 570 265 392 265 460 530 530 530 530 530 530 530 530 530 530 265 265 570 570 570 389 793 635 646 684 779 606 580 734 798 349 350 658 568 944 780 762 600 762 644 541 621 791 634 940 624 588 610 330 460 330 0 500 278 523 598 496 598 514 319 520 607 291 280 524 279 923 619 577 608 591 389 436 344 606 504 768 486 506 480 340 228 340 0 0 574 278 278 530 458 1000 504 488 400 1208 541 257 1025 610 570 570 294 0 0 458 458 409 500 1000 400 1100 436 257 882 480 570 588 0 242 530 530 530 530 228 554 400 818 390 442 570 0 818 400 350 570 380 380 400 606 555 265 400 380 398 442 860 860 860 389 635 635 635 635 635 627 876 680 606 606 606 606 349 349 349 349 785 780 762 762 762 762 762 570 762 791 791 791 791 588 593 601 523 523 523 523 523 523 797 496 514 514 514 514 291 291 291 291 577 619 577 577 577 577 577 570 577 606 606 606 606] endobj 233 0 obj [574 574 111 553 498 276 553 553 0 553 889 0 608 498 553 276 0 0 0 0 1000 1000 1000 1000 481 1000 763 611 553 276 276 276 461 553 553 885 719 276 276 276 553 885 276 276 276 276 553 553 553 553 553 553 553 553 553 553 276 276 996 885 996 442 885 664 608 664 774 498 498 774 774 332 332 627 498 885 774 830 572 830 608 498 553 774 664 996 608 608 608 276 276 276 498 498 276 498 553 498 553 498 332 498 553 276 276 498 276 830 553 553 553 553 387 387 332 553 498 774 498 498] endobj 234 0 obj << /Length1 891 /Length2 1444 /Length3 0 /Length 2045 /Filter /FlateDecode >> stream x}R{v " yҰ?rX  &!hI"B@L-&[*L+`KJ)"vA1/3$q FJ)9B" (AU-FZa%WMnk" }csܑɱ^= ~Pz&Q."vs@יouq#< ǸIo=};Oo(l1"k޻mU"" %ө}NW~0Q>=0o~SM;]xCfbFryȘ ?/֎mSV][j`.}:CL_ҥvmI"wEtO//> endobj 235 0 obj << /Length1 856 /Length2 1274 /Length3 0 /Length 1861 /Filter /FlateDecode >> stream xڍRiXS}P+"  *!7A-2 Jf`P2)b$ -*TԏA1*($AԂZI}xk^Xxw6 {Q O\AzBCC0Gcۥ >'BhO&ZYy`Iy20pp 8@ \I] `#, 0a&|i4g` ` 4| p.!!,p,۹$@cx )" ƅ'x6ʂxݚN]wj%/#.p.}0F;zz!RMC03xB|R<i|!2g7S\@!\B! !e/T}^7Ayp;N!0u5?@A*  RK5 (ӔDsuq``)6U!$' p8ƸIS'l @ "A`P?C OrxG 8+%`1aX tYw*?5hٙ7ۚ;n$,(eb_mʌ{ &6]o ":9ɿ/Y}˵ ZDŎTh/|4}O7qјSG @ekLqOmsI~jSZqFk@K}xI_b$J:RN`%\ڧjBdXOvc 7<:Gޣh/|@ɽT GWWM/yZ+ZqOsHsk:+UmqFӫ H o2 zmU1 ^ ek6_^x?}sJAX#c{70e(JX3ՒsW$uU_c(} _}t< P^˒)XC-i3T#z7O~gm׵kM.)efsYd*_2gYiURw&omYv(1<=|bWc.CQHOj4oE78 ksRXى=Y׶1ݓgܵgJ>-tM23d볆R H[tͭ̾jq endstream endobj 236 0 obj << /Type /FontDescriptor /FontName /SIQWXB+MathDesign-UT-Regular-Extension-10 /Flags 4 /FontBBox [-43 -3407 3250 928] /Ascent 58 /CapHeight 58 /Descent -666 /ItalicAngle 0 /StemV 94 /XHeight 492 /CharSet (/integraltext) /FontFile 235 0 R >> endobj 237 0 obj << /Length1 1102 /Length2 2004 /Length3 0 /Length 2715 /Filter /FlateDecode >> stream xڅSy<ZO!Xz֘fQc-Bb 1 %frd@ j e:F‘\u Q@՗0h j|]ǔ`X|J_쁏s G"ɇ:@GNqNJ_2@cA !/ ;ĠC ɦ uuit7AkQ#gg+ߊ7L 8<@bHA"t ‚Q\N(d/UK @Yֆ0'f3H/W* E%'Bm$g}MDA u㴿j|AI R>3x vN޸j$.I߷B :|AvtS84m /E\h4F|;/ad y%#S&sx]SZuʎ,yu1Ճhd'7mp߰^uxrn4ie*:+fյ'\X{2$H7 ==md-5oRȦhβ|7LTŅaGWlL+;{ to'=j&}jmkEdzG]5{c1&J.( K^ꄻp{sWT7pS\ x ڜjos(8.,̐01zNXgkPV#hwe"Gּi9S=mתM=ϼ*گtЖ4t֒2N Tމy'Ѧv7-E.ѦXvZn +*=5= 1o| &CkQm=bA}"e2ϔVՌ_|3XpGJ>[v`O#RhLTYeVڞ$a2qTL#H*%xOΖEqzy䏴'TN x @w̭\z(R◢ H S'Tsz3}*!Uy[>IGS (\PzdG>znUg^E<[u>7u,!՘{5,@LC}^浻3&W'XV>p합pw^9g䵣+vh"c{ԡR͞lvziI ѕٱuwtk6j?zeBߚ|9i4{DB8oLmS4*7,43Nmj(:XQq,M jMXLr}EK+6![+ :)G> endobj 239 0 obj << /Length1 830 /Length2 1180 /Length3 0 /Length 1757 /Filter /FlateDecode >> stream x}R{<9%j[mgyr92P(y龎wr鲒XETGK}P10J{~|>b=۟*x' |"B B+(4l4m w  xsQ` AİshL @8BզB#0@-_jDJ+@ 0Tp6d2j~21`#|WF e@ ` E0ƈ@|f1L,fq $ L~ōF,PGe/KsEb@SRO$/\O3oG0"RGT  +'v( 2W"kW'"O1<qZ D @&ў= PT&OkV x@|̯q !\DUbB!  w?.aq`?Ŗf(ttPL"Q|%@p7_"ǯq`4t-pW*/m6p|/9uC {06Pt6=cr evU|eD*+cCfGn*+,pHQ^)Wy^خ ҈o6&)u//E\Y.fԀ&7] $$PԗSp?7U\rssKΈz~'eKsKnZLI&4p!,*Hjؗn :ʠ0=q] sK SY Ng?J;J_gY0Q?PyfnǢdeXWlMRE揉xMu_W)4qq@!wjo,ioz;Ps)SCv{H3oVFuQ:arj˗v#MSz9pNʹ~3HNC.ĞjC~ nMیfKVT+;jO !0/w6|}`GTh nN(w+vf [7Z" "^ﮮ[o3ml7TFG禆DGSK?Y5=hn(LiQfit :WȡMARR '=r?ھk 揻u孭}rA'uq՜#mpJhQEj=ީkj_ԢSab_JVA(˨n#w7VwhOf˚ՎZOx^ѥƪoz_&Cx΃XPW<׸97buuIԳ_3N,8U|`6؞~ǡ{Ǥ\YȌk,.NVy\DTFmj\)N,SxM|Tn-}~7_]bﺧ} Zlf֐ujXȃ·LO,ܣ~Ϋᖐy4d$1J10.XBz*cG%>΍i񚌓\"5ܵ-h ƴEͰc0=V}X9r}ArAU' ;St endstream endobj 73 0 obj /SJCNDI+MathDesign-UT-Regular-TS1-10 endobj 60 0 obj << /Type /FontDescriptor /FontName /SJCNDI+MathDesign-UT-Regular-TS1-10 /Flags 4 /FontBBox [-216 -224 934 750] /Ascent 750 /CapHeight 750 /Descent -224 /ItalicAngle 0 /StemV 94 /CharSet (/minus) /FontFile 239 0 R >> endobj 240 0 obj << /Length1 875 /Length2 1315 /Length3 0 /Length 1909 /Filter /FlateDecode >> stream x}Ry\SgFEh+"'k(`®l ($/#eW"PQPQ VY *E0P@ՙssLV]Y!p" r>0]PF7#1D2VTqTq¸%^0!d2YP&I3#<1(,q'E03(?:WLLera"Sl  N4CQNЂAY!/Epʏ[fnpq@m. ]#$@?3 E8mf>!:3 ͡(!"Rf)cU{V7iO[l?1b`MPǫ+n`qS%Ya\Qx"` 3'C3yG 3.A$qg?Q V .-( *4}p6bŒB4BVD <<7 .") )BdBgb66!LGȣz'o|`*cjѣ~9jۺE)ONlHM/J&j ON0JҦbSTTq0slNgY:w6Nd77 w -+O cyF"v,}#pŭ[oi=a:|duG +7}[$<H vkmekK;Mr]r3R=˛N rKɪMr "nؾ,m+{O;S$2Wv^sZ  2tN#4 @ V;k(+ FzJd7 |LKEy/ڢ a.,P}v}ZWZ4Bj3jqb(kҼ#{)rɲo[l*x>B#˾5Q{ jN/ѢOrҾRN=J5K5}m+aިl ԑlԖp ܭg>D?uvV_IKƘPԶp%ث*qnvEG["{gC1$N ESZnW{i<(8A*¬$\-{Ϳ[jzXu#2w)ү7>tZevY6|j |2U϶Ak++b3\֗c]a6-1U_/|S__sMIryCSSy2 { JƱ2(}wUL uxጳv/nlA]R|J׌ϵ|'nu Ԋ=:ŁԀr;G4<.KxJ-X*k{<π|w??`-WxOv\\5'KRőXl 'v)aҩW*K掝649t[^A;'*O;SG"8~LY9y?/K{1rEW8UfˣbZR4+ EbHl1uT.i:ECQiBɾ!QS )Ecw&uqrN1:a_3[@j&=,U^QE7HօeGn.g3BI315;W) )j;p[X⑭zoKӏ )q6XIO1++ɮ'n ԉcKo2S"jnp%~$nE=;.%9gƍǢ> endobj 242 0 obj << /Length1 940 /Length2 2064 /Length3 0 /Length 2686 /Filter /FlateDecode >> stream xڕSy TR!K">d/lS53e3#C"£"$([Ȗ"c,WH$F|ιs)0C4$Ka g' D40 k%246F|@"kuC 'Qȹ4:@uP8 L/ A5pAd“pA u &4A" pĂ0D&8LY>,sC~f BW" `"P:?0:b;'82;#C0hGCks4 J9 ? 逞~Ι7ZX? SL '# Lv-M|P/ƿj ‘$B C-* B hq[Ov8f8PA^GB#|+[qJa&B"1dss 8ghh #](  ~ή}!A R&27%r[-jcWD/n?ަVR&vϦ/_pCO]V?o DD+DB w=vx 6 ~60*z0^wmJwK>&/ꕝ.ߎ:KK۔7F/pוnfp%{" /sB+#@uWO`C,RFKiWkߙH1 ubv~(,>G~|Dp :ynJ7xen}3W] F+Oy]w\][v?a~}ؠM=jY@]kD)Og{ lkܲL.}"n|La" Zpy(Lˆ|Cچ*kaӨOw4LwfЇE*DҤKCou}Ewڭ3hͭ9.?{}pl]4pD3iE4yR]WKY7y2{:p"1+╢S m-PF|h۬?1AhFڳ3o s{ IuFD[ǯ>o=."n+~6@.ߟ|-5h*lm/?: gTQ'd'{V~Y)KcpAkb; c݆j"L|(9<)!GwezaM-X4cȮSѨ$MG5Wɻ9`{XE6){:TXsao]*<.)N پ<ܳa+Kl&u3jG˂-Dj-2]ok_cja'7,a$Oc=]y`4)]m!S%N 1ǟVOI{=-EM7axvIf}8'RԄq?)e)1A.5\ ? [[vMƠ+LEoY!ގH0gU(jb؈Qnʄ_5o^f+RC ˌV3;>p2;Ϟ2gF5>I/]"6.ppo´<cw傕W]qlգr{7Wz ɫV~+)2 wlT]v؜^֗Aiٷ8Aq lk*6GBzfD'-Mr,ۡ\O{R‚5Id)‘yR.}D )a0܁jo.KNSZIwq 9_d&θ]f/,2!iY: A=#'f2=]DzC;CE>4f5%[e뒝OW3VL7xFf̻O JTs7<Q. endstream endobj 35 0 obj /SLJMNC+MathDesign-UT-Regular-Italic-MathItalic-10 endobj 24 0 obj << /Type /FontDescriptor /FontName /SLJMNC+MathDesign-UT-Regular-Italic-MathItalic-10 /Flags 4 /FontBBox [-57 -270 934 789] /Ascent 789 /CapHeight 789 /Descent -270 /ItalicAngle 13 /StemV 85 /CharSet (/alpha/gamma/omega/phi1/pi) /FontFile 242 0 R >> endobj 243 0 obj << /Length1 852 /Length2 3256 /Length3 0 /Length 3844 /Filter /FlateDecode >> stream xڍSy8 $R^!:3fVȒVĘa0 PQDveJ"[R2dɾKYe{}}2@Qȡ@dl be4[OS?taD,~S#rC@Bg BCERD48'` Dh$非Aer粎2׸i~951y\bgᣲ]l3 頧M:R:]֥/'>mY4&/)hPn^K 4U q~R3iz~WwB֤>;ѵbyٲ +CT;mNvZ=.[bRPKUw-:@؜`(Ό?S~Yf j\w,Kݪ6U;HE4K$&|YߴquJDI95"NMo)sGwo(UT &ceFhΓ7y$4n5+oܘqRh 1ݪU%$ 5;ǂ}ic]r2K*6>gja]3Gϵ6T'Ni@΂T}xQW'ㄔ8GǖRFhXVV׍Y}tX/J9NJr2{IRQzYY" dW-[,!'VT,/T|Y'ޔ>m|l93h6cV ]ccso`IY0϶]k"P/hv:ߕVїww}b3*gEEՆcV3j}mD]͋<}cE#l P]΅8H5j ]Ц)Ry1o)A9$t &g"u59Q@޷x@Ix*ؔ0g_(.F또 o1=s{UZe '{ aE6:C糘x'<ܛ|`n$Nz#xw$&SsSs j8FRqF{כ:q]6yVsӳр+ǯ#yvu!?M]F}'Yݴ,ڑSۣnyƖ6ۑc4ovW?mv& FWmyPmaEg27Kkmz,^Ų=m<~Yz]RRM[(~1Pidqu1oFpcEׇڅ%>Ke2LnguhX/VP HEz;Gl/ k7gN`帵=lSU NNŞ֜Byܞ󄸇9Vu26Ex˟!N*ՆWKΠ>l8a*LO79>(t 6d_6WNN|27#gs3:LM0`B罻 ;:"Y6UԳ|ApfJ}?#-=r+?<~80p[-%)8+±ag۵Wh,4C<5S\A[%iKSnᐥ[ Lh~״qN V"UԻ} m>R;Dk*T}1[]OVK5a XI;Bl|SknQbepTߒya:1ZT(nꂵΰ=JsW`gPUAq}}8,ʳ~R۩;=s>|tSO'mq8GM ESȦ6Iom^`hZ7"5yplGa Eշ=rVaZRWLz -bˏ EY>AP՘Io+{^ зBiKNi\m4Ӑ`?M}Mܱ* iIW(~̅e,,)O<I<1#g4bXōuuO*#l"֜G MЄ+V%|OԈX/G͘sAMa'm=Id }9(;3+䦆8-'јy9E5j ؒ9c{˭hDKe!5xzQ_ %̏˖( _|AJhBhS=!7^ӒYgk<gIw$h7eI*Oa ̨phLY1v,Llt-r+[Pa6mzl"Eo^_bėS]|[2jbwjٵ1,N2&Y6x\#mWelGB6f-f L^NkT+[= la AD޿ݶsTK誇eDci5gZ") Ei9gճ4 TJ8mJLRc^3TSygMޏ]z#ñfWxq=xJls4Gh&[&#p~Blh#'`- | ķ޻_wݡZ͟hHv,K58o%T2h628lF gϚ]?d`~$ (FAa)\*5( qDNI X}]j94;E9Nwޒ֦S^k:+KU}^e?;ȪL_RONK) eFjݸmso[||R0Wk)?ddarzjZ{cu'T@nifA! bybEmbҋVA` endstream endobj 244 0 obj << /Type /FontDescriptor /FontName /STAREW+MathDesign-UT-Regular-MathDesignSymbolA-10 /Flags 4 /FontBBox [-86 -542 1240 1034] /Ascent 503 /CapHeight 686 /Descent 0 /ItalicAngle 0 /StemV 94 /XHeight 492 /CharSet (/Rbbb) /FontFile 243 0 R >> endobj 245 0 obj << /Length1 860 /Length2 8060 /Length3 0 /Length 8651 /Filter /FlateDecode >> stream xڥueT\%;Ep $*V4%hpw'nA9~?=9Zs}ki44٥@`y{(-0@fKہ`@;ɅFO/ PY , 07KPOO%$NGhG- Wn8 0ӟ$0' d m PZ;9;)zAT4 E˴rq7 vr/ AP;lơfXL2N+kɂA!H> v;?{O.vvj+_3~yTi$S jesB!`fa 9  ְw B89ӲXB(0oZrs#jЄ @pw޿\}Vœ Cο7-ii{w/v.^.;\B!.~Ci޺?l s`;mnB$&9-VE;$kn\!CGڣH,iz)ʆ _@vLc]>l 7q@Ը| [~gZ1`37LA.%O2^ L~iP޷Gx 7ˣNrVܰ2>Ӯn'Kje78ev.񮟯=m9'QWU e5cGe y סS;>ÚH3 u6>%WDsu$׬>zxXx2X3\!gTvTN2AUB8_]2(jTmײk!`\=a_`44촂Ă[e|Acċ0Sv22a;sJT %Eq^w߂.0 Σ&G(2;u[<䙸"ن~b[n~74ȵQ ~h/9 \(4xw+0͋i0s"eH!(-ӹ>/?( n"Mwph._0\ї5 gݟ5I<.>YlWDg!˰c CV6O@!1m]3BVB[3ߡ? pU@Mvb8EZNHCjiJvnjV n 7?kKʴPi_e@.Q_T6!q?tZK+U~P+{bq,PƖUm0'ԋxkʇQr]^Hj= DS eg5"P).s+" wʉKgogt6n1q7 k٧-4sZ2sDp(P*^"ncM (Q$>6/w4wj%5v0e ; Q?VQc]G+Y7#zKD$mxe%i1$?#avpeߟ w>4hmEsD4 rʊx~8&N/ܯ-HHTe".9dBs,CdEtʌlD%p.3Q {ֻR^bP,,rq$/sU>\9wA2ҮA/ e;ո7A c.1]btA)g뛊A,K},eLb4Tmõ*]YW&;W 6# LWH_zޒQhxG0dJجhB#ԬE#,o?g(4{(DhHaH[SJ U>sa$^1H>gX9~{'L{ZW8@&*32k-UjajlJ-J0(7Kф>Ya 5V)CEt&HqX-+jv^$c\bQ֣_n|^mY;v,xaq!ޠ@ km:81BC,Jm!Y$Or1㮌$<<$k؋>>Cb,MfF,n_cdG' 7lsYm]o*0UI@QZl2թMIB?bBmHF"_E(I:+0eyrSJ߮⣤VHa%3-U1YhU6_Wlvb:Xc֘ Z!ׇX~QMeOi8aύXi#wѸñg-v GYc!\QCZ5pT5I'n"؋]1qdҸ+I p8ه)_:Zz;z៧,06Ć4uU 9%;"(zf :})˛:J;~mHΥQbX 6-k_r cַK}<B3ֈaYj*ޢjQ7{.MyD6 0 󐷉m׻d'lN6&YČ:>I/m#}O ]o+P d"%ɿLhSRW^0H$b"[UTd$dgtpuiGZF,6S;ív'&AoĊ>!3Pu@ qۉJZ " ґ*h6P-݌Хг]\}}PI~G#]/[reRKskQVebuxqF`P7!* ,%N4{ncowoQ7[r]~B%jb nr}>+`rzHaJt\MLP&],-Q5]&%\p|&TSrǗmҋ i2MʙD'`Mn_Hh5`NpbX"E$%q'VQbZ*QQ>xz-.g`B"ue2$A dr2xt9dHu)L86ǮV8{a2v#rrs!ho%l팣o_TG2#d2ؓDr4y ޵Ԡnxj,`igݡɎuBY^t -!(pY6=_vW)we=KUK16ZgU DԆW2_'Jc7[2P9coam.\uUCm<; y3=EAmm LFF& ֑@V;yEƭv/>=B"lid~>@h9t$ɼY4sbSԗ0 K#X޹`E>F #,8+CQڢ ts䰧j&3R(=}oYN4 M~JI-Z?!@'q,D -3z &,]j1[z&m`BNi.g^Yp+-M]įLD:Y+bu{˨^//c/O|(MM$!X0d2ܧvWBoy&Og2r1i[XB>'/uyЭ4y%+BI$?MI6܉PU+Q|`]4w?#N>5je[VHlk2gL m'W\1:~DPh1ht]Wdw^{Ґ)URN[_FBa%XY =uov?'Dnxvs4B9mYPĊ{j_K3W>FD6(^bkŐoy&7}):[YwKHm)ճʾQ|q33!:OגI#x( ݄]A" ǮDkPY)<9pS \*Hv>˸^_YMZrR"]ɄPvxԐ8>@䣼,GsP!${/ ߆(nf{Yww <K晏{ a%zZoH0~ݷ -/E!@Жchu֬14qG6Hp*\ ,3yZRxV0yՌ^we/2yiPQf:Q@ NaO"T-C5)U?\\ a}=|6'͘fčk{^ؒMkU:~8vz#&3[M )!c~Hʹ=s1 +́¹ *]PTlI=pǓr~R\Xhw[Б.ѧ\B"d2蒌 3ϩKۉn=6,~y?VFE(0~Bm,2[/zUE=zݒ怭A@-{ăQ\6KaC%G 3nq`E2!.OÔFY8\ԥNYou7H[u -z&Mκ?_&+vwVӼӰo}yU_}v_o`J|gIa4g(R(sSyx{c<߰l H]`K 8OP@vE[vghoʢ=5` |19n֘^k=];Kg^$}YhپFO銲mߺ[`;CJ0_[G.679{᱗M( ~[!i.@Z18.orfk4@2i&;, O_7*6/>]O[@:1/Y~Ӕ֞EQ$j(n//QEb?՞ރR(A̅j65KadxF=ح;PJXF?_'(Y5,; G[Q-1MhAH4 i5D?*IbC)uXgNj_aTһhUF]Lba'tmΥ»mT DN E 3@.n oMܗPK2;ev %Nv HQ}&/:N}1;.HEn7[' ZZo!2׳*)K|<sM70}A ,;iБ@&?JңL_Z.Rmg° endstream endobj 246 0 obj << /Type /FontDescriptor /FontName /WHMTSE+Utopia-BoldItalic /Flags 4 /FontBBox [-141 -250 1297 916] /Ascent 751 /CapHeight 688 /Descent -233 /ItalicAngle -13 /StemV 145 /XHeight 0 /CharSet (/P) /FontFile 245 0 R >> endobj 247 0 obj << /Length1 851 /Length2 18807 /Length3 0 /Length 19392 /Filter /FlateDecode >> stream xڤShͶ9mZӶm۶m۶m۶mkMܪ:1"=d !W034ua$Pq0Q41s6p$Gg"!r41p6p6$P31&3r&`$`ddbg/?&Fv6^‰$Ύ&6Vvf!P'fD akdhoφƴP hZ[(Kؚ0G7v?EOφv&PtvF&BvfFsP/kk-r"P4q2qtGYu5 l,=P3Oy/ $ -lͬM#Y8Z[8X;GW56q5sW0B&ob:yq q!p6s:fJ[wXYC+ \@_G:Lv^4 ,43kAq8::)ƪWezVs=z贰VدCTӊc>21JQ"~/"TabL`'U]<pv+) ~dURc֧I~ +c7?IY]4KcK:(o$#&%IhWw! ȳl'+Mԡ= xx%aROcusf2pD ?؂vi!znCl; l9 /yf+xlsU}V*#xZ $^y|\H>5Cr_^l׊QfOP&}c/,aŨ4I30Pױ<ĕ|#GSz,i4K &dy,:Uӹ&M0^ArU{Gtrb%EM͍ƌگSlD@h-:r0y%K7dH__ײ&+x˯Dh$y"m,8ʃ$_/e81Tf O~aϚ$~.; pCq΄Bb N˦L{5Ҳ LЉ%c٥bқ2't+;%f% 4 )KZw1pe}8P}2 SdIO#~V%16nwzg@i}EHQ˞Yf ]p b{䋮:YW#;N"w:0 0Vs|eX-M[^@K~vD vp G3To刜aIQTFY[p(w7_ U}RzZФǩ3EV[:(01!~OrCpe!7$9#^QPx6b{3Ӡh+iLvN|! @$Tu>c>xU5Kۺҡ+5S^:%:}dwS5 #[[e ̓H{#`v јT%i 6SgP1n TD7Cd@{wUӭSNTZh<./7!6urg@R70 0q Le?v ;|&_z0J[_s tE>[DP珔s233MP$PRc%(+T,SmNcPvI?Qf)ڴma D pπ'1ċ̞|N2e_T<L?2^E w|/!3;)<Ha+ɂ&~5tGVR4<$ÙFӖDufw[ tB G(6#&>NIl60ٿM=ʜ̈́l#o֢"GJfkP(~F/?zy+KgcL 1à\8sh+Êm? =:jl= "=["A ^*bO&n{K{rƢ~j{&d8e0nv6jڭ>rooނTL6f MQpdw<|+YQKҁŐXh 3F^pz2-0~%)">e?#!!$JQ qp0H)g,2R̋X›uPR䥏xUgi =8a ^Oќ:kP8hjM6K[5lh1 pнU:fd<9\/j+b[Q `4#YTZ9ܵThM^'l0JVWkx`[i|BUsi2;Aj"[ϵM܊Zu*b%_6RE>/h6Ip."z6)3dLJ0"0AVH|+!ۓ1̫vzwV*_CY8K oΚK%d(dylˊˡ=mGtq7Am6=zJzjfTR_-tL%dBPA5LWKVpQ^xЖܷX3pNRq~9+3Y' cKaYX0~Fz 곁X qw.-DQ! קӄǪ<. W]Hf-}{p*իC$W-KfY&sku]K4d={;pc3-VzoKFw9tۣ.2tq$wzdĶP6^Тal%lI:ϥJVCr^FyB:vՒ@xGMGƗ`!]U͌kE\K18%ƞ:Xx]?j|<ܻ;M!@ #vCz.OPSF5.p4K76.Ѐ 㑨,P|75_3Fk:(< 2̣ $$͆,\G}$imhltdx嶽xT,ËjdON5F$dN(ϖW;渾ŋOW I[FD@_ )ZA8幷qT*~к`ZyJ jtnx$ B"*3bIגnwerLBu TEvA4a}.{+-M/޽¦Z S^G3b (1YVs*p=Qd:\ /tDBjrXY&AWcP}JxK!U?@`&dwjmz1mb5j`N=+TcJű5 bZ)w¦ү޿/jfzOM_qOԿq^ZL*omVbO)]UoɅxJqc 1M 3+Cqc8[Wk:h, >Q:aΙLYO30Wa럮=!Z?O ~0pppws2nAdӚJ.UU[޶mGaـI3vT'MƷnZ֩n6GY9hPzƑX~!OOm#4?O58\F)ZI!zs;|!QB:R: [?slbG3OdI{8ZMz)PkO(b][Y~X(M꽗09;οv:OlzWLЂ? +Ft> ,P.Ww\Ƭw!'Ng2 p$B`|9 f=$pBh\G-n6-7LFҙ-4t D&qsSzC)fFb5V b~Ҙ\? x8XNzgVdfO?<4'w֑.:7nAñ  M]QH\yQe,ʛ 驶/KH'S#IK,UkW܍imynol,FD?is[ʎ4涇7Y6ĘO[m;8n@0Ciڊqc!#5<29̷pwzQ :uX4,kQC 9t./5;-^h iOml_sJ}/M?r?o܎}cdZB#r>ˤ<3Lo\V {{cOpTux22RƜ7ow?~(i]p"ZYo!!w<4K"ܠoy$?a{a)6sA>b' 5?'2\X3z&>.`\x|Kgݮ PFG棗:`EE Ec?AN'VSoI JMZMC(r W!բx^t3mW 1hMtތlcឩZ3Qx Rapշ}#:%·.MQOFf4ߊܧyא2N (:4^VgE}G{&e\= RRZ*BX)r|x@bŸV3 0g9At/м]֪/MDsYZWd~k8f[?jjK "{ Bgj9ض_k8,^s}ܘ#GƯuNFR+Z<ղ -ڮΌv U<Ł tX#ҶlN#7`^d)'zP)};Kq" ڲU=2L)E}0^-,> V/ZҩN2@S"aiz&\6A4  ,ٛ/_m= Z*D``2r˘|PRU΋KW$ P)0y n>pݠ2$]\`3jڃoEBk@%6XoGJcfT8=LTȪox1_r$0> e_# ZD2ڣ@Ȥ]4/]~L 4sWLJ7J~} Px]%n5K,Uv@`D(]^!fK3 ߔ˨jTqdc$ {j8a\x UqҦx[~Dc3 Y22LjvyLo kU%,@r,+\iXCku-Q8 J0FS- SW bcKgbYt{Ny8YӤ4jsHlD+, utd:h2VoF]L9Xp81l + #oАLh[Sh \z?m(-lX. tհh?Szs`79JK.pe2)vBIToM^:r+qVn kyisNz qegwBϺgX)8.>*dD`Oq&8j]1ˤtOqşn͏)JXBl@jS=@="1UMmdg=Y Y #7EY3E G1^G/2 ,zXHi4>"^kD⢣l|"cQDXUGw{ti %(|t`~qpa)9MN7ia@D4L[xjRIwȎS&%4HɻM.-zlJaζf\Cc( [rB /wUd@FJ objHɼ3Nb`*B%:t @P6Y*9ڨlI"cɒT(~=Ef(9y]|þLgJg}Ԟ%eɘ6ѓ6>6G1&uQ(1e)c-{%~O1M8hYq qT& ԝ;1] 5C2]@j%cPP}UyjgFqE(EI`RNY-Wg33@F 屼[f+8h8FqGNK[_ք뜕 M9kWCL:K-lң' Zbzs%gM/es ;jcEM'~okmOWǧa?Ju nߙ`"8jkg+D;1rJ+5}h #8G"=s` lx%-G`X0wi݌4tfpn"gcu/rcx!^pŃG,̲W,FоrRoy? &'2,pa؊{2Dw>郇SW:O5I:udgw&Y|;)3XV0޿T_uΙ,":|:g }7$*H[_.fy}h-pT`_NڏV9zӱ|'˦~$L˴A'{UQD#mZogؘu˂q2GU:Ur^y ddӪ)wOFjuD= 61gy7 +L ;wӕU]5i9g4Hk<`c-J5KDlLoYreTㅃ&YbHI 4uhf]O+Kr:f#3>IZWd0wF qbflg{iO$Z]dlD΃W/ ('Ԟ#<4\-ըB؅"HƱXs`-1?H RZT[c&bI[m Vkx"La3fThZ,y[NhنE{FA%| ҳR/y{ԗ2$"3A vM4YyJ?8T) [K]\Iibt!M sv s.,0YYAhU{jI%hSSA.y9+:2SPJdA7979X x 紶BIXp~F;&z*::{~҉|FhSCs}2Eriڌ *T=G.^K_zU`G ?k/gxRw ;h'|Mg}m(1;NJI՗b/N* Dޜ|y!ݘ,oFs_aS:t0[if饑$TI1Dw (64!MP 5c?*=&=dӿK͛|]dIۦ }#!5ZJ ˿ȓj4* $8Lla< [A>9&|NmI9]?0[QU$( |RjƁTU[ Z$QPL§(0, CV/r|fZ0.o6w>N[|H@4oBhvY!jFU$H %Z (9;O#He>ȣ OMb}K PE+I-\\ʛYrFTو2T3k;0 /]w p }D+gsOL W}]5w̳4)t `5~e =Ј *t}؞y'{k*~G7l\}W uriOISm U_,1Չ&lёVQZMy؄7B],+wtْ]bЗa?J| m F 0k77w3{vuA #?i<"Jn1]`jZ8qȏ]_5ʰ "5ە ^S+Na<{}kF9)"LR27BDػ)'E>@]5jr'Utԣ(5U7>`ǜkQ?9{l3E [3잒"OQ˿LDI▊ORŽl7<[h vEX\f$Fq3`\Gyas] Z`z OzD+60%%B0YsQ& {Hb :RhCa JN98ŜR Q .LupYQfsPP6a;ATg}NXvɏp1no n borsb2gmsLu:&ڋ x(a1nrp ZcE=A%$8Y#-v~PbAaR8Bn X=!3fvl`%6e 2JzAIT_bNv^ - %>I?DN61>! Rp*iꁒL)>T!{ $|tů$J3њ;>n1? Ҹ߇da}W .k_9pco3^[d,pXyta6`:B O+Ke[Ne@(˙O\;%۶)*Va6t$&Ń syXmY9rOhou$]rkCHA[ 1S/u~bt nHVʔck %H~ 7V0 uB?uyd]mqT#J%oEb'g4Ȫe![34ХJmV꼪vmfJA-6S$^¶O=[FU8uA@)n!y! `Љ/fG[&yCf/q&&׀ܞYBYߏVS59B:F1aO@)97FÌra t^0qZ5H~˭ȱmuMQyN֏D'N3P"[!"YSʬAXlR;k^ rFe^$ݟeH#<3W-w_0Pnρ]J?V 4󺯑zJf/|~uub+[ǪusE;>x|T*p(L(_Hq|7=RJ1YlˆB]W h;!4v+x }"n$gjjk%@,P@RDBe"ārGmߟcpjJf+ŶSXh. %nOfYtG?#u"j?YO:2zZNߺ@k 4B){zS3ig9. 5ܧER^_2id0]PQavr3}AދYT:UikWQr t8IxB{)x SȠ7@ &"zE egsM4\z x6,Hnqٸ -`CJxzZ{i1t!W^.20,fyjc}[79V a3 ACm'Kj\yQY5NCo :F??wx|G:E>B:]iZ\VpCCOp*GQ|R0qE1"BS ceeᚣR9Y!k|oO!=BUFI 4D/'4YsYwH0gHqCѐ$5bqI|YH}`L4f]s_>'(lqˢީBۜcY=luёgEjz\րa}$Rgb<vamȀ-GZJnb3o n{JʃyHmL/ekS`˟>p20&p1af7) {Yסt ע~hnE{Aϗ\VdsfE;7O?.P?],]# Q25X }^wO%0:mOu^.Q&(I+`K*gi>(aN!*S?ھ^[Av(t)󤾊-3Ýzˎv']u8" pY"4zļאuGb/(x45Q^W bPeDB䊹#8iI3\RnoC+}!Clw+ĹU'!7᮳`vTmY-8,.tTI]~63' J)Wl7LϳiC+g1@Dj,$p8 euGtlwS!CY(N 0]9`, /i>aA-§ 6^Z_XL|Nkq?HOQq >H}, L7ow:(!K jl=C,Hb7"vΏ76i%|v&kM~a6*׈!,/~:HM?}XStEuPg&эͭ`xVtbȖZ&qY`?QۆlXsD4#F3Cp mj5~4gKQ2^T5*\) ؒ'\Q1Rh=="a!,L")N5͌t4n\MksIV@Cv s}tXkd7<]v wC:}qPzqү|֯8aWAlRV[oW7j Џ$W&>ӘrM)Dy歄b?BXx#?W%^ou4_:T=Ncu4EA^ /uY[$o|bw-^D1}U]+cmo|.>A<Ϳ{,AJ'l8<'JV>K> -(9@i"j8Kk6O{_]/L˭eՉuXGHbbY[PF@wQrYRKZp.IQ|.V|T|_Xz%|V[BWO<s֨Js%$z/4ɐژUx /\e`UAvݟLa;}M,CT/de"&DI9s(c^Z[ ,MÒ쑥_<4t"\\`kϓx]܇S[F0P =;5k"ΔkTo%&QFo&JvO9%o2YrɻF^h]l.R:苌>~o/l[#PrA9R *3 5HТs R}H# 2_2D@߆bɚ~D=2tAZg4/#۴%9G%xmVFbSsJn#rG nR=ci>MiJ* y{!U`)޾kcu&ԏ(;kd7 [/GA[SnȰXIx̲ 7r~ Z} [^7̻߀r u=.H60`9 \ N0ID3B?珊%[=C!P,v7z0f53 &>6tz Rv띋J G]R}Fk w5V르ƳÄ+ -ݶR$n&fA)Cr]E]WE ,:x~ =frl=99hp8ӕmH_F T[}K%Zԥm<$`y\ľ9{̡Ki 4_`wk`, ܷS̋g xjc)!N-}YSY=]Gq(6_g=oR Iz[hSl%!˂_㾏şmj鑹1ʄu;[4 .$Jjtď"E[eP0:U fF!LW%F8n]3v?>˽XΒ%Io˽3)D7m~A62 R{gRՆkdօ㊪u2\ ;hOñ C3~Gg}R7ܣ7sԔjk iE7 1$Պx(%z_4;KGg.MB)_\1}_ h]o#/+J xKoTl'SiBc$%0?_ʣiꪐa:r?L_{:)G!"U%7FIzv#g[Ponu>g2&U+9T)b{3_j'F=Y_^Eڱ rxhp](.f=ɳl*O3v;\_={~.@o]a.\n5s^*͒[Lil0CA_ mvR+9-nztneAozhpĕh}M+nr'ΐe3:iz+귤^Z"Ҟ˗X$u5Yuqfު! Vy*HSfK!..̓|Wbix;x29LEnHɁI|cs4{Vuyi9M3I* ,$F5˶ ؈5XB[мH͝!Ѥ݌8㢵Ґ7-7-jE8v3\9Ѹ.?qY^V+Dź cl|E@hxd{1D6b兙ߩz_M_dI-Q\>ʔlPG; {naph:1D;Cv7@9v3")(bth"!~YhF_rdoZz6wL]+غ*KrJ-0O^.=I/DΐZBz1KXMeMʭX>L0XK43%=CX/CM rl83LZ@G_4DrP kDՌei5oz`>w @gtN! bfTq;+'b *R `Oبpdð8rlϗFb_Impi!˸׳1WgJ<,ÒC͎g/p4ML':bKAvXRY2U$Kӵ2W$j݈tUbfސp?W;;O X[RrD"xO3*0{YQ yU>ٰxbgY=ݏgͲs㪓ZmᵔEq4q2At&s\ju?hitF &)<gu ؀ W"/A"PRJ ;Wrx ?2=4L5Xy3%+t'WPl}ƟU {c }YQɃ2AS7iA,W6j%? ֲ|숛q\-=W7"_|'1/C6ɷ%dNp,\p`J 9"!!l!>ְmC,܀CvSMs;@Cg'"%5˶X9*;nBg⃭䓙qGCo7y"wWc̽`)h,|^Xcd`Z:0$lU澍rwlﻷkbcWa yl=0"1ɍ]:hIǨZf>L9S_B&uW&Z`M8;.dI# Ծ3wj# (9QEdJk5,3cV m=Eo%8ӘSwL}qSݪxfц:va> endobj 248 0 obj << /Length1 876 /Length2 7739 /Length3 0 /Length 8344 /Filter /FlateDecode >> stream xڥvU@[-wiC Ch4Ҹw .ACp$s?3w+/vZUv=lzvY;;KdgC,m@.g IO/;A``'PbT5srAB .!_J `# w8>'qrCl@; Z>[8Pffho\МC+>09R͝q?+2K=sAhTsALRvPK+' ~AJ !p3ۿuQ>+WBmW3t II,m @v@P7{lk!6P:-bO^0{ vJv"ώNsZE(uMq_[Jn@>U5cg[ًTǁ17=5SWKuɞ>eΙTSuҤ<[ڭK^tH_9'SЬ Eeao„A~Y&qk )7M6CDŌ\ZM4ءQ/&yhV8R; zCEZ[9]e؉:փLepzeifUG=X㭘*;5R|?:b3nY">:(_U&w)hlm4{UR" ,yQ5؛kjVtkES?JR2;R~c;dIZ3s.A?yMQ-}hr:&M JHW)⾼.+,w)ԪK/a#h\ դ)8mq˽:E lo7E[5$-€Z"ABBR@x^lqJ ;=Ry뙘JbDƳ\&Qp7ge*i5!WdBi$( $g0ԊoO\%%SEmvyl7nh(XL|ź㵺 i@S1G,?/2e۬>Iܝ᱘\)5e1,_ VG(o➚ѹ5OׇcT\e!ЊYuDqjמFB,z'LՎ?5L#|+TL1Q;cK:\y'_SD\2(~}j􅧌z]&!0 n&[/RvAےzj!ae4i|cP5Gt"~zPZ+@/pQjKXyCބk9' 2]m$ #yŃÞ]R~hhͤ]@ Jդ~bq+|^lvdh ){韧ؠ nӪ>2IזbAKs s[5A%*58}5զ% Q'X׏, t8EUXt <|sGF' `l6st_Dtq2%Rvwx1s7o#R+]wr x.gxB̄0Kmh )*h} CH2Ll~2,!LL ф,zD?yGpQw3])FncPV e7)6fX. uz/:ǡTru/Zs? fc) /59r@C7{*E#ih .ʿ%K[G62d p酵ѝhH=>C=^@8@UD4}s37ԣ̡%*cI"sd'[Ǭu-tsک<ܺsA>\\W51:ˉ)wJ߹*Y"e 4waHvKSӞb^pL'Uw.{,xڝ^_3I&2sckN*.݄"ԗqdky-[HMVXڣs--]3F<~7S=\o_΍iެB[wmzs66";탓PJ5ů{1_5y%׉G12A[)B)Q]8i${$3X6P[&zf-{c &r2YOièA"srG05~GK6q1Q_IOޡo4{R9zuz/㑥8HL_n%sZbLhtG4*SP-ܐ Dńb`44`F(F߇H4uj7^wj4RёΪ`w?fFF/QD, yD",=f7, xЕ0мqIXbj[ppG͚LRځ x+)Ų+jY68b(?Z$DW]ۭl;Eb.`i yOG2bJwNDE!=wRUQܣ65_m=7sD\J6I|wA'w#5" I9+ʥL1r[*09)N}||˯v x;hͥKF_b2}CUs+,y!WeɨVHhf 0ǽrm Hfx>oLr\^֖ٗIq=&vȮ=z8KtQHLJh?1h(5. rW+14˭"$GcV1SX}DΓ^`4D[i%mKC6Jpzډ\W#NW9-"q`-, ,BD8Í|p7F[L5 \d3DTxܞψ.$Y<Lj2uuP_L042_7C` QR:֦1VpeW~{1 %(4ЂLB[v&*\}%#ˬ>{}csh|vLǘeGEz8!DN;~q@^N:ϝzӱy$[ȋJ`njNt"~aŊ@?kSvg+h,^N40!&݄:C,!JrRN EU41BD nD"m& > \r$ k:C/D) =Ma4$lg>D$bTRijhEl3!z$7' Vm{>Z Ehhr}P%ԅ\H$j|3QOJ6H6;BQP +CmfdC)l ^ Vi<*HB);9 6Vl .ߔg̽w?4"f$Mu~=|BwrUw*glU5Tх{R'eȞ`Q ?)k *q&w?\?w01:Xfghz &$o_j@-+H%uri"DC'cOiSU j=p,fa䵐vaSTXabçq_֗i<!{Qoc8d O/5 aLjbjW63M$qQ}C6!S*Ck-q}!\Qx-5`}I!mXXݓxFk] EVAbpf bJ9mrm\zev1h):  5gP_ZOj&seս;pkT1-jZm>SQk6!﹕ <Զc9^kY%F]5;@"Bf_ %?pV,^NrYhJvqydmsi/gMkS;*;&N s`Z[(XmtYԐ7Ik! p_GS/QH;p3r? 6Q}XVEGn/QcD$ذxd.i?߆ǟ7\}aw\~(iN qutW2ʮm ,-fq/8Geho!uawҪ?jЪ,lЎ)w~*he;T%X;<𖖍0S-(L~Muly0c";Xs:$Rag}rjW呱--v혒xps&egXoNN6Fg\O,L. ]z&Y]}8HDJ% A ;N\ OaF4S0)ɻc3d9E1A>j Uϗ?$亂f!S=׿:|]F\ֶ~ bB#@\k/n5eppU5GRo;а㻊"4^ޱ-D4 ?JH[#H -0z`{nB(E0!mejئQ\CY/AYF :5L- YBncA(FIF94o{I\Y{6_'R3ei6)Ȋ+$5Fm֐d}jba9&4ZRL=# 3z#@m~QLNj/_ir9tϴ 9|r7FEW@*=& LE}m-ESØX!5ԝTP*Qp] `lKy>#ٛ)) wF_tj>\:đ uWQGW{Hg]3 5-cx2Mq|;֢{kYT11!7LH?8;ϒ%v̊"'o}" ^TcXtw'%[-δѿ*Rt;Od̵"- endstream endobj 249 0 obj << /Type /FontDescriptor /FontName /ARGWOI+Utopia-Regular-Slant_231 /Flags 4 /FontBBox [-158 -250 1158 890] /Ascent 737 /CapHeight 705 /Descent -233 /ItalicAngle -13 /StemV 94 /XHeight 0 /CharSet (/C) /FontFile 248 0 R >> endobj 250 0 obj << /Length1 850 /Length2 15445 /Length3 0 /Length 16032 /Filter /FlateDecode >> stream xڥShݲmm۶m۶m۶m۶W{SjRmGc 3 -='=?"= '13#;' ;';ǿ|2.NfX .?E Ml L BOƉ@ƴP t4-ݿ%lMwR) 3?@ښ@_ML]?D]e l!yn5Lhbbm?)+`kfmB@IXȜ?ſ##lnadekD򟔉L'!&@.ܿ="܎%;-o`aaoB@k;f߱;6? ڹ{00HBA8\MloL߱?hbnbjgl\7:-o$5S`8P-3'ŕ@x]#u7 1tGwKh_3cVKֶ{\ޛCÈU.泂>eʔNnZ&9;fzN}Iz5v?yl8Bz`RQDq%ڔP f5WH9UqJ5Et\R25&UwٹC_z4 5 +^?hR"@Zڷ%Ġ{>(DSkk+8^ª^!Mgket;0rML9kY:kjƍk =} K7uO@xPP=(C 槠ygL[lUQٖs"D,@.ej2|Ws} se[`'{Lڡ+'E͆ӢIcq6vv0-3 DiA"- rxG ~ ES4mŸ*' P^_=Z%S5 YceV;K!<92%aTW50f2=ч/\.ׅw-GV]y_QRQ/ FU*MVa<@=>)mVk:'B+EŜc]o5|w&;g\d`&X1f)0 Gx4/ѥ!t@Wd'Py8Z弬)3jb"OJw|xDR :߱-|I˹6!ݩ @LL0]f 0ٙBԪN׆]0ո)5AnKj$J~[ Go!bQ\f*Kp N~bI?Ow9|rJY;!IVgp;:$78-tV23Noqf1> Xu=,\&MyM2CKPGPV 1X񩰭c )^qreo3Ca2]tGo`Okը$@X9du!咄}skit |枙OƺvJ)~y>i@V+{x6V`ۤ-"D Mvfkx"ӝ|}va 6M%CyD1ʥr~b(J_,xfH~U'T-Uz[FgJ8 7ε,} " }VM]gTnhSk ~C `#Iܑ~Jv9Hb GϿ=,G(ݑ,O(nhEG[cG99|GAGLvAKeFs@(ul+ O[^d^ܒO6'i]vpv0Vc-,p`tRwZW*o]==UFmmkcs\e- xx>;vAXTƠq] ARHDpw[{Cm:gQTǹ!Ez: fn*Tq9'(/sO! J3%Lؽg8w?A@B*=G) 닼po=^Dp}ƒKgdiΩt"?ʕC_ 1);25$U:VHn;?w7s2<3`GY6ǂ p<@1ix*]1]|}3fGd{ŔD͛劯H5z 4)7cJ#RՍe U iw-t{T;=LnܻFB"5v?Luz-nRF4n>Jf1ұ^A|;朗Mvד4NebwhfCp)3U5|{Evua԰Afå ܢҺL Uĺ16e>\?5C+#:ΊWz-wHri8d4P1 ( &gxJm?MlC0Kdʽ 7M`73o4K*ngiwަylMer!h|b $5_FK~uFQi? ;uu5{(E}.({O'$nQsëd偶4z[tu\ }E j8 ZTqmA Ѝ}h3Q(P׳-uEaCԱ| ē =VjtP[1ҥ!p[t DgEWhuJ:3!n`V LaD'FzīQ"~ br#3>s~rbymoPLkh!-biܛ|Q#:_$nƒT#L6*6ɜ0h(9^Z/_Lܘ=ZpNܼ/koCr:L8 6R4\~<o꒯I1A*کx.C̱)>?;^ދ!xO!>jvgLӋ ԏ5$x&()hG Ȩ/#}<1zAM\sJ(SI'Qk@i`̙)m҇)w.TƜ[#ZFo 8M ;u(l^.tRnR]`fθG-"\)W<ק=cD^w#W٧y4\G+C=w&,YlzqSv]sdu쨣{KbW zNofĠݜl: p"C$$t4c-e*$#h@92b̍bO,P'^ |4X$ƫ'FرYf^cdݲ'J~xyǙwp>7\E8$U@cB*EnD AV"Aٺ%#LOLE! O1°jzKLN1 kSPaMwlO64ـ-C.sGzt54C7(]zvVe2fX' )pS|G )P֘$*^l8RXT$ =S&# v8G\/uW'c SH~pܾdΜ>l-M,G(uX: xhl9PB ێ< $S.4$pWE AhגdGC"j'Bᘤ*;+v` /d\ M8k%RE= YOg_-fc"ZM #>@~)[!8H hN<'$JKǬe{[CVOC2{ `-|:# ~$d%/[8peȂ$PTM6XqDh֩F9AQ$ rtt˭]]_haiL녑5w3y]ij>}+W𶄱>ݩ77?;1u%m>1g33u{ _UDf[ZHN+̡ޤG|EGNrwC 9gWTxboLjk ":1CDuTRkIkX ڪH݋t)ϋyVvm1zwWu :dha܉L2I'a-~oCϢ+y.W okX#T9z!%)=6ܿ<[ vL&+27R~6^CMK!|$ӗ8t:sѥmߡU3VULP2w:ЃHxF?伜{&$l)QX[Ԩy"$GqJ\AL„LJ.i/II1W }"??jZ~,ޒQ9Ypb9yrf];@~i`uƊ4F Uv q\9rC@!kS*@R;xR0,g0X|Y;|4 S6-4n(X3TlMa/Zo}GV,l#%.wIѾfR7H p;~̓C 3x$ 䊵7cmEW6+?&5$ƶzE-Cr~bWOѷ)9 (uh.7s:`:}bd+uGM/9\Н yzDh|<.տl,{wPtAY~@`df*.Z?N zFX/M_JQCQ.5Yd&^X\)b8JT<.< n QVc*˅Y-cu(NoFD 6.BV5u䨵Mz{y ʪћѭ/d$31T,S2tYMءr*Sl4Wᥣ-mS8t9Gm4j8@/n+4ڭVMyMJ6 ®>{R\;tkg5W FUlb-۔hK#lhzMknà#w EhwݗԩJCH%63ͤll+w..1ϝ{!*%4vo:t=.\]XPjs[ OsaiyP+Ž`FkYTm*N*e"i 3uX{G.OmMĽ9=) .! f2W9_vfZ|諦&Ln=sǵk65̠Z7.$Q!Ĉӟ3&P޾[ i <69RH͒PyҵvQqKY=\ke=Q5ߊO|JkrNhPQqkc qE[49jhd ,4W/:겢C?u; %u…^?2qIg ظ"H$>KFh {=Z?z7Ճ$Q\.Ȗar8G漴jVLh.CiprXA0v䌠.P⾌2{FHAj D!XClIE+>,j |DhLW:do;BQK6=\\Q Vy}HGWx!U@s|SNKwDŽ^Q[pi=m|;b9WrӾ4/AUţgOo) km"T^} &.0KfwCҌ[g}fNE&G6dn"D~bwm*nd"437!' G:?eMňUJZsHb^1ZB4OκIT}  ahb),1_'%~%RӠScT"nz#L!lꦼFŷޜ28HgTTI5; hf@+YYՎHe2Z[pwPw dlʮ`O-ÄN,d}RCŎSd/{kj__q"=$% T9 Qp<"*д-*Iɨs8l\h;lOOF|s;咞$*(6T َtj^zUW- q[y<ًR8JI$bX?o"kI: HHVp AY ՈD(9`MNS:*vrnߪͮcG?1ĥL'ٶ1=x^02V[BE>&wO6 avC3OGݝ~.:$ ZSs+xR.0f{\ޅqTqH08];=rnƑS+Nj:AC@ւ; pDxgqvF{[l>9xfx?D ;v>1RڑPٲ^"]:X$BKb} #nfjɯ,e*Q4]@tR%n&Fv@I,BgKdd=`f2!Z%J&@›֝R^zdqy>\mDĎ.¯DLbL @27 yiϩ GTlwÏ+iu8e?JъNE8"7E~PNZSj5J Tf,nsI@j1:4q,C#]x5F" 'l#9O~tuEן^ T&|I4W+11k6\҇j4@IөWн3GmlU=%ڧͰ QOT}eq,Ӷ4}G(~Ug YCʎyV^!H ȺmgO>&$)^l*:W|ħ%⒃C|W~VZ7̏ub!{wkm򺣴ݝ"R/wP =f5 9U#o|_ GN<_Wa˛k? 7׭0wnƀ ^1T/S@Jf)ʪȫƒ#%BKmn̩jHf2%SjXԯҷXT$l# 7W.ZC-|3@ìَ<1zy7dvuJ[D3S9^JH'_ٺcȽrJȨp٭_쓦|`*W|HWᔨ'g? L,uA ϟ:#$5XUMݿ9#fkdp 6' ;J#ٓ.U ϫVrӁv VMl$1JQ1ߔrCOeP!Jm0W(P33"|:Ə7paa1ʴ^ WK>WGӓ/pJ JQKЛr=GPvkvCI2qܺ܂~!:q\O)TӉ]bݎT?=dA'7d46sʿf7 #tB ioU'E8}*."l3{'|>+_p>"{m$F6  nφ;F&cs;omwwt4y3w a]6<c.RבUyo鹴FFrkb^Ҡ'xje0γk_Yse>pl^(`)z(4Dl.۠Z0Fq&z5`>B5?%j$ _ja#ձ*{lX;)lmbo`~Ȟ\ވ?|ZvG,- z>X8IG4$z856Zl!T=G *k< IdW?SO|,[a 9{n , F$%n84{53H(o#U.Ok<9ABB(Z`f͢#D4+pИ`eRc;9r!Z0 d员8F[֝wɽip˙ԅo(sD5tipy{֏+%>4O:l&5"3w ^5Hp{ɡHjЛ%BZqwWIWל. xSˉ]׊Q_8۠$(ܝYU _ggXTC+3ѲEE,;yzQր(y LB,ni PؒEJmɇ>Yep椢x5ɵ]MT?V +qV k۝ 7V ΛݍBƭxk,{SY5^XEj7c_[0FnǛb P kǬI O7rD_JǶă2:*H\5ZiDu#R'zyp܅5F1PɈ#u9PFQj@Л`oVԮŜ{7,fxö:7}滶 KZ w]I&6kdgF:-VO oL4Fo=#R$\\=ґ\eq}Ñ $FOgiT42p_]*XQu\1zYBgѳNK}iCqH8D@XSb< [|tD6O'r21Hz{/ ].e`ByF;7=pegU>wtEߚz\Mu8>۪ d90Z|b+ {͝WQ.<]-$ljN AV ߀WgvUTE" %,Ư//4عص)Ub}!+UT+s="XryH g[eakH7aEXﮉ:'fĝG–gdHQ+Z{UۺJpC%@" W7BQZ`=Rl)#1dةN>E๬n` x Kvv0~nڠwa}4w>fq[>'na.aiex.4U\9c] Ίi'4ĒpMY/#^^-uhQpnCٍ^ًܿ/ŚME7z_1T{c06!K&_xĘ9ǐ|7`^zSI(p̟Өs5v"StA:#V5"8װ j맼dT@"0aجk?Jװ ڮݷQa w]@jϭ9 @j++,мz# SSFci#2U|dIA:QUC9T>BݤZ(/ jjLCE-(ouX^~3 `<HGk|PmA-fB~^HT9q'ۍtP"8`+I1y&) ŭ =:׌r^rjE̝ZIfѤ {S9 $O-WnŜ,aT'C@ _T ?OIO3yn,sȘoBd8ⴘ+ca~f@b\?\̚mA *hVѿl{FfMyuf+M% a>aUH1U.[՝. ܸAYԣ`&^ue M6jaM@^MqM6-uXfw-p.P9![׍QyS#|OIDJp?;&R)^W3 Lnx9rf =a>]>-bO jGLV&eqJïicQe517@!2γ-o3 ." IO4eBbrs; :.F 7ON4s?'μjDhxKU2]y]%@mf8qoU>Qౚ&Pn7TadvpwV) Eo72k,!:+mtix"Jo.HdS'_+&;T/+%NU(qIVӒ ubjd۷: #l@Y>AʧLWY!ǚm]wZYE<*3]_ʶDX]voyfuۄ9=qRr±)_: z]<ȤL5QYV\P_=_.XA'ӯh@=1,i\3}otժ(rj3bdž?ϔ!j|$v$ .̿tP4/&(5fAcdG+myiJ ?U!m$XOh2\ג2u`ɶ&4Ӳ#yn74dx=6^-6R)Pe B})>1fh}WUǚ*iη'DJKiXfXU#rJL@zI[X)ԆMJ~ū1*f%\|8$Bs4ǟ@{awG1-!b cuAۚ#gaMvkyA]mKpiSh>ߦ&,3 |2+%9R.8:I%X endstream endobj 36 0 obj /INZWOQ+Utopia-Italic endobj 27 0 obj << /Type /FontDescriptor /FontName /INZWOQ+Utopia-Italic /Flags 4 /FontBBox [-166 -250 1205 890] /Ascent 890 /CapHeight 890 /Descent -250 /ItalicAngle -13 /StemV 90 /CharSet (/A/B/C/D/E/F/G/I/J/M/N/O/P/Q/S/T/V/a/b/c/colon/comma/d/e/f/g/h/hyphen/i/k/l/m/n/o/p/period/r/s/t/u/v/w/x/y) /FontFile 250 0 R >> endobj 251 0 obj << /Length1 725 /Length2 33858 /Length3 0 /Length 34332 /Filter /FlateDecode >> stream xlstf-mm;;~b۶ٱmvұm~s};Tͪ5֬j(rbq;[g{ 3=3@Y\E KN.4t5tԁ&e= Kp03wPSYXX8\-|BN. . ,R@5 )%/WHmE#k c1 H 0sXٚXÿ غ!fhgS) aTښd%YnO6_ײ6_:befX;fMBr &@] m*;{g#@h n jhca2 㧭?1pp(Z8 ?:?g#4pr?s&vgJ~jZZۙXؚ -A: }9CgG w6ÿZ_X7KX݋ @ `fpy]cGGEL@;vmΘ729Gpvv@vT6Š% n<Ŏ]a,hb28Lw̧zWk]Յ[ j]J /xmyp5м]kr}2PKKmM9*T"Hakk< !+A6Bl kXs$?K, nYR '*+Dےv0wzuڡޏiCmSlCEw6@>?JhwP7g1|旾^T0Gg97#!舽߷bl3o'8"j<4nKx3z!/v+2p'c]TsD3|v-ps*L8: |ұii^SHb厠Ryz`0Loϭ!ikkS>==>}x3es5^=tЯdϖ/h>aeRųr]'h<;?;.[ah@{qgg^- ޓ@3-Ș=׽Π̰؄?SH`.z(p "8z{RHPz5kh,K@-AEa}s} (UЮ.z~ZfmdܷYVgH?[s_)IַANgq"vka&co* &LS,"}:%=gnp8YWeN1l+-{h׉!!^/,\e3Q'u-Ry8(u:$"T\ӺV>SDuF /EPz1z ̞1dU0A* N91%.2˳f$qX B8ͯw_$ڃ iiDbmzwAVtkP٤ `ݛ;RGp:NJͳF&._c¶dfA(+[g.w CDrk~@g輘zNNʕN·38=.I! "7/8GA ds Udnȇi&jt-t[;ʧ͋cGĻFrw_hMjќ ~ϗ;MVg@1ׅ[~$s%.˨y7$+E3Cx. =A|v+ TBs$دålR" {_ ;Fp uX&e_dY~N쩋]P0;s` mez{ӻ&Xz7Skr`e0S]!l6*w[xzK@9/W>JkwWJ2'[t㲈[9t=P*ʼ2)?Ll\,KtɳHI~tg~ZH'Cy*S:ˠneX$fe_zcz⪡V{_Dw31ķBpAO*ufr $+#/4Tbo.~67x c'GGhz837F5`0,rnH c)?` ͛a)_JR.㑨ޭۜߗuAy3`N,1pQ} Ӛ[@?Jj|v4D8(,D2DxH p#Il$ SpBa?؇w G[9R+s$4 _ew+>s/Tc]nlf?Y_.}KwV; xYGO%!OF)OJ/ZQ\=U&S2>Uc~yUNex/UFY$hXĂ NuQDk㊔?V2I71~ZNc]Q4-jU4v|$f%1At',T­ ]4S sa&cҌŘ} r9χF`Tarl-\N/IG]#Ӏ=yDt:W4iDH8e]hkgDņLbw2Tכ$SiZ'ҽn wGVGdw̲mhݰOz" _+V A<5ۼ}mIVf?V\W r)L`ӇxĺZx}l KqSQ'5Y0 ː66,[_e>DM)z6əz}#ڏpRjU'L8nߎ67eVtn*gOg.%8X2Je5Lv^!M11d$BCG0Gw}PdQgt5t-`Pf,2>?r,.\vlhTYQ٘sٰYc 갑Rʵ3"a4_40VgN&[m^LJ$9FQ ݅5(siLhOuv 7{+D}Ϛksx\Hd>|7[F[7ޮەvGPN3ojgZ/@6nVz3*pq] kڥf.,N4ie1Y/h^.y Ȃyn~U3 &ƭ6=h;0Lƺ&T_cħw(Ōu¨y)ayg̯#n+3{?h}#l}[ odǐmH"'J&pw W +İ?0{O?z\J ]Y)A~;yӮ+k!7ᅧYf>/19W wڠoJ}߿ Lv*{0 ԝLNJ0t?0Iw~vdGuU Ay/7,~[ [x,VmR3H5+z}EՕU:|aih9BUB97[b0؃vFI} M mQb]V! BQ+((gXIבsNCz ;_jqC/_zU5PAĭ13LNq$$`Y  lUuγi*6n҆:"opj %j2!Z!zmR'F:8s77q]_ Q"%Z@pORx)e/) y@IUi/*{ZQ>BfDoe"fe@J4J>95dy;򈟍2$1XG=Ncƭ)ӀvCXR$e] Lr&G2ՓwR_+pXo͌;m5h5F3g-Or2y4AT7 _3.2DٞJ>Й/ GbuOZw銿/teo H+zƿݾ=~‡c2O7[}jݢ6pw\Uw\& 9wsWqF.ϫjX{ .ڳ*7x"fA=bg+__xU6M f`$qF9?8qJCD"p>`猈} 1 h &yCB1ܷZ[/,0w̷uMw;oVIhHwSf]g`OJgj# "Ep2碚/'"J˃Du*mUi+ƻ_A%ſ7Ƚzz=DrK+INŲ ]6OYLaו2LGp/P}m*/V&|<ǢN݆mt̫!RyYjM8*"UMANVMO4{ |p/~DK2Y89U?Vd,y=*Я8 ƵKۚ3 Ph/\{#+SzE v ?ZeU~sX˗*Eh֤? ,APwUё, eP S͡F~ 1Cp_p,Ȃݣ$c)%9(v( $Q@XIhp,A'm?߀DPw+]‹j}K77mxjPtV( "XYrݭQid(P2V+_3נ|lU55xR֒~[I:UhA>lW)(s#lC;DX^is af4A"W6)+jxGrrFפ~X`-Fɜ3/u#ROk4h HAXL8&iZd}^j->y'ߛg^ET閭Z`-p9h=}'i괧0brNJ{[1/#g x<-dҮs a/H;b+%)}:gUTScq!$te-˧o%;ꀅ O8#V<ҐʚE('j C(+Ց]>UIM*نҶDޠ#Ał2aUk+JXt}p(0}H/9G&wr ZP/}@gh0č!3!97AۥXjS˳t{m+4<$Vgb@S$_: ?5GBܽʚr; x#Sv+E]fdۂgt^q믻Yy61سk2B++A`u]2JoV:\a~lf`|JV@F㒇$n%kZA$.FT? rQDC#QPםe]Rl=ؠjJH"H_Y@%U;bG'8y+bU=b! c;$6䌨d8z'oTvU\{ש8 ԙ\|P'Dwȡ&{(0IR/װH"Õ>==w]Ἕm}*si1So'+>Ldq0"jmY u$*!0N}cYE'^ 8;T0zn>A͊24 oWa1$reBN~-kh9~y^2"wzQ:`?2w6j~k0ijDPšG- /Y0K#?=~Y$Io_xjP֋/&ʹRo . R눩C.2 +=׌H&*O[#ܪiwBcr7?<|73Ӣ2Cvx:qTcU7$9W:+:fFOԓ9f$Z2>*V:|k\ IIAe3rh$_q`4rmƬghf^"͊CrbЖI>c Byhb]EhݤMC~[ r!H2AjGqv0Kع'*y` V Ok1dF%3 ]\ vB) $nh9JQ*;) :>a:™D@KbCDy#"iTsȬXלBns 5ފUcq]#l0ȍDl1t|+#;H~!Lf^|LyDXFDOpk( 1[/3&LIּF郃?[!:-2L9+_GTľ.K , AzHxbTaJ qz[M%׀r\>ܾ-~ Y ˰HB?sB|4_Xi%pήAQ A*MF[:'Ct۲w<0j$eSrKqth9ٗzrġ||NJOqA }!Nf ,)QH{חH|' dm0|s"1O&@_PW]hr9-6yFQ¸w;|]?bU` ,:y 1c3Rh ք;r&=^6j7x$hWB,FQ3DTNjĬWc˼RkLD̥ܺH >Iy,<|uB+cX.4ux^{ o*>oI"da0b.jtIx n%I(ٞ 7~X;wh뇏>ĜD: |kCIBuГ/Z[&q-=.vrz][Qe6w5w#ޱ&flpOoq{Pi6R~ Iy YJXj0XiPoLft2&1+-h?*쾨!*:JCb>3OʒR7!?B}TGX"yhԽ%OL4lAvzo y_iꑭ`R9 i®t֔%?g1ŝC+tTBLE:fRx&bI ';\MU]Psν/7&g4գ f3lX/9FJ}kAQ Fi. *\iVa('=♰ۂmx4*+GLy;(鴾#>' =jɬWoTtJ>G<%~_Zrr 4Ѭ[µO7EEUm`S,SꠉRP70uapW98/ .5]]To⇷*&L| T-@߾ϓ;/V҈ Y<_b퍲n:Y\x=YjGKӒ2tՀ!bnk*t 9tcKDa lL8o_ӛjdvnc؋,5S7V7QԊ[{Y!4l_wpՖos;\@oG4u'ecOű A-&ZG8EU`28s2j+="/2*I(񳂑7* F׎Ϝ}qrch|3 F8-s42rAjJe`ΰ4kՌrㄷ^mEq}W"rTBȍyS1-ĤlB1>bّS(4kE@ sf:}gwk#ZW,LpyZB:cа[a1 +Uu(A:x8yBI}?JsyYFB=W#gd#ܗPF+1,rVb9U[v~9>YUIrj+˂d nw|XO%!O㚴zT OL竆v($v~PXj( ;ŕMh)䅠~xlz#Dҟcu4X(cCZ&nlrD["YvbIqR[b,HS2Ϣ4d'wΤ%J^-(~+{!5ﲁ~LjÛu73)SfDg]oQ`<(w4+z,;PC)F >|w$JK癵+Ҳ+?+ ȴ"i0#5)m j1CXbeYUJe8"DQޛrj}ڐŬ _UP u9Dԍ_DDIu|uZcv_'ˊ \qűU1!2bGݻfb+N^'X8E99+?͎s.P9p'~A?[/h'>h8>Nw$EmNlDH:=PH. =PA>w(,)1yf:P\f&Az!oS`"y4)i1- qjֳۄí5G1Ck$h68or5f@kb33V5^\O7jGkfJ@7ʼnYw!bys,p#o-ڡn͞q;FA/WX&}GB4yAX+zamHV׷!KmxN8<4[{ޱpۄ7q~a%[0_>?]#6GJ[E7 z7KT>1 HTl y ʥ} 8")ax:‘AУkrҌ3rr%m30^iy#]ɾ=k;47]λ]*Uhga.' NsWx9(:cu|ZߖO)>YAYN'-?bġ}ܺ裂VmX^\Z9`%װ1PI,AwVN' {n%=BwqMMD"i$>\P C_]hX(DuWpDݳab=6-->u-֡;bk&_$!5?7 [*L"RwPi'Ӣ9EG˟ mH}(]!Cpp? :GPNtŔ&"JDu&‚a #/CdQ\sD^;eqm9Ͳ:͜HF& mf8ʬ':ȟ=XT!)gr5n˪-ZD;\EY9c=CJ";µض&ZII[Pɱ5c9#1Ua62_) YHz_{biFEYBspϰˆe`b!sg reO)9h2,ErbYbhaQ4p4>sB =an`ܿ#;.̯ 4�{UݨNcv0ȸo !H7 >_),Ң(wIrs^96A~ IQ%4U[>S*)Sd=]OO1Uq16J7{C:݄3ĎC҂!I?mZrO4]UU^0'O~#L{g/q_Rُ틏_Q#QRHm\IÓ3ZxRX]aLuڳ͇if3:꒥zKKU-Zzk~_~ت o }ㅤwD)]0sHFP5tҪ%X /h%Un0K F ~t.+\{M>%Er_+ r%fv)tHI dJ ')de>ɦڂy~]6;y'ŒF{rsk\vKnO8Uq$SbЌaSڐ w_ُ߆byviu$bX߄Ye p&a#:usWo&XmދUV}B\L=1V$QDECC*968&hV]\@ )*Lw:bPo C2&0RO)FoT"ML۾[f:!]YEߎan}ݤCik.L|qtC?`:oqf: -LH4ZК{=vb'8֝iGFμM * yՈCa"HmŊ`Cf[ܺ<?w۲>a<}2ޯ$ZcA6{i*)/1,3Kß{zFpnȈ2q$7n'̏(0G>=Sh<~^.ΚĪ>d}X*b+EGe^3=~{To!pm>?{O*Q a1/9oKϒ\b4nF{#t#}H鉿qNҬq4fX Q?~ ФeE|=&Hy 'rW/KXTMq\wn nӃ;P DK-=<'+ ˹ycLVtz6L/I"S`y 7D E) auNL|4Y '>*|/d!w==!0=<< ${̓'4X Hbg+ӷ3V܆&l-acX$+o:׸hB6!&,Αr7{*){ 5AiHT7Sa6[#5ێoJl1EfoVFd%D2 3϶qt9ZuZ̐oWe;$f6 ,h0cXMȎ"=7 DrT`/7\QpXa4Dz.}#D?Y)cZ]FcŞ1#T|+<@^%trhS ;/`+$~1"\og˜x4Yϊ4;d}NeJmg](xgv~x/۽QTƽЀ*P~*_ʨ!Y)ƨȑ"7w\#DjlO0%؈d J-9xc[I)ǩ/&rb@]OAHBRʼ[7XHP[@x??z [':WN)p/yҔ5n/rZP=\PD,݄gI&\.h,|֨׬/E[AZ܈r8o:DŬ ?vUo7OaO;5R^wwGrӒ/+_Tb{_('>}i{I| B^= :M*O|09e [QqnwM}Ci ʙ;z g3]ml2zĨbmJBy=Vj&#_?{T'lb~%<]a%Qo ĩFojtN˸W}~m&(m#]9?krr-MYґmBfyfB XLY/݆W˗yw4x^"o9vy!l[R*=_, r0Ie%wzlq0BXt}DiӬ^ Pb6=( 묛վuB! $ʌ?%(ف) CZ.7Q}|R!MmOD6. e5|YW2t@ 88G!B|63 s&L|&Ѳ#NQj2 2?d'e"Et=?3li"B 4A8: X"]#4b7h.D7o],הTikasS(YD|ɗQ8=_%D>oJ={(W9H'+@2MDh0qzų]> jb=~a\*^dT]A8@J3k{ƳcHRO[ &A]Z漪h ,n(`Pt 2֤ ٛCSjmR5.=BUS8EQvxt vOZYw›14c0p# ha ,CX)_y=@%'L-68Sꈽv=SQ'A7,+w&33tBzݡs% V~ -31\ zZ9;ߨiO71\Ԭҟl`.xttm۶m۶m۶m۶m=&7gC&>9C-P}`bհ]m:L.,*]ZXYgK F&述.^lZd֌<d)-|Us CW}M>Fy>2afvK0C0,(s[MrZ6A >SҘK8f e5c:;fyÃu6]N\6Y1Z))v޼7 Cj6%o@WaCuP$p(| 3kS\ <+2`O|fEe J:`%&-W=܀ .4*#rq+qhG'Y2ց+_K?AD梛ՇF !1Kjbȍ+lpoMvB^Ɛn9^ M3>gYu5D0^df߬7M݀9S?~ r.?d;È X *lt /;ERCGQ#3+`eQ+GHLuqyR! @99 CS҆x}+8q}!V8R,󂲃4Ma'(*rw a̵,/Y<6[bFoȑ]I?լ$ܭ}.0=LmiHR{tX"j KZU*D5BAl/ECЮ}wKGA"$^C.;ey di'i`&l#_F٨QB(ھWp1r#AẄ́ur S:[ax kTGy>3#8G,aT"%PbB9 ~fuۚG#T뺑nPd ؄Ŷ'%pM~Etc…w#T'~ޙIaۊcc)H-o Z]f\H/OzE%Ȁƶ5DE]am{(yWmmfҊEpHKdl)X~ھKâ|+UԃkC(hBS{\sv*"?u8EΤu+"'^tcPYH aa/8%$!^h⇂C1G?`Loiїl=x>'! Q1u=rLUqed@ pӦrχoˁ+E2l*7CmϠǩ.fjOf5r:}d(: kq%^̓l-4O"n3 ?\S$luҏvy eTq*U䖯@0pw^}xtlj"&S.w^ʩ+4:H2 8Slb0K0GG l 1t:!Q:D@ł>+̀Ѩy (@)IqտA- JL!IgVShev՛vä'6K}4Flq5NZ>1< V(?i]q(FOq_0<;7o$t_~D\Փw_zQd6*-:i=zUŪM<ϫ3WŠAn4ΟNa4rM9\m6K9=O8.֊E Kji!--ZnyF{e:)s*v$ʭR a`oO{\hlRI)k}F܏bS&[r_ힾ=#i2O$?T/Gu@7.ي1>amA{(it<ݗv2~ {N4fft9~QC+9QՄ(Ž/d?|v+~$uZlW%&9At\!8`):9*`FIE{ ~C+t2a Ok$ 3&BYibKd>2I*-tF4'\򞘦4czZΏ27'-z_a 2zM7*~ж2u((ɡhPU7|o XC@A$/7k+n~fY՚BZgtn2nPߢ VE9]i7zSJ~𵎀 6zF]Hr:gQlp6 U0@S*)D?} ƚZf x)Kx`aq62HXdF+hI["4e黔׿Cd}"IB(@} ŽX&Bdд7r ^ -BΩ,!9F[pP dB V߭skg7^B75*|Y+ $c6J "nZ-$Ѽ(E3R:OT.NC]BeM~3ibX6|YO/$Ź\ˬH=DI0[h8Zp N!zl ekJyO/32/v9u0 o|k0={.3@rHX%︞!uMyO49zo( `ߡ:'+*z8'A2SE*d̘w BG .?;/M3w|bqoApQRЧ~hJ8׽xR.orG~1ff[vS&fer_#WRer;R3/k4T s2ZuWbl499hWIF-O}9#4YGw\J7v 1e^KW J4w0 ޱHI}9Em?';b+`nhc ?s0=mK<觞/a,\U싌 \Gz].!ߐ1YS۰I1?[T.bW;b\47X߷ű b\3'.)рZEͅxD5%0m6|>Ǘ|Dwg aџn5M:83I_B%x1ͬ!_YXTqtJC{̽x<\u"=ʄ qh!]qO3P(K1owԠKri3F9L^jUF̀?g6i?%$II.-尵H.R#1K pP:Ej'^#fρзz֙0%myb v+[D$lY%%/$t'!"~svkIƂ'OR 0Ym\\FhV(7XK{0xmɕ@ڤSľ6sRKKۢnm$`ROp8BHn SOoizn!ŧ OFSN5TFPBnC&8L $!M2;RQUԎ*Un2M:t]@|七+DDn)I )`Ï0@MÈfB#eiHM%A @b)'du #36IH%߸b{Jѻ *"/dӪ#Udl<"r%:.9BBMən9FGP,Orrݬ$<Sȅ' G,AјJb蠖]vb=tBq3Q82&.fF)w7Yv_Q{-`讒GԀWd=r{t. Cr)L9yO7[??i^(SQ5M45*GbT^j})TZW3_M5k n3غ(=;ܖ0Mpr/( MF>ݝuLe\ )C{V5N &s-0{M&92Z-y.4,jY"!{f1n vlu6!],̼u%å(􂮡񩐬blHeWQ^^jHKz(OKs}- sNS7ik񴹼oH{cF+7m4ZO:Y߿k*~Ғ%t4+s@݄T+^Aa߽=Z59\3q w/lěwLQp:I4s Z`Ð|5L %s嚺@2\%k}=AO׃v. Y_P Y,@a6cW9q*yR`q$6gsQ:8 a"h]¦Xy'uvQ%Q. =7v֥j`JHkJӊ!GEeM.%7tRԼ P0g".p\U]rX ?\(+6-T:cP7 ? >HOԒ/+$=Իޞ گk@kzI&4G ( pAHA g∫OpxRqc9ܴ  muxCw>[I)iQ][lr~ېjI@b"OeZ +;9^p ۪2o/BXR?[i)gw}<!8㈜?ś3O(Vk JBn.wi@x X-ҿ>B4s;<#oFd ¡܇̞+c:YvLlƾ̈1NֻZ0)F;ץWҗ= i|UYTYB)?aQk #K՝I"SI*4UPS3ߒd\i )`^s=w{iݞcv  R E?iTâ\@`> 8l=&~b+T1VM/sy8&ttFMۆH&>TOT{ppDxZQ,vȞ?Xwi="ˬ [%eYzN?- |]bVJBAa]x:qwn[ou0sDXb}> .mgKY fSz皷srP^g }R`^,Vn6Qe`#ɸYHV Sc^A UI5[4 SH?S}ꕵazXEb U3r̚$zҰ_ n5wzE_6ˏt ׽6G|HIVGd'(SR(vn !˕}gЯ0^jů(5!4?\Cne:*5 l*K+`<DfFb 8p/ެ| = aI_] )0%Ykշf ~.HUc:Cowtvz/]iyC׆#V ;ZźI/QA/msFtoɦZ.?VS*w4̈́w pt*XE8FCҪB :-#UʧzN[ x?$.qF0 ',}!nǹi"t }[Yv]xY`NA'ufc]%T+3fNIX1d)c%{t]yZ,zRGŊfp\8S60\n2*@ڰR~us^Ex 1AT%w-ǿ8K\rx`l1.F2Y r)\8'腬'yT橺 ">XïBf|:>Kj5T@|%Ty/e)(M7&yRO(|dX3ogN*HO#9glV/%YqE½~Ƿ e$ %c=A`Mj]>کp!kbY0G r1N/`AwODN|L3><޴0|$_l]GXXF ٯ_Kn[WRL%"Tdߚ N_V."yXaѤp|$0N.Ȁ>A1wJ ?S>.) gXN%u{C}qI;Z%ո=C_7mrŀb bFA>-e+nJJ(L/h/ 6v ,dr'jp[cϐot@ac3Du֯}xDa\̯ѿ¹h:"5lW[ATA ks|8ѓo ianh).v\L$Aή4GG;, <80yޣ9!uvJ?IΖECehn|u `$s gp"Rs|+Sgwxj _NU ƫ%ْq}։k `OHo]h얯T%Lf^IOyF6|g\*).Õ| ͳs𻯮pf,<+ҿ%*ݗ=_U;@9b9x^_!rO70.\h ]̭XdzK2oa0 =6,7E7'2lOQ>pSvs^}6t_7 %5 _jܳn|Ν5s`95@@v ]?PA5wυPҗ)UGbUjT w<^3=+a &⚕lUY9TUgsۏ3Z;J?ވ6īm(\{H'n xK λ{N[qUyD[GLeLQ~}UM]aa:5Xʇwz9cIZj=[l38q쾏x !*5e X0{*ig$ ?!>;' `ʹkX%Rf*JJm,n3!O~2}gЁd~i]@ykPVwv1ž=Bm DL;eÿ)_,߸r)xr-j2p"6*&y V ۅ捅f&-}L26$ߠ/H AZ<-0Nw[ 4e# Gբ+쾳\d+Fm?]}e 4-PZzk|P:KMY[4{8+!VZ·$k\pH7qLD:Nz4W*-"Ut\N"v4YMbf~]%A|%"^4t wHYVzB͆N%0kb{IrpeUC2rv)VaP%ś Gs!wVm3pKɍg jx6qHJvh݃Joe^ ! @ DOVyیQ|y?Q5/;jAa;á!X"T኷D+cq򶲚-@uT1:-<{dHl.-(s'}#Qˏl73֤.+蟆%HhTRJF*#tࡕGim\'Qq#u@qrfB ˌ c\]P >]e>Nx?!qMIT_PwV?~|h~~@)EݟimS̙ >p~Sk^>a10),`w{ռ4̲k*"3~r:6g|/#r A=Zܖ!"k9~pA* _N\8d 򕯒K)xXM>QOoIDv۶۰υK'R 8RCnoܽ3WNdfJW-;wxߏ^XFlÛRͪ3^}DIѣI]߈~ ^ox[2Xۿ8Ndi&Ed"q<,wXw*vyw`/7C,`V \lčh[BQ߃}{o@9=/#e)u i ҍ %"D&C#:>I^:H/PԥNPPOf& LdꠗE-E nPr^D<^9ҁz\,3OUyI4,90(.f1Y`\<j AiZ!dO1{'jg|%yaFƦفEƊ& Tд265xKuĤ* N4lG05f5^XM%=,6Jv@ݳgRw 2'3szi}%E}A1'3/ß2 TR5r(0<ۦ5٭5?1oZz@N|)WVD&ރV;YLuErSUǛu?N̥@־$qGH܎~봗2&pҜ2ʏ}1u +]lmqs4A(+NB(cH}24nΕBW pqӿmDJr-`]9yilgb|[|O!m+%'#3t|T*-KeEX+ŗ|ƒ獒Uasc!UtkU \!)?aN}a7&y[>+4%U!H;5ўvnM46% ,o L-Ի2Q\/%g fm=ra gbk?@KGznjSx6'{PXs]B+NvvTn4[`}A$xt:OȞ1/֚n?S4bvn=@k8>oi7wta;yqơqaHjjt"s1 Np89u v«rFbR8I䌞)O@8ۑ@ZtUL*?\\[ n9O˷-w @1!iV[8vK#>dzOmXn(uG+@@amV&MN"8mlÒԿV8Ԭ;1aRE i4!=PӿVunc\uܼZ@.  \, o2LYG#0R~c]ɫ@𴮗{3]%&Vqa!L%1*Rߥ }jNEGlrӤKW&t2 t/2z9t,4XYH|@l^YjgQ~!x,դ3 U8ձ)DæTi¤Y#q/<`86E&ֱ,k5،2eA.bRLzM3R,G(J#@ȇL$c̫RѼ@Θo ۠dN,f,9:viƌxUxPdh?p[UTu2~%$}cLRȦi\rō@n*Zd;~ŠIp͢R&z{_a=޿ڧGe (0daDгv0V 9yxNVҦp9lFM_`<<ј'W!+WedMB>5hjpvNm:p:i> Jn-Wl0ܰ\Jxvl X/]zK,Cl^%+_4'].. m]O$Ab)U?RdcCJ:U'v9_>s'ʌv»Z귯^t;=^ޯۓjJ Exsr Lj(ͯ{4W:^]apA %d1b/l?g3̜@{/]U&FZ-&]+):V*eK).vBh _Dm23h j$HzÔl2¤X=S ]44GRuƎ0,X/?wUunwc`-P<~zоbD)EZ;|L\'`x9y;#10t "uJj*AS\AYgUClJ$IIBvB6&Y1 zL?4rRd< dM?kC%:ɯ 2a#&4zy g3׫FNp(kQFV rjL* &U[A79?#d+)t rRgY齲z=O$z.7ٰ_ُv#=\6k`WovYb2Su# B|;v񏦇ۊ%x* 7a؆"(۫ DɧNIX2-Ig犄Tbyy,ia^@nbh?B"k<< U㠫w9|;@*{q߭`ʹ 2\L6]p%:Ÿ>{P[Sp[@JhIfO Rl: ^)yb<$[`'%+U94? yX=d/66]:{Әr,@9NeRW,[YqK +BR3;hS"vQ[\. X! x+ԡT A>rA = l2u׍2H>.t!s{he^Hlt5?.DA.7p&:OBkW~217/]?fN^ XEc5}2+J]DP*A1Y^*pٰVaI8wt#'!~gd@AwiܘeSŶ\h ƹmdZPLNƆvF,_K♽N]߬[2\>O^j~bM8*I󲈱k# q\Z ~$v{vzsюtRimE^G-Ob Fs/yg0#h=p$< )Aѕ)ZδDCoݨZo0lڗWH;Ucw_ȘNN'.3/&_}D4q/ fI3E)LX$tF,&@Bi`8fڧEGuӷ|GIɐ(u|yELVLHT, __{BJ@hbca$ 2w|IRh.u+-Kyw7^|ǽ+8 (7ѕ||%+fR5K6~jl%ucx/ 4 O;WA~-,S<_˚Re5bk_1A#m4Fgw9C- `Rq \O_4\{FbP} ={tL.>9/kSF/a]ENj}sdd7*L-DoDS[zbXOGEҋ\#EE}G.&TaQvo4c(5[KEO1Y-6lq~o<FI] c ?HGI :6qˀOtxEoGQ$NKԳRMԄƘZ g,D2N֭,ͳֈ@HtìG$X4 Tc3ZK"m fIp~QAGlj9%S7IJdCo w`eofTsق*Ȝ[PDr/k1# # 9K M &JOYz iw\3TE8]cFihkx |$AʥfV8#~p΃STr0Fz˗OYb<3ԤɈoQbin9k]Eib7ˣC;տ$;Sۦ u&(| kU;sT֟?⃈*B;JȠ!Afy meb&[Nar/QJ;ܛ9jv ,ҔxF67)ˮkUbE Oa[H*(w닍 ; c5S~,ˁ.T`5ɽW}&HaiK6-&ܷ6x4Bۜ᝻~[P c@ieؔ4jw[Rk ): (/Uӱ endstream endobj 252 0 obj << /Type /FontDescriptor /FontName /HVPZJZ+SFTT0900 /Flags 4 /FontBBox [-210 -359 1376 844] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 50 /XHeight 430 /CharSet (/A/B/C/D/E/F/G/I/P/Q/S/V/W/a/asterisk/b/bar/braceleft/braceright/c/colon/comma/d/e/equal/f/g/greater/h/hyphen/i/j/k/l/less/n/o/one/p/parenleft/parenright/plus/r/s/semicolon/slash/t/two/u/underscore/v/w/x/y/zero) /FontFile 251 0 R >> endobj 253 0 obj << /Length1 725 /Length2 26689 /Length3 0 /Length 27180 /Filter /FlateDecode >> stream xlcp&.L;m'kb۶m۶m{b={b^ɈlTLtLeq&FFF#= V P&f3##@ @iLo#@fgmbaluqqtqtwp'I8@RBN :Z-2@[G ``lgkb/L`tp @VLEH\^N & "05'ɑhӿ8dmJupD00v,lś?fgq|8Mv3(El읝Y;-_ܻ:XcPC k!dBfD1s6@ gS5v?;SʿcWPRԤ&[ &k[??XLW5trph3EGQvnť:vF +;;8mM?f݀p+vbs4s34+L=7(C&GW8*8yF|{Ć@ɩ(0b 3w0k5lc9;)̜ߥ|(LQe?vm%t)P34?̃ ^BnȰ B,E5智~ajbcnT| m_Cm <1,@E@o rCg-}JWFn?Vtzͺ̨PsݑZ# `?ِ^v)99J_nq<A\ppVgK&i"w^n io{ #r;v&PH08fok.xq="lvd;H`hbJ\e?8W1m c[Cu!HSvVq4RwIWK,p&/ϫJZS!myOH8\'GcW/CӁSnG"R5Vw,8hZu'1EEL=?aw݃"Up q6++9fAwUP+Q9# K30 C[Rv-^s.ʄ]uAOt1bT~fLef|ₘD~ATo Я6ies Y0,;[~{VXBG'M[STc~sn1vvƸ! #^52r2fovisv|;\N_:5kM[}cf>Fgǒ<Vp:ԟ_uc}n(؆vFq+x|٠`$N€!=?!YfJ%g4k";fʠ~ݍv :U(~>X}WJgG]o摋`BJ_e ۡĸ?L) 4,^6 uDK$舗֐O+&IFNͷeLyP".o1B2\iCsl0x19+HM)P8m&}T9yS.MZ~}\ sYtryǠ,U@ڌ~SD߂ FLGf=`y4SX A7~,! RlcBQ-62Z U=:W0[Da<,?˦Lk=G8zo\u.D+9KVRF ].誌:j(PG۰)UnJȗ;>k'S*eh+hե焠s2e&yH;յOY4$8XLuJjsQRV) .΢aK lpY|B @H籎7o'sobͭ!xu_5C;\z<#iJ@3gh| q6Z{$76pplhY_M9L>| MuWP*!^t5k)\5R2%Bl"TYQuu`{R]2QhAqy2d}v:ORa~If/4|e-Mq-[C͐]vm4猼c8Fe<5`g |#Uz|L"&wQcYDͯqY98D 7;4b׈j_ O.xfy_\>}f\er٫V@Ms?%Ljt;T- 50a|`e]p&3`GS10$p <R'e6\h>r2Gd[5T(8@Jngδq|=m Mpz'[1E@Q%Iz~%oXșw1Z_g>9 IXeItp Dp[ڕz#.oݺl-l?\Ǡ^u@ϔ Lp $jL]ʿݴqW t * 7?U),}|pGH@DfF|uDRT-N $3Sg؛!:r,: 0!L_ EgyfTCȌAjAƁauUަW_.ӢΧ'+dPYns1g9`AG^Y&>QC"fo87$ho1m<}2yg dy@[[xg/ 5u Z 9`ZrrⴹΡNxh[+&qGQ8*\ƹ\9<ڂH6WpW뮠Q!r 6Ǘ5Os^\D nEgŹwtԊDX\o,|{hsSHVIЧ\= /&coi@G0!ӽOwGgEvnA/). eV#pu#w9VD萷W=`oa7 p.FbvjhNRaOd ͅ{հd oJ4y㏚#Z,1Ǻ}_ށT[R3]gբ[:so 6wx1y؟,̕IZ2Cţo0.To3!r3[Cf~%IVicE|vwkXBu`ܙA'v[kHǪ^ot=-`;uNT_3,rF؃"MGN#e ={[*,PB oVvBW pی&S2vՠX,ݑAf:~(ѥ$R[n&sp1lOPUs&D2~K/Q 4)fA-6mb`vtTeDp]ImJ/I S8C'ƋjS{v:ti8.WM=-hvCsDNџ  F0p) Au* l5*Vi WS~S\{v6LN:ߦ `Qi5#!pBc4%l)'2=w)|S#y۲"۰%JI4uD[3\m( l\*ӡ h;ҌnH1iΡP,iOAaN>U:H┫5aZ<2nPD+FpZaUŮIVg6Wt2s ב x }&KŮ6Cj$fg\>-s۷߈{}ρ`abUS[;BG,;q:՜T:3S*a6sU|hۤ9Y6 <[8rQYFUEN:Z@q;5"=`%pLc7m wLhN>:" ̑-Rjϧs\-kۗE>*#UB^D.^ƿ `Bib^/KJgЏSPp)9J- >yXe*LUnޣC|D Kxa})'"} /Sj8f(`^ .8]zA8M,{ ʶO'W*ߧǾPvg9~f cZRY!ǰ f9m߱.O{(&<W6 Y~@_-MJ9;Bn,9 Ɇ- U>Tqr${GS‰ W{ &pZxZHL[ 6< )JPGf\ZЭڣp4%&Wiʡ&&:^; "Af#Ln&r_گg)?%QkiZč0u+_ÊUMcI8en r/0eh/+GIMԩ;>剦1{N*| %c eu_'R(=XFs}?2>8p\?帻H'-#(x>¦hǯO# 4Vҏ{KSȀz*l|^ h$սH!U:05;enf6V=tQ)..c!&LS[r uNCϹ0ZgБ6P J?,lPPmoK 4 Bʍ49QHLLpMtkuZނ8?Ơ!+Dgu֧tVY\[*}~XRY`D]9vUHi}:mɲ!` *v/Gma9$ȗ9VeИdtxh0);?^hRF%y C2M忦7Vm"ݫl1e-\@ޫ !3kIEl` 8+2P{^\ll-aF #ĂIfH~< I7lI:=Q)V[ݤ=M'uS?yO5Js' ,1 R\iܴi4kL]&8%RUA]pVce;'cٷ,RW͋GW}֫l?CQuO$ա41Hqv=Dzܔ5۱amV•XL'k3%PvDi%/Cjj7pY,L>gu hHT]ϝ;q`Gj*e5'JT#`([5GXqQaɏeGBzkjCA}7U2m%SZZS@͈ƪx?S׆U]FlfkXR&f"_t {/e6uh_+w,BgZ;ֲ*q$bg>E] )Ka7m j|O;D,eES|PƘ@Ro(hSHyg2UNX< k&aΰ~ܗH ErY1_=:Oa}:!42UD:j$I! qXc5" Y59"*φL}wM^od_Y() ֖$|j.7gø XhUHSV.o K+Oin؇D0#HbΔ閦)'J,Zʺu #DcXBA7ok՗VX4b[&(Nk5m@{fX@1V #-MgW셶wҶ`R Q0j!/x*geIAD/m\yCT|cd_ARb):}C Y'<2cD]' F%q#k[o UL袌h~P{0)N4PᒛˆN6 gE\Ū) P)I-f=;[)*u09S^ZhzG#&̘ A9*}'(*pMDjohSMpb[(YlK@҆؛vET^# T-)t_Ѐk%4&JQOd>}n ,mHGZ(T o-p bh3Ȥ yL-i^]'T59R)7H;l[,3/5*Pīam/?oy -[)qhҖ .:٫x@)1Dh"!=(D\ ʔ'gC%5e4ơg|؄'1(LϙuVtkP@{KqZr=u>x:k"E~RIWV @DKl!=xd,7RP\BNô€:^~9dGh7[Pk%3b#Tdv"bC~"( [H](xԭOiOi/JÍ})9AoR@].zJRSyC L)83V1 )B`]Zj9BQp}1Yz{=m+io+gDz/1M|dz= 7*&d-O)‘z8@[YpzBMedspĪzTbraٍ DEP+@٫@0(n'I,{>ǙU~8xE2)]l{ )?.lJA =ͭ.̇x=иRUjw#TyǡӇ4lfD*fϭ j|dwq5 d(?h1>E;lא< VZ+~ۅ=g%1R4GPt7*TK8c!J(h3{sv.EVE>q5fc JOXE]pzג[WMg8臬Ot{ؐKƔUNCu;HsymQFCq`͓Fu~'Q'?dBnX2h,](dgbBpi6aj$n(}9Lxs)ADCI+=@*w/M+aE5ۃ}K(+jã8bCj LLw//TC< "dJn$$tyk[A zPF\Y?X"u,qRu ꋐ*zѸ규k|ϟ')V6KN0"{U&&Y*0xʏcċPc˴wY\ 6ٶ:뛑<2;*X[5@b4!D8s0~sg߶U] ')o0p- !9Y0:oŃUh23, ؚVddA pɐgOtCVg¯6VMRІEh7j;EK EIV2 ӠvHyJĎN0ԑ| ʁ} &DmJh  yХd?/ar=ͼq|YFDݡĞ+' teIړҪb.6jakǡM,Dbiϯ3g Dc ._g}8:P?,-1e '[ÿʷ0KWvs2Ŕ1ik$-h!ǗUnh^c~qfH7CҸPs(N )IÈ- xy0owbߺq]oEXI#жa֌{t8A6yExW V Hfgl!)z>?F߆҄ys |:Cv+1|bǼvIt{@7z SXf~b0>;ދ3 >}ߺaz.l5n8qO#R|B.$-ܭT'!'^9}zo!x?.oC.T"ȨIij2"Қ]CP>tf^5(kDݢ'o UVEV`yr2pd䄅#R]u |(9} >I7ߖd,@ `T鎇!Yچ6)XGZvZ k{?f-n;D4KvR=TF[x2ڰ|ٺNkOT 4R'cL1$?ϧR筟2mdڎCsD/Z> ֛(pp͞ cV)􌶏-Еbɣc*kyO>o9_Gk<)@{Xh#olaP7FO;fA-P-Xq9uB.Ft>Y'$D@tok-(vd,y*q];*kؼfpȚXN`_wR1.-w :N7KzY5|XrFi#!͋@`<؛qIMxDZ\D+ )N^pY1 gǠJez\XwQT7'KْŶ}G9eqt9~:Rࠁ,pG$)`,X@/dxَdVP57B;ϫ1KXgHFm~~d߭ۍ].yY,";ceǾv{Z60QF )lpcoĞ¡޿^j=Te11,7V<"3~sb %ulS\ZɈW v[E M7'TtE!ﯸ̛cX%AVqQMΣ5#VړehIL#/\b|UvϺ*̩7ASB.q#~ 0'Vnܲɣ2ns:4—PQaH#ʻMtB`x.-ѫvT?x]?clx*kR{fw;uW8ހɻNҦ{ #7$ʼ |=:/eZ(E^=s31-ƙ[ٴOS-o#J$!SCVF<9y$;FTպ\amJ8z۾ҽHs ;$X.c&A.ڠs3tp*\:`zϤmP#/)[Pl.Mĸz,)r,}Z Β>jnqx$q jn<xE(]ϴoD?8?)!ρ‚NS<' \n!=l Tp>W駂]!*pXs$P\Rv)wq֐̯KQ uBgoYIہ ؟K dYG(R cJlp΂/ ߗ|9˴QH<0R|h<8Dw6H 9\ xn" y~*4o}mMu* 'ƺ(7V 31N;ީWqVÄ?YXՁ^Hpf/ x2XP!c u3CeZY]m TuK_uq6_}P4w58 QpE .m;r/ggkXtX=;qjq9g'ߟ>ONX(&c|W2&̪x,]X찺ʺ V6UQQ6@6a;!gŃp`*Kź jp--oا8Ǎy%z9=7ql2ntpfP4T̹oZJ=wgЙ]$4UO~Dp$SaB;u2(Qt-=qj+\˖՜I2Y_1Z6)+>gyxuɜ=x?wK&ݔVm]&=n23D3љ(46ѷ+lwϐ,drYwZs$TIemiFXӈJ$YV;Sl(;{%}!k=rrGBOk3{\~X ,e$Fps$1iHCo@61% [~}zj1W<\ ~d!#ɥƐ@mn6jI-lsQ]KO/]U/VngW$Y2ڽ6)M/UOcȳ x6 #&16mѓjzN$X }79F4:ЉFo7N:dL(2<*x#?{"(cB] Cseɹ*+RZ=RNTT4(Pһs)Ol0W TzI\dyi4') 0O7 PbG~(>?_.#(*,5p ]_8ZJˆE(ؾeotX9OSF&e]a=[#Y ZM4Q)%OTZ[,Xr4>8rHW8sw n`wo}X"gy݂AnB.vw(ΔI41P{_JJ] `4&EJͫYOw3k\2q Ͳ-Cd4Kj'ug >n >l /?L#fkpSNnc_d!ȴM)3d'ny#|~cC~l /ħnPIӱ @-t6"n_EnYSyeWVlPTHF?k8䌉\$OXל>dI<\ a(ٽeobjeA~t[{}6pdxGsM7Iܳ]{ӿ(ۛ&{P y;Gyؘܗh̦?~0 0زI;}v:s޽o\dgroH&.)Qؒ/vN0?lD`\)[Zk0Tj7u{.^yyNNDLkbSߥ]a19,@].!Ӯ9=_{Ć{%Zqc$Ӥ\JdouKАG7wG"K d "*E娂|UMI96 q<}r%_*ׁ{s9O`!ZEmKv1!<f+,?r̅hv:*0"bm!6SbwK-oZÍ K"4&|~YWLzB.:Ĥn!+4M9{j2,bm@*?&QgNu^Bz `T旫.ï_P3Mrn[W_#lɹ18^GqW32Wa*?s[8D()u<&NW?Y9[| ~2]>Ntt:@L蔙 SHkԨF& )dB&Rh>tz4 /e lZ(,˼Tdb&Q"k߱V #;li鬛3>~%!79o fk\e /V[j}1ZlׯKa}';ӫc͉|Hiwl֣\=.>u5cK DU!Ud.bRlꪼWxBj46=0vŦbo,TKu \`Pl7A|p[4%5K$8qoC>[@d#r$IŊ}aWxd^/MY˫ZU)Edꗂ:1,Kn')E$q-#pɶ汧nYLwX5'cĩs0?, 'zRf'NNDg7K$a;3Bn9Tv'U[\ݙjPᯜ"Xv]BEtEf(sURCi$D/.հͰjrbL}8e_؍SSCY\7v8\W׶m۶mwնm]۶U۶U>|_A&W&lOFbZM#TR4+ҲAmʯs"EOzWx5M9Gn_B.b̬ ?k)$blc !2Uqapas᜿,wVBS(զG"Pi򓰲  y&!&Հ+WE*t*>cl>D,cEgs=,KQ V,Oc$۩檊Mk>~jW[eK&ݸ M#':ݑ* \=!jI[)H:jhDe֮k#^Ut9}lh~Tn N-q*&3XdL_>$BlS!;:Ppu*1D59vGE"./N]BޅPn\;BYcS[Eu2),A0YU)l ^Z0 ;#p"wVHg޾cI_5- Ԗp)=Hcw6D iv7jMeoq8*f j +ŹW*n>bD^na"n'an%3y lsiOsyMRfb:d dR8n|)ŗ&i7Lw3FIK K擘Q#%!U͋tg{t< FacV%OSh[z~DO pAOuHhT4u O+L5ĴlV"+u d>coLh%הG;C)|gH,ko RQjh_ǶbEcK14(D,i]B)uyZ$"%1VNK'1 d*g.)wS;ݺ%s GwHSg\NPy}jr}9?Nϸ:xzނW`L:ӓzn}1~irBMEQ"ōz>ΆjŽ*)e(|y-eԃjn%uRq{Ҋ'_G[|btZrI<(NQ]UG*:BjG@Μ9fLSY5Ĥ'2!ka)!!JTˣMzxM8O__=@qz,1KɉDQ2{~" O|p5,s͑'_Q-!OF.=uZV/'LQ]^t6!f Oin`Vh$ni>([&x"4'jYAIgz4RVA1ieC{§Jߘn(`awby\ѳn4/ |j5xlo34Jv🁕ƴ2V;]Tz@9VbW$cEQsݤ& vxewKU0=Hbi}yD>g9>u13*F)jikX$a3{;k[z\nι {;|is=q?xt/7_9vE55c,kl/\s39~]UoN䮽~wANʴКv\jRsIijYxZ0[ȅU<+Zqf1ZW7q x?eF EנpbKĞǙc&44\IRۋ=73-/+H!n,y:RxD&jAFQDDmt)}׫QV^ߺE'9^WL^KD{]~|?E1{ڨ"?@5OU7lTgŝ:i'UdDbo| o\L~*?AU^Cqő VQ qo-I{buNByjTࢪ@ZՑ=&YI$ڡ`Ak<Ԅ JʃT1|2EQ!ײgb *Z)XR\ZCVim|NQ֮i25$ȣk8؎@./qbD`ͩbҜ 37D%bSo(CF'źjmw+bC|$;`6 g VN=L*Ryi )'nm<Yn,$!dvu<2PZr0J=Q*{JNQlX06c5Vx{z,[< |3۪o[%%ٳb/e7q# Us4:M`3Hyev"yڄ&'æٔD=NcXd=ͫrur֑HF$'*0=W*2d)JkxUF@xS$'K+雂zKnreEZ ";L|)NUL=jCۄ'V d>o$pVzO2$NIZ5@ HVȰ/4G(,L_e J-iQBeR(C"PDw 6Yk'^MvmBxNJ@.<ģ|u 2#]Q] ]>] $f; c 8N@Eսsew\GpCq6Ѫo qvd?犦_0`tp͒mcŒ%ʖ/"40;U*۷:X a0so]D?uxb@-3+& ,0CΌI.,Մ.T.{g$uH4R$ X~oΘObQdT&U'IP< 7| \a/lk4P-VN} b /#Sw`Ri)TB7kS>}N{RČ*AO=^Cw'Y?'wt7ѦJ3p %A6a,/=bQ 5iYr:#'#UP {ɣc Aj @*a@U:VG#=Cz/F|fLMiBi 6/Y U>79HjSvW^8th|wQQ!nIM1љǯ8\A[fq=\k>\%˪_?2ň֩OD,L#2^(lHM9{+)rɿ Dr}oؾ_l`mQ^0< Xz]^ܘ]]PԜ{u_v|'\[!-A'isNl5GW͌$XpkƔciJهD{qYm32 2)EhW߈ԼvYdVLi.L 86¢Yt'Wgq%qq@$OMwZYn`6Yvl P锖W<׸{^2݉ӻ!i &y&L!REIcEY4Mb U?J5;U[&9΍lTp.s !݃~?KѬ5gM57'`p鬕@+,kxN9rq|Rm\]\a C WPSLގ%qB_{^O@!"S'̾jàf T#$2 / j<"$O,CcX!("(~Zx~{K8Y%,vVy@F))8G_:|ϙKZ|)~fy"]%m6[!t 2zw |&zeY?OH:tHPѥٿ49`o^e;8m= 1[ŇZ[y)T= +mfł<`! !)5&zB'!\eŽ[!`~Y~eblWr-GWل{^u+Cm+QKJ7M F n{(O ,7!%֍_g_qVѵ,H)ۅ0eTcnRBAs1r ^rJ4 )bCBMhC2lr L]F51'a #az6'O=15km2RyhXP$89 9#Q1v*U0/)F hC FpnܾWV8Rg;!i- Q`qH3>ͬt)UxC]LZ89XVb 5_"qy6Q!=,lrY ORm.ƶVgf|˳ٍ%L+vt'fd]Q@m2l9QEfHdG 6vv.2սD$<8 ziΆ$9/&<;ucZ믾r ]<^}sN8LS3]!VIꊁ(0Y{0+̖^96ߍUQ19u'䛗-geݶU U5f)]4-u9RdS>`ۨ.Wr=: 60F(j]^Ie[ԏi:Z,S\,up\{K|'XWXI)V-\zPk D6j$c:=o4;ʐseZ%ƌar[V"͚ן-D& cz E 407śPdf:Kw: ozxɐ ,}rnp MLo{vNFNh!>Y߷:ʐK?#Fr|*aR' DT=uc'L%EV0*t`cRU-gi(=IQi^& av  gP Mbv^,@A7qst'jk' RM?Z\6 {IOejr5^H" haM.8~GE>dLnVᅲbC4Oz`m.C}84=fL.ipehФ<(W@;Y0vG \!>A4&.lԸ> \K(߾@'8.Qo iF"e(1SB״F EE3ʼ]S`Mv6ϭ2a , 2gtm@7B$Khf5n jz^$x9Bd aMq Ƴ|w&=B>ϟq)`z@cb3W0/Bk*U%2ssT\XlܦPLk)T^}ؗ oˁ4wAKs%Iϱu"O:^f`c[z Ñ侙mMأ}hm#iّ1є!y-ޥ9#;dl%?4B(Uh)k2E֘K 3R @ \ds{nC4rPstMks!!ߧȜL.twlT/rBP1nnJl+"reAV&XvW{vrC)aDS,W ^V*tW^d ~cݓ5A9Ѕ2G,; | SǴ=yu,c,~9md#{(;w1TrbHM2#<@܍iz+_byƚF!5vVk ?kUX!sums& p(-|;dt_wlZ7^tzo[dOS:^-GۅsG-D.[)IȷŐ3|pYw*|ƖEF^)78yS$(E: }e!T7,~-@%L]1Xf2BF;x}ɑC /{aaԿ6V{J_fT?iq(t}1&#vU0^(?1J\)ٓTqnTCf,)O] +_ʞQh% r1Zӡ{{t8`Օ˜ysUqV^r%VōXiBh=Yj*@rgQO8="PMKE~[>H{<Dz)=A00ria7mG|Hڳ:^E[n'5Uj2\#'BM X5i9 pS?Gj,Mx]Xpuտ鄰:t0&@)ʒd);tu=0eXG 63j=ged#Enf3꩚eÓlڸo e&V"R07NBaTR`jj_F~ `Ƥg t/)!o5el}!6UNu܈ 9TwO̟ћ,z_9,:T3AaKRu:a%)շoUҡM`Ib";64=(:껣xP"%ת'j-@ f2Cݑ69lk ٢|T0H7 x7 4cv\@x9_ O3nzCNsv͜oHJCUuF1mʨi.o6~#Y68 F_k5t'.QDExEԨʹYYOMQ˭\2eA fmjy&s "~&Q6^#>iQ/5קuvWcP➱X^X=k/%b߿n[Օ(v 8l1 "ٹB%sK}_|3VyNJҁj0*WGu#aM:v"]wߩHJ]Oi'"f~NeӅqc _ՙ` T~O4{/&11Sm"UlyGSUTAޡ"0{qVJ75J@NݥeIq8%_^[6=y %3 Нw3kkĕ&QlնIp*M+ }w]>)A09wȖ3$siX-iH9v]xlۣE!,D-j(P ٝ0jlbZhBꭿW6ÇMriw4r12D$PY1) ku‚`[d[p ; C;?yBV0y oGC땘q"KswWZB=&S#qcʅDJ7ZQ|ڽg? endstream endobj 254 0 obj << /Type /FontDescriptor /FontName /OPRSIY+SFTT1000 /Flags 4 /FontBBox [-208 -360 1374 838] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 50 /XHeight 430 /CharSet (/P/Q/V/a/b/c/e/g/h/i/l/n/o/p/r/s/t/u/underscore/v/w/x/y) /FontFile 253 0 R >> endobj 255 0 obj << /Length1 889 /Length2 19950 /Length3 0 /Length 20475 /Filter /FlateDecode >> stream xڤxS.Ld۶m۶mmvmyi۶m7^UEdFedU+ 9$]xU4Em]\LElaEƮVbƮ"y{"U#  9+?ԴtDd_ ž⟃;`c"33+ ?Hۛ;13'n_; DTቚGf^DfsFW+S[5.-fk`lWQvV^G쿇i-?A+ +O% ?qu{3=@?85K+S{ ;(ٿ U5俢]ռ)DD<|虹yĿr.olIO&DIM̬-T]͌?V4¬-;ZgdgcL195. u Ȉ2 chnZ:w:9ðM\R!oQtr3g^h,p0iM*~BOw:CݼP=;"7ƣw!5_P$t>f$Qq)~ g`sea6,B4_2=9'/aL5Wa;X^R rFyn+&C= E -x%\0  fO!E%nE ]a$%@򏹳,F3 Z< Ufȅ=iyXj)Sc\DA/_lὼ5xnߝ"*w[@{q'/vk^Dc})5Z= + s* ia3{7tm ){UsEnkO9N%Rʲ>8@"tIqe|~4cv2\ 6T0ݩ=tZ< ^r#<-Pq6av;wL4׬˽B{݁C"mD6`{aacE-ާ_ tHZdBZ OyBXwv~:QH{Zo=b0%)xG׍8d>dʍ6Os2ʸU'y,7<Tav"uVM]9EuDi>:Z Z=-%}=Y%)9x Dy;V|y`9Rkdɧ 毌?x Ǯ@œTHoڤdg 9CgTe j  E+ZALZkl.OL*%wr!\~^Kj ҳ)7>搓2䰜K87i*|(~Kc=}o\K~*g_or%P%;zTS ·w]\U"6n= T~{ G D,$ 7ZNAsqWJ\P92xka~(QP]),3,ENFlw;&ti+5w)kU7b[<q$r|+Gz9.3}$1UdMa*/.Tjˁ/FY۞_+޳ Gpp5JLA1u TSR.:m a6̍Y\8=T6eqf}&ix52rПOS.DH?L!XNUT[Qȹ#94F!g=oKAe.7JC `aE.ov{ X:wWs?EQpuîX r5ZSSVSܑ{a]6P9*zݓ<C(ZH% :%QI xo;xG|rಽ췭[4R.QNlE^ڄ* non:;bŵ#J@+baWh-5i_}{<9ԂS&>Ͽ˹?8?b ֞FrDD)q+ ޾:ѮY71e(Ⲙ._FBN0S-7Q\k _K?v <*8ⶐ(Kֿґ|c0FuһpgIn^f +55=}Iv5MC&f#ReJMƷ9.򞞿P ٴ~f>|XDxP-8fA`}oBeXIywB hI:`lۑMVw9*Glfh$Hˮk-j\:ݢ%!H/Pvɏ)6{Iq{yj iI+pͿ,jQe:!!RuUR6`7%} *^NSs ^SdL8ܠuvmzo@`, O_E&Ί8,VNqU(zE 3hR4F x.Vܖ5_o%\Eza''3ī@D +Ę%`o}йmCI\oNO^+ ~Ftae$#[ŭւГҀ=}+NN#K`oZZ mJ\[54]?CBWwkv΋r|AExMiüZ6#Kzmm1;]$0WMZfnPw-~7$ lKD_k Y7piG$ 4űhӜ.?frpӹ91YQ lAN2eUYFURFis.6"NDtVTkw-)=^TR]ۂ[{ m3|M٭jᔹRry<&-ޕ~UU9ﺗM\ Cw*+h! zyǻ] Z;OUl 뜡RF[Eq'O"֯yLi`Z<0?b~xܗgY_˜Qwe oܖӓA3&4ΑҤxlpᕉSJjU!L&>rYΔȳ.\R2bh.[NFqZV%Cl4TAD4ׇU`ב [.<i/Eh+d拔*fB_3R]:=ULAeߨPb1ŹHx/el. qnu'4}{AB2x/ 5b0$ ~ow6h+l`o97qR5A2I(:,}Pp]='w6e.3+FHq%/S {b8i#%-\C>FNHHY UIyjGdZ7Wv%MF0+z/wݓ vV6Bj52$ًX?V$}}9d?]%Zҵ(] /`pO( ^ \G8 K'kWinދt?z5#nwFull]7XK!HFz!ܤ`T/XO,/ t mOB?1 b46?fo<;O&,hڞ$rw1}sC+sSK?#4Ne̓5_5 b"GT#B&_pXY8, t-,qE6l^Z|,'8jzѕ0ʰ08M{10qbIVQ`2͖Q͚D Qfc8]'RyDӷG3+NX}A# &-1˲KD(ook؂IFqE+YBINYҪ⓿삉Kǣs|N]$3AOƚr#}<6n7ۗqĐ\X2Ah>” h}/M%s&0ܱgf&5ߠd $!^P],gpd8BvE%pm䕷'_!T_: 蟇9 hly>hKoFliz)gt7 6\ 1Y)ە鄶餲p+BsWu_6K '.%bZPBQ Ν&hЬZP^a|jKI!;\h/ ].:c=/=*^X"[μK}Iԕ>rܦw+cb+y5Y&`@Axț{Xt~uoK#\ѥpr57^i\c>>`y2=:G"3J;ҿI2lO? Q1+ ޭ8j㛎Vj3,d&ZB= {N})5*֕j`}j&@!o4K54IyhJd?'K?᪍:'>G٦=|ճHWmwmƷ¤Umb6v1~@hLz:Q?o!K̊? /M CK)e^pvN"~KhzLepZhPϥoef"6CJuD6% '9]-F4XRigC='IP@ 1 i*Å/qxYM3RGt6/Jʠ!$8bzUμ𔛭7?M*!&dC0P>N/܌<\Y'c7p?!W磌)Q`}qI6{^oTpEO=hl7ZJ{?i!|i⫩9("h̫+܈V#1g_yAP&T;O j8b*Ī+o.f|~R浓2j `ݣpUe)GVfjX 7H6II>b%4BɿΈЗ &)vkl)SH7¸Uz;6m&\>!kW%P\ɐ;ޒw s[XȋƖN)MA׸mH;7PPޗ d[j|Јmmh&vd!C"` s409ʚ%7#y !#ۭK1[OIn16/sNF\Cmێ'־X=<0~M]-T$?QB0=0+oַL(DH9%N[q|;”L'jih4bf Púɢ60.[ӷzNt%\எMoJyIz g^S)D $R׼:J1 3-ۊ~dLzޡˁ+G!:Yj37٬2NGRA#p wpyFe%?pqS^ܯ~FAWaxť#Fu&j).,VC Y(Fȯ٦#m3(2 _5&惫5&\ngIPtkG <` dQ AmS,J;n۹QmT#g6K;Myg#}a*sdTы>wνKx mwp91P@TI6<2%aĨx]KN|q?ռʀ;O<Q=#{Em۪$eGjj ̝5Z s"TdF%.{dmQ>PQ|zw1r݆ !sEɺ2'^V_їDţLe;v ;BW '/ځ3vuaR)9Nz0AAA} d9%XSոH,; ~~ާg lKeےgOɞpiDucReDz%`luCx2,S=V4N iMJ;X&^!Q啣fghI1#^,OM{R|Yo)mD[Hw XQ d\jngm9pKI֡q OaqD2BЄ6OЗL3JUWZE bQ6['0b+WndE9Gyה=^ ٥HuOJj䧛H͂g!.lA14,Uf"{H M5d) MM`WW,A<YmEw ï,2k`ҵ7,b-`sZۈ,4uqt%\$J}{NN unW2RIj,N~I ك"AV.@+P1J-/1nVæeF#ǭ+. $1zAM30,\sylv1+a/j|=nø@\چjɱ?X3kjYmntl`q1ƪ")Iy?oOn /~1wTyH9,\] n%Uk@Pz&n9V9~pT\mj@8@|HrY]Yt60 K[]ͱU "9|MʗpGFm5hޜ)))<# [gU3kCLLt/Xp}7Ϙ sd_ʿQ|D9ܒjT0~IxT$AƬM̃NR@s,ޱ %Y y)^r%h!2هeNۂ>ږɞn{(Gr. Xt4:@zN/E9bX}X#Zy.iMI*uخQfewm(H!F2l'I=Lb8G)0غCt RJY `~i&U&(رeHg~jאT7[OJ>V_)ɟhpq2NS§\fojt.3ÝQ=;D7dQiJF3풧‚<7F s*`q>l`17LCVe4-?"U* q˔#C]!% hKCf#u -GDKu7)71]plI i 2nߐ.Ƽ?l晄s*h śG qE&gA/FU ۣ5Pi:vjT`tmovV1"eu*X)N D'~{rjP 7p:ʪbwėQNdA =Kd̲NP %>6u1{L.DW'QP=\V+j,,1TohӇq#fx%"Y`D]س(wcxl+lZ܏i H:_Sp-6@: bs+6oE@EPp|iӫDʯ汜8Nc'7v,CKPEjsdlָsff&aIDy"bo' /5oq/}E L?$vBԓ6 1o"3΃GoHq7mb ŊxUZJd$$tZ  (yՓ <-Uhbxۗ0錝L"/yS8 /4/%|J6g&%@nz`whR$"h|G8鑾{eS}~& ]{W2k fGC4z7'kk::idjlVP`ؓ+\! A՛LHI j,AB.hL%?Ci5 ;_|eN =V&6TiCְ04;]r4p36AJo)yO5K[>qIcgG+0WA `A-F9rSNiEervN>nL&d6KHay*FE%C|1qzRq !2I9"AtS.%!EV}Zr7꾽6/.Xi0[ZN 2Y\E,*ه3pºDKxpIB!d`rk}!Q8&'Ef!G~ Y@T/peП/qVi.Wv&Io{}}^E>LxV ԭzX37*p $:+=!-(_c@GKyOs0p"6#x๎SM\WL#{CP#!(Hzt*56-q`Z]k A4PJ8CɩB]sO m66a5_H yoH/D@X4`{~⸦wG1$w\9vWLy>˲6R겛/tylr13 ڎ2pyG<nUbVQi3R>v:Yp%7ĝX+OηS0Sʚ쨃e`bIX)T 2}afckvzbZl|QhOpQ/geHc^dlSCU"TbVf$n-tՔ_s@H*oN9@jf;6<3>N -鍨gԆr{jw9Tޭ*+ntjiɶOxܢA[s LdXL^!ZȈ5{N\gn CBƜ*4 xP 8Xa?Z`j97KiNm [QSv,{uvНhXtŤYQNFĬVv"Sx* Wec?賢 zv,{&P! "}.SyoڽGaRwKHZdg֗܍iCA.–.XL"I"VVwO3f%;MPuѠ!]R0<,obd 2 :{(9Kz)gr`$q?h7~g PQ`~L4#і|yn꛷JuɬUіANԅT߹R #QTE i"$7yc1ڪ2yؒDž?-bkW1t5Vk*`V=f^EO#x R0%aLu{|>z4݂Wd#厷FECD߹Ձ|"rb|q9%&ˌZ+|Z#-QL*MېJRPPrr<wCQBbfՖ15a(=7ˊQ7x昶9͌  JL=~">'; |TDBy|PfsssrˈL&:ĖeCkHȢ=z-F!A^cU ]==۔t<;!>O9YpzsTFd c6O9lQMJq>"kc>&,o Pr#5"x40Ҕ9%;T2 CvKD3mTEX im&a(TS5_LMw$FQɫ%v`63ۆ{#SJ*ajd7hٟ 墭^XR䳿@J aS"g;ԗ T -DL˝hB]S90+o٤ߌS'g֙x%禞?3M*9ݝ$t|]p ]~=haN/!s߄(}siyǧCt-`7Y6}xWxŰː`dTKbAq'P 0 ys q`9aSP$fgva@U+ڞ#u V; KzR5 *ྤt[nt5nݫAG*W@yebEzjQJ"cw#aHGP({&dF0 wݭwέBE3mՙƊ$Sk_?ueJcn2 &jp;L/GQdVXNxPm2n{@'!@xKƄr (DfyĂM1QX7xg<фͷYwYFU94ppQV[`lxsB/2sAScϜ7dc[>eP,N 㮨 ,y랳~#4bq嘺Y €_?oȡ@$8  ńa9ǦS̤^|L N R bTc*(Y?ڀc^Ӛb[bJ:PR{|mBV"q\x&u](i]RR&ò;skݤ݄nbQq\78KD[2._G4%c?WN;0{BF$;~N1Ysf3Ay,9GQJhgΧ r80MeQm.#;?FD+@>-n.V zx qgqÕEW4av2 pnVNZPl{Qre5I0C P.]",^Z^+_Hf&! %C.cxsRl~vRɾ+J npt4`4*\SxxĽx+C+Y-f⁦צȠ͡fKR1A8w ;a] t/롙%Z5)|XvZYc̻nZ/t#V)yZЛ8}DD& Zk\: 꼒*2kj-nh1iI7u&fDyn<8hGNۣ󠬶 Qv$vR:-3?(L_ewZ\\*'~'[,`s k#qHI4q/o~Ċ!6+@W.傳kFwLgRfMYXkB l?aW84!@9C̋0)U٘MI3SlXœ=ap GFDH3QeQ]iadbT13[h}ӾAF#5U^h!3ᒖ;gRaQ|xv:]y! !}8<1k#i ! uC|RJ׋6~~' [T?zn԰!{p\""U1ҮV XŠϝ\䬕mAFFf"!:9J!̺߬|~ȖIMeBq`@=0d幫:iiG~>V 6%(q O^ekp~qC̷G4DE d`Ӹ/! b,ofn׀1{#$0>S/^/RU//J)Jp]6ڹ`V% hT:gLZzP q#۷+C ϲd%s>[~1wM3|ʼn+ظCh p`E [ߧQX/@MXz߫(*  C0^ l@L{]g˃k٦H@ug< =-rVQTnײCqs)ML`cCk};>G >G2Ԟ8@΄ׇ:uJoC]6_LJ>%m"*r<|9ʣ!vlgyXԀKO9mh~E͕A ;zRewu6򌖌/YW]3bPA~ D/@@ >Btq|Q 0£aAm!{ik;ұ<_S_~E@[Ps `ŐW ,}9;m<Aݓ*ͻ+ǶLon+Y?tRd)Xhٍ7! xl=|w~+X e<|_YA㿿HmT3mZ)QwKa:4?3AQW~;u eiwQ^7G^ذWZ0k :M9rɵN{ ZX hș3*`9$bI&U]}Q:1 )i4!DM˅FQ /8D% D`fG@>K;9 @9~=&曔LSjr coڐVwK>9􅥡3nV7hZgY<\]׌e'n Zo@"rd!B|eP*9ewKXT0dCձۊz 4 ɛ<ԯY W7;Q/X6juOa|oiMۡ|:XfgPXx&:M D0*hRQO8`pPb 8Bh'g8/נ`WHmyؚu[:\u Vh3V£=c(|ѝM SSBwvהipm; FN KQN8rуGIqtUyyж̓ߜCX8V+T͗O²{`Ebq>Ŕw&:Yb"#aØF h.L%%R9ɖU)%1ɡOxMiЇ3e4!6=ӄ+HXZRL?p^jsp8H2<ɸMZWe4W**^+4@Xj 77Bݞ=dV? P[)<:`Uah_t!@~xa,YŵDtɵ5j،&(@Ľ>!DψQ#0+%+Nz>8Xf-PxI|p۪c\fqUٚ2=Vzb#DFZ&vYB7D&/=cNHuG&/`iN\r7H154wӞ}TC^lA/$,$%v=p + ՞ JjqU2Ҏ%eҡޥ*#B^^ 1 Q&*v<=X˶2G2Ӻo1z[+')2/7)1RfXz7&UsF%'>x%xΧ'̥2ɓF~I[ j}ެxV8,[2o' .%py )DӪ_2Gŭq+WMOa lu %w*/_c0t`} w`S(A"f ]:DNH:{:SE 6z`7yWULYP|lq{s Bm61 a;jM`tG$V4n4}oy= W}$sȞ&6~"|vU!fwȘ|0mW*s.1S?IK\؄ \U&/kF!n4pC01""஻8p0HFkgQ"g][AEVChYOnm`Bz({U:P˿) P 3qʴgY[[eOz%^FNS݀F躙MgmLU z? a'{myvZ 'Kes^Lb?&Qh&| L X WBˑy˓WTX˹^~-w:quꩍ3k]ߋ_x5ݏF*!;Mye"3A Vzy~ HjDA_#[VD( a)bz:O1(ʸ/oğQUx{!YDsanx¾ endstream endobj 256 0 obj << /Type /FontDescriptor /FontName /CALDFT+URWClassico-Bol /Flags 4 /FontBBox [-195 -260 1193 956] /Ascent 760 /CapHeight 710 /Descent -219 /ItalicAngle 0 /StemV 132 /XHeight 477 /CharSet (/A/B/C/D/E/F/G/I/R/T/a/b/c/colon/d/e/eight/f/fi/five/four/g/h/i/k/l/m/n/nine/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/y/zero) /FontFile 255 0 R >> endobj 257 0 obj << /Length1 895 /Length2 8340 /Length3 0 /Length 8869 /Filter /FlateDecode >> stream xڥvUT\Ѳ-wi&@ w @n;9+~[kΪjVcS~b03:9>>kINNPS;vu/ȋAO/;Clΐ%;['=ŃApZX: 07 ` @0=B`v6[D `5u@,0"gknr 7s<fs Ne;g)+[?[2.02Ϥ\`` 1^sS 6i F?nld@UGpAec8Gvɘҩj Pr$5֍| ƻY;'L/tPjOM/ŞhAt&sWb2Rk_?nV__>~śWmo}3J1ˇ +H5> c8]ffh&4Ս+3 HwHr({q~{U4d)Upr%P^bY(I҆tѯ;F~ DoUP?3AZ<2n#="DI;HPM9Z[@{˹zYNBnf­ Oޝsunup,V_acZg[l[Ϸ2ܣR]!ilj;Q&c:Nk};j&.# hZƄ0@;b9*$xZ*2gP̓f%&pf/ם͝eU~X=!!&ka= njtFI9y:OG1ҜYw.,e{@/R4ّSЮ׀Wp8&g{M'eI5 @~ËG㾺;^{:_FpOd$mTWudGko@=Τ/Lj1TTů'9 uw(| 3ʭ/]i޵&6{fκX"`[ > ֪xDg&_#WGׁ@:svxWz8i_Y7Yi]@m:E qW2wgͰMY)j3?1ܖw*ꗔC9?Zw[~*-;&DܰZSc]'Mt)"M+ȃнqDir>ә5Pu&ͧʩÓ*x/y|Zu+}=##$(Rs˩5k7I%mS\UC{Qa_.C , Ԏ\aDoIzLgxd)L=PqT_gP)Y@W7cZC͇^۬%TS.j#M"> +9??pQ( zŰ^;45:^hƍ> [`@YvKTo?Q0Gy#sIUt."IH8}Q76{=HF&jtA(gf2;1*T:"9B&J'@ldv˂dm}"A҂E|iʲMAj޴U5uIu-5mmN"ᆧWd(e~U{}vp P0]m ~٨&=DR)7~]^SaC MuIR~NOXzJo܊CRboJh!ދ?c-ģkEZ*qjC-OՌ9C'z1$STt[#3= ?kK~*Wիl c wmR7k #yFpMw-4eNe<P7 n^(]E *>Zՠ0h`ᝬԀHOUy{Z̸6vm7gk֘+zSO9eDߜ+`e\bܦe2>qnO2B#Ц-Sbv?81Ug5 R!=8MX\gV./A_;z֟nU']2oR"^YVbf Nis1&rq#B%P-LӣDiyyqrTZHP?L?AqL|j>h>Y+>5wa0ŋòױ9l;Мq#Zt8#kӌtdk_̈kH%]62|?Yųm<ںIo#Bev$!.Äsa>?NJy~T_>ЎLO}k9/C;dxaOc/Yx {'=n RGCz^}uU;'TM"6cQF99^?~bmY&Z9թ( V` ŀ3W5vZL{ M=[]Cdv~ո '^q-qbE'f5rbW'!{?+܎6 [909} N]ר(K-}':`$#/6"ewcK~Ohcq1};|_'sQMpV[5Y03ol}ӴJIsD섦WK߻+[WjV3pƎ$toлy(K28e&Ɂ^pnp-gu6fW"r=yCKU؄R>pshP/3L[ѸB#Wp#9"Om=t䓿q2Q.S,~cH#m=iP'P r7c,7\{ nH6) X+/e;DD[)P ԽF]B9AĔBmEz!ZoU1[?D6Rl {'l1w L81N/K+h `.uuKa.1@/nuɅuvƿ(TTK۾h3!LĔɫyY!&@&c7VSCۃ(vc= DOo(Qא*fObV$.j4YGkp.8o 9t s%Ŀ\T"şc)&~S,-{3 0h{$6,yDuCk.C8 E*K`;i1^vSߞGPawCTKЏ=<uݗv,{%msxXV'X^5„}1iw_vEzN^Fi@fa61;y,5{,W-==chT˻BU 2 1QeBB\7n/\˪Ο% b=?fYSe̖ u$|>`#4]a {{͎񆞒4f?(_1y,q6G#7 tHGlq'mVQeǝ.q3Ћ?zXvrYkpI==]oʼ)WRIXnD)zwoeKNSoJHy땭a\1R&eö>"sr֔Ry JN"m4O>wZfm<+Ǘ>C@1(DroVR{(fR'kU nG,2V>~xA l2N"~/y;'cܕL$:S4gh} usNx(Jē7(EBȇLJXLaҘ9w玣a+zg*u䞴Y\@.dwn7a[v|6fԐ&Zt5g )hxxY[l"AH`.)Nc;Gx|C[`#*7h^1]Vo^7+gcTyʠlTPys7!b 9QUЂUά,l8gH_Zd|d{9lچ mBDU:jS`i8b CjT/ҕ zD՚0&5 kkZMQ }_^o&ӟ,WX}F0I-Y~=U.>ЛT3ᔇL$ x4udaW*VQ,dyzze2, [M9|~GZO_Et"/e{Qշm1])q"\S"@ ~%jpy,u23=xsem*l7~%{|RQ4z0$݈e g34E'P/txMb,xU ~VWA8f{+\.5z(' m?Q4>N!8)ѹʛHi:"~+ըc'Rf3=+'Hd=0sy6 T]T^OV=`* `Kߘ Yv1(q8d)peڰ0fT6d8n?s?A+)"bLvePpJ s#i:{Cp>M13Ed{Qb(^+s!!p vNe$8U]jsM:383SŮ%ˀcfo\ HLwn=(j$XVT}TJX<1 ac ~0G59c=;xi BF ȏbrpI_ͷgd я"x|P=Bn~ktj`ǝGeUnN剟i:qDyg'xr)}]^zEP~WfMn\ge[Ԗ4aQo D2VUvǕ#3W2n ƢnreK9ܐu meVw'da4@po7p&6(F&Xϣݤ_{BMل ~QRO _өSG/J<^xtHd8uY?@(8֔_,2DU)O]. !kج1yHIgT|tZNDL2{daWsy0輼*jc6-2M̢4'Mrs9w!`|FBtf>Js;||jHP*z-$G;> endobj 222 0 obj << /Type /Encoding /Differences [2/fi 46/period 48/zero/one/two/three/four/five/six/seven/eight/nine/colon 65/A/B/C/D/E/F/G 73/I 82/R 84/T 97/a/b/c/d/e/f/g/h/i 107/k/l/m/n/o/p 114/r/s/t/u/v/w/x/y] >> endobj 219 0 obj << /Type /Encoding /Differences [40/parenleft/parenright/asterisk/plus/comma/hyphen 47/slash/zero/one/two 58/colon/semicolon/less/equal/greater 65/A/B/C/D/E/F/G 73/I 80/P/Q 83/S 86/V/W 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l 110/n/o/p 114/r/s/t/u/v/w/x/y 123/braceleft/bar/braceright] >> endobj 217 0 obj << /Type /Encoding /Differences [8/fl 12/fi 37/percent 39/quoteright/parenleft/parenright 44/comma/hyphen/period 48/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T 86/V/W 89/Y 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 147/quotedblleft/quotedblright 150/endash 152/tilde 252/udieresis] >> endobj 130 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HVPZJZ+SFTT0900 /FontDescriptor 252 0 R /FirstChar 40 /LastChar 125 /Widths 220 0 R /Encoding 219 0 R >> endobj 99 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OPRSIY+SFTT1000 /FontDescriptor 254 0 R /FirstChar 80 /LastChar 121 /Widths 221 0 R /Encoding 219 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WBSPYU+MathDesign-UT-Regular-OT1-10 /FontDescriptor 46 0 R /FirstChar 40 /LastChar 61 /Widths 227 0 R >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SIQWXB+MathDesign-UT-Regular-Extension-10 /FontDescriptor 236 0 R /FirstChar 82 /LastChar 82 /Widths 225 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PBZZMW+MathDesign-UT-Regular-Symbol-10 /FontDescriptor 238 0 R /FirstChar 0 /LastChar 110 /Widths 231 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DAMSBZ+MathDesign-UT-Regular-T1-10 /FontDescriptor 241 0 R /FirstChar 47 /LastChar 93 /Widths 230 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SLJMNC+MathDesign-UT-Regular-Italic-MathItalic-10 /FontDescriptor 24 0 R /FirstChar 11 /LastChar 39 /Widths 226 0 R >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /BaseFont /STAREW+MathDesign-UT-Regular-MathDesignSymbolA-10 /FontDescriptor 244 0 R /FirstChar 82 /LastChar 82 /Widths 224 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WHMTSE+Utopia-BoldItalic /FontDescriptor 246 0 R /FirstChar 80 /LastChar 80 /Widths 228 0 R /Encoding 217 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PHIHMC+Utopia-Regular /FontDescriptor 39 0 R /FirstChar 8 /LastChar 252 /Widths 232 0 R /Encoding 217 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /INZWOQ+Utopia-Italic /FontDescriptor 27 0 R /FirstChar 44 /LastChar 121 /Widths 229 0 R /Encoding 217 0 R >> endobj 180 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ARGWOI+Utopia-Regular-Slant_231 /FontDescriptor 249 0 R /FirstChar 67 /LastChar 67 /Widths 218 0 R /Encoding 217 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CALDFT+URWClassico-Bol /FontDescriptor 256 0 R /FirstChar 2 /LastChar 121 /Widths 233 0 R /Encoding 222 0 R >> endobj 98 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MYFJXP+URWClassico-Reg /FontDescriptor 258 0 R /FirstChar 101 /LastChar 120 /Widths 223 0 R /Encoding 222 0 R >> endobj 12 0 obj << /Type /Pages /Count 6 /Parent 259 0 R /Kids [2 0 R 18 0 R 96 0 R 128 0 R 158 0 R 173 0 R] >> endobj 181 0 obj << /Type /Pages /Count 2 /Parent 259 0 R /Kids [178 0 R 205 0 R] >> endobj 259 0 obj << /Type /Pages /Count 8 /Kids [12 0 R 181 0 R] >> endobj 260 0 obj << /Type /Catalog /Pages 259 0 R >> endobj 261 0 obj << /Producer (MiKTeX pdfTeX-1.40.9) /Creator (TeX) /CreationDate (D:20110303180320+01'00') /ModDate (D:20110303180320+01'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.7.3235 (1.40.9)) >> endobj xref 0 262 0000000000 65535 f 0000004356 00000 n 0000004244 00000 n 0000000015 00000 n 0000309364 00000 n 0000308853 00000 n 0000308000 00000 n 0000308166 00000 n 0000309019 00000 n 0000308683 00000 n 0000307667 00000 n 0000308328 00000 n 0000309703 00000 n 0000007123 00000 n 0000014643 00000 n 0000026532 00000 n 0000037797 00000 n 0000041736 00000 n 0000007008 00000 n 0000004508 00000 n 0000307830 00000 n 0000308505 00000 n 0000008230 00000 n 0000008455 00000 n 0000155051 00000 n 0000013607 00000 n 0000008490 00000 n 0000213479 00000 n 0000011993 00000 n 0000008659 00000 n 0000008808 00000 n 0000008830 00000 n 0000008915 00000 n 0000008999 00000 n 0000011697 00000 n 0000154984 00000 n 0000213441 00000 n 0000016274 00000 n 0000016494 00000 n 0000188091 00000 n 0000024918 00000 n 0000016529 00000 n 0000023304 00000 n 0000016887 00000 n 0000022266 00000 n 0000017149 00000 n 0000142020 00000 n 0000020652 00000 n 0000017318 00000 n 0000017467 00000 n 0000017489 00000 n 0000017574 00000 n 0000017658 00000 n 0000188052 00000 n 0000020356 00000 n 0000141967 00000 n 0000028115 00000 n 0000028326 00000 n 0000036183 00000 n 0000028361 00000 n 0000149657 00000 n 0000034527 00000 n 0000028532 00000 n 0000028683 00000 n 0000028705 00000 n 0000028790 00000 n 0000028874 00000 n 0000029276 00000 n 0000029667 00000 n 0000030060 00000 n 0000030452 00000 n 0000030856 00000 n 0000031247 00000 n 0000149604 00000 n 0000033945 00000 n 0000034042 00000 n 0000034139 00000 n 0000034236 00000 n 0000034333 00000 n 0000034430 00000 n 0000038601 00000 n 0000038812 00000 n 0000038847 00000 n 0000038869 00000 n 0000038954 00000 n 0000039038 00000 n 0000045868 00000 n 0000051386 00000 n 0000056998 00000 n 0000062624 00000 n 0000069089 00000 n 0000072850 00000 n 0000076601 00000 n 0000080409 00000 n 0000084300 00000 n 0000066421 00000 n 0000045753 00000 n 0000041966 00000 n 0000309532 00000 n 0000307504 00000 n 0000046528 00000 n 0000046742 00000 n 0000049771 00000 n 0000046779 00000 n 0000046964 00000 n 0000046987 00000 n 0000047072 00000 n 0000052136 00000 n 0000052354 00000 n 0000055383 00000 n 0000052391 00000 n 0000052576 00000 n 0000052599 00000 n 0000052684 00000 n 0000057762 00000 n 0000057980 00000 n 0000061009 00000 n 0000058017 00000 n 0000058202 00000 n 0000058225 00000 n 0000058310 00000 n 0000063358 00000 n 0000063577 00000 n 0000063614 00000 n 0000063637 00000 n 0000063722 00000 n 0000089939 00000 n 0000088072 00000 n 0000068971 00000 n 0000066650 00000 n 0000307340 00000 n 0000069788 00000 n 0000070006 00000 n 0000070043 00000 n 0000070066 00000 n 0000070151 00000 n 0000073539 00000 n 0000073757 00000 n 0000073794 00000 n 0000073817 00000 n 0000073902 00000 n 0000077350 00000 n 0000077565 00000 n 0000077602 00000 n 0000077625 00000 n 0000077710 00000 n 0000081150 00000 n 0000081370 00000 n 0000081407 00000 n 0000081430 00000 n 0000081516 00000 n 0000081601 00000 n 0000085013 00000 n 0000085228 00000 n 0000085265 00000 n 0000085288 00000 n 0000085373 00000 n 0000102136 00000 n 0000089821 00000 n 0000088319 00000 n 0000092032 00000 n 0000092252 00000 n 0000092289 00000 n 0000092682 00000 n 0000092963 00000 n 0000092986 00000 n 0000093072 00000 n 0000093157 00000 n 0000095856 00000 n 0000096124 00000 n 0000096369 00000 n 0000099755 00000 n 0000105179 00000 n 0000105061 00000 n 0000102321 00000 n 0000108367 00000 n 0000116293 00000 n 0000124210 00000 n 0000108248 00000 n 0000105348 00000 n 0000309185 00000 n 0000309815 00000 n 0000109396 00000 n 0000109616 00000 n 0000114678 00000 n 0000109653 00000 n 0000113063 00000 n 0000109808 00000 n 0000110170 00000 n 0000110193 00000 n 0000110279 00000 n 0000110364 00000 n 0000117313 00000 n 0000117533 00000 n 0000122595 00000 n 0000117570 00000 n 0000120980 00000 n 0000117725 00000 n 0000118087 00000 n 0000118110 00000 n 0000118196 00000 n 0000118281 00000 n 0000128492 00000 n 0000132150 00000 n 0000135776 00000 n 0000128373 00000 n 0000124423 00000 n 0000129079 00000 n 0000129306 00000 n 0000129343 00000 n 0000129366 00000 n 0000129451 00000 n 0000132706 00000 n 0000132932 00000 n 0000132969 00000 n 0000132992 00000 n 0000133077 00000 n 0000306961 00000 n 0000135937 00000 n 0000306655 00000 n 0000135960 00000 n 0000136495 00000 n 0000306438 00000 n 0000136766 00000 n 0000136865 00000 n 0000136890 00000 n 0000136915 00000 n 0000137106 00000 n 0000137189 00000 n 0000137212 00000 n 0000137541 00000 n 0000137682 00000 n 0000138355 00000 n 0000139311 00000 n 0000139803 00000 n 0000142277 00000 n 0000144257 00000 n 0000144515 00000 n 0000147350 00000 n 0000147728 00000 n 0000149889 00000 n 0000151917 00000 n 0000152179 00000 n 0000155317 00000 n 0000159280 00000 n 0000159537 00000 n 0000168307 00000 n 0000168540 00000 n 0000188587 00000 n 0000197050 00000 n 0000197289 00000 n 0000213799 00000 n 0000248251 00000 n 0000248682 00000 n 0000275982 00000 n 0000276258 00000 n 0000296853 00000 n 0000297212 00000 n 0000306200 00000 n 0000309900 00000 n 0000309968 00000 n 0000310021 00000 n trailer << /Size 262 /Root 260 0 R /Info 261 0 R /ID [<63823233E62BEE6E1B505DF73B52FFC3> <63823233E62BEE6E1B505DF73B52FFC3>] >> startxref 310242 %%EOF octclip-2.0.3/doc/octclip.png000644 001750 001750 00000005727 14332015454 016101 0ustar00topotopo000000 000000 PNG  IHDRdd IDATx]kPWZ*+ 3"h\T2݄l*4"Jma~j&1"KmER 30883sLϣo [>q/&e@lCC08BFL1::#twK,ҶlAEHۓ'8c8,/…0>$$J>YXPuŎ֯Զq#]ۂNVJ 79h/Y p++*:FEaDZ~8duuFc''KJBF_Їf!㏡UPlߎ0,Am&kmxL+VNON'KxA؊X[Ž vlmXZ}{> ۷|9VW ER`ֆepW'#ޮ^EزeإKKIx<-wAN7d圇Lb'O6@Y˂VsVb2S L)S`b 턩T؅WUn&NEF,AG)N:rĥI>}Ew -L$xzI"Q\UW{UOYՕhtى ״Of|믳O{d%'Cp1GghY[8-Ÿ!9CY z%/=={(fX 6mcܹ8FUUQ`6f\^?*xLmUVJd-25ACB deb=BΜ}rkv6j6Ld56_%&nkw֭x E6s碶իT_BK,?GזxW+7!Vc'OCO'<5n*.^a !5/*K;yЀ0&gTæ *s'ܯaMJfr%nOXyN}V}"F4u|u hl9~zVTc,7zZ[]+ VQSJf- +_1᱒p?aI!Ma0!'Q Ko,(hbN[_8` dGϲXoA.\'~MMߴiXWbXݐG={0ɫvlY<;[m$VI0^3ACEVpˉPKDBBBBBBDVy$Z[%%1mdz<<@pfQP0m}`EZVVi֎CX]!SG +76"Q `i_kPRRRR|h;wFAĭDK~CHsɷsi68R:#l. ٔRϧ[>JJ8?cTQP|Q׊~%T4MjFI, N0^7+6{];>贓s,Ht:C9D]XwQcu:$g\?GW)8WRC4~&)xLX:cc~(6̙,Co$euebGF'Coxrr`N'XI)om[1'=1!=Q@kV onktA`kūPRRRRUfK%I\M&93vF]֭~ܔChav6ecdi)]? !%/#]O= ?AcjA~ 1׋JE1M=ÌCޚcH9r7Z*Ɛ(Ɛsc1DK/D'IO8^H ќGqcՑrcl+'S=y")WZ*8 |Y_ +S3cb𲆕CLr٘BBBBBB=r1[jFtRb1"ɏM$j2IεkKMX[RO>A) w22QL{=S,.RͩؑW[j*M|w>jo[DӴ4 j;v!j? uu<ƕggMXj5QUc0 M{次!S⭷7(>&~ܚ3&YrE;w#ދst!$i+%W.e[3rZN E>%:V(nڵX6c6Oh1k֬ hdoS:жpY}ѓr(*yyXɲX,YЪe$KFm6 EJIENDB`octclip-2.0.3/doc/martinez2009.pdf000644 001750 001750 00002302752 13060023453 016570 0ustar00topotopo000000 000000 %PDF-1.4 % 190 0 obj <> endobj xref 190 187 0000000016 00000 n 0000005265 00000 n 0000005516 00000 n 0000005542 00000 n 0000005590 00000 n 0000005625 00000 n 0000006088 00000 n 0000006196 00000 n 0000006306 00000 n 0000006415 00000 n 0000006524 00000 n 0000006634 00000 n 0000006746 00000 n 0000006858 00000 n 0000006969 00000 n 0000007080 00000 n 0000007187 00000 n 0000007344 00000 n 0000007488 00000 n 0000007638 00000 n 0000007791 00000 n 0000007940 00000 n 0000008076 00000 n 0000008210 00000 n 0000008345 00000 n 0000008424 00000 n 0000008503 00000 n 0000008582 00000 n 0000008661 00000 n 0000008741 00000 n 0000008820 00000 n 0000008899 00000 n 0000008977 00000 n 0000009056 00000 n 0000009135 00000 n 0000009214 00000 n 0000009293 00000 n 0000009372 00000 n 0000009449 00000 n 0000009527 00000 n 0000009606 00000 n 0000009683 00000 n 0000009761 00000 n 0000009840 00000 n 0000009919 00000 n 0000009997 00000 n 0000010074 00000 n 0000010152 00000 n 0000010229 00000 n 0000010307 00000 n 0000010384 00000 n 0000010462 00000 n 0000010539 00000 n 0000010617 00000 n 0000010694 00000 n 0000010771 00000 n 0000010848 00000 n 0000010926 00000 n 0000011005 00000 n 0000011084 00000 n 0000011163 00000 n 0000011242 00000 n 0000011321 00000 n 0000011400 00000 n 0000011479 00000 n 0000011558 00000 n 0000011634 00000 n 0000011712 00000 n 0000011789 00000 n 0000011867 00000 n 0000011944 00000 n 0000012022 00000 n 0000012099 00000 n 0000012177 00000 n 0000012255 00000 n 0000012331 00000 n 0000012409 00000 n 0000012488 00000 n 0000012567 00000 n 0000012646 00000 n 0000012725 00000 n 0000012802 00000 n 0000012880 00000 n 0000012957 00000 n 0000013035 00000 n 0000013112 00000 n 0000013190 00000 n 0000013267 00000 n 0000013345 00000 n 0000013423 00000 n 0000013501 00000 n 0000013578 00000 n 0000013657 00000 n 0000013736 00000 n 0000013815 00000 n 0000013895 00000 n 0000013974 00000 n 0000014053 00000 n 0000014132 00000 n 0000014211 00000 n 0000014290 00000 n 0000014582 00000 n 0000014890 00000 n 0000015538 00000 n 0000015697 00000 n 0000015842 00000 n 0000016407 00000 n 0000016640 00000 n 0000017046 00000 n 0000022066 00000 n 0000022480 00000 n 0000022896 00000 n 0000022973 00000 n 0000029422 00000 n 0000029950 00000 n 0000030340 00000 n 0000031317 00000 n 0000031632 00000 n 0000032321 00000 n 0000032572 00000 n 0000032896 00000 n 0000035121 00000 n 0000035373 00000 n 0000035724 00000 n 0000035843 00000 n 0000035954 00000 n 0000036676 00000 n 0000037650 00000 n 0000037814 00000 n 0000038219 00000 n 0000042100 00000 n 0000042435 00000 n 0000042807 00000 n 0000043012 00000 n 0000044018 00000 n 0000044177 00000 n 0000044395 00000 n 0000045350 00000 n 0000046326 00000 n 0000046678 00000 n 0000047645 00000 n 0000047865 00000 n 0000048612 00000 n 0000048834 00000 n 0000049167 00000 n 0000049259 00000 n 0000050337 00000 n 0000051291 00000 n 0000051612 00000 n 0000074605 00000 n 0000087701 00000 n 0000087936 00000 n 0000088147 00000 n 0000088592 00000 n 0000088801 00000 n 0000088854 00000 n 0000090084 00000 n 0000090322 00000 n 0000090656 00000 n 0000090751 00000 n 0000091031 00000 n 0000091240 00000 n 0000091525 00000 n 0000091586 00000 n 0000093112 00000 n 0000093387 00000 n 0000093762 00000 n 0000093831 00000 n 0000094206 00000 n 0000094275 00000 n 0000094332 00000 n 0000094487 00000 n 0000094570 00000 n 0000094655 00000 n 0000094753 00000 n 0000094847 00000 n 0000094940 00000 n 0000095071 00000 n 0000095155 00000 n 0000095251 00000 n 0000095354 00000 n 0000095485 00000 n 0000095594 00000 n 0000095690 00000 n 0000095780 00000 n 0000005096 00000 n 0000004118 00000 n trailer <<3E295FEAD4B0704CB34E7E388163FC90>]>> startxref 0 %%EOF 376 0 obj<>stream xڼTYOQ>ӍN)آ( PWDRpdRp"BiRK)[$-h|0$$[T1Tc 1>1`{h|K9wf@\)$$QHGSdxY Δ<*AHϧ>?eё76hsۺN4qkjrz7437\kֵNG?rnk&;zڧf&&=^|Dǎ1:]}&{'1szfg5Q;,-`UL<.V/l2}%ݳ>1a%cɌ<Ꝿ!w<4n FkQ͛6B4Mf0sgn;h L6=E'MOO͈m@VkkM׫ct5e(V[MMV ]QX݀Uj~IauXPV2J.&46+7K#*XuPnqɐaY`W"\,%tN $;&HP  <-436wb,-.#DʄkBNҀ?z# cH HWJgn_WrIGG; +kqZ)h(X$Gljn>/Size 190/Type/XRef>>stream xbbjd`b``ab endstream endobj 191 0 obj<>/PageMode/UseOutlines/Names 194 0 R/Outlines 359 0 R/Metadata 185 0 R/Pages 184 0 R/PageLayout/SinglePage/OpenAction[195 0 R/FitH 555]/Threads 192 0 R/StructTreeRoot 187 0 R/Type/Catalog/PageLabels 182 0 R>> endobj 192 0 obj[193 0 R] endobj 193 0 obj<>>> endobj 194 0 obj<> endobj 195 0 obj<> endobj 196 0 obj<> endobj 197 0 obj<> endobj 198 0 obj<> endobj 199 0 obj<> endobj 200 0 obj<> endobj 201 0 obj<> endobj 202 0 obj<> endobj 203 0 obj<> endobj 204 0 obj<> endobj 205 0 obj<> endobj 206 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 207 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 208 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 209 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 210 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 211 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 212 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 213 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 214 0 obj<> endobj 215 0 obj<> endobj 216 0 obj<> endobj 217 0 obj<> endobj 218 0 obj<> endobj 219 0 obj<> endobj 220 0 obj<> endobj 221 0 obj<> endobj 222 0 obj<> endobj 223 0 obj<> endobj 224 0 obj<> endobj 225 0 obj<> endobj 226 0 obj<> endobj 227 0 obj<> endobj 228 0 obj<> endobj 229 0 obj<> endobj 230 0 obj<> endobj 231 0 obj<> endobj 232 0 obj<> endobj 233 0 obj<> endobj 234 0 obj<> endobj 235 0 obj<> endobj 236 0 obj<> endobj 237 0 obj<> endobj 238 0 obj<> endobj 239 0 obj<> endobj 240 0 obj<> endobj 241 0 obj<> endobj 242 0 obj<> endobj 243 0 obj<> endobj 244 0 obj<> endobj 245 0 obj<> endobj 246 0 obj<> endobj 247 0 obj<> endobj 248 0 obj<> endobj 249 0 obj<> endobj 250 0 obj<> endobj 251 0 obj<> endobj 252 0 obj<> endobj 253 0 obj<> endobj 254 0 obj<> endobj 255 0 obj<> endobj 256 0 obj<> endobj 257 0 obj<> endobj 258 0 obj<> endobj 259 0 obj<> endobj 260 0 obj<> endobj 261 0 obj<> endobj 262 0 obj<> endobj 263 0 obj<> endobj 264 0 obj<> endobj 265 0 obj<> endobj 266 0 obj<> endobj 267 0 obj<> endobj 268 0 obj<> endobj 269 0 obj<> endobj 270 0 obj<> endobj 271 0 obj<> endobj 272 0 obj<> endobj 273 0 obj<> endobj 274 0 obj<> endobj 275 0 obj<> endobj 276 0 obj<> endobj 277 0 obj<> endobj 278 0 obj<> endobj 279 0 obj<> endobj 280 0 obj<> endobj 281 0 obj<> endobj 282 0 obj<> endobj 283 0 obj<> endobj 284 0 obj<> endobj 285 0 obj<> endobj 286 0 obj<> endobj 287 0 obj<> endobj 288 0 obj<> endobj 289 0 obj<> endobj 290 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageC]/Properties<>/ExtGState<>>> endobj 291 0 obj<> endobj 292 0 obj<> endobj 293 0 obj<> endobj 294 0 obj<> endobj 295 0 obj<> endobj 296 0 obj<> endobj 297 0 obj<> endobj 298 0 obj<>stream H{PT.,"\{ͽB!H 3*J Z\`eYv ! A|5$m|hLdPLz鴝t?;3|~w!5dMoHQgdH9ooXle1N̎! \o.$l_*+s<8<5'1'E+KBrժ_qd,%?95EGyJy q8EJeYbY8J!Hw&gR+\$KX! ;'!!!$$$ ÖXBv[vAD';+ d"#A#'x N_66&mvډ <.+ɣBOa`Ἠy#~_9N1N3t-E/[qqwQ|)ŮTk`hVhOT 6/jΔ : kV#KiMRwJV&R{3fUO_{kT5h1v4Y\T6g@^ECI875=:6=TYlZIœ.>&tQhOcPX;=^nH gUI,߅o4w(jw ֎'wkk=D8z0t 3 !bv^4yrم籉[BU"lln:~3-E&KQ4Y*ktFqLA:+ " ΑG&>GԙޑAE$A.#i?8ȉ j6lL4<}~hŚ$_emIﲓ3ӏa}]9?ƈJڊʌtCm}j(HxC']h11cF_@ǭZQ,+L/)(HfRoCֵUBr2QR--RWdp:iCV{ho/yAetxpBm!IIpHmE0iu@c!}?͆z;0Zz-Ǚ{i!}pŤ&㽺^MEco#GdhV_SD1'$n̻=:Sͣ'gob:t-v[VS•tP{%aẻxQr,#~F݋z.3` 1[bDϤ-ʘ8:3SUV4!@յ[c^@j0_FH@"P[ do<3}\ ;Ǧ yGi;m썽It4֙^*(ûwN_~8Nܤv ?(x{͒kbXS8+}jIV;\\*in^ƾK3==~lwCYJL]#m#N Q;-5{e0 5sbjo7 &~xI{% СlFF5 ûQBKkUeVvPj8i(l)9m\|g֞/vAGISl5WoyE7rAe8O]:{5EwƗG3xY__Qq!G=㾜~;|j e^ѩBMCPφVGhKU*5>::e׸PYS*H\eF9dX.dyg]n#ך,[V,'+9ޤnF]d0zY**LLd UsE; -Db}/aPC{ ö܎uY>ؑ{ۓ ]Z>>l@8旗 K0B*9B j_/+k^7"r߫<3 x6iõ<9y6//+~rjjj{BDwݒ{{VUYv|m (HEE^B + !! !@ >A-(8u\*li\s};_"wT&*ȥ$JY5\B%d SSZ'ǝ]LGv7V?FDž?BjZE<6lT{,LW RTfH ` ?,YΠqAL[K9ررRL!QJ"M:s(;28ek/acke y.s%Co>[_ce&j5{A^IJ"?;h6{ Px>@8CQ b1h޿0 O2==#3_z#b#r0'VɄ7}E .ǤEk;xs7}5\;G@3L2i C($Bݺdjw3O_ANpt䭁vʄ6r-߆߭8։ YdWH@Ju$KĉCe=Z+:*]qToj1Z|DjIdwl4@;ػA8em*a}0(t%%L-Q豯cA̠'-U&=ڼ9gH79p}d:Zk5ZgnH(= 4cr~EKM '7O.rLkWfKzOAw|=t3RD(PhFA:%t!jlQ+m 2gÈ!xwR,)+T~Zhi|1 F -Tն6j1%e,=Ɉ?@ +B.*[@mH=g ժֺRm\-ξ~i&~/Vq2?Q^`~x)*/)U)ZQ>ywS3xՒ+ALQWh!p~ZK5Ff|J&Z/~`֗[ L? ~յMR衭p/T g1Esb'$)`*e[<`Q,;*)ՙK URY9t6nAC?pҭTXxFGIdTW1&!(4V4kPTFV!ۦ)ϑG,uFAs3yv.7M9&(Yw- OLI sbzEjTbv4|oO߈W,t@TJjɆ=LjagEIa{2\ӧƮ0,Bp& ^vth0]=Wϖ͹'|˹.&nW:ًƁFZV,#DO;tch4 /)v AܾsGpm4O*/ >{~ k55$b3wҵb1R*D-Ve1WcϜGiݖgMMΈ'%|s h$^F)Q.7`4]`F@v)^l vk5ƦWHeel&س|ǹO3kYx짜R'<oeϪӲD;vldxxu!4n\;f}Bn_![B>JN˨7 }D\vNhFܴw4 B\;~ABmx .7Π;J Zuʹ>(p9. ? EE$dmf0r%U)b>Xx=G.YZC-C%pn>WNƟ Ja"0^ZV';Eظ_T11YVPjҚ+l j򔰁(Op$$ˆk~/=cLD "Temݺuڕ2a bE0<MI'y޼y\g59bQV3͙s#: `{9҇{^\"jFjރ0fj1rAnSiAV\YgnUZGQb5 A K]rJ@fO$G9f17*PS9Ɵݞ]bnϛxt%P}MNU7S RL :::|a1>E\qqX:ϱ~t`؅E֟s΁ 7 Wi d IU)J G jZI/ړa|¨%Ukl6pt\B03Cd;vܦ>Woԣ:^\2ABMf31 %̊=!-v1q.kP 9]ĀW26N _*'P4ɰ8`hDB>0#]0OK(e5޲ ) +@b#!lDMedU&Ri+IN p6>/o܇RRqvSA4@R>h[PqX§TZudC> endobj 300 0 obj<>stream HTRn0 [t-@2&tj%4E;J6gH8C64C8ih{7_w eqncTN/p-{H^c';dD!|~ZTy qK@> -N:֟0Ǣ3clTSPLp'xKLA4cg90<"R W\iG8LX1U>,jqêkǖJ>*URBJK ٵ4Nm2# mylx*[ c!~p? endstream endobj 301 0 obj<> endobj 302 0 obj<>stream HlyTS_//na}ޓ RekՑqCADQ=!B! H0İɾH"YYD\""Scugv sNC=}4Ěh4~>K7>rHKI3I3ϛ?7LFA ڕ#t-)$J8×FIyܽb_e@'ѩ"JwFqyB0Y(s%`a#b fg>`֩Ygc;'ux{66-;iG}+rF877N!NzϽ<cؗӜD&Lv[3O>WKKK-~aMYA(~'BEJ~ZU~HX1CF'> hE變{1A6?K f#A;㩚4cZj8 baZ1GSiu1}l%$yz`8:sazynhZP7UY'sOLWS;RJH`T*d"ViZ/G.ޝ ƣ#Sxq+7ՓwLbՠ7^o}fk鈡ݔQE|N@`ѓ CeLFLYd7J(ic$qgfJKA$dz۵[8)6\KMaR0XStZP$xYG譖 f>vV@|(}@Uz:-3-a;.E/en^NT=-ɂ x %=+F.miZK ymDva.^"49D 8т҂2R_u3%%jJB|,1JrFBB_|wr8c%?$6ZWRVB5wypBw3H?2a,yF)Wk n% }[t XhIŇo3uq7 |E HAƚimpE(w,{P *&&[Ah,WرҊa}¢ac@&\vJsw~9p"wr'Vq#Q4gP;dUWHZGE?ޅ怍0"hFy핶gs\y(o8&+޵7φ{` ^02)ߋ/ \RpBp|CrjI;|<=|G(y$1'As1>.1jfKN[$3)HCU~P^:y9缌Wh`jG_hh nUԈ2)i9HIh$bwNU5jNЦxwVk:ʖAyQJ?:kk뮤WdpĦ6Zߥ/7R;\1tuxm3TBWwng8h-ܑLYsz)Ѽ|a؎P-%]";bsۆmc9Nj/TKT(upH5 `2EK^bZA(Iɀ&XYLUȌ6@eBJIC_j;h[3s D1`48He 26ǞHz)-#l&^Л = 8L;m-'Ȗ>UHLWi0$kI,^u3IOߦ(u eRW2F/cĥ4]nml@ ?Cw6\ ݙo,`H;'̹C0@(P,ctDgJL؍w}/t4:( Z3@734&FsX_ u}8ԓYVG$Q_XĻ'$En_?BNI^ '1%L6% bE0S]N`WP=Hbpns9LqT/gyn V==ݴ׊ 6+xmX]c~Ȍpq6+Z&\=jK.esJ<¦>9d#0JǗbfĞjʠs'ĜJ\4q+Ԋ _Af#6 ý3zrph=BWLdj qPΦ`>ar&/_v:v:֐0v[p]"[]ji5]>YZăgfqf%ȥ6)0{F@.ښ]^e>|hΓ=nvF: X(+pMd- Bgpo"?vH~ϧE:,qȗc}㍬l0D%!i_JEAӆB`ng`D. endstream endobj 303 0 obj<> endobj 304 0 obj<>stream HTn@ E|X$Q,PfI0"_ֵGM `N8A8ܼAYPLi~r t'쏶("A:g7;{Y}^H8ݜl#{k#.wZGW"*+%mEY[U()>+wbf!NI;sr b-ULWXסvK8aBCgv5q\aKZ's_I"!ee{1 lJCNܼαrǚ8?~ endstream endobj 305 0 obj<>stream HU͎6zS44޲"{EFuTX9RE60F}?M1#͡$RJkb_ϣ3Z.ZC.hX/Cr  .|\ecV߮49L3{ZzޯNmш. hm6] ۋk0F\'sQy)P25 JU Ī-fZx*<߆i2̧3PDR<#J&AJgjZK2eX>RzܔOΏI% [ @, ̌#R*P[h -KWZٕZeT(c~?l0A(W};nӻU7Tmk1e f1E<&Δn<,^ )zPt%B żq˪ ay|从MK:"䜘<6L$?w%0YͺZgC U+D> endobj 307 0 obj<> endobj 308 0 obj<> endobj 309 0 obj<>stream HTP=o 9Ueh2C͵;&Ej"dȿ/U@~i۟{k7?hce^Dh,TGPF=ʿözg\НW;R}|FbX mM 5p/bBI]6pq.NHŽ@CQ\𫌕= 3>?EYK]c]Y)m+#.%Hj>_v ٥#? mb~" endstream endobj 310 0 obj<>stream H}TS/'Γtr{u3-2aVB !!7!$@K^$Ix_2[K}sjYsf۝m8-t/s~' ƢSweʋo{JRF-bU {W%/ iyj -mZH=8*ߔhYF,Qg!X&ЛwؚH`RHHk4Җh>-dԌhy(KR)3EL9ktHɈet:޲iD3%V Te|VDGRF )EZ&WE^Ĉ~J"g=]JTR-]%L> }yV|-JZ%bѬH<+# `ئ, Ò1,R1,Fc=,2(nTC?=SWg4v]B=9sxAN|l _M'Q;K!/W]wouB:z&hm6 ߀5*Z.̇+a*<((/~ _/PtFHef3g/0nхשUkvk漛F9#:ʱʁTëZܽM3xΪdڎ{~Ge0jo`و){9ɝmہhyt^8ܿz)u&9LGh5~~EH%K>;7I-dCzlH:)Svf3 |ˁ\}(Sx qo`820s'ty MwϏe2T.Y/re0gJ4YGE 崶C]c9[+HVN'ègf?OV8vXX|z.gl3ڊbZ$@5{s# ya!>>}#b[ul`[Ub.*H->P,"&/j[l--IuG1bՃξf/sr Ke/М静 I'FzCe"RGrx.G늭>h15UUV _FxuçwuyA_V d52sCLڍnYLx@o%_Km@$^m53_"n**JQQꪢs[qbNEUoNBp}]?5=I}/>l6|ف|ҧ=~O|^kQR) 眙Z΍ӡq_Yjlt={X&I91&}x-M?C!&ޖAqoÚ0ulRiȠZGD\ZcYJ$kY csfXVTxXQI(ݕ8E 8N;I*,JY]@8YFgrWa53=6>:t_k Ŋ2Ŷg,6WIɤɸ&O_(9P^x[*g=M3iWc9J]+'NCG]#iuzgÁC䉑^ns4"xǼ2 %ńZMhl"J*L}vר鑛S(d % Uqڬ[hrLx?;=݁Ću|idjsKa}|s9 >> endstream endobj 311 0 obj<> endobj 312 0 obj<>stream HTn <]N:&EEҙvp$ ·/4]T?Z(.8C8-JCTbfCc;efjݍPi+}tJJpY TH?=78j $~oƣ4m{򰯠̋ Pk,_eagYs8%.mb 8<9W.۔ngREt$H#*SḝXuOP"Jh(jGP endstream endobj 313 0 obj<> endobj 314 0 obj<> endobj 315 0 obj<>stream HP_HSq˸eAd:m QLwupk`hB %/=se |T|$$8[G{驧8pw( zWl'ܾ!w4_x$В_/:PjI̟x^$:J s/{naߐ,޴X,CcʊP$11j%_%R􆂊ƌWVEYD[0(zFGq#ˑ i:C(&=dYVyxz7V BzCv:JtŖ:`]=ZGzhR/D8 ]$H-HX! ?A61WN*4ʆ eP}wz%{^^X/2kŔ04cXmBLqp7t(1X{)[+F.Z-, tb5C5L0c#- L{>stream HUˎ8+tX"ܲr"m#m$QG}H{l0ꮮ4yƳ+=/:k>ٗ\3GB1RED]p-yaك775%NPkk f˹.$[gi1 "*Ol\3QEh IŶӶޠzVk}Q\B3IN͒}7Mx)UJ#޻1q2,L~vk*jvT[b %w|!]%"J)3QBTTMrՆ Viw}[ٵksc n$1Еy)-crSθ?1FPBxF0wӀ M@ǐ1BuMxm-bB^'=g<^ʭrа ;ee͓D^0&&arX.B^#8~L`!ۜE3 $g/*k1F+q4*tT+]"G[ДZ\W0Ƒ!~\C*n) 0erklOUƸ4&td*lxpK;-y(hFhp ƥA]Q OjGA-G4 i)Rս TFXU-d;1% mp 貘btsv7M|,I+">HH,$I/҇GGl4:ASwi 9n|) S8%Sq}.m{R9|/\A^ h> endobj 318 0 obj<> endobj 319 0 obj<>stream HUkPS>A9bPq99]ݮ7"RTPV&%pI A $ , hEP*]mƙv?7~|p|oi*8$ =jI>7~-#Y{ԕ{GAwH@ 4~1pi!fM7pz[@  Ր# 2}o>S裵p[̄ LqYTbPo, K]BqT4:ꬶ$I4A*ĄrSrC濼=~7ykvik}'F[ZC5mE;ԍknYXT l7 .y$@wCwG̾Ag[. &yjYDQRN&#H/J^\HޱH4\^m fJ+P1~7I)cyP2pŌ'Wpxߺ(m<շl(#;>PH7H3[9Lј5kc$'-JF>)ur*\@P.; W&nUص??ݠv?»#~}) $4؝O~HzK00YRYͩEZrZk@ZgJE}?i?JO syye ]YJ\*HD kwҙ 2@PK)_<2qEZcYi&PWד5g؋c܏VVUa -϶`LmF%_1bl}U˷]Y@(O O5ә Ik uzJ^C2-m"

F](>=piU_eh؀iPcXPuOA 2=\?LO1W2@Dxɔ?>dž eLjKV[>ST,(ei4`Rܲ`܌hBeI?u{l B$a}2-qu$oiڌ4wLǐh0Eo2ZFce 'A |&IsZ .R?U6S/xl v %_:rC>j)vyi|z􎇉J[[+J&!!" f 3G}B+g+KOgJ/DvdT&BcXsA5zeXpȷ+8_|9|ȏexc^W&%yEeTЪZ[\Rv͛SZ_"516og'68  !nV"-!Ёᰍ9`9.v&ĝL}L6v>4.d2i}~pxF9w Z*sxÄ~K_70sk?)ӎE> 8X{o({SS'xuwFf.l?^|(Q蹸+ ӰD42_Xׂ:LIڔDHCu*@^t[ZhG`b1ca* oug8bR֣ckjObbJa@\ <؉M,xrn*ppzQ<,teth½jeB:&j}-3\KcaH/C= bnГtF?B/bKp>__fغ pSL)ff5l*X!= oof<"neA ?jSrynyX ~C#+3}GP_sж?Q/֡](tU\[/c޿-D4>CGs4rJ?E pkΧzo ذ< chIKzdWij_eٛJTH4樀Ǭv3'67gPog0UM&h'?7- k@ɤ8P`1Fd¸J%/F+^>Q1szek'ԵZV> endobj 321 0 obj<>stream HTQn {L6~i+Ї4wש#leMՃ.fXIq~0yZFh2Ht^UQY^| O %~s^v}rus)<{Z#hg|8"NSU2)Y <*^)$O y/LI`/m'ʌY<*O=γhQQF"'Jѣ$I=(Bm8]򿥦W|Bn`v}G]Ɛ endstream endobj 322 0 obj<> endobj 323 0 obj<>stream HdTˎFWKz$bp90H" _zR$dT?wr%UBk[f_i߹aq๪B3R\y&Sl8xJi:\Jث_e_"~sᄕQ|o\ 54]3175[GN0A%]{sZ̳*͋o0 ZxfHAmEd?I6r'(&*~N?'} LpI`AXKeu[u)(6SdZׅPe*> endobj 325 0 obj<> endobj 326 0 obj<>stream HU6RS %2]T]By6YtDFnfI`'.+.wgggyj-Z%[m~|Q!Nͺf|kl584,wc)HOw=̾?fO {vI~gے}fĭ.)8J#^=z#2HdX>~r#:8c8$[/BF K!aI͐p˰/Z+ 54u9Scl)6$ 0hX#G#,.x0Qt:V>Vh# BKB)>ꧯ<uhb8OeFF:n[P)S43hKa6ētR ~5&?Tӱ-lPDh2RsWK)VV~$N3a`XZc$d{'TcZ;uOBqSqBuDgO$m*)*Phz*خ.=Z6ɊIF A\KG"1sR@aqDXqA|JS(V&j2MK].U\B cii}Xa2j8Ua/Kq^ Zj˪ C"hX |( 9Z-RVћF>w+ڼ>赩c/w%Muu9]]Tflz3X3^4w<]u8: agp2}#-£ǁ2;P;'[?[o,.Zb@V{=nS*W=ƔED#ݵwo` endstream endobj 327 0 obj<>stream H|UMo6WHoREQ@ك֡mmmɕ}CZX>ə7}b+miDԏ鑞0l7~V]a%Ww-UJ 4pEdiLݔSXSZ6ǔcW*[UJr4?scm2ԉK"r9~A$ [mUVtN%c,4P@URh"HIxhw{l4$u)B|I35R;Åw=kОNm 5ӈvW0WP5Rm?Qn8Җ+RpSyȄFV }(hD<ȁWE!c; oXߍt’qS{@QvMۍS9HfK%jdcsxC\d=3γߚ pAy5K7-4]hqwZEŲJ|bp6{`SRH)ǿ] ;+Vs|J4*IsAp%I7V9.)Žpu-!b=|րsL! ?wvO':c6v@~!A#WSё!.zh픨 p KVۛ4LлuS!|1w1JJ`w> Q~ѭ(DP$јC:cMt-vf3]m ʲ1pc²#,Y_Zdvqv1zCFc 5乥~ 8ahpl#Ȫſ}Jܭf%ry_%L[Ǚ_ۆԑ3S( 0 _03Khvx_$[fT3D-m`Kd L1c1& { endstream endobj 328 0 obj<> endobj 329 0 obj<>stream H|UMo:WH1/I!Ȍ-@ IN?R}r;;;ytslZZ/aN,QҊ}~BkEyU6ɩF<i me# eyy>=]*E'YvP"?m&CaU!Fv[Y9nX x5"Nsl.㢃xw?[Hҫkƀ^Ka4h]zVg0V-؜#h:1pSF35[" ŷGwD7UF̧v?Z~ KH'.$*,<)%bjm85g$J*t_wL[Qq&bcxR+ ]cV5hߓO5GyB{_k>|+:xP XqaxPO9jw@i<y 9^#B +,ub:ȥk2ҷ}w:u_p- K: @1BƎ> endobj 331 0 obj<>stream H4_HSqnWն lj>5"lQke Y{YN}Eja&0Mi%@ν&)9(FABҪEƻZm4Tæ=h-a;%I*TĎ"%Bǐ@H(EJtQ- _/$pM\b \ȑ}ID`#SR$ZVU S+eH0ąr80zmQ33̘o^[j)E@r/N4i+d x> endobj 333 0 obj<>stream HT;o w~ō:`XU$ˋHVuڝEa<ߗw/mSàt8 J+A*7-bhH@]w+ά|,:NvW b7N=4 q p'"Ig[i#q\zD:4Zqw$GEUccdWE H~kuUnmr̾h}h8*!? endstream endobj 334 0 obj<> endobj 335 0 obj<>stream HtUM6zС(H`(d "AksmhHrWvb yfTZx[FUM|x`mZ Zh.Kaqmb\qca pГtVMp !*ęĕD^BC_]ȄVzѾD;a䊬?B˧ΨOp%E{r}]WJHY]eL끭> 뉠Ԩ"&PPRϱ?aM6j@χ-$ZP97 6Bئ"+WYVQ6`%!gc/hts(sm܂[M)%s a}\7[sѹlg:W}L;f #r犓9kڪ@yhX$yɂhklAoC΂U3dswÜ҅q:WCgoB29>%,G )vIR,^uN_B{vi_C)1kk{z>[{Z{ TA1\3uJZL64^i9 %:Zx1miFv<w@ endstream endobj 336 0 obj<>stream H|Un#7r!XHDp.llFG@&HC8zD#jH<$⢚%bUi'} )ogz:Y=]qZJad䧛}mq/Rw@͆>4o׷ÞVHfN2L{Llu&0ˮ=!<)4b&\ZgP\SN07$b2ʐ XU.@N՟f-PDL, l[`;.Lt=~.h"ccŖrE<`TUV?-q2ǢbC:pR^lĠB Uic`^UI+[6Fw0xCLvSD'qHLʈk, 0ܟ珏벭ke;mX'z2Mv>0<3+G!HQuL?D\ݲݭ{n^89n&>R/l mE8;LG>{kS#JU\7ΨK(^+~:BC%7D+AQj[Cnv)mLxz)I?]2@huLEpll|_AslQŗEעYQ@BE%"d)!J쑧U%$X~$+BA"EzIYMg/ $>=798TBJ2[lYdy7ՊF+Kee1RL`À֑}C2?oMn[OG^8U`LhfhMbqm2Qc+͊~ endstream endobj 337 0 obj<>stream Hbd`ad`ddqvL)ML Jf!#wʯvb`bd<9(3=DA#YSTDIKii\Y\[_T_X2X!(8 (ZYPRX_RY讐_ W\TXZp?02t20322 }U%Wv>XN endstream endobj 338 0 obj<>stream Adobed        s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?+.i^dƪ/t;xnkgA9&YvQb*U+*u S >jfV2D^F֜.8h3t:^q\$uxb+Ĉ\oPVI*5by@ut*Zkewms2zC,r:*3Α~Z3jM{]RHϥ.V@xzETb\Rx-nb=,-op@Ynn42*LWޓ:d+oiEİX[O8idvpVH"4fQF۵H-=;Lh{roA<$щZ%C%)wX`O+.-na~]G5E`n5f>KLooSM *d<} [-[wz~^^be/b'¯}XK-\SMѲXsBI*p쎱QeuqGZêZyhRE2QUa_i뾢T+μi]⯟6nfR̗Ge5Zm&Gyg d4(-J u4sZ6qtpZ5 -=.OhӘуb̾],]#].Nvlqo@Mso Nr8+GJOL4-EY ̌oũ[jLĈ٤<7z7M[]%浰4TjU.gVq Kv//9H#F!DJu]Υīc/ulY Y!ti^*Uy+5dZ:8fM5++ەD*EeAw+ʚƼ!ӭbRy]~-$<5}C 0%f PL4?/|}څƓj]9&K٬ńoADn'#*4/y>bnt.kwb;Z44馚QNL0漸Liw~jQ!o5u)fϙ B8ͮ,X#-E*o^@ P^Cy~S(=w^`y"ӮJмfu^1GS|'Kvsgp8y%f@OhTȯCyIҎ_ipң-[m spmkhe^QYjT*0y-jɚņh,=[N@e[bWY#bE,:U]_X4+U:6zE{;Q)%k^dmİF-SuO!/QPh'ʳh~x.K3R$7VԂ-'@ x M~tYnbQy")'HnD4⾼p^}CcXпAi'./4uYcSzM.̬zm:&nU~`ZGwxM+˩"DZV!}g#./?o~ꞟ8{ָm|E=|e/X>ZmRS.1%%D $nGJ*S^FNi^v'$3y*Kw0O ȍWס)d4yYt׬RK6`_N8IJښƬqToyO:cI|zĈam.R1K{˫dF yf:q 6־S@յh%}C@ԵˈP4W-W>U^=]yo4'/wR}f2;&hgLzWy_(idԴeҼ[Id4[ +D hei$qR~Z\Kz&=\\[$ 4 JX8F6qvb]GiRI{NmN ˽n{j[趱rͨ=]ē\ܤU#*Ky<2ij줨2܄ky-K.έu'lp %UeX\ދ?Q;A;Y[TݤE77\2[L<|k[3F_k7備2EKRY~5UmogW&{i`SX?QDQҨUcWd%K;q.~]mOn}mxe4QXʕ_SOum\qIDdslު=(IO<]":\Xuhm6Qb~)V6K(T2:cɞZɯ a1g,N٤v"icB-XqWԭ?D>TwLJUN_#r5?2y^T!o-mo5饴4F+{7ІI؄x#1Uy]畴7T/6U`z,~֝J.m%r V ~ 6j6gt6't]iQvuH!^?Uzb7`UDyϷ'bo1FmK/UH.Yǩ:L-ΓF!xHS0O7z嶧Y0蚞n8;ۨ"{y-Q0hKS骞y+Ku=jڜykO˓y6FK F.Zku n".N'*:8ռ`7k-^Q|\hw$ްd+i40p4V[jNZ4%nw.D?ZfDGn ²sUvh.omj:]=[L, Ui]/⸔,94]V}C^bп-2LO冊RjML1E7B[E%Yir5csI囿.N$M!)RKXnfzRhc?3cK[_t[='V&+6{7n&OCg_`ʮҴ?4'pZ?(h7vrSen]Z[^ ;ؐHyNuBKyZh:Ur,Q.dYFq"YMX*S冋ڔLחtYX{Rqǩ*IXURJ̶-vמ[/b+fT].QKinYX7ڡ'_Mx4qﴽnk/pi7 ޖl.H$ lcW`U 4@XE^Y=ivSl$QN uo"C(^X8F$~MӼ4hvg6iW zTXN^YZ i$VUw}^f<ɭiky-f4ᴆX,5W/"Wّy_Uw:!Ʒ6pC/]l~ 5' dП`1=_#'.=P6jצ}]ܴ(RT"ªUV|*^TZ]*=R4K3GukZ $+)݉iб*Fj:Dޯht-?эqY-1~%ȖLf'h*F4?.kڦ{X-tmY4h27{xsȔ;\*yLvy|>xҡ6k<7h8_їL"%*z!NK*{Zi }"&{k{-JYեp>b֖:7N)ƛP!n\IIlJ"T!WyZt=Y0tu;E-o|p-ФVdY I4QzHoXzd΃\ca 1 aҴ˨†Z|f{#Jj% ԏM=hD~{xilw/kJ"VI+I  Qڭ;+6:z=fiu]n"pEi =(0whf늳i|S2y{}-cWDm [M*YLhɪbh>Ka_+h[򮜚eȾHKӮfx-na4޳ *yK>Oߝ}JTVi5ɒYnl] ,E$ U0V+gvl,Kx!dVSTgb9ȚמuZH$"64+13j/n#.eЩUتd[sS]vSΝ"uVƽ=DS@<}RwO5sO=y]Nⳑ۟^]J5ya1-n&Ԫy˚还BhMOSԦ5խ%[,k}ֳB1 ,k,f~Mĝ^Fysφ/:%íYKbq%c]q]2_˿9y:M"*k-^N+UK`i'JD Gh_}y=AE&Ӯ;> ;{F+xYj.56s874aIo,i^^ȉ]j: }6iBNWVMiKۤ.jWqe ZDYJԙk)-n')unN?|<ߍ̾^n5XϦ\Z*FBd^4I)b!~U_zG8:(t{qCMuķh~oj*|u~Yj:WK+emy]j]-ŬZK_O9kT[F̫J/̏4iXE7<bHm5 [J xZY,G*PumwVӗZo55}7Gmck~4Hҩ  /t<*OԵv;m>MNmv'-$zg+dx8|U>P_z汯VF̶Vg$ E4f]wmeYywX5YK=u"gKXm摘u'QʼO򕶣6Eg?-kD{KXi.u)ts *K6:V7XM{Vٯݡ2Y,9'hedh%ֱ,:fC~cG,5=F{:ZLƕڅƗ%E@;o*~ak>` W/p""kiT~e[uuJAj>a5P͵v04\Ҥ$?B K5wRt)o/D:%Z[Dn= ^Ky4Iӊ7^a\Puxm+o,mn3n j9Z(u].9& {A=!QT;gYwh\գԵIwskI5o= 8aM+8e^1>t[yGTZoOj -FW*hy }sN*z-?2 ޟy^aT^\ZImWqY1m.."IVHZ-A8+ܗ:ռ׫z=HPi:vxูT-YUPdGdzƣ"bfo(Ye*Է7QlҋbOPWQd~Z| a COuRD76ܯx@~*¼'|izl5Q#yc[ N[IXa7uY`5pUB:Xۯk} @AlNc8g-k54!F@U^Ϯ[kGu4S켹sS7n4\2؅$ʨՐ*1Wy.YտAW,ug I#Y>AuiBƌ_ZL=3Un 4VT[^O/G6aX&?VyGZ0@NJ4oBY j6i:sЯV{縹\hE<$h&'HBGw^m^,2wͿ7o<92t+>biĺN*Y-K%pxb sVO=ߔ_k<{z^ 0SMNDtQqWy?`1_GwWnRچ{k gaz\v//̪і:GI2=Uy|ky๳MF ҴͮY2B /mfnu ;Ak7PXOȏ%RWV⬣^N|;;_/ڭW|LҐŋK튲&e0DhrF * cڏmW̚/QP1Ѯeh"Fj*ɱWmBC$ּpMm^zPVٶV"XpRޤW>U <y]VI)Y5\ȈAN@@y"ڷu]gȑcs2YCOB2@2+(ʪT?*/5?憷A%Luѝ]e/#]DjWjb~cp]26kR 28c*y\ѼK5CΞWԯ`jU[ƌT_Yf^Tͧ'oRc5]/dnո[ @fB P|8m!!ޒOhZRګj&HƒMR?*UW*UثWEݮ~c]wa L֭~qhI*RqWywWZsFk(^Ũ+[W]e2mI -9 )Vi *țߘWZizJ4UyT{{yo&r\^x$x([c4,q9o4YG]yh4UOgŃi$ )*t7oizԇҊ#h}kh~ +&*gj%Ӥ(8܌LÏg|>Pi􅹎UR41 c:Fj]ⅺYrG;UվS='U_tO2jZ:^IZ-đڛ|X+S*^6O6i?<&Nqy5DK ΩCO*^Vh-CT0|RTKuoHF֪Q%WyqZa63@mty=k X1$HVWCg.yeד-SKm[Մr)[w@X(UʞX9u VZf;:6@ܪWĂk|8n[/u{{_0y->k`O4ICH㕧(ϠUO㿖0s6ZyXa%XHcYGUV=O˿<ۢu_Qe59цzE\1*SjlҼ6ƅ^CNԣI30 @O,Uy:ۿ6bLRH[@WImkq4qLYD\Uf7=$OU7H.qjoU9 Uv*U7qO䇖t:\7g(=֟t pkDJrp_$_>h~Nl.yyמnUuiT=A >6 ~ʯMK4MJtkѺVk}1Dr$5]Tv*ü(evʞvѢ4;I^RXRDt*]?*[~UyB.@Cӧod..ZEC<RJc#ǿUv*Uϝ;|w;++KBu8 ynf]>(o-(ƀaPWUWjz& 1ZӮRO\G&V]n1Tv*UثWbRo1-ۘ3RtiQ5Οo(y#г<ۡ^ryP="Di<L]hʾQL~{lgW^o[q=F 4HJ4I;h(k>q}|/ևw6ܽf[5ˉ+(WdHqW^b1t6iQV٭ĞT UtA_~qyoIK+ Ηqumu=BHmѕO^\[@L*{byHGNo,6zu;[-c"H"QUy<o+αmIi,d\Q7*yWW*UثWb]H54h~\k崓R3-eYg=vRB8FAs4zgmmfnumbEl-mxk+J@y2 [d:ɪj:Jm-ơm>N/ n=@ })5Kɴ3QRk4)Xsumg,tjѐPbֵ-?qhJ3uͮ&eV~$u|Uza[N4Y NiYЖuMQ5U쬬h٭MH;V*ث v*UثWb]5=Z'|;΋}wh-KHɂ5TG&9MB?٭C\s$Z.g3ΊĨCHSUw/3zjSX1KqtdW3[G֦YYq*U}xW;h_/tiu}.n͵w=o"yo-SKuQeh <')*S%_ S?jOчW3C8fzWjO;0~ң*#0V'Wy Hf=KZO/5q o, %IgX4`|RD}䯕El7M+^6%͕[Y }Tߜ~uX^7SG+U6tUQ '2Z*zOSFOnKa}wk3\; ~A,JQ?d*9\J&7OyNӧt^TԴ'Jη.m^E '+Q*.yC Nn5/5F^NO6_4 I-?} VAoSRůtt/+kZ5,bM_Zֵ9&"_/oWu]/aW4Իsљ.Qd&-KU dv?p򮣣ߗ`oM"6Myq,Wrڵ%7nVRE_DE<&j&cm@j\hʼ$>ɠUKgy ͞H ך49S?pDe)9P;F+=?/<ILQfjyrOgHZS:8!^\x*(}Oo!^yTW?˶YjW,M5kf #u33|fRܤU鿘s?7Y]cy" gOO*n.PeIs}w6IۈPhV/8%6K5 "PY v6F(oBWvT/הEj&?"yHi:ީa/4^P~S/W|w_Tk+p[fxi|@0~e^o~94}U$mT56+ yHUW\~pz5,k=wN}EWKﮕ{jdsX2IEyjks[VymR7spRwP;94mxKԦy uDKմxW:>DE<8_|h+O+E7ٱY곬kЈ'6LU:O10/$ݾNF~U巟lkr9*Ho4k2rYqNrWԛZMKKGoVeIZOET__Y6M;o=ֱI.7>ٓ| 'ZO-g常ٺk%Fd%@jYjU|xd浣h%]O{KEn?QC **W?~wFK[} 'J[>fdޞm`ㄌJ\BP bjW<ǟ?+yϞT|xyk5OX @Dr, }$yדbt򗞭K/k35մZkD<˼?tĴe 7$?.<}/A&4 7Sr-? BiϽ+AA]gQ#W@|G⭯qqkZ׭5DUoqhtM3|U|-+PRz#g⭟PNֵD]3Q֣UVqt%*}.y/Q Zk'W@RZzU'js:_[DZ3|Ux}.K5|U>\"Z:S֣UVqm~ϒo#g蟟&_Կ*8i_%jG⭟5>KI5|Ui{-@:֣߯*F#W^M~Uvk>gn+G5k[OR%+!J5=8{6&hπ 2L'eݗ_> FCHȨ6m`;L0K$(t]kNWtxiX*9#U{aaq9Nj ;dSYcWq8 HȀ9 ~fIiH_ҵ AVja켜8tx JFƯ!ǃ@U5ѵAy //`kwuaPfCq:qDğjM>(DM1y.not}gP钘/ &MlڍdwHG9S$>< JXqw{4#gDt4ΚGCzxolfFJ"^%B&@t޹9F|LxI_4Stm& sU&!]>`4N`˷ 3 WVKj3C,q:r59R)Lt]t5Xɩ:ޞYJc逳?=L?1е/.4}GQYIG?$/9=+lA',vF$wcu?aB*<+%>z]9n9CJ5?mNs9WKY2hGֵE^Ywg39L*{ ̝q- (J@oxXDѳt + 9+?f§om 6BX\F Vݏb?=كWo\n;/z#ї=>{S;(?EQ-<>f7fx)͇n n/ }?ם|"\>?xx1#d~xV#bj=u}W]Oɖ{ oE'Wr~Jx {jNޛsKjƟ׺qZX@|1cJZn-6)e #I߹6&$q)X[Z|->$OK N޹e}UcMSXEstxʿ>?QACN_~{ *Usĺ1?f§. D|kZ|׷Q̡G3v\rϊB=cmktq(dž&W姗F~([Uibh$IQeaHls8h`?zzE_T垶9>jyN+(ZCJӭSNnv}V>.\8d|c=?%|ȩHuhᖃKlvl}+KQ9=m1c>ǣڽGe'OC4WO6j^ni.$FӤ 'C+}mv]>11@zk7IǴ⭮II̿6zmo-0$+iW04h@N Ȁ{rc_Gz9" ^ӭM"ˎZZ\i9"\Tj"ٹqQ@AAмv<)$ nU'HTiae0,!Vg^'HqH|nQxE3?*y6H Qz\L +ggY zt~C3>F5([..uKVIk!l=-@D>X>"sA1@5/JϦkQX+Kk-JKMFpڽg'x@pymg}1HB\ǜͫM~^Ze^ZK{!R '|vN|30F$`<<Ö39d@"QgqkI\R.u/OlN:=F,X(4Qo'V"H܄cè=DL%9delaRdd&8c=G nȭ|ǣrdne$ѻ9bvpaˏU#,7Q{Mgsk'.<"# {1?wkmk%osuws41lؚih3`!8Js^=U˙[m\Y);D1=8+?6j"K'@ݠ#s=ķB6d0)q9izdr Y5$y2˹~mW^@]ŝV.!8 FR[21/˒T4;G$$H≈<; =6^Q$e6os'^T9\lzLYh+r}<|7ÿOM!>*o6(xsA:}PgGno0vGoH4U͵ϚEjt#K=Ao@e ޽H5X稖ozQQǏ &$]yNn'#t'z<8 O 7x qpqWP8z endstream endobj 339 0 obj<>stream Adobed        s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?hZ3{jI$ƤsdޏHҚDė{?C6D鏉.?憏QGZ~.14;VO]chw 6)>$%K1%޾?Dȥ_C@hiK1%޾?揓@hiK1%޾?@hjzK1%޾?憿@hiK1%޾?DK1%޾?Oȥ+chw 6)>$'Zm?RL|Iw'Zm?RL|Iw14;VO]chw 6)>$RAC[ZB}%ni]81G_A&x~n5mh]\kVjB !*#jW和Aky=(~Iy:}1Ze.O#?TEHeiW'__򾻭biw61*HKs$59\#wȶ5]*w* URՊo b2wO& /a k\_@jUE^ gTm^\ÉABXۈ(דn_E~Zh^p-Ƴ; u{ɋ̒p֣aDѐo5~]W&}Fy4ffXLl^~ +Jˌ z)C]VK^8C^*|UإCx[t]*/ڶ-P^fޖɵ\_D}~g,籒 ?Q侊 /qd>4Aa_?iR_] (l 1< +SV5'lxüϬ麻Z%#OX l$BdQV`¾'|A 3'|KC*Sv*RLUPRUݿ(w]TfV\BOzKf0ɵ.e?>#^E]\v?銳FtQ72i$ىBLJ/l<%Jιj:u6i"qsqog㐏չ%fT;i&@lQG^j1EM^{)+{H)֖q,JȫN҃(lW_{R3r "Mm:Z퍫  n"cJӐ c1ie.'91(ܭhfu]H[bC o%7WVЬ6&FPEzxK8 E4TL[8ZqCDW].?*plҦku4kH %ɧHtњ¿i y&?Ӯ_[M/ -:U| 2=%[RTzb\Z;a5ԏ)$jYiBXC|&yfI$]kVCI-_]ƧpU"׋a&3时c~hhOiu ywܬSua ozaq #Il3J/#LE ]D.nXCOՠŬ4>91." /2H!114T `;C *≅$-O 6PӺ> ?cwsA΅6Д%G sqDڱ翈*e~k=>^g_MwMՏ[EooKg8Ʋ8e=m;Oڮq;h].=k;Ve\qhh˕ XQ;_CD6?O {z/ڠn;)$.BR3=c\.gئPLF#&(zz/>QS"w;wy|o2OBPȺFj rd}!&YI+Qf㌐RBR>%1+qgܣjuqW~Yy*??=hPEMα_X{[ >kc[A"5m.9h8;}Ft}k7z?vnVk9䍇&$QX7I'y/pd>SS]icy[C.fLW]Ryfa'=Pw$DtUޖ~SkB嗓/. 7ogRM7YҮ\Mm,uK$SF 9Dn9'b:GO8 o-ppba^!KEŌY<޷j:$:__'?ricYY]ya-5PQM^X (;ynV \gamd0㑀?/~~iiPh>f ]ORP7`KX2Z,VhB*g DoS}_2$t,F?G o4>C z`b\Яl˼g:dy`#|p~IÞ|hlzۋ(Yw1~O-_3_G$1Ȭ+ qQOZ?ttOxt6,w:eF>kFDEx`b .Z*sY.F[{<#K:~<ޞgIo0_t[a:15 Lj@ I[Wv{ H?2- no=n]JIdt+I\I*.i87Wi.ndѵ_ >L|imo6n.-"实9K$E>AUSG;ɿ;._ڟMaH4okyG-̍' $1F0Y@0InoZGsyj?(kZֻ>Y[¶ʫ#Fz(~g=E@_w(ms^Q̪DF: {IÞJeu^-u0o4)RC e En(wj]]KCxXFaZra OO/``V4gLe>{:\D2?Bb8;|^+aRiaiShHl4hgq dqgQV|-fX%N^HVVCB?& R rbN.LR{4d{I-ڃt|2ps`GUlJ 1ߢIثW~Ww].1Bj3̹1S |>^.ϯ`L%?{=&8 #.dmXeaaUaFZZLDg5@~\rEW!*iɄOȠ䍗u;| &3$$St.LKɀ82`Ӊ8 (I#dS_ٖnLF[`jLKɃR$r']AA P|rث_(wUثWtTf;].L!{a˞]+:U3y/yߡ7Ns&,G" EV>8nlc/zO& saM\Q|#u+:܄/j'ݲ*G/'.gM}Q+O Z)UTr*z1EǚY9*&i@q/lA-iōa!0zH\SvbAhɴ+T6[ĸe~IJm6%9huyG_*%VHprC9&;FIM9?O 6?]/P|扵O,6ST}YkC_PMpQ!^TռO(h֞[ѿ1Oy`oM;\.l %_VD C227N\pC{db`'gȿWȷ2yqIy2I#(\F("r0LDbϿ1@Kd|m_>M,7Q'_wSsWzҁ sY g/L:`Gmy=2f-4$.7EE̼y czUȯ,-fcˌ/}e,U!xtkO P<򇖇3Żs?f#cR5K2ɿ%`i n5?/H sNZjgI:%kĊ v>cqUn0oݲ E Gӓ,8dB6 Fe!:eDŽ=`85;LprCY4bKr@ QLh%jKKo.j/b:e oՄsˆ!MlG%YqX=?vtg? SwuZOM3YR$ODI?'rbhƝNh}O(n# &󇕿:u:K?hմ=UBj5n# -KUu dM _(0#֥M(*A.o1 ѯ$ V1›CW{ @[Wyu󭿓u|iu[M%YI, 9'[uh֛].2./fg1?)h[X5ט~..8 -גD5< 1v6GoYٗ'O^j"M)C DV&\F_U">e߫x`#[r]aȚ{+L,֞O򯗇C/~n#cR5K2ɯ&G'#qUQH$3s2}h'KC`s:XX;+7.ҫBjtfg?.Lq)s,nHͫ9=&64ag,l'PneO0!! /"u/P?b+k DÙS߁yh~J35Z.x,^MMklv\8tLE`/utt93[G7ѭ#r 9(rI;IÓw'R[>\RVdp)ȝ$SMVQ Ǔ=;YqyFdf ߔG@ռy[k4y60sQ1wJO OZntcio:4-k<^a]@y-N=;9c2EUuF3Dqq U__)x>q ZHRMJmUjr4_VKQ}`bY⽷=P&W;\>R4V0*bv-6HaESGk۱ъi)VE"M~#Nx#P˛9p2iFY!kalG.L;ߛ^woiW"zEc',y jS8` Q7\,WW[puG~O[yNMbP1N%nᨧN1үO}4g~\Ccb4WʹѵxkqoYn$9ܒj:ϖ:5(b51EnON81,M.5V?/Ǒ>fiO]/~^A0kOºxۥG|,k)k_*cVh=IyK ݍo'(=:vd2d(*?-4y*2ii>{k73^޸,>F(kEQpBbt0=8]3F+G(|;L$?Ou~|5 =]Kҍ-LQ-DVJ^J5򇖍v 3w?79H+s|_vydA1_uL~#&}!\z_XO~<cVOqGG@5MppS2j,1ǰ/%$2H/Y"CԍIpq;;>?>oʗ\ӢIs8}b@5`D/#7 z\._%gbsiCd|괱=Xrp2'ݼyyO,ZVWFK/nm"9p3^MFtF9ё lN+yFWAA%C^Βq5h*Y}<feר?_I]bk.zL:|3oM+LFqG:I!Z(HU';:p<2B 르v,sR#eՕ+0ߟm_L>'yL.w% %xh*QErlY_BϹ5Te̵abUc:#-@ )|]?X8y2q%/ Z*L!{AL{&Ei'0S>.M#o0Z[i[Ҵho.[hT9l8ʁ=<=MBֽ_ʋd[uR:dmpTz7ѩx :lk<jcM#>nм[K\խ54Z(P#rE"lr=uєM_K7C}j5/CbUpaǕ)0 -TcXW8Yf]޻4?-3cs;:A_&m&o.ﴐUWQyr^:0z˒qG{ԟʿpw֤U<FM#SA"#Az?2N,lu‡`V* |Efw,NHFV'ߦsq#mP,Ғ_mɴZҦizXagnޚg}e}M!;id#+#VRsHo__NQcqZ=O]%hv]}qK_-트8Uæ*TV4|! endstream endobj 340 0 obj<>stream LBLKGF+AdvEls-ent3 dw< AdvEls-ent3Z)j(b/b/h(=P*LL*P() endstream endobj 341 0 obj<> endobj 342 0 obj<>stream Hbd`ab`ddqvwvL)ML-a!#;E/wi߳ vb`fddlRYcdj_Up/*/J,S(ISpI,I$NdBp~N)HX3@H)8(eg+Ĭr S߫gf%U1zWȉM*[h6&vp>鹳g?!zeڏJͫSY&wpRK*UEI Sz2B;|j|o=[7T l%2mɻ// .ݙ%dm`}T endstream endobj 343 0 obj<> endobj 344 0 obj<> endobj 345 0 obj<>stream HRmLg-wpE c2QP$jZ[(ʵhqP)J-F|M&ea۷綇,;5&hb<_<^$)EQd{Qu[c}=oՋkw=JTJ}kJ؜~e@xx*@QW(l"_SkmzQ#=}QW. CzqUcV FN8UFMPCFA۸UV1rZk&.;;7[FR@>Ebى e(K3D` MGC蟊tA1%%&m"}%M>G{fI ;<.ɎY8!apFbe@`r^MX?FhJ v&|zV7^aC`%viPN)3WuT?{zl@?Ucx{xm ;*1~ƂJ<Pi3Gk00xl} M U_@!ރ{`/k?\W% Hr_ ([M4ÕQ#6 ֋fnf*s-1Uq}/e,__SJ%RTL(J,F\/Dm 3EZs4X9CL_zvb4xH#Q,/sv 9r+wQKJ|+:a/y:U) $Y@$$͋pn) Y(Hes4 @Q_0n΄(Tâ?Vlw5U' Nߓϓ lhMAÔR{ךK~׏bCMU]r4u&*p].[ AѤ#_Eց,Z%R*:z> endobj 347 0 obj<>stream HT=o0 WuJC?TsJBuC_6oڇ֚O<-^!\p0Dڨ{ۭF逓[ck w px*n^7vY||qD =ͳt/rDQΫC7_Og'zi5Tc h˓ҫ/YUSfCJvS3$O˻)L#x$pnrj񞶰mv6i,^&0 endstream endobj 348 0 obj<> endobj 349 0 obj<>stream LBLKHL+AdvTA42 C%biAdvTA42X$:=V#XAI}}#7_YI=':F-!GAI? -gTU[Uvau8#_N:*Q{ endstream endobj 350 0 obj<> endobj 351 0 obj<>stream HTP=0 +<`: *1C=M p"%kumOXd;`Βaၽ% 0V[<jq8as:-+dK=lfT<A&kgP,} ;WYQPꙐo⹙eNysܻXH|J!~0hj endstream endobj 352 0 obj<> endobj 353 0 obj<>stream H\TyLTg{m>V P"(Rzu D m(.@OJD(jZHh x TV<:kڇagfdRNd@}xb̸̘M#ډ"g瀞G}9;~4 OJ&e/8rQ>(B(*TAE(h5ʡed.Z)?'U!W)fE4e#~RzZ +UhǨ!g8W*i(Nb24\šn?!3Z *D ]Sݑ/UB8ߺ 1 %݈T+ʘ/NTj>ToV=0Xx WD Yg33@?GZEfVg@LWycee~npߍ{BVrfFB$¤6jPӮoHaxSnl8÷m}Ŏ!/nT,Eq+"ɂiV'U;w [kg xe2& No_\wrxE]'xt}˺>d:/6 i^U޶K!Y~;yNdKJ 6++vU}Lgl.$<1d`z,}@|EK7G/Xٴw h~5BBoQW_.3<_ %IPץ bYhƄ7eTk>U/T טY\=')}13Š(FLkiImڲ_~V,v_F>`\Z ^m;x> endobj 355 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 356 0 obj<> endobj 357 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 358 0 obj<> endobj 359 0 obj<> endobj 360 0 obj<> endobj 361 0 obj<> endobj 362 0 obj<> endobj 363 0 obj<> endobj 364 0 obj<> endobj 365 0 obj<> endobj 366 0 obj<> endobj 367 0 obj<> endobj 368 0 obj<> endobj 369 0 obj<> endobj 370 0 obj<> endobj 371 0 obj<> endobj 372 0 obj<> endobj 373 0 obj<> endobj 374 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<> endobj 3 0 obj<> endobj 4 0 obj<> endobj 5 0 obj<> endobj 6 0 obj<> endobj 7 0 obj<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>> endobj 8 0 obj<>stream HWr+x#$ nO۳;>9bdDB<$@ivfuE35ʪ،Wo>|R !, y ETX]``pOW?g[ت}vpsz?-dM6_*W3:{j!پKpئF+OV=ۆU6ݨ(W-n ۆf*یGmpfUes0:xhwqi e__~]=2kKgyP2Bi`qͦa ʬ^=UmT 0r1Ck)Xf7O-n 4pp~ 2* $Wrxu"uf Xo7 B&{}ĚWaa4&`gtFZ4 >3(Fsn6Ȉ]1?YK)D$c3R]:nQZ-Bݺ xMz 0=Q 5F hU(ORĂ l,M#R|cX4a7fbƶOߵ* 'IBYoնvUo8^_쮎UT:t4婮h~[w#1D5:) @RYPWi֬XGZpD@,Q棽l-/Ζ!`R5ғ9ġu*Wu,O`Ne."%{0\Uf19U +ե 2_װwd]Ԓ 5i|o)vʹ:#Ν3cc C5MWڮbc/.Gmʼn;d6d8#GW{TwWwYLqT%(òktG_9.1j6ekUNk)._ۢm&V-&}dE&V*&`\_mϏQBzVTlš`Gi AQA VJSnQPQdPCψgs.R+-b.Kܹ*/q9󗛫f~4cqB_\ cKbBoBPpVzŹ=s(m/g mυśÿD l[lf( Si}fTؐ ǮG#keG[q\쟱i6 gbPҘ'E:⌸[mH|qPZ!3$ڞЌ`6D}|f ".`LE#|zHKJA*d'H‡1/!W,Kp+[Iv#5u,Ҟ.9B~C #$uD  S\=q!fٻo`u%q.@qn.AsZݭt;%vnS$#aggLlo sHB^$zxUe',Fz#,:D4OEzL6t1+sLw#aᲯ  Dz#]i_nK9H>}KYu0i=%==y];=hA廳?^+v7 `4T^PZaAd,@0\4N)Gm",ߢkh& ˆBr}J9_ Y ~[kCK{\5F%j봧ӅP<(~g jfE<.J.S51#5ÿ̊kn@Q}5^UH5;F:O*֡'"ZDv0 GJ!K꣥ ʙ"?ܛ2h 2"w}IN#iV+lf2(AKJD(Y(ByVs>ÅGC\0p^vQE~&1 :=y1c)hHAZq(Z>4F*\jNa9@;'%}UJ1@䴀/2Si* k4T aK kjn)EsߴfJѺa*^oW| BX1=j}sd_]vw|}}^]m:1W#15q!۹5́$/9!cQY Y:UЅ{Gpڴڲ:|GT, Walq>=+eiZ;E5끻~:X % J% ?,2`5"a7Q1^a+tH4O1-I?>E=1tGtRS`nutҥ'u]. wC@e@;993GEГ}=;y˚+&܊Kӏ[ѵ ߰uL)f$_htTȄWyU |EїhocrRv"we7i/[NfNe]'_\>1F2*z{l:t6%$ܡu.S_Tl|G=Y##47d^չj uV!9e؊E~s$ _ÅmaP\-29cvz?p?E$u};\uwFWg~ nB <.ⅳmǾ5 Yt ^!K1u.5>stream HLNP{KD [>OnZ݈ \ԅZ[喪$ƷpGpGprbw3a5#6]@UjgE:\i/jVx_wFzKPV<;sZ4j٤ADZ]yYlHi9m9FW &M!(%Wxb=#:~q!kc˳=Xk60v1V&.vUda]Mڟa^eգȆyȷm@HA5Qo$wh0fbl0NROV3 endstream endobj 10 0 obj<> endobj 11 0 obj<>stream HTPn0 Stmt4x]hW@M <+)N > endobj 13 0 obj<>stream HTkp`I˔M2b/ޥ0-MJh&&R06@+6_HeYmX^+$[~10)&fLit:v d26rt|xϽ/@ w Ee%e?|\(QIr}y{ tk~<./b_UCJ_"'H)RT gH-AهD wtɝ¯2\[T|SwS5B [o bرwSz!a^J4IH*gY4uo+fɋҊs?Te/@dcT u \4PF2=}xJb(ڬUX78%1cWJɲRO]8kȣRt VryBd(ƖZj& }Ú}v~@3dF7f;:Xo!go6t!UFϱ\&(e\56վm:4MNG ˤBYzu ?|ws 6~EE{f,D5&bbc@tpaKC"؜1 \)0:n^ڮ,*׬Aj"Ɨ@vtė!3T$10s-6ZS}dV!xTбhM.DC jP[{ZG*++0\5ZPFӧZ4=cp4@ݬ{=T| 6o22u]䩕:n <0@Rbo*&ԫ+A"ґ wad<in aWR@Jk *ʯlJ1 6VJSH6N\. ;FȱP*Ɍ="Y~/Nd`2cQ&HFV&Ph,hISoa ioח&CdJ_5I_[D?C=mȡKgԵZ-~9xp7#2\1^I({9X,A$/ F٫y;o42khˬ0}nϻYrX$zwܵDxq4(FQDr/a~`cuy]|POvjAl:BhG` ʽد;8}^͑\_\Mi砺4MZ4R _Ma˰ Κ)_֭&Ns;h fԤj:QBe%xlCzpg|"3vK."]T/K5voU,ֵf#x'e:peb.9.HVjn/sy}4 ]`,BdGc%꩎$l`rCK^\^&kN 9h;JoQaAao245pNP17,qo q8즑֌%HP[<џ 3tpT~ c9rFke~ Pz uQjccRdghXK@7] ɌD!O¾?N~!BB|Pv~.ahk+_A endstream endobj 14 0 obj<> endobj 15 0 obj<>stream HMN0 o*R&BlT[vS+m9z5+iQ7L!y!T?!,/E03{˟K/i4i[;J:m3H^CЗ2#pZR8$Hƒ7ږ B0XIwG:gRAi[(I8_ԯʑ6P%ԦjBTWXpB|458b;#|3 %<'Wr]7RA ;!;`d쟕Q%r7uc4uIBJ 慍7 8ÿwR>8$W~߸O- endstream endobj 16 0 obj<> endobj 17 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-21T08:34:03+05:30 2008-12-21T08:34:03+05:30 2008-12-21T08:34:03+05:30 256 172 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgArAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYqhNWvXs7J5IlEly5EVrEa0eaQ8UBpvxqasey1PbFUuisbjQ4llt2lvLSlb +E1eX1Du9zEB1ZjVpIx9r7S/FUOqjB5j8vf9XO0/5Hx/81Yq7/EXl/8A6udp/wAj4/8AmrFV0Wva HLIIotRtZJGqVRZoyxoKmgB7DFVtraWt6hvLiGKY3PFozRnBhjZmtyRIBRgr8jsKEn54qiBp2nq/ NbWIOJDMGCLX1W2aStPtHueuKqZ08wr/ALj3W1KoypDwBt+TNz5GJSm9SfssK13rtiq766Y3EdzG 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 2KuxV2KuxV//2Q== uuid:4EA7688B08CFDD11B9CFFD91990D4EEA uuid:C696A6050CCFDD11B9CFFD91990D4EEA endstream endobj 18 0 obj<> endobj 19 0 obj<>stream HMN0 o*R&BlT[vS+m9z5+iQ7L!y!T?!,/E03{˟K/i4i[;J:m3H^CЗ2#pZR8$Hƒ7ږ B0XIwG:gRAi[(I8_ԯʑ6P%ԦjBTWXpB|458b;#|3 %<'Wr]7RA ;!;`d쟕Q%r7uc4uIBJ 慍7 8ÿwR>8$W~߸O=. endstream endobj 20 0 obj<> endobj 21 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-22T11:42:33+05:30 2008-12-22T11:42:41+05:30 2008-12-22T11:42:41+05:30 256 68 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXnvl/yv+YUfm7z BrN1rTw2E73UWk6ZcGS5ho/H6vM0fremiIV+xGEY1NTiqp5w078xm8rWsaTnVL+O89TUo9FY6TPN aCKTjFDLNNL6besYy7c6la091WQ+RTr3+EtNGviQawkRS8E3Eyc0YqOZT4WPECrLs3Xviqe4q7FX Yq7FXYq7FXYqgtcv5NP0TUL+JQ8tpbTTorV4looy4BpTbbFWO/ll5i836/oB1DzLpsenyyMrWRiH piWB41bn6RluCvxEgEv8Q3oMVZfirsVdirsVdirsVdirsVdirsVdirsVdirsVedeVvK35iwa95j1 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 D0/ToefPl8PHj1rir//Z uuid:569DB99EEECFDD118F4EBADC3BDF705D uuid:589DB99EEECFDD118F4EBADC3BDF705D uuid:C896A6050CCFDD11B9CFFD91990D4EEA uuid:C796A6050CCFDD11B9CFFD91990D4EEA endstream endobj 22 0 obj<> endobj 23 0 obj<>stream HMN0 oݤ*R$BlT[vS+m9z5+iQ7Zrּ*ob03{˟K/i4OۤLm%U$Lyuw!K\8e)PW`cImKk_m@QΙiP3F8"EWH}bujS5 !+,V8D#|458b;#|3sdf9q.ep`F ;!;`d쟕Q%r7vc4qIBH #n')s}Bqi|pI"Zq / endstream endobj 24 0 obj<> endobj 25 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-21T08:35:21+05:30 2008-12-21T08:35:21+05:30 2008-12-21T08:35:21+05:30 256 84 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAVAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7R578tefNY836RLoOpy6 XpVpbSS3UizSLFJOk8bJG0Ucih2dOQrIjoBWorTFWI3msfnpp8thrV9aSMbdZYDpiCFlupp2sV9N o7eSVQA/1kwS9eC/FTliq7/FP55S6vqWk2VubuXSz6dxcJaxRI5owhe3a4aFH5sqNIGpRS/CtFxV M5tS/P8AWeU/o6F42u4+Cw/VaCD17hHUNJLXiYlhbkVLb9t6Kp6fLPni5/NGbWv0tNZ+WbUQiKw9 R3juawMsqCH1PSQeowJZo+VQOJxVIYdT/P8AbUIq6bDFaC6PNZTavWAz2iUZo3U0WN7lhxHL4R12 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 Vf/Z uuid:C996A6050CCFDD11B9CFFD91990D4EEA uuid:CA96A6050CCFDD11B9CFFD91990D4EEA endstream endobj 26 0 obj<> endobj 27 0 obj<> endobj 28 0 obj<> endobj 29 0 obj<> endobj 30 0 obj<> endobj 31 0 obj<> endobj 32 0 obj<> endobj 33 0 obj<> endobj 34 0 obj<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>> endobj 35 0 obj<>stream HWˎ]d_%tdU5;{# OlM[e|,9^R8A3b=n9~⹿auݏ"_BjB >>3L,.35y5^aPMD1`9̧&`~~mwM_s3z"cVu;o6؋\Z 8=ɡ."epsOO܀4pc zIs_XVT8Yi)_1S\;>ʦ^4'<묗3Ύ^>`Lv四<0'91• arYeNV8^]6l}jD2Gu8t˜>ZMlz0u;Iv[ӲØ!%Հ 9_bX~3,&4?zKYՑ|>>n׆>.$hcf"!u/9H¤r,gR|#u5-m:='u1b>)L O'O<%1̷J\7f)O^QXi~R]`0ꑻHK%~d+SO&L\v,Е!JN ''o1T~Ne,.wB<ҳF=zח8g cWōIDZ&/xߖTē~;H,3f k)U߁ŭ,a̦, HҍV<74>/%ۮ^psDDŽNW$׆~4=gV,c Z>l8mV{XQ36jge,XMGYC""zۺa[0%up~a阨Qq$[6;RtD~2^n,`ōc |ȅra"jpVOʓ{ P( a7(֯-Dw1-L[=*,?퓟LdޝD 'ש,u?aV0qLd#waQs?5㉟$'mQ<2vN9,FAE#),7Mx{VWㅖw\EU/R"MIi{F# L jg,x87'b5`3Z/0rr*!R*L>y|YW[zF|k)׺ ۵Z· s WTQ Ii# m<ϫ:"zeEF*ͽ 8fd$jo~"&-y\jw&udDn6U A%_kX͘~)#nTCZq= ԘnH3>|E67|J&5 d7NUI+U@ֽ`WeRV G8+ldM/Ȅ"7斃z(M-vF0T#~Fu(7<\jK!w*j "n(,㈑ FeC  `d' (`.YRdcu7UkfՎXvO yv@1,{"hԏr%<5> 1_dڥr>TulMCDT@؁U1i<τCv G *G%rLHe-ץ1c)<},r.;,&PTieKEARZiX1el!;0]SHMqU0%-S>.P@Ug).I)qa߷ 6ʉ|%!3S9ҾO$k1r#GnLE?@e1LBl.)JL*}5(ڥQF7R5Q&OTg5F@:Ij(ˠmrGB۲$Ӝ \]K PAlCYefUKq#% x"QB={9[^;&T)N =`j 0!6kH}g6(ѱoXam |v !Ԥ`0cj5NĔK0݈c>,Ůy~!8O^&bCp]PLy(fmd$WJ*OBM*QuPM/"qr[9֜LX(u,uW84_ecNA6&<.9C.7v,o}y"ϬvE/yU71͵C)i27N!> Wg?" 7 挛+5Ϋem^@@V A1Ef ԢF 9"p,VݺZϒĩ_g!wBֈB݂E*eq<[be|5~xPI^HˍٙvVvm^RyNQ5V] ,cL75ivҧ=KYA '~2Rs)#o ,Dug*Mo)qAR.Q@©PwA ;r[Q(*7kgdU-{-#_[&֚gb=Rw:3wA* !|d]4so& z/qKDh^:ft\3ϳqYsayGV8Z2h`2(ƶT? TθRY!`Pos3 #N~=M5tAAL[3v:{i1 C8Q6:`BsRTe6\4MMqTY<†VLf`]]Q|)n"a{->MV]ȟHMt'qn6 R˾V/LS43pH]ah~<ʝ?&\ǃ4= HvB9W2H[[[D&^PoKZ\oeC\L@Keޜ_);ֶqwRef0NҪ{ٟ*aPt!oNvCᓒW~)Zw(]ov॓CLHmQiYA ?!r<:k,*bل$ ?a8VpK_d|sSG`CVhi'Kz̤a<0i>cn&}O `yAFKZ3HB{IZۍw4ti)mq标zI*.)iI]cHWʤ [}I(0Md%HRkά!*cq:[ S|"p3"f}^£(h̜PzrܳiHβRш'鴼V-޳7Esy`v\9[G.YPL3=Eɰt ʴ݀lIm9PZc2Q6,2=Ċʸpo+w$=&/%{2'K߭7 %_6Э7 %&͖_ >dEO8RWj񫠏r0o:9Yd:żTaM'uB`C|2H |7{v9͹>CfChC*i3y\VΨ3@RRd_Q;jP`vLP3W|<# :>/a=.HEn1>{!ԗ$ZpST꛼pU)HFU|*)0<ʺWG%G8wµ0.ZAn9?+=:~[d_V(B *[9or3r=f繁^i%KJ"ڵ?17nQbޕ*&ˠ$F ՅsfxD6KF^5]^I.k*{:e (H(asOx]@CQ4ע+>s'g-Lb`qI>9ZNTݗ,^$X.F3\d.#%Ȝi*J 1 zDCO⸼n D!T$'DP$\DŽpǒ֯]ʹfv['YgNSNXuN8{н:G G@ ʄA5fOgi}Bg1wOàGmxݭu~)bq2P zdTV"&VD~yfa$YnûruuWopgC4TnvB4BϡqO h9f}.l?riFyE*{l԰Ӄnd">jI#:E-ңL#g/^r>#PHdI-/ѡP4BHT^tr̢mp>[U6ۚW}BR]v3`S:;m/}#>:HG=$K0,*OzSՇWl=xT+pŁ#XIAve bJ_X+ {iB?N'wP? P/q0~tMn0]Zdu€I %j! U@"E{w-wn{߀#l>_߿暙W~(XnEB4wyj߻$¶LF`ĕ?`(tz PXZ^ۍS9Y?^+F6)8N@`\~nW9Vzyb=Y=$iL^)Cxס +> cʘ{ꙋRc o¹g-n Ϲ(~!TR1ޮ =ϰa^ @cv6 }}z{q}b^_^A ($rמ&:Mʖ:R@_k7@PWA,!~~csyw1O/ qi6!gݲ)!V1FGO]ӍP?^ /1JyO^o^ٗ @.qg6?kF:WΤ#}{y˻:~gY3~b 0q\:>q #燈 8{öfŎgz㛿b8̍Womh>7S4bL'gGuJ906jÈ2-*DKEVvnf!|OErc*8 C-\9E&>.&K}@Bfש.\K9)ftv6N DXP3XDElQ7TehĎm1YSuq{@oπ-hIxX/'񅁴#z:1N?t@< qP4CRqV25T]Xʙ ⃆*aa?"^JUbU9*`ՄDN,E^sގ5zpZ|D½c)NJ'UCN4#=6 `VL..usΎ42'_iph: dLbVUMO@h6'Wè*PYl0" >u# ICBde(v L egh bC-LSSvA d^4M zM%fb!q@|h`/ Nڑ%mM]dim].2EADYJQ4٘r2]ϮGҞӕGAȖ`^ti%]];qe< |n<;m9Mys;TKϬBa]@G|Sݩ(;K*D#5/ O-:[?|.˝`{s_OoBW6d\,s?ܵs5*e1`g Lڨ *P9QiJ(*k[2Na'zYZy_9͎Ώ endstream endobj 36 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-21T08:35:53+05:30 2008-12-21T08:35:53+05:30 2008-12-21T08:35:53+05:30 256 92 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqxzzf5O svNtrZwXV1d2cdhdxXsElnM0JeSFuSh+PVPxruCO6rIUctUFSpU03HX3HXFV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqU/xq0IrWRSCykqVBFK1BDD2pviqSeS/KVn5Q0ddGs7m7 vbYzzTrPeSGaRTMxcgsabVPYddzucVZBirsVdirsVdirsVdiqje31lY2kt5fXEdraQLzmuJ3WONF HdnYhVHzxVystyoZSGtmFR/l+B/1f1/LqqrYqteNWIag9Ra8GPYn5UxVqOSpKN/eKByArTfwr1xV firsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqEh1Oyupbi3srmKe4tX9K6SNhJ6L0DcZQp +FqEHid8VRKIqAgdSase5PicVXMoYFWFVOxB6EYqpA+jsxAi2WOgJIPgTv8AfiqrirsVdirsVdiq G1LUrDTLCfUNQuEtbG1Qy3FxKQqIi9SScVSfUNM8v+eNCa2vY4tS8tXyK6AM3G4APJXV0KsqggFS pqTv06qppa2S6baw2tlGBY26LFBarQenGgCqsf8AkqBQA/f2xVFxSxyryQ1HQ9iD4EHcH54quxVa 6cgNytCCCpp0xVqOQn4XAWXqUBrtWlfliq/FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUph8y 6Tfald6Rpl5Bc6pYMq38CuGNuGFQZAO9Og8fpoqoaJ5K8v6Bcahd6JarZ3mqzfWdSmFW+sS7/E4J oN2JolBUk9zVVOI7iriOVfTl7KTUNTurd/1+2KquKuxVSB9HZj+6/wB+O24JPQ1/DfFVXFXYq7FX Yqlur2ltqdi+n3USzWV7+4liejJLGwJkB6/DwBp4/rVRljY2dhZw2VlClvaW6LHBBGoVERRRVVR0 AxVWxVSltwzeoh9OYbBx3Hgw/aH+YxVJ9a856BoF1ptnrt2llc6tOLTT+VSssp7AgHjuQDy2BI3x VPcVWyIWHwni4+y9ASPvxVyOWqCpUqabjr7jriq7FXYq7FXYq801Hzb5103zbqRNtdXmkQsipara yMscRlijMi+lblnYq7OCtxJyFaxoVOKpFd/mV+aC6Ff+jo8ovngvJbe4/R94zW0wVmtLcRiMrMZT sj/ZTjSSpbFUyvPP35lQWVg0Pl6dpIyv1yeWGQrMJrGaeNuESFgIpYuEgonx8ACobdVVtvzA/MB/ Rpokhe5jWVUuLW5UoZI3YgmNeCrCyIrKzFj6g323VehaBe317o9tc38H1a8dT68IDKA6sVJAf4gD SoBxVH4q7FXYq7FVjua8EFXPXcfCD3P8MVSvQ9A0ayubzVrWzii1DVmEt7dqgEkwXaMuQP5KbeOK pviq2SOORCjryU9j4juMVQt1dDTbaW6upB9Rt0aWadj8UUaDkzN/MqgdevzxVR8t+ZNF8yaLba1o tyLrTroEwzAMteLFWBVgGBDAjcYqmRAIIIqDsQcVUxyRgpq6sTxIAovsafhtiqpiq2WRIonlevCN SzcQWNAKmiqCT8hiqSeU/Nej+cNFj1nSWkbTZWkiCzxNE5eNuDVV+wIxVNR+8vSf2YE4/wCzfc/S FA+/FURirsVdiqC1GztLi409riCOZoLj1YDIqsUkEMgDpUHiwr1GKo3FXYqteNWIag9Ra8GPYn5U xVItN866Nfea9R8qxGX9MaVBFcXgMUiw8Zvs8JGFD1H8K0NFU/xV2KuxV2KuxV2KuxV2KuxV2Kux VIZfOWjjzcvlBWlXW5LQ3yAwv6PohuJPqUCk19/xxVNbpQtuYk2eciPkNmJbZm27han6MVRIAAAA oBsAMVdirsVcQCCCKg9RiqD0e3t7bSbOC3iSGCOGNY4o1CIoCjZVFABiqMxVzKGBVhVTsQehGKsf 82ectG8n2Vtd6uZRZ3VzDZW/1eGSZxLMaKGC8ttq+PYAnFWQYqomFIQXhVU/mX7KkVqTttXc74qs 09lkt/WH2pmZ2rsRU7KfdVov0YqicVdirsVY35s822uhan5etZ7O7uTq999VjltYWlSJjEwDSkfZ FWHvSp/ZOKskxV2KqbOWbhGem0jgj4dqjbffcf59VVyQxoaqo5cQpfqxC1IBY7n7R64quxV2KoK4 vCl20P1iGBVjRx6oqSWZh/Om3w4qt+u/8v8Aaf8AA/8AX3FXfXf+X+0/4H/r7iqyadZ4ZIWv7XjK pRqLvRhT/fuKor6lCv8AcloD29NiFH+wNU/4XFVF7qSFiizpcMuxi4t6g929IP8A8QxVEWs8s0Za WBoGBoFcqeQoPiXiSaH/ACgD7YqrYq7FVkkETsHK0kXZZBsw3rsfo6Yqx6y81w3vne98tNZ3MU+l WqXRu3iItZfXPEelIe6rt8ywFeNcVZJirsVdiqje3S2llcXbpJKlvG8rRwqZJGCKWKoi7sxpsB1x VKPIvmK38xeUtM1iC3ntI7mEf6PdIY5VKfA1QeoquxHUYqnuKrXdUAruTsq7VY0rQV+WKrRCH+KY BmPE8T8SqVPIcagdG3rSv4YqqYqh734ohD3nYRn/AFTu/wDwgOKqsisD6iVLAH93Wgb7++2KrlYM Kj6R4HwOKt4q7FVssSyxtG3RhSo6j3HuMVWW0rSR/H/eoeEoH8w7/I9R7Yq27MxMaVU03koCF+/v /mfdVeqqooooOv37nFW8VdirsVdirsVdiqyeJZoZIWJCyKUJHUBhTatcVUvqULf3xac9/UYlT/sB RP8AhcVV0REUIihVGwUCgH0DFW8VdirsVdiqGtUEsDS1IadjKrjqARRCK9+AGKqyOSSjijD7mHiM VX4q7FXYqh1/c3RT/dc/xJ7OB8Q/2Q3+/FVaR+ClqFj2VepPgMVaRCGLueTmtNvsg9h92+Kr8Vdi qHH7y9J/ZgTj/s33P0hQPvxVEYqsZCG5pQEmsgp9oUp9+KrkcOgYAgHsRQj5jFW8VdiqEmcx3YMZ AWQqk7EGinqh8Kn7P0r9KqKRERQqigH6zuT9OKt4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqoXpJg MSmjTERLTr8X2iP9Van6MVVwAAABQDYAYqtdFcCvVTVW7g9KjFWo3avB/wC8AqSAQD7j+nbFV+Ku xVKvNN3f2eg3l3p1m2oalbxtJY2SMFaWZRVEBPj39q4q35avb/UtFsdS1OyOn6lcQhrmyZg5gc/a iqCdwRv+PgFU0xV2KuJABJNANyTiqhZAmASsKNMTK1evxfZB/wBVaD6MVV8Vdiqm6MGMkYHM0DAk 0IB/Xiq5JEcEoagEg+xGxGKrWcs3CM9NpHBHw7VG2++4/wA+qrngRoDCa8SKVrVh71NTXvXFWraV pI/j/vUPCUD+Yd/keo9sVVcVdirsVdirsVdirsVdirsVdirsVdirsVQ5/eXoH7MCcv8AZvsPpCg/ fiqIxV2KrXQOKGooagjYgjFVqS/F6clFl3IA6MB3FfxHbFVzuqAV3J2VdqsaVoK/LFWo0apd/tsB UA1VfZen398VUl/c3RT/AHXP8SezgfEP9kN/vxVEYq7FUPe/FEIe87CM/wCqd3/4QHFURirsVdir sVY75zg87yW9ifKU9rBci6iF/wDXFZlNoWHq8KV+MD8K98VZCqqq8VFB/XfFW8VQ8n7m5WT/AHXN SOT2b9hvp+z92KojFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPZfFEZu87GQf6p2T/hAMVRGKuxV2 KrJ0keF1jbhIQfTfwbsSO+/bFUk8mReb10YHze9pJrXqygvYhhD6PP8Ad05CtSoBOKp9iqncRGSI hTSRaNGx7MNx9HY+2KtwyiWJZAKcuqnqCNiD7g7YqvxVDj95ek/swJx/2b7n6QoH34qiMVdirsVd irsVdirsVWyxLLG0bdGFKjqPce4xVZbStJH8f96h4SgfzDv8j1HtiqrirsVdirsVdirsVdirsVdi rsVdiqhekmAxKaNMREtOvxfaI/1VqfoxVXAAAAFANgBirsVdirsVdirsVdirsVQ6/ubop/uuf4k9 nA+If7Ib/fiqIxV5x+U/+Of0Rqv+J/0l9f8A0pdej9Z+pcvQqPTpx7U6fs0+z8NMVZx/pv8Ay9/9 OuKu/wBN/wCXv/p1xV3+m/8AL3/064q7/Tf+Xv8A6dcVd/pv/L3/ANOuKu/03/l7/wCnXFXf6b/y 9/8ATrirv9N/5e/+nXFWGWf+O/8AlccnL63/AIP/AEUOfqfVfQ+uept/d/Fz4/TT/Jpir0LFXYq7 FXYq7FXYq7FXYq7FXYq7FXn3mj/Gv/K1/LP1H69/hj6ndfpD6v8AVvq/1ih4c/V+LlSn0fY/bxVm X+m/8vf/AE64q7/Tf+Xv/p1xV3+m/wDL3/064q7/AE3/AJe/+nXFXf6b/wAvf/Trirv9N/5e/wDp 1xV3+m/8vf8A064q7/Tf+Xv/AKdcVYZ+bf8Ajn/BVx/hT6/+nPWg+r+j9T509Qc6V3+zWvHt7VxV nln6/wBTg+sV+semnrV4158Ryrx+Hr4bYq//2Q== uuid:CD96A6050CCFDD11B9CFFD91990D4EEA uuid:CE96A6050CCFDD11B9CFFD91990D4EEA uuid:CC96A6050CCFDD11B9CFFD91990D4EEA uuid:CB96A6050CCFDD11B9CFFD91990D4EEA endstream endobj 37 0 obj<> endobj 38 0 obj<>stream HMN0 oRBlT[v[+m9z5+iQ7!4V ~C X_paf|'?ӄd\ua  ʴ azSc A[ i-s@ K ^ibl&}u4epI1 UGI0q|Uԁ*/a'V}*QkQ]` iМ VZ]OmOxso䚘d8:^3ˉv,KmCd`4vholQ%/r75c4uI>i7 &Dm3Xo^:8kMy$Egm_3qWNr`0 endstream endobj 39 0 obj<> endobj 40 0 obj<> endobj 41 0 obj<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>> endobj 42 0 obj<>stream HWInd XdpW5ٰav^N}IiRr>G d*ՒgoY_ZYBXI"zI+#EP!<(=ݞ?.6/g|y=?ſ!eYZϦSQv[NwkE)$tXi_(~\"Hl+>Ly)ҜdV~>ʡqO16[+hF#T I1DCNi lY=A ]xp2QjТ}1B}Uв5H>HNi?H*AR~495~f nC=sp1`GNARGZi I 3:noRUƐ]+%H\ Gi7_Ew;*$A-EVWVUIȰr$%Ul{rRX jz(BЦדxtlRe> b0}_+#Դ;w5H`,^"I^H5$~A(>GT(w$ZR91u?ABp4 $Ck^2sH3׋ae8e['*!k[)E&tgDatԃ 1eHBbҧ6lMN?;nrEΜo8L:!\he~d4HSYaxDn<7n!9a,.j+dF23<ԑq6} "p*IE@zw4=D1*B,ZZJD#r4f7-sMFg>0H7JlNY=\Wn//ˏz?~8{;(~QaFE; W\:n wWwͫVy,ϣ;v<$)MËQ01 D>\S&Y[rN]؜ݜ5!RMBbq铕,doeJBwbUYkGpKo:G'6:._8rlB%BvD!Ӕ '1KiYMBIEF ݁]`t,N7ٌͪV F*SŽz%g3v'婚N80f1btț ۄE /}jhMDX0nGyC#4mrO3f$KN8W^e 1;:/yp(x!np);ƾlxn>@pֶ.PEBIR6R;KꪆPxўΎV bSLhZO 9nh0kx } c(ɪEB,peQ^2.Ͻ64PLcQ'qMJQ%4d5wFa&McR(㦵Q]UBUGt|wDMGK;:*yZHUJGmh&<fήBhZcU_aU` 6% e]Ri1JB@>\vjeCO|_̍HcY.F Go\0nQX8ϸ.FW|$ `z3fqcʎq%>cFFJwO~ne e$q۔R&J #YvD( lWԣ o:= v3~81E&cs4 *nBn'rJ` 3Pǩr=uvFͪzy3vwxbJjŕIń:/V((nw3*W:}xR؍\ȉ}#LwY*H[8J -p#^E-AfYqo3%W<pez5}}܁ 쫹? #;~Ur$U'-TL% Yk\ZZe3'?]S;lgd4,>ھVpv|Q[;C׷ 2o<cPMpOq^*[K +:`d^'`57`*S稆iV8f 8?D,1׻{)ԗhG)G^X$`]T_xUPN1wۧ2,قcw9̅2Tr}ESK|BuzyBHpNzU7H;<)= e敤3r +2FIOX$1ŤP]I)WΞt8,6C;֬W?1[(,ib  0 Fq~ M.eB@я JOHkdZ^֫my_#(g5/]!!\x)?s4AiWg\jq >=3xo9xWd.32s8cOv|6h: ,[Kj J5gÜeB_+ R/|KgLa]7= wdMay unӆϟUa\=L^Bs+(-yҮan>p%{|Y|VL>B[(; / {^sahbU[ŵgadx[̺C *3|^#?3r!355u Բc?_<6'!~!Z]I^61J'xq+{My5Z5F5G$x"eybUܯk\DuR=LR aZ1Sx k9sR .W4\VM4ÖipG.4B(34/\iXL#_Zjt #-,(V6CK,Uܺry>kv&ؼD1\Aq8S_%=տAI=r1l?:J *bR W1s_0==el^seǐ=.b nl7߸ P.d %Q =SX*QRHLN,,5{G2xQ$' $r 9l+U ,{ed !]!ahEjZP>h3Ya2qV ?w:>{|)aQRzn!Uw5§i\5+8V_3XP.3B q 6OxCxJ3i^x4["OX}0ukEтc B-){p0=D ldqS2OӂW,%j!{0eД\/u j>ݧ3|*1P=LtXǮ\Iiy'bC wPTOuZĐ8Rp]'s?[p4G;'bf\^{uϥuWeP ǃ$(ߘ ҅ 5HUB)WPDc0+~r!H9qOBo/ؽ:R cHiѧ"vq߸܏.;peJ8nxC6! I0 Y y@@Xϗ4&3e~d4R'+~2ґjXRҝ/WpG\+[X:قb:{=6ud#tsW`{γCO42/TƐC%8m`ԃzCSOL=1)4|J'dP1Y^,2/⢩.ۯP^ ~>RgDCޝJN2ކᄘYpV$Uזela~V#]2iΉI.K2ߠrމ.OUN^`zZrngCۣpJ|kep`zR`F׊u*{xy0(^> ֮qȹ\X,Q uH*UsdP>,dzji+sU{rI3A [ƭ 2g:#a`*>z[`O'AxfXX+o5[%r#6\wb3ux:`n~-tFHa0 \{SsW&I*OGq6nzŘt&x7=HV5]gk}͂q_`x"I".P>+3B$ȅSTYc$ xܾp{VgtH~̚0l'"1B@3t3KHU. [D`^&W,~Nڃ^irƗ 0SsFw|H LǎV"WFv}R|>֏57?L2վbhQ:c2KB/8n F+u=OUS}08FETg8FH jMc'it ƄC~p+S;1_f}5N"/c|^إCʌ+L/޻=&E6fO_`vvݯ3g_'p';|<@#X{o,pt@IXВBܒ!QBu!L.,YS|?gBZ4\.S^n ̟8}I`+2ajG0.xzM+}rǹfBnV1b0/9k(cuJw  [[Fs~2F[ GSIK mQO7f[E-$Nh}wæTc"վe q'VihrrCPRWٵ6n̓J SpIŵF귮!05'w)89/I,}77L *{GHQ)A+afH:T;G 2yI䗕x/2ڎ=n0F Q2"#XaHh.R,sz,VhuKE-z1,3r3j\ի)3t&ȴ6ni[ϼ(aҼPfx[yH!6e4o=;MӋg^x,6];y{u 4o`Y:q'Gnƈ1AKM Qϊű xg:rL”ۡ݉mYS-ŀ6AW^ӫ1x9ԬRgCp3Q;cr̗Zkn!f!Q&Uiݝpv1C#lH,Y8@tk[ZNlNEԗz +»j矣xy׃oMw_8v3 r;$ pR,lY<8O* т ɻiٽa;0,Wڽ c!vR% _j;DRo]'%n1-r1 5,P@:vcL0ky{b "=G'2rSI[N!Ӕ\L3}w#J u`M~0g 6WKlW]]>ЁW` p]l6<##M%h ` !Xx'.>ӱ\x9H˸ D$~b<\FĘq.dqRX o.(2$%,&Bxw>ϥAմG#͎$ noWƞFU* mOtwM# ҫx- 0T՗4;)Cӌ&M̢2N0lwٮkvo+ʂ:{jIryHB@Ï`ZlÈ]\kr ͅ_:35Wg\S>uWHc\IWm4FGS1>f4 WP%PP[WjꗪL"J>ٙ_4`LaӒ+'KJ=2U5 rߙ{ F)GM:űĈNa -I@Q}Pq+TI.I8FX!C 2J͓ vhl!B؄(4]-@]nMXu3,@@xprGMUJѾp 2 %!ߝC%2`ou"G +ʕ{#fB}YOu+THsSXnH񘧘RYA*}QQF{%.]d<5Xy8]-=-$c8xA|eUdRAȶGQC`Ws\|&I4N->Vt!LKrʏXdZmk價T5h#߰01BE*mR^A܉l>}^+ypQazwG: ]>U!ނOL`ccfP7{42Ǖ 6SWTɸfQ:b7a ͅ$F;͵c-m)A~0棔]w3 #<_ԉKs>m]M00 p<_`_X|l;]=mίy w1_]Eu#=Q1ŭ<zA#ۀ#<+/Vl\3n #k}B}/H:LŵK&&uQ-r$qv/hV- 6B&Nh >Yb50.(I+ph*MW44/1|p@4+; t]c<_STYzROHZ9T"hbg/J߯M/,T1=޶Vz \ia2#X(1$sPNl&#\"qX`4 l؊cXZ HzeyX`wj 1o1Ŕg1YѶ*C͏0gھb F@aʕ(;6ڴ_px q5o1fF}bB(!sʍ@L8LT>O0iMѧk0,§m*3gq{S 6*)?qK.[~m,IS崹5XJV^%w@~J٭Ǻ"218rH"WU ΛJz]d):Ť*g hwImڭ"ĢM,3*|юGE?<g;S!Mk=ܕ%3kfunbO#ۺ BVT_=񬠝]`exfc:·_/X ߭Ά-K=sʾN8.(I㚉|/-B#5 P[n|dYxy^iw GѴm}9H}bӓxvFϊtÿxCFjy{*F`$J28A)_NO%/%>8> c,XD1c[{(njޤ>S&|Y:-o͔hbZY eԿu(Qc3?'F6&W *ۋN.c{%6rČ+sF-%ҥ_I82}⸧`p1f4~QČW:cB6d vkQXU<@GV]:r˳5cq k,xUdz+ mjD~5eGCѲ˰U]{7no`:€asaȯ%.v Z:UQ-_R,W9C[\d;)֑ ڏ7MZۗ7m )n6PE pbV t\Q6f^Ky1kĴ[?f[繥~͙`$.bzsZ Ur5KC >0 E^aнܓ_q7 2Gvo#﹤;uKC_KRn,r#Ҳ` P@la$E<-QqBA'q4NQc9&> 9f+!I2&&eLQmpx0b ;_ x )+h"f!Ƨ|kK|}+cRh?'/,Fk2 ]b}m[)UHۓjyb^z^}0S&ɱjrQ 2 y`YEm.ךu&U{0[%y HL>sr8V|XQ. c cuqMi`;jFɗöu]^:0-H`Y^CVt|SƳ˅ 33|~b+iB`,)$JOV-Azkg[)1f!p%J!r%xOރj^s#Aʹ{^}fFraZr|8yvF{߁aDL凌YVlhI {B;݅{tVcs͊pgMʻV]{CdABeh=IK4j{0B@km>^z";3ICwFS-^?#+B Zk0r.`|xzWOb Ƭj2߸dJ M.0\zhmXT7Vt 5BMAXPM0@gRn;ꄵ:(dp^P6R`T PϦVpv-+Dݐ*`JT".nA˰B TF u#;XS`yUJܪ>=8c"6U&z֝ p=#6Ʋ,6$(*`{h)px FePWw1B0ߘYS K0l.LKS^{r~Δo r\5Z.)`Y׊c;02^Ag! ZqÄ[# 9ka`Zv(<=* px[:R/|xEa&Kq$y0c'5Ck3Hl4:~w+ #s >WIb,o\-F}} S[/~WiDʄ}"Y#.Ɯ6yXtlQ²C5O&2@r`c?v0ñn47/+q#%Od7 ]ŜZc7bzR?b}IAS ~r77qG3~.k^wSDZGvUk>Zg8#6sڬ5h!uulTUm! *V)WdA;Dr0`\ؗ;1Z[S*AQGR^8#_O(5K0*Nv]n뇽6XNME&1C=ٚ2nz3?,1m/|MD`| }0SwK{hͧrnLi :҇JTfhz=Ī]0̈́%kaR;ΑIoW1[ve=;=qV^2kLnmqn<#zs`6+᧰>~;[j0B> ?u] v{L`VlfF(6aQ`\4&FVOVl̼{'K63#$y+rw.D4"[ZMg ,lvч'/}ޑ/͵V<\Ib;ͻ-Q{[a'dh ƅ'+[(O)8 W_jo??*˿h*+K`L:9 ,ep vg5vb<mx0hMu{pꊇl1=8X]חaW@p S 1 .!*uh !}2n~-Q$jÙSxt\Cw><ܦr*wӴ{0,_&Xv8#^k !6DQ\$n_[<ҍ*OmwIdnc<]ch.#nȭb@\Zr0{[7"DYm؉pM9EHʅ%㣢c<=aMPS$=L]5 m?a'Pb;@Gi϶okHhOj!<9qtο9TKA5_bM|2Q ~a}+*e]L@yKJ;bzy6GUVw%XשH) JFJ֖ο(:w(j7v?5ZGgC[xZu a#r0Ha#qИ9Jwbl`Be{oPWfl]j@UA{CKw D\nZ7CQ\ }Y3$cp V@4dyԪ6`'(&CMZ<Nkվ7gNh0DZ8U\TЦ3C<c-O:vsV׃Wee$iX%ShD.5lP$v0Ҥ=7R75,0Fn5l'J=de1edX 8Vd8d\ ~|`Ec_B(-EsT0X.W:!8(iD2F&O}; F!>P,udG ) U΢tWK=vۢ^k:Ԏ-PxbIӶ[w8IE1wj#(Pc=xN:zr#MsGJD^CQU,HpA_ H̚zކSm׫VrēZc,91=֪./lDxY 7B_i3I~-h4O]CGF9Hk@yPJ:\aOI3CZ!(ȻqXKwD~-eYiƙ{ؼ=F譙4c#_:?^}]`)stc•}dt5hP*+ /LPwLpb{w28!i8ĸ*WGQ(ms ¾}8p_u% GO'dq)"8%#lkxu) C6Gph(vY&n7Dm~đf_>Pg,twmkicw{Gӹr_Zv#^"~]n7_ہVˮ, ~!R+ZzK1juO ~^񎴿+x:.^-W@)ꔚ9P<"*)\k3I+t풮^+S鞐3ҙP`W?Z?=~XAU1Ia6Ӷ}XP\j ع JVrywN%x$ . 2{ ;vo8!C@hGgOEN`đH {?yp4dԡDs]#3_wkt[5Snx[ھ)W氤Y$ M&. ]%i>፶j1 Rq *i5EG8j3H{@&a`eKe.J((dX]Pd0T!L:6>G%A{׿VEl\&_ LMgM1\uõ;ϙOL3MR/Oe, U&>zg0NhWr\6d1bhQWլdxhkXBB!SpL]pNzS1ďQwV;ۉB=kSW:J@j'T3* o%j/v\D4X٧ 3uhADL_Lf)5ӪBbhuV =&yىbɱ(U{m۽xL(UkhLJ,  ŅRJJCgF:#*tB 9ᛤAY Q[BƩ>jNn]J w*v(˅lT =*G,}(.(DcAKY}ډ0e`!KtBtNN8d\ n'd~U)Ռ|P F1m, 3FL*pOH[`{Ĕ9f^Z)-# *+s!e3mc"Ҽj}WF(/SOgIg؎u0z"fL"<[ġ! *e+Br/q"T%"a_"ҫ >:-Աh%qoD}~@V%Xo=*{(Up#_>PՑ7e~K}Z%*c"lK|:ɪU/V-͊XUrω2kaՠU./(a*5YLEZ٪B+إ& w}z~(_ܩ=tD_W&`ܘ ݹxFG-R|N۝ fk%MCڧ< -];WfE|1aF~ EfrB-m"ze麘]8Ŷ2 _ZƋs \dQwP"WM&<:гݕ j s:WezIvt1U{vR?/P`w 1\4˦}*R(ײ[5 3HpwX5@r'xdZ 8~^L#ұ!]ה3Vԃ^7ɵy`I7ۢ>5 f~xMEtN9q7 4gZס0 vË)SƛRރ? +p8xb!a25GlXHG•ܚ a֞Y{%}X{:aɾZ7d9b6GN ~ ]34tV!找139CGVE;d,v%,08eyj6Ɍ1gH)樼b46YUJ(TSGt(L#aV"p=#ܕx#+GxEctj ž2 u';e^&ZdCmGi<#Ȯa;:2g)^90-CR?ߐ Od qѽҥ,֚u@z(4sZK^H`{ 22l'Sq8EZDrz+9JrVuaȘrBvƶ̮8-- +JNjora/CZJZr )}XKfj z*gg “.9 ҽWsKPjS\C=mzqqoָ"*45r:ӅHԇw bHQæ+aiTxqtKs ҶP4ƜMVJ6lzA9NdɮD]-9-QN'|6Hٵ޾޵ן(1dUApIm,sNN Y6] GSp1,`7tCo\Nf͐8ZZjF )hdt zQ׮G%Ȓ)UJW/"6jU0Fw?RC Vˉ Ԟ&EwJ}~7CfhvIyCT!׺(Edl[3p@F "zxG&Ნ]},reK|.ERkEegQ /,mIpc 37fAs4<&˲FjML(ҕ)f哑`gKɠVpM{wscM`X\.ۆ_qXB'jhA2Jl B7/S ~穁#kOxW4I3sE(+^ƦΥ~u%A`oϡU ?Jho 5:y"YyuIk{c2 !]CdpsM-zFox' :v9 uҒ*=nބv(ⴿ$gkgvTۡpB={b;ğ.wltaxvUvpU<S#.##vDXZȡ#n;XGBG hDc5|~&et Zp+߹MQJMG(۪1^ 8+8O;cB :in]z >Wt2C:eMbQC-3 e y1@[ptkQbD1> 'Q/xG)3sF:3?"Zc|[,uɔb*Hn/[[&h@# I!F-MF='b̨_E "C 䀚 (25/Fۜg@K*n',?%x{?͉]o=>Jīfc2nj=$jĘjwozv>}$s)p.8:T|[^-|6#am yɥpKvaXs9CұmךѽIӪ7^yw`Ui}G>+1F|ɯ»5izyGFJh5-ff`嗨#;['H{+x~r`D!=F "'$`H_/Ư8V]!p}et#M/9ahЖ^=4?-nϙgK Q >/( !M"dZg,Ӓ`XTDСӈ!X E>#>lWև)fom(ɡf[,1B~s 7Tă5~iB31_.\x4-:.) \`p͋$(OX̡q6laCx4>(/A0wեBRWtfϛ}1CS:A BPXrkb6-ehM~'.se'y׸!S*V֋SdiPD.V@Xd\ezm:G+gR 6)aߵ:5= fsxlkζXiOT[bn#n)ӎmm L,u5L#ۂsK="ѡZ]%mW57o+k$Q8,ӾHF5Xu,$uf!CiC+!%ӑ\L X<@.^OTwKj%4E9.j&j`Q(gf&Ft/= xv#^) _IL*C$3kbd;%hVCܕ,Ro]F}cΨ~P"3&SɇnkQ}b2&Ŷl1߉VPοnOp5cvX1PV{+]/^yX?nӂ$ |OdhVg>*-w"`L&fTnCTUnI(3fg!uKxjU dR_Zأ΃1j׿#-_Adwt]a?nhQfLW&G]좶(jNz/>0,+`]IW\ӪS#fmWUrFHXHXIS rBzs,MS#{ϔ:NTFhh칿0wķ2|:|p{hlzU-glWg3pNFZlO %WJ#HFLŽjb_`]6.9"Vw Dg烼r:ڌ%U^]},L+1‹wChatN]-I6p? xcxTx g@"DQ|u0nĪG0#]]٘f!Hk(2nDw 0g4B  Ŝ0F8™/L^w3Sڇa:?cEa(_qnc D1߇06bd]cIM+8vYgw85s=nkt߂+7%vO0 :зuI}D)xOѢFRՍ-UV #]un³CjضvqW=YAA8 aJNasH]v' ړ6ƺ`>K3p0mp3I7Yo[Ūa{E> 0R?b] D׀cz(*4VYu%:n18 дKR# :vIjCNx$V%uaDR@ KRa8}4I $m_""'8FRX0IS%Y$v?` T09N,I*#*QRA[nSET̟}F6KSR9ϣ{[S j7#qƃG|VuFsmhjg[!_ rDO.VtUNPa/T ww1+C>geشSkY!M~.pˆQ _HTa#+L,bJWG&}F} Yr2+c> L#qOKvzz sG 2hGQ#L7!K P_c JAB@w0 >OV>޸8cJ8b6S%$.R2#X|ij]lɐ=]tEv=6z5K_fOJ`3K_}O(ZIe#De3fwR;8/ gOa*S4M@USb؃]'ʶ/e6qIN_d7w0Su_!DZΡH3a2' 8#Rҋ\ҍkn6Ù[VM-]V0Z\TU(z8C1jxsIq޺lf;B*A8971ư#ȬtCuπy.^^K7%{yJu rJL.#@>C)>6ԉj3 V/Kab]Z1I">3v2{?1rULJoƺ9MG `fo\K #þ &w{O?=9ZLX^6C:2þb\֘6-IQ}g_ӯr:a?w!gÖSϿS}cEj$߫ޡK̞ xWvߩ1ZiIvDn1:<XใP\-t)UO"&]5Qo=@qQ-?{rV8Xm(~YRgTI aț!Mxj*']a1g<i+0Om)- ba'_ן3=_gqpq/ٙ~-۹༈>d) Ü5ya`^ *-!=FX褂]oaF.gp{GlV#~ b =u3PVQ 뛑_ 1Gܗo ^[ ~\̊G#zToTK;v*!0èWg#l3qpV~#:a pY#0FR+)q:̐92jV8ůl;yyn(8/?l-YF8^,Q٘5N:cyca6s7.9i7&pĨM{a 8t 7/<3$e)Qܮƶo&5>ZMfe,hYleXƻt +&kG߀ZFyUsᢗR.CK$ngƠ܊x%6h>ez ϸl0Ϫ2+F0Q mx? v8T]`)6½DUl6.dׯP`t{EyӬ~ܘ. xWL-)9Hk㋕>b\ {1W ڈ'b7zuk/- &; 9lJmHḯ ;Κc3J8GV~WQטМz#t0\؋ɘcڏ:6u|)QRG.S:8?jգ4.uS# < ؛>4lQG:rRGl栎=KKq㭎1u ͣ};Z[Rqía"\KBi#Gx԰\`CzҔ݀5:bO;S[ 8Vp>d͸4i"c!i:HNd2΀2vdK[]Ai/ fJ!|0)b? cԀA`ߏ2gx^9uFr c>dcxcU^/팴p`|XG<Ƃ'R8Jd6އ$A ڰY=k 0@/Qxu:\Md$jCiŃT{lbf^ {%w G+{z?c1ȃj3_4YFմk]sĵr1)]e@AӒ:'ֺ HyJ +iTk 4 l>4t* y0,ASc-*8ߌYu*wߧo_X,7>l<,째R "1wACp)3\S+{adDŽ\*[sFZ[0:ۉ{К<̕˜ױ+d!0c{:RQ"~IOxZ y\G++]r64NL /JƋs?f!W/&vzgu#է 6+veg'('3 ,c YO/z.rԸ~CFx )(spFN菲JS+`ƄJxNɹ181^Ud)>~!y%"N\6vH*:?Wig*`ҢjQd* D+  [A2p*Q=LrsvR!"Ӷ @Nr!{Q"i2)dZL#ج$~n9i 4B2_(&LsFdY( a/i~E2͡ɴ J ؊'Rhhå ?iCD>E-T\nXBW2(^ytFBr ]ݼ\ƱGc`go%A6 rዦ2PgqA#1K؏;=[W kWlN܂aaEwalȈ]a/Yт8$}5'7R-*!Ihuh}&Re]KU)`\uE|b3AmHeӥMxʩ'NVCS;ӲEq p w qi#^낸-KOAD*i7UyXnQߢ-q\:,UmK{U0kU=|xvqMlQdc ȇ|)92/THgiz)?j!Ct'tU0-8f%fX"E3?|D*TxRhPO˛?xߑ %ĺ^~Eپ)= kgOr 0yr$XOHkmn*zP$f|Ao`v߫"#voXA` ͇0 qsWl^܂ᜏ尟{5f7|Z5I}xˇ+ɋ[0l>t+6HTnADl:|n0jq̃eΫBg Vk؜:#a2Sة1~1lUdFjivU *YPK!$pKfc~긘^Vhr,YW _#UuE| /EFr߆2 4͈YGC{,̮ iRpƴg bqYXQ8䣶 hɟljT1^1[XmfW4ǃӲZ[8! )3 -͠]7g-bo@߰p0c*p#3GI'֣ V`|>°?j˽&=O +K3]zA sKd,9"R|7n| (2cfkU+(*8ίSiEm˾fM;? #3~QD.-qhF]n} ; 04lWInl9yx)Wu^TI^鈧H zڇ| .R+ .^3)RƵwDBw!`ϧ4S~ 3^0$*\.3 4Ę5tMF8&\gp?R Olm {#w WL0{s+EXBxi},##PeSOCTEg7H8,L1wgk`@whD@_Xq^G9뻤@|:yGFY·E/~q/}@I?}u5>Kze<^Þ=8<Ye>J)p˚F_jky?h΋3!,l wmpG|N@!u9 :]^qB`CJy@R]s{bl^M:_٢{_^ zG:38AΙ4 KZɳ}Ex>AF @Y-@gclI DhWdh s#NH?DbJ;10(nAڿ8SfZJ'8>a\ޑ玓,iKо!/p:-XC$ZPV9?oT>)udExk#g̴K@k_jOe }z4|bIVZKlܛ 7MUXū)bB\6W(ڳ'j!UD@V#zvЯxw?KVFil㺡@~p-ަ[r}Gtm[C̖s(_#-`U)+z3sX Wb[ܜaOQwu̟^-KKEoIO&v+H`VjZ{Cjlg\GͲ X9p}۠uKk'Fu/Rʦ<0k(xk+{dDӜt)Vk|(v#O5p5Iy!m0B[Δ?7چGqpCFuW)w_`}A?ݷl2~->Jkv}|r::s,jl43&Ol" ~Z&KgdW W&BlF{5cqbkM;߰]QIDž+!){[vɎ+鋮_y)Jدp/:JiO r. B飙+:}X5bTWz@6kl ~0]KJgBAޘm_1nl|[]J ý~vi*U8{Cu/g"#|Wf]ɉsOl9;o.V#ً!L} ',{sG]H8Z}9F[}E{1U#@L&RzMEa3x؝і" ?.-_䝕dR|  pImP:nCWմ,G}!ieb-CF&?uqVE11_T]%R(*r2VdKW`H-!2aI-z'a*ϲu}/ӺpK:oÝJ+~墸ej^oƒKNV@]􋥺+tN:5>Rrrek.5OE{@瓤ˆD 罥KYSmTitػp)li)9P"1T ݜYD3V+ o*`ofJ5r)be9A~6 KR݁oBrF~c!~eUR)!0ҤR$֠UڞTՐ{=s:Y0e$Sy5C¤wPȲz)x%B(*pѝli:{.Jy)ly=P2Ni͇Ϩ;kry%vDqT=2%lrc!`hu_h"x m-y ѿb 0l!KQS,zcAkV>N?bؽd ] q/YHޖjTaN0l!:k+v YcE$hکYME5[vL@-YUThA,:*jsfҌsawgM/Y|+" TRvrq-:<*B xukn@E,HXWC&<Yn쁫iə%{=xM^ڨ3鱊!pKA瞿b`fӓwujXH9d ?z SW蘓mȳF*d~vn [H!;Q_Z'JݎS9̜U ,5x4gj Xc]2,a% Xs\,/`ę5ץh!ק`",`*) `=b޸_eԴ1fJ3^Q\!R/Cykt go\rE\~T,fZ a%5W.z{@ـ;4iN@3%Xn(.t[xw EE8 X#IP`{ 3:NyԱfUYAMfAkN!{Tj;%,H+x ;޽\_ C~,~}31(r̴~quˣ5b|,糥Ö|0lYʘQbgst^sƥtYUFˬE5"ԑG-Z+uI Ȳrc_}B"̢Ew` xEVg(ǓyTZ[8*iEV̩Y\E7+i*]VLi$qƦC:1uQ mOfDUT&cU$`sUٞU-M+e`Z$fq(x֎vs)0᤹\ad.b:&q,f\X}.?M0ļKYd|H{:K[a$zRehI<=h\e ^0XGw㉆~giM'sF$vṮs3<Ds Lq_( ` k_];Û##p=N+^?fzzKuØVhECM.+8eêZQ9 "Wo}o:X;ԙ]LJW{YZdW ^bCoICQuaS׸0s:V໮x 9Y&e Q`ȂـKN%1&<PcT%~ڵA -؂{NqPyI3}téC+zu"ͶbNѸ]r @4-<;柦=}a 1hҘ*EJ' Qv3Ap|Q-,mHk;Wn:%|%Hڮ%[oI朒֠,s1UV2:fۊC@kZp]\XJLtTAR:5"Ҡu͌W tfDgFZuό䙑h4xfa_wI)S3"̈XF 53"1ZGgF>sqY\)2όx~H3CљC)cjN-}f Bn6yf$3#as53ao9'JyROFVnb]LIؼNjھV6 4Nz zpNJNp: 4Bb7*``$ q5nuц31E8~Ӄ p&z0`T8v-7vw$o8#%&#Iu Rv!nmݚ-bGcŇRSIޮ'6ʘY* kcsSA {2#B ߸~Y_`tLd 76]! NYgS`suVJMɉ:^?V/AK ' "UІ!2`7S`9~bKe,7TY 3/ԡT0KbAz3[S0!W*OuD`9*;{.WY'M뺫 b!dž>)f{2N5I,:1wI=UN!^d{h^7J&G^j˜7V. $Tc w:ZIlUF6qĿc鍽 c.ڌtL;i69l:8Ι,Xi*=bk;Ԩ6M\HoKpfʱ|PcJb[f qڵA{r=gހ>~h@^3}t×%͇VX%iI}o7ۊh c\AL@4=;v-p-,ƠIc hr(U D JSy3ja:ղN 7_ɨĠсw_3WP? N!̦y=&>ŵ%i|2;g?e1 P4'.Jtyտ4usRjH+K]`%x14v$lRElCOD܎G·}XfH:V69LPfo /YJXx&g[hy>kɄk5\r&?. SaEdrt$@c pZcqpF`޲J>-鑭'q_8C|خbx km.fd{$6ِuVtu UJ +*dOrZVM 'ӠyCy;}1t5dFx}d5cIoGa=g; Gjnry*!xč}|"!OQlw ܷ}p=5e~`6Éo):=h/I{pt0>ByV״Sv^Q'e<hʓ/$3x2f4NEX)*, Ld/WײFS5u~/p 0;}AFmHVfV,CP,m/vhx1ݲCBQNx(֝S< ݖ` N1!AT--YܞwOy*`)jLzuHI|ҎlW[WJׁkQU:Q|pU|n:tKu+d-~f _O'N7_Ǔ:\rD:%{.ד9.¼va$TR;D3izDO DV4=Wm_YU `&YgBbJubO3% \a{fP=߇cԹ$髪q.i f9ϓQG[%4,0ɠ6[iK%%M$_`i%˸<1yyxRЯr i[ZP"`/h.68YK21޳rf$ Ozi6>Q<~2g(mo* QUp¬=Tfyr1C_J)UF3qA~*9% 6?ґ$a*46JG#~̰$t~舮',i")!9v&_ 6)'̑^@Ht__Da1A'L&UkF-o vA /N~Qc%&9yД)1zii}ةmNnS6} &1`%qE\|zZwމ0`>]K.A;pO[v&[ [/Qձ*|KDۙ,G'ֲN`lhY#eD(o&12-)d<:ǂ}^H>,Yxt(-JI#R1E{ LI%k1>!@oZ'}'*mL=a:L(=1Q2{7Zb.Qn|QX:~3a5$i,6ձuNuc*A#G4xKDnZxsi B˭sv|1DuN~N!i/ g&r}a5$i,6]0w*UTU;YG\0:zn %r`1A'BҸhqnC/pc_4r]/I!:UWJNC_,W:6dQ c\SkⓞP U6[,fmV_/=Y۽-e/xq s1L1O0$ g%O&aԥk"Ï}nO )՞OٓCؒLCNDj Hڒ|.d]>d?/(m g?àd6Dy3\ /LA` [.h1£d`#< 냲S 5%\r?fACM]k.20LM˘5rZ'襻mcR1 S3V&yX^Nnep\M֠%2V/qM* 2]H~Q ȇ˚%aX yҮ'#A]ȱoK.}4 )?޷O_n=}u4 FES#}^ս?iǂ͠Cqs% oO޷@Pر wrZͪJ-UpU>?c[ E%D}MXДk&3/@k._zˋ#xz3DjF(^^?Rz|=UbsKO͏N ,+'Vf宮!xwӃK3RW1CU"Q7/.Rj(C! CO4OTANPZ #I D8;$\9𷎯8K{$µ%IږU*z_T$ v*yTPnIynyPHBoL?V@W+pѡX CZ&U>znXj\|2R.5A aX,8XCƪ uĦ/DoZT!Z 8{92Z/avؽ;$?y⇚p1C+6< _ "G+=y(S1\V.9f{}E0- BywuƞI>:Nᛇ⡒x1ǥ)g'v:^A26!NP?MMFaKDa~pxh/T3$5m5XH::|~[zaEm3mOqO,p,NA!Uw$u=8Ot){TYIQ݂mPPcsԠb õT#vĤǂWݻQj5*'wQ2n#b`代,f#&2+=a<7Tьސnv3͉l K`?Xݖ-o⦁e }BL|/&QڔmA=x& q$]TO^t <*?6.| >V*!$cZKnB*vV>\SkdjU.ap j'cH k); " sݴO8fEZ )Sc'{xRZ YqVǃ)ρVlx1|k;oQ‘ouT̥#'rbX)ptJ<~ #߉T6`Tܙ&)kJy,@ زBqЦ{eкC> /q*YFpZwvFݡ&;MVx jPL8:X4G`e'g9cý\2Ԋ-^ WZV[j"Ѷz$m鹖]֢Kwӗ&5W4d/;d)ul \GJȥk859%VX{:3`=c: 漥(&^0`E`^49s֐T햭 VB= m퇠/pc)J$^?F?Z{VP(J 3&ڜZHb1< ),Q HJÆ޼,t%x/E^=b2B^]0ŝY _\ G%Җz N *BR7-/7XwkC.cygx/^ }ۊw:Aj+xVl5}$~$!18sutpZ1lİ:S= @1l0k[)N+;󃷯h 7uQƔΉ;L@Z1HżLؓK$ԣއ=`1);EkrI /Fug.1 %ͯ NPMyMSubL (d۶U IB65SePJ\ߧ Nafȕ4{ ^Uź%g(8zyLW;K}!Z%RJڦ nt#\Tw`y^wHYȕìGb n,%Tìf+{ŞjXW3F:ƠV~iB>=O9OJ8 $'ڥ6>a|gEE"?$w]щ )b+.Qoy U*˓.CVD3O  CRHKHMBkb'+Uc> %Cqd =L'>~N)`PqESGsDbP$Qj6KNP63zd 0﫵2\"1K()K5hІ9TTgZs`"%I~Z)ZyX"9T-R73IsRR\7:XA6e0\/TlU39M%vMjvt=Ul;V ܊ CN[+dOY}JwR];ҭvR+*uoLFL(}鏤UBX:c^Rǒ>HWycC3}Xg^ǒ]^w$є%ܿ`'8}zơ$Qiy[o.߻v,f=ə*1x"PSypԊKtc5\,5vI8݉v!9d}`ʳ\.$J:}֦r#N:.$LjWLLgǂc=CP ӧXX~|0F^1|s{J|˙kJYZ͒^3e xIw7U]0 "+ͯd2/[A[7{.0_&͑!8cȑ.b ij:J0ʼn` '̴a>!4kG; 6(O*&j]ɚ)i`O[+YG!y"6r3[j$ДaFd洂ߗdԡmC[`jʅyoTddwR#N% ;DY9 {(w`F$SIig9fa%qꔸj&"|u!s$ =rTAjLdOGy&{DdqM.ڔ*+-~DOe>!WAElt~oX2,T¸GxeEʒ6Tc m%9΃ /c$ p2 ( K%dCBܸnYڑ`*x-u<1?qlǔg2U<Sm5}c&w@KD\>IM!wL?e>;6"љx0nsN+כ$<"zbH~x~gYvUƛV^'ݘ}{ _di-,'֦E"aMz%iV>U'N:`5xz_re{F]=ͳGQ7v.Jr ߿;ХnSq֯1 )7nI[,lVۅq C|jS xeM E5؃6LnuFBY:1Gu[c/Uץ`pΖ~($al٠N~r]N]c.$$5}MySz֢U\H[ɵˮ˸Vݴ؀۬Z+IsXL R={#E&v5=Q2R',1븾>5?h{{?BG-Gpg'(\ك'k9qa`Vfs%~x@ ^LX3qN(bHZ=(=>U$u9޸LpQ7} '?Ӻ/)#A99-,ٍ2q 2q82ql5x\aSIk9ĘLy90v83uDNH(eEQx_ޚq/ȒۖU3CñFjxPƲ1XE,)x GdG: n]!el)#OԆEG!чX%E%Bc@}zbבi-}oЎ4.ׁվb Y %g>%gs{=2|3;ANСPewr^uD1> Ge \CXM~㛹s1AMVvdWd}yO &A3 kPA ρW2-5 ji9>hGݩa^rtlڽmšj1 3$W1:MNO~u!YԾ[W_=}ip>DW@MzW$uTj$\5]PEDY+^vZyƯ؜w'G{Oۻ*Kz-I"J68lfNآ-m퉤jS{>JӅbӺH8$cfi3 :]O)IU?1%O?#C쫶ٹWճKܶv FH%3 pm7i5L{ د #>C40M=C?'a.\JPx,;1m@p3YRV/FFN%} <'Tk Ue3~<\ [UqW7t@y%UQUܮW{U V 8r/V{Ư'6I"JƟ q7;4c)x#g )u<5  |3&!n d_S@`uIץ}o~eh^#$f _,,t% 26Ts/8Fk.5]Dh!נ:+6.]"Bַ)wULk2\?-Ws5pzh=-#[0NA&2TTppsrz螌iXk`5ZG26,tomVԯ/i+*`{k,[]O{+ M02ik6gV}^m& L;29QH.0MiB`Þm.l3<6Ͷ5 3θ=wWwa\ ־BB{'א$rQw}`u8!.hڵ6͒4Jd C!=k AJLHzbsߕ<뷓>л*Kz*'B$nB0|*bF,2t6٫L=ƑEZv|zQ4pqQ磱{M^B\V3Y/4)Wh-$ uQgQe=|+D N\^V:"LTs?70WA14 lġ?3͒2b _̼O"ޜznz8N= h  Hć##Wj)ڟrWC2GP"_haI7VeUIDJiGm함kܘ.H\8iWH_Fݪ1l3J\nHNYB:҃HLfx$} \s^[8so"QXAGbJ](ZD._<_KM[LUQocPFX]jxB >#ms?kA#O|c*oRM%%\8}CIwdu Bh+R+ 5mk\9gdAl3Ί"a>)!=Iv@$cÍn+a 2 M#@-wQtDw|̬tmӨ#ϙI'{4#u =:&@mS nj_>iILM*`=8iيrTB?tVƞbP~8r=Ox4ΊU\BG}Vw} .=k*Tk1^I?1>2{YO; 3!|lͳb^l48eEA!mmK-)X]42CbGg Nъ!u!2T],oK$S^_rTVڕ=&I> }YQz4f Q8˪CR~ *WTYQ TE]¶"xf]Ҧje6XVao"]{+ޡ<_wc}G1=׳B7IPyʸWI_/\4d-]KtsLU/4E)xc>1|Im􆫟0L,cذ>ê<|8gԵWP j$+n(aks.[K+[bt(zeх <*9OBוРw]EAʌ_pp[xB[[܄]PqA\=9Y(5^b$v5A\Xv,1'xb#6z9LXmAVA襼QZf|VÝ5/pv Rz6gG CQp| WSWBtk7/X+u4EȆ$}0-|Y@`w^oB@ӣZi?X7PJx÷q&݀dJ-@i6)08WdFt%ĦڅZy*+jS~`S"Q:ߏPg.҇Rꅳv@I(dZSV K $Ecϳ&fK"}O p6#(e_pJPgЏjSxʽ ֲ1.cͼ7CL87鍭C|_ŕOvJlTFOMzrSg2kp/G|.Uʎ @+&$OTe .KI85q٣%sg*CO()p5NJ Ozւ\Z~ǓsoQ?Dn~o+aw%Z֥,;'3ls- \p{{Љ4P*W$py;(qs9~ {Z{Lu*漴ec! =i@LTu;;7Ā+F: Xn0γ-) b(TRqFxhQqp8B)";>j,{F@M%%GgtS}J:c@YJ7jd|[{s2H5hvSz$뎩Hq)hYe/E3e+>Zͼ:=#v"OZ/Cʃ;^|WCwhky33mTVubKn0P/%]hr,|'q||~h"w+wP" #,ĭZ)1lwrx!=WsB}q3L7PdM`8M\6"eXYu4;v{bv!4RK QR_@W;_vQd0KBh-rs.ذHޛ;wX58D4a2d8= xf'6:fu󤳞 yPs։tä`XCϥ:$W=:_Lq AjC,`gz.g.O8;ȁy*@0e/q[]Gh [) Dd{O'Hvq0 )Xy3EUӲ:ߑTx6SU?NUp㞅)bn&E$7}H2>Ϊ0hg G5S42=)1b@#¹M |Cb2ZC.Tz> 6҈29/8q*r(|`0sīv1t!\ظ669Fƛ5!XPpĦ/.Ӟ܈뉙AY9/GJRT+N>;'ut9d;?lN%pH T-VhI==<=;601aF'WȊ)l}9?cJ#AU|P;ӈ'١v@W'5/͇Y^"|M!J#۸ܰ #NX85Z,^q{Fo.aLZvcڰY ~%$4[GdbųZK}bzJa Ň` 喿dA_,[\O|O`xC ,.K`MY7=k[7?dYS4 K]PkXOD+@&xQ*"8xM-yA=)O:yp}q1iY]#/'t˗VH?wȊ2-J ^Kf!_-Ifl1 ڃW)nG i*PnMjaoI-yo(3rTLҘ6trOSrc+OYm=;n{}Xgۊ#p! &Uѕ$Y@fzfv!O&D $.%Ŏ)3. 0\A pQC *Z&qu,L {>g|Jf䪽 "oA>8 0gCF= y2f8aV b];.G jd+P}=G‘(yyPK'pqOc==KyJAsuЍ߶~V̵|Ce3Xa#R :Sr1eKQd . ܗ7,'RǘY{aBO({^$ۍ'mN"-(]<1^ka?,2BxecavCr In Y |~dR*wkһk0aaH$Yơcvx|^'cWnL4*>t`e+,Jf|#kqQGO9Jt,ۻW" {`[@LH8櫎zՓ<[O+f4ĵ1ӯp E~r0F uJx-v!+!e GV˟\״G }pPR\AD;*vW}3me$xǮfLǸ㫡'ԑ,x/wvj|ڮSNN: #G034W5ٔ }Ai:+`,r1t=I7S|2Ъr\|++oÞHqˑ؊Smk~U{mDzc|s@jf~-9iޫS@_907 GZ6ϗK:BC.x˜)֪젠C$ab$K=n_w2nHW"9$p5haDb#lN$&aN 6" @8P"Dbgkp\o?ŏ\%x!|/Q`0nH*Q%j= ud6ãJ궸r%W> ܞez8t ,U%x10a p[_?i|kvǒx_*5'ܱ`rx|vH>+pl:~?=A~@`qOz~DjlOJ9%4;c}^e_~׫UBe;JݓVX@m*]{wiݰ0' |VzKOjf9jh)'i>ia;!١{ؿr6 oϏ~h~^NY?ӪgXNqJ)~~:U?e&|5E0c: ˨Y1Z2*da M>tswZ<6Cʊa %[XB$%'VX:NVm?#Rk/(y4,k|mz&xIqǸ'TOԑ,x&M3ʖ4~b0wŅ%E2RFc˜&Xay5seUZ|a18YqzMN #:²h]{׀jYٞM嬋qUZ ue\փ˫WqѾ27s`u-=p-2g -UePEmB,S70c!-UNXS];hٱEBrP?~ Ŵs&!Llw'Ch ی*GypZ,X!)azLjS̄}pWjԹ+dtR Ԣň|( ³DX7M@2 FCt'ƳS'ɥ;&bڎsFײHc߬Kܶͣ:.3=Ǖj4I{T#RY#`2$r"':[$c7VWt|-*ɾm! Q%w.;8\Sp3bh7;IhQ2 0\$\@q#0kC$z4M=oZx9ӊ04*L&?deHSpͱ%"}w"/P J;V +/^J" vKd޹2kߏQI׾5EISo\hKp#ͫcZQE-i"{%<% (vhC7Qy&]Ei3s34\ѭǴ<&8tt-zkH4K hYm?L]pZ ܖy98A1)ŐhxI l[W}4 ||Vƿy޽;6GGC;twUO.YO=4 ξ4 D3wOרG}c678:Db/WUnhJ:SåR9tkg5FMjEPfR"^r %8 ’wi4"zD9y4Sm;ڭu1JK.$QfhHVlj Vk3 H/i]y(<9ʌJhIHuY'c\,v dzaZ0Қ~Jq#\X12~01x95Ix rKphe{4Ol( dzmXL e$JofkoNN_Y%/:g9sVB,Iք#RL?ZHy$A/Q(bN2#D?\L <8~c h(ņϯzvֺ,GwK \ Ӓ`d{5L1n+ް}r[X6,L᫲i^lɒA`1BN_⚖]1ܪ!i[lv>O`5iP[Xɨa+L x8bӱP:j)=Kpi 8\ɀTojsgYQS1O/Ӹ|ϯD@]ܺ_٧i[!CdG̝RʄDihAž_VRDکE3*帼wXcz+ 6^pS Dp,+|5NLx^_dÈ=G,S~n}cQ᯸$x"~:$h P ?#S":pzn!i΃;W?*>7 թ Wr:xMt&$)^ɜ&Z UWPsNJ/\=զ LA̲+۳kc e&$un?$G X<^~]l}W>CˡA;OFM`^O xiNy$Q<, U'$DMkP:joQԀS7]a 62ryM/$˩z]i߬488&͵Ŧ+!% !on9]p\[$0) [vŠth>0$u <-Zj@<=s_' w Z)wD;pF`+&heKw,އ;HZ"܀e?S$aRoiN{$*KZOl! |# m\.vt*W]`M|m2di0Ic-K5FҘ1½4H[+\CǸEs-FLbQ >K.%Jx$A(]2n]1rZgņ zX:M6<& ;%v zCEvؚ01h#2T:W_f{n !Qwpwэ0=\GCE.`!28u!a},Lk,w 9 CP&q H4ЊItSR[LXB" Q`X[h)GUhl~*0#x"RۓdQ[sl=0=#$LǩZYgs< zYn<&HwxC4'Ƴb19z$nJY$;42Nɮ۶+0)=24.2֢4 6gbvd׶do&*@œ4n~B%.YYYc6U^vuIƊE都 enwe3\DHvLF[T D'z&b"͐|<mGՐ=A>|!KL>l+$6'Gb mZ.х];;[ P"]B0^^S$y{ Km>m-t^`GBB2Lp !Xc4x@ _ |y*(|=R=JԪ}OIU;ϝw,R)sa]"eorf8W俄F ipUWⱲ;Y$ R1Eq/46m>K'v YPHRo ) Ǹ/o̓y)kܕ~#Uǫd)?5H @Pק Jt6wrťSŸDwK^}#-k w1,.u+m`놶QI΃_9AĒAof' v 7 Fq%F0 uMX=bMHM`aF.Y W cT5EX#ER$-hĊF27͊hk5YYzÁvY|Qbrvhdӊ]܌pHW(:WQ YݻXby4mi_y/:ARݓ*1[m +*3zyɺ="F6/UEnk qoa\ty$>R6>]z#t Ԥ}@)c> ЗĺyzKCtW0is&49ip4&oq`joehj(13^Nk( ^b&m4,IJ+h`iFnw%c7jL˛uc!L'..oL͍+3 9c?'@[!OټU^Գm8*Z櫱53*@1"`Wϳz~q!]_<8jXI،Tl~PHOlUu48 7RÀwz\UVZ 'F9$.Oo_1v0ɒ]]--Qڸ0VAuZ@>w焲[2kQZvn,)Nj{YHGr`!i=,6r8w,a!TB^/ iV/`G D"OB[,XHƷiB -~ oXg.Z4 貐#q|opRuD~k|XHn" HVOfsN`9'k`iq,oĉx%[⽌=~Ww:@Q>R}c ؗ ѭ7xq)oA^ۖjjԺ2f[(Reh٬mhˢF7ڝ$9TO0Xt(w*՘_lݭ\N7Ż;1Ib.|Sbt IC/Fx.nuz2ZD4{,e͌>4B6NvwpyG{:9#.#)˰#n8jl'RRBl'I-`Ŕxz =pG -?x& /$5^ B2<+bsG,->#^_I7@0| ;7q?Sc< 'rJZ-ңhl8,ABZ_~ǿ:Q$u*Ldl Ox[-|SC9‡3hm$6cIDDwπkwwϝp1O;V'W2,'xGpp&p-EXy`QAw ƨ[@HL C{baîķJD$-MM{]tw)Q ܧDz]ص6-8CBBE{A97 $D = FhA$0=[0yAUuAk |gM}b<<~z6?ച,okzK#lS=(am~kz>U c*P$Ʊrn:LNdl$N95`w"a邂)X-JkZ/# l`^N7 XbVKEzP H:wH_~u}G£)iU*M*p._Gtj]Wg_&<0 g8Tce~?8|N7a֎JWԻDY  "!1V]1u 8.=F_^ ui(aĶaxAD!a l(/Ǝ0cF_69Dhdb3_4Xk%$ d@"h4\ cbXc8]2Qo;\ HŘ 4Vf^w;Xb0;6f ߯(;~# Rs辌[qI/1Gb`4h~10sc}j'Z>:72#Ϳ`\!𹑙5\J'^CN _ Q,uR8f&66:a>Y❢6]1pH-$~Oma@zt&az>A{负'neSs3r a~a0|PЧ3 }cUF^p ^ߣ{2 4[o1*A7o?2)ޱH¬Vi59+XC]VǥZm9fΒmאxCu=l>Mb/|LxW/%]Wj]"밖R Thpo@XPlm_C#PTYiE |o pѠ.q0K^oz _|g2Ԉi0<؀K~|a O9"b7l&-AWApE{뿘WW3-{wX p'x\bZ8y\ {Qoa6NUpU G ݰ- HF xeQb)TR0ςhXw2Vރ'[ﵥp˳/hPNȡ\A- b=X’GF';vҿRGfp/XRl3|1+QF)GVD$N7 a𸾊ͫjaìJ7ml{)Lixi::~s/3[RϱUz}z1}Cd; >_nۋi[K$r[Fo01wzb^)E]3z-ge,|ÀTHPx# Ybыr*kWn6t\8nأ2C{4ec& $\qX OŜ p g> [3L'Ց]9$WAɶ- CIC'O3畸 lWlc*)­5'Nd+geyReznse=W~Bzו0~_4.2] l;԰ّ*sgajHpl\?p=yH˫ aGChhoCѻ mx^GQ&@uGg%/ xXs,3`ȸ_U=T܂շhKL[+>w§~!S'ؕOVփ{mMH}X%PYn8a'VHYgA2G'\Nș@sySs0us{pT ƤǺ`Ӎk35/oɜnX.Uǚ*E2{h6\.}#K3|q#b<t[?㖿+Df<}VyXpj56G" 4]Vm+EłTn[آY.!$Qgέ:{YDmK$vܿOrPOOq '+dT ܵrшR)ofv(b@gHF_5$VY=]4aâ\睴Zm f4MX&װXM\Hxu 5(U;9.Lvwva*A+P0/2\ζSNn5ِۦ`ͱIl: |.Ęk^ΰ^:)ڹUbMywKZmiϫn,~{jܸM<7~OV%`ZX!6hc\q`> ޡ7Q2o]%%)%Ieb8t0_8 8]vQCc(#и\VkycƯTݕaaxoEC ,"UyY3L|HU-_}JQ0ZPsY,3K,шuC`4E:#}%5֊88.4\L`h3'P`3I(CE",I4^DK\GG8MGd$=k`\|qF)0=!\K}g Ѥ \mװԙM6z`K]p°)0LĹ9f IMp=b}k ņx<(s8&X)£RAV#&дt-4a&~h4SDŽ/3lle֐RGi'p󦩝 bk\UWYFtDB~׬`ޢ{njmcLQ0+ǓN>_Go'ڴA*]+| n ^~!jF>$&f! peFw,N^̇$Zn6Kݚ4kB%|D =Z @y8""9Qtk٪"1Jxj[&@{cLޱkDW 2rt;<}AVjTMSZ}ӕVb?2DžjfT(Do?()ձ-|@F(td/jҔ8M&tDYW1+PFe" I7F¸Uq Kx.”J0^TQP}T#@ ^c,Mޱȓʕ0-&x}}kCmey=Ltf~.s?bS GR o p޾r5.D`RD P+@J6BR'ۭw)ӗNN.f_H'NqlHנpyE_sH.x›]`hnU#)/eT_^* /. -dq ƗuEu#"NSȾ~}>_n#.X f/M3Ӏ1/LR~g WuAq θdd/3V(ds|z@`bÛS*9_&fGo=aػ\dDΚ!bjXuoe 칻X L%h)hG $͂"k '*Ga JRF1KxmԿ1R&X ?̔cByIqPVoάV8HtDVI`l+ivb,n\7Xb6Q&K(XN!;-E`B:NS7.A١7rTى)c-"ULL_#8{=꜑."*ƒN (l䳤 ~ æ0Y~ Ck=Euw9R0Ai߇01!i"xXF4lB ` >4<uFeoZtf¸_1fA.vX`(*U@|‹Êqa?brTbg4jW$>?] ϡs|B tɼqp1vfJsN;H94&zF(TiuFb5vMw24N>yhخBa=&6Pd^ETփE0$QCWuXx|lyg7Y|#Clħ&7}ۦ8'b0]LK^bsP%wxq+SD{a%4vn+9 +JXWk/õ+'$_IBL0wZXueZ/(/\8k}v#ύ{u,ͺ_~ ]7Wb$&J̸K'L`h:%> FNBC%{GnNinFZUoH^l$FpHtFc,dq崗a58R0fTIIcwH됸[Ra~I(pj6X#Cob05 ObkY2Fv(]>\"F`,l_0j/\^.f滸yp9&. 8v(]Na]ş.j$L)ᦳ`$"(m>g._tcTW#iQYsv>XWlÛIB 7²@ViS!Asl aؠk }SO`NXQ{DQ7HEފt3=8IHiZTjvLXl{AFjT~3̈́+pѱ:㹡sy#A^GwL//7$xtV9%G:;'f waY=Foڶ?^/  ݈!o5 oxiy,Q~ս?L* /[$ $x09`c+0.QJr2M OcTj!H,4 y7WX3ҳ%U)E1Yl'}a*q4cM[ћ% fqm1k$3Rb蛂/q2!_F2C i/DcrZG~%FX+i.+pՑY}L~z# beDan0Zm#2Bϭ3/9b8ěDo{10{D_ӊ|">Z|cd C">r7B |tpE\d0!\ŭ=pvؐ4˘AS*/2(/bq ۲{F##7|X} ԟZEռ6fS')s?q(Ih{']$L[yf]/sq0b)ūU8IzƲ, ,?MX&E16p#0X~Nu=ª-e$ . 2<7>9qVd:=-Ξ?ɓX bH!2< .Ԛ19B -$| 0HIYjxvHZ$2 MPȗ];Vo,YgfcE0Mҳny7A>H3qOإ|A՗6%x*oŒJПa{p1OJ5\5l lf?e 2Zf19!0R Ě8hru3z/ AG93Fq['^a w24=3ꨇA/ޠҌjElEfm0FlV~', 8AaiΜ$X$RŀX+¡"X6VyTIB[g1$ afg=| )p9s+|o0B2p=S=kT }\C\ofj ,socvˤ>4\Bzi;v M!Cs|n@q+YܴVaA, kjأFwۣfc}$إrl0,;ꕾ$f@팔WeAg+B$rbgb&@nxG[3B~B k`E˱Er!CM JlTT1$I0'L;<-WٻJGzy,.eSB#`Ft"C"U4Pe)El^ F)#Yd[d+1+cת3RtF-Wi'FhֿtܮuZ h0W6n .iHw_gRUF[1uylzvL}ҹ~YS9wI5=pCÄ4- 1ƊHPV3ih+u[;œ}$!u("5P5CbkYeB"N'Rh?{i2P{b 6z;wyi+ڻ{8̧)-&-3(Nu1?)} 0RlWI-) JG2yjۖgVR6f볋'` 򽠙3ŀ`1IaޢPaA<+.x͑ z^df"|L'Bj՜37l<2`F˛IɉZQE0s%]OŊrܗ.)3bEX*"*.:OECw˺Er&]$d]$f%]5b+e]8t1aİ.tv\XinO#Τ]Q]jtd~6¼T]t캘A$]XK_*׬^ ƳCx멽3X!p &>veK/ NG6=prX κMCXy1r5=Buڮ'e/E L5 DxOR#Ddb#?hyF3PL _B|$b]{5&nYTqt0,䶀C'NqOX^<`KgHj>$ Q[KPҵrr %֧q ' 7|ficOZʨC(?,oK0`m`(P#WOM;xS-4ױRi7g a<ڃjp tK /p2;;a6)'0l+&y&ܱߠ,=r"wbK.eIz׆?{Jn`Hy*ٿ9U6Q5br/l6)UF M`mC/m4GOuYίM=p,&d0!Yy^Jg¤gԤyVCy]yʋ:R^bRޢ9h7Vu+LiHT/p<ҕ+NbH<,=+;a +obX7f]K׏;F:n 8k(/8cŀ+ѿw+3^nH C`-X܌Zzd3,Eb凄rn~WN,^$u_&^< __l 1(=]^K ԑJѐ8 z֒zvC׺$&p`_Ӿ̥VFӂ B2bܹK9ʜɸ{',/0eFq>QUci<Nn)r닆9WKZʡB`8N|1ڦo/4|駤)Ԡ/Ll~n\4f4'"YJx>و`qk@@n]xi~3s%-OcvafJ! hZe< +st|}>.#: pV?鿤[25j<:'[#܄[m3{ViYQ"R 0{qB~k hX(F%&+%Y]Hf8뀗炳/ݫ2hj,PW-, Qd <b-e96^3e9fK}N1XiIXcKx-s)E%aef L-h[P+LI}d)FfTzbDU _lS r2oKC5AլM({JW0I3`3X\ł#wڥ1&6CQr=^ZsX7c@ ,* Ǔ/ZaLx1A~#VO1_YPaf]%׎00?vD<_W2KV(a詤Dx(}cSڛ&$*dz~1cL6U!$k4SK$qCa{`uژo` 5,ظ!u*fS;X<)osܷ03zS% LVԮ1fpb&R#F~U;u[$5bc}: # 5p.΃զ!\=K|Y#VCr"IbkHj  \kc.s\8|yOW$GGU&7{"U]fO--awV5$ak6ol$¼Ǯ؛wRFt[61cXq)CVbK=%EOy]87za[;c#Q ]{߾LWm\ծ%$r$[]B#$݆:?*f/q 7\OK=(pcc+]' c Vj$<-ᥞSme%n*9Aӿ9H:hWc]`N3\_j_u _l% k_}>b GH ] O]RcXmKuGL]%ł_bܘI?AEgj{[iY¨NumqU&`>1$:wcu}TXNvelT߶9Ŧ5DHh^Bdު>d?H6b0U\\ߔԏd Po]>>VNb.'L4%l_x.8y F}DJX(a[J#n y!G+SKt< ]u έxgeîM+ARFX ǮG(v$oPƮ` ]n@1B|949~pCn51=А&'FcB1Jb61)h8W"9毂΃&p̅zGt+(eG/6HP )jYg?x,|'7lP+hRɔ2+s匼bQBOG nQ:|}Q FÂ]̩ fifLycc~ӏz^l&_xhODܔ.!YZ+h.͚%/D Rf.tHrt;|OOFƀ0'YiI| F8Ŕ:Fn _W])w'Nl#6 x\^hvgƯ|jW7ILop$CF,xf?60z7[Bg9u6~UQ36"bmHZ^ Oq7/\r x(vI~`p/.ۗl>eVL܌!iI #6!}ߑo+-;#vGVleb쥥ͥ ^GvZZpWc¼lFjѹ~e̶ܹxUdi~. %uw !sba7 Yqяya.4'U~pB}\' C ɼ1J) 3 4pTBajxi7TrrKl3a}-Q.)/5 Ծ$Uqp/ZokW(s±8[ tɱ%)7XNg#xȹKHv5G$awIOS_q8-)`L}؍dIAA0.R rU`OOI + 5&+j .>Z+"m$)N$E=FJ r$=HKҁ䙅 *gFy'PmMg%c[1)( 1RZK'QAĦQK86Fo{ )K‡"lO}DeNP k W:=.q^p:DǐwxnE+-D G|qY&YBgCN6 Ii.=1JBwJN.P~٬KTTeٓSR,t)+ |CgHGn$=/fJcSB(,!-A ʵ0!8[%`4‰f\/8Vz% ¸ 8$+f 'It~ܯh>rWALp K,-* Mْ4s8,0x4MQ©%ͦe=j0XJK.yo ӖKy#`}cTEz_z7"ev9@͈>T]> iF%L`ԲjIu[9+]O⡘AʋZGGeƃү\B'fqۣ ~-7LJ$$C'aD=К6#lj/:|5V jנ71nc\SPAhG'ɘD8xz'>vd-5Meֹ\;*L+2Rs.RzkJFn|1R2xlhu>>>;{,Ln&1:³Hs ѠjU0c#I) n~ ʮƴ<5x(`ޝ@- #DgK|)Pv $YZ},.CW@JRtACAU2t}L7tpS(I0=(] >2 Ldm+v$>!Xa?alr˪w*t}.mwv4VvIn2$IfQ.x teJIY'=Y} }G@p9;ͺGuGW>m'%W&qGhmivFN4 Y;6eL}97;:RBO `;fTCNT-! պcAB~[Q8bx%ݖ+Q кX` JT@{oP:*cI!8|8Es ZNfsZC0$}lׇ3hlX]r/KX~?>WbWP|ɦNd'#Oy=#֘\9E=ߨ!y!Rz12KJAĊFIAZ1mOxac#x{q33D?wkaWE.T^d! Kt0C>s@*]t˸$ s:hUlMydoBUg)S֭ 7vVIjH!|q˻?}M^X0bfDK۩it`iV *Kې@^4m k li S:ij"~TҦsxI p]XWq5_L+zO%_z%uBoˎnoVI-X>z%Bl5tPHor/=67$ʱ{r#hf#n8|^8|xrDg.Q+[֧JId}D^JK=\ bPYhV\  ^wI®Q}ן #mm|^,'p{R0y#>ޫ\mN{M }=_Bs!]^>I2t;-=qnmnnugaa%ӨgE)j[+fEH [Rz`J+sqP4WLʄ[]EHpmI`?Rg1-gGi ɴyu}VOfFGփǕ_ .04.n>v%Jאpn4!1ˮ^v=B# >}bX:h _鐖S_?*ae&xsJ_^!pT|_RaH^y~YBh$Oe{1柭>-b*IUoد'dK&gT_Ai,4}V|.XV\ gN'>^3%M-T(輷>EȎ :l -#N/\ F)vp6dvTUܖQpuoa`s}6%FCnQ7^”3SY|f51W}D93V쫇)'3n F3?vpL$.z8RȹMUgTkh}@H(ʅZv8Vpb3 @<;1sBSG 0c@z5p^3~/Jbgvp1*$HtIKmFxWo^ < nk LC!߀w _LUd#|TM|{n/8Wlc^QڊgHg]Aϊ1wr2r;T0LMLjYJ {mLD 5=|9b6 s;c>Wz0sןj!va1 h:.Ķ<Оp/Ƭ[%9f=c[K4ca=3ķ0c'`ԯ/YRp.٭bVM: q/Ej0z :*P)2T}j53WxAYs"spU_0׏0RJuku:kN[? _F2:8Ә2sibėxTMiД(|I+43=h.#:9Ԁ=7,:EgRO- [bkkoyN0*w{p|&`^A c3=N+f9IfZN mi/ci;K s҆u}0<,b~d w $~1aKlCw0,WS|ؓ@Q$ǾV'wZ'[iOvH*Bҥ3ċ d^$O{ 13<Ե?%Kb$݆N{STsJ7v'd6خR <ʖwmsúw- >Cy `VO+::jZGՠ5GbiWIӮU 4dw?\|!Vb0h넿/wTaXX9pljc6Z9!)-~0_8V\ c)_pT+!)=}Xo̹XJ.saTu1hFzq ~srvh8uіtq财Y76ƵVaN>R)ƵYz6 B)̑q[>#'Nm4)QNPA)Nj{Q7zBbw3j5_O+z8mƥy_:&ghu>_ظ+/a{5 iĚk&2=q "~>gGK I vLK`[7p4ꔽB.=/_(1nzPݬIHȌMgfUEW.Aj68 rL<~E۳%nWw%|3jx籜CȺ-vIpN 9hFȾ%BZ>iN+LVUGKM8>t]Qk{\̇BYeĮ͘@RjVIe`j˞:z5Ovuɩ`gZcX .=о^dzj~䌭O׊H&±B߂<EgrUTy-LEOP#vWGCeLtj7p^c옝'Y& .ߢCvh З _B}NjGM~eEGo>ä_)bvƒob<_5"8 _& V\Tbk|-뽸ˑf&g;8K]#p+pU@ɾ83ji>7)avUCaDG} esjTG(-ޱ& {Ŋ6>bt V,NpΌ0t{H:Ssaܪ1m9rJ=P1nG Ax882"3u!;H8áu1 {dw8n#uEr1=!_ReH[ƒ`ðz  Ly8pƽ: ŽT6]&R^Lx >A+HD݀f:DivE*EGVbdžIts#q_ Kɳ>⾮Sh8ª9Rr y|&`'pR#wLI #LY9Ǟ#t !&NtDxQ1,( vUzQCc*s]P{T=$=OiQ| "YOrhHf]4XǙnSy?𪪪(/SƉ!nZ敛N`GV0`!]CPԣip{@~;LfC]R|c.}B3x~'d6gf^| ~Zityq{0xև#:Yp>lZR{AHck0WXp>{3[zBk !x05 I܆W: ݇P/̊6ykbs +Yp\u<Ԏ|O.R)\s5HfZj׌MZ$F^Nz.5ȇSij^ h A h~z4H A-5HƐ$ v;7H6:bEh Z<5H&ԣI{ƾ -!<0! oRCuȃOLH~C>rF-/X#k"`A~Hޱ;˫7Qx5 + t*CtQP_η[țiZ 3+XX#55 o =ޱ;9 JK Rk0V0.\yNxɌ>bh ݇V2'N6zheI4Jێ"y>MT i|w7͏S\v+5GSJ>kX̀êʼcO|ض`{UX_ YHB]\°;y3nvPM5+#qQ!<^ٜ<#',8v&R!5=\x5n0łH)4R/Zmv!LmWv{y: vi?WuY\|'‘A7+[d30GU3%YQڤJ$!}|r1Q-'Gkb8d{ȉvy >!ۚ/g0z}3 )w?!f9CT-=d= RK;S1CkW^€A"bͫ080 ϙ#4k dAWn1iG'N6 R*BYq*={ݠ~q#€A`'d]:qnS%Ger$FUXpҎ @юM;LMvӇ#"{֎Dl7~"v{63gs+zS̓9_s>6LxvV`f4aL,q %B:c7fJ^1i3Sݾp/"cgDuQg==Dk]?v+LCg$} 5sфe8CfUM|x%(D? NPوljB>Q!|r#5ΐ$ uVe^R 5m+3rү&s2 ʎE,V5)mD o`ך0?<:U}d2c6,ZRdCC5S-wZL@z8npCGYZռrM+t=ܰiXծR .EqB%~exU?)tRpmOW9[}Ǩ, څL?BG;,:.4[U؎cf}_,gqϟ 7r!ʇt /[S;?0Ŗ@,[2 *cKn0M`nhU-e%>ZBnJ \ $w*D;U~~a3ФlkSլ'1LaR&s̚PKl=}<6;=+|AAϱ_MR)ULt>2[S n1_88L <|vJJ')-]sU4*ǒlW[Ea=|zfTV$!F|"DJ*Ê/7\F(h3V0{ؼaA&l<9;?9b}1H uЦ1`iMzLtKimO0;%[/8SG0`80<ɣn[WǾ&3K(e/Vj]X|^F?I/5za* Z6b[0Ν_@' I>voO4:f`V{>|"IYG"IY0n`9s?^YWd%737鹕7[g}NIQKGF>wF9ȭPs'ŖM]; m>/,F[]}'|b%}.9:xuvv01Nu'$1\kz@W/x13e>b _ K#̴uX}bX$ ͇Gݏ3fRL~c>`NLMm#7Z^%,]GYɣ&,B²S XH/>-J{= 3+/>i`jbPdž uL2@͙fnoZ=9I"n $edhCw Q'v2|n'? {ONȃņͺ=bJ#!B0xi0TP8q='lMfĨqF[,>\ŝ(󞖠èL- Q H4sJ+!8#)&BC3"G|\Ņ0_s\ wʋK&9ehI-k ?b 8֣ڌ pܡwF#+$Ư-|elBܲ@~ו~iὟUs3bpWI -qxvQXe}*IglXX0l>&b6c #VḒ+r_B\AfW)"51"pꙤUߤIi/RCʌH=?[`JO.A$):\y3xHiv |>(: FnYPN՝M-x` JW(SKe-dr7ŦTbbݷf"M .ܗXg}pĩ po$(Vn9 cQ^GǸ]_ui)Әқ?];/\M  +t1e$_W_VW{7$ibԛ*6G|e s?خ0Kr ~ԬޡT.2.4nMp^jz]Z:yR!a3:?͍Jp ly\fȂ@N`Ì,#دMHq<󗝶f9! g$gdbiK'C)/ 7`0<c1b|wc`LU1awuJ OLܠWJrÌ59Y*#6pTa@yAYg0Peg?U筂UI`U~rKͰv*#<£K"hF[hsqz@ϝ\uY`{zM (qβo[W&3\QM#Z5,6iZN芀 m~|1h׾HM;JumJAr{JnT,Lo^ꭀ],,+s}i%F.X6jLⰁ Y.`&+^A1Xb!cby{>+lԍj@IA׾^UBG7Mޕc߷3 AMbsG]UdSzZ3S*ʽMوLE_k$P}$Đl_ԻR kq?qgǀ3N_P+޳#Tw`we:em6q;I[`9g'IUw`OywȂ9L|(/$0%\|}rAbߔteMbԜ ksRlh@~p$1[ ]$9,FKH9IElHk'?~͑_aܿq,]: ̓?G2=>A~v;!2~5|@0K6?߼ݲdrB'ɄQѝ3E57u鸅mK<pdcO6ԧ\!5.*\ Dn: M%o27l45C)!'dxJGlN|=/ Ψn#ta#nB =_|9ZkٯKa_;pb,]HԨnorj{]E7g`>Pb˾7U:]p,${KHjqZ*os>'UYѭI.d7J՞#hK #jK jҢcc;B8rSʰk !Q; ƯnlC%s*q2`kdR62,e S0,EؒۦRץ?Y5V %9vAdcA},QyN*OS%8[q-M1f muǤOLB&@]Si mz2 RmIV *'6O1Ά w~a_ԋ~yQC q. 1.heHOPbp e^̒qNڂzG없D ҆yaOؑ%zdc- YqccY;oB$ީ3qo{ܖ?%eTs`zϐYyeu[:pz9+WZYRNaV|E\R7v$#:_1 7 Ɇc'paI7m̥\.꭯vXZmCuk% !/@O+bAWDS`j;\ OW%rǰP :Ul#.Z j?KǰYP5}TVggCm`j\1Phu>;Rvd<ښV8:VttvRlYqlFyMg~#nkd)Rۀe|6uaUgvm+',G+@bH3n5z!V{'r}䒣+Zώ[|OXx`/o"B1JH`ҚRj-1 Npg 'KADH إp|M‘ FЈy(uɳ&.2 p8Ow*B(JX© : R8޿fpQ2T4 Rx DY;E04g\m rh+-bNaK9sw)pEyBb##p% bQ\ ڽ`MzźCXH/=kC#6~E [a9;8;zEizrm2LլMJ8%<%Pujuc.̶L!-F86T%3=+}i&Dz`e-p2d )>bX93gg]ǻ)$̳. gc;!) ʝ* FB+8>ӊhRClЗ~HV6z[_J#IiQ/|հIJP)!nƊR ~c#=WKN#6s$,`aNx[pTE.}*v) gMPZџA\1< K ㎐~)<⋉Rtfk~ Tz%6\5pi=E}O/`opo ?JD]FJ窃'G~}* MYϿ$ajX4{ʣDS>4|bf'\wT;X}!)-#4 Gdab172 |[i]N2#4s_x/Sg b['N#[ tNI߱_`I8C-O)3?b5$V`oФ@ǥJnޭ|ژWU&I \50 ;κ?KR7>geo L`G3}f;c+iI"%,lQbq惙s€&Ff59.0K)䛲ZvGɪ XZ_+Mܟ' vZm<%Wۣd~1<Í] tŤ.hŸR=i˗Lt.ñǣtĉM mH,I/s<T/y6X2O3s2swH5^fen0TZKEf~ĖN\;83n>jS'r4b,.ƔBzGG`$ka`84,`'!]Jֻ8O]AXGrɨ#%6;<+k(klyXI=xZ0fUd]^MmnP,rv)+Ʊ랠m$6QAKTzs©PG,|nDٓE3vclpx5sHJ!e8yU޽H4 }v*ۛ]w3#M;Ѓ*@p/`1A^ 66^Kg >´񋨉᫑ Й#1[;8NP#oal?`iZu7p'(#Ht#.ΜGֳ a/S> OG`ݏP{v~j0jWp_w*A8emd4nnD4&yq}4nnHiuH#4nsUzMW6Y7w{wF>s%en?3)#2њ+Ya_@˘4(BNP=ټh_mjeLAʗ˴W_mL1}t~yJ 3LvmAFln vn mx^ҦͭR_-*y Gg#6m`C' oqCx5Q;0rQWLȃnI\3 tuD<P Ψfvu]V4#3|s{ BOK0sR"oOW5 X`]{5IT-ABn~.Q ȟ'L:SƺwUw%+jߣ3 XoPO :6ffS*s؃-ETyXsf/fw=g_o z~3R?bDbWi~Aa?8 Џ0@!I> I^6`U=stCsЇm;| Xv82RJIXpJ.3avKplLԷC/?P7J+o2f¸`i}陝B`mF ‡=bt@V̔VVL+YЋIGKQc q"}K%L-.X\~1s? k߬Fx@wfy`~gh8!%K;O/Aa2,umWi\]Yl>ReŕI5ruq)r}Dc'K_ןeg=.NB^kOphf]w3CGgs2¬R?>B;rD0XvbfrqK?X-1Ɖp'!9M[D|Q`^70݋Չpk0zwZiq+w^[[naS't4L~eIҾ=Ԍ*̐ g"^v엉 b@RU>lzPCQ_Xi&{]{rfR$.Rߗ4P;w&piw}]=Q0=?80({$p09gOfm'&[@8!zЄՄ"6`Z| /k 50~Q[{?ԍri1*>ر'1\:ƶaz2X+! Xש/3V`8aǬqGkVaZ+'ǀGw9M/[ Ϲ͠4pdvWR CB`9#8z 1HF1 ޚ*Qǒ'6F0kKj>~\GsL$i|!ݐmfqV4ȏ08ȉHAixJV~]<ʵhaI N#JAޛn#0J=Rà$26P0C@ o%/_F:Sե(\ 5dd`!8dT@E®a}nɴxWg,X Z5cz0 qC~K3#Ȣ0J#;TޖpdaTȹpJC׊9Oedv mWI"G<)q̠{%4 %k?Xӯ<'S0+Qؕ9+'Q2DIva뒆Hi cv ЭGRo\ݷGDaTKwK&"ď9K/8p d 8g~R|qaL#!pOfvr V\]`PDʒF[>ŰZ@ꋡ 0Bqgs4Fk+)!4.(34.Q܊NRR%3~ ];•YM;1`Y݋RF]OQO$6 (%̗0#HhӲhgO+;kft;4u?5 چ:2YV3 7AӿK)ɝ.+LTt5HW]&ww*M_I;|a8 4sUɘZK!3 W;#y v ϩm3p;J a1 vaƼVJA8gZeCLwi}QG&h-c/ =LD*h'TG41$!pJ;-G8|qaL#!ps ~W*coŜѨB>ނ׳Lg6Af05YGJz4ILiO(yFBm8tHgxQ/[1]1{a$0" K[)NI !lֻyI;[ygpxRZ< >Xf񺁑B̬ӀGnآ:#r-ݗumU \5h|9 ?_sk^X+_^Bu~11;x1~Ì 7xGlQu1`xMy}|fr`-+1m$Nɋũe?_[8fENbanȎ biBZ1?*g~:\1.ujLr,HJ iGZ@WBj 0Y r|>EM*2gcU4pUF?fJ&~6Ҡe}6˰||ZVH튰H#Gv,k돵//|,T%Sc GQy(Zݙ*✽q 3@4]"\}'RhK|ܙ31[/(ҕBK\͈*uE]&gT|L]A6߆zCdM:Ʀ~0tǾ gh\y7jѥ @H\j?_q$y; ,\*dR@㘟@)u7Z XG;%FyƖl\qH@/:y& \2'yA!Ft2JC82]dp,. n쳮ThuƦBl5JԚh=b g+t=-{Kw* WV"y\s/︍%JNk? #ZeЃdJ7B#?A;gް |l=1cSyĪÂ/x0l1T3V4fJ@GlQuC_0`S0ɀzΥL2dgּCx5>Yg~P0=(r95Aմu! ELtbuzK;tNT` 5N-tT/u:UdZN'?9t3:lTԘ")`d:1;JxTDL3{#AS8Qiء<\)`~QtXdL?Go"<2=e982+\g-u cѳՇC+ki<a,5ml۠]YV_zt@m;V=5TWlabK mq1ssx6̛> F-]cA?Ds2VC,7 6kS˨n7ٲִ)ѳeˆ!1W0l: ]]v8]?bzl@ `Ԣxr78e5f 4!CD>몘2[CLP[' _zyx\ڮ żÍadaZ>9Ehtd Rg59NZQ`ZZweAz68·/>.C1ӂ8O7V9#m@D-e?;")l=:z)< qoz9^ IDD͕26xkkx?6x}AS_Q7u4$ܱ*n.X0I nwfޜ {,k0ct+̜2n_M@)Ip:Q]N +a;w9h2]/?f8Ba\KX U^ Y>UxuwZLv% _lW$밋f=hރwWZQBcaf guvwWfTW:pt 1V;RQwo65]<J2۴ Dn[TXOG0]x8 5dE9za l28,jcjls |ka#&/FʴM=Blظ.-.洗jv83&0`Zƥ : +FO~& ؤtBm h=؀6d A)Ѓ,=7O6m*jwl&y>}=b6JVv;ѓo}uTwO3OjI$OW:.޻<@<_l7؟KbW/)dC?iwGC>=RC1k$|_X0uu"Mqrz~ItMw 0~5-|î7%qop7Db 3L+3>}f,ЦJA W+فbmY9:\( #x:3i AndIX;KܦhicmHIca#] JރdWZQB ʃA>3w2Ji4$ 0tdX 6`;w!轢<0sl:3n5Q5QN cmq˻?xonXC%^}`ȿ|=R_.qp%/{|0=K{ F3QHp:<=9yOȐ]k!Aq6޳:Ļq"'V52#. ||DP/Kv!K]֡eA ݡ̐NQ$xAЏXTjn vvHNddp +xFG(>zoI+`)B~dc9wT '}Oרf'tb' <}BW qR&}Ů5+$(I`z;YNbmɦ2ib[hLODZ kDPxCc:\A⭠U@a=?E]\D(è8L7p<"Y#AW췆Dg[[]r=׸% W:ߠd%dr ,+zq^c\BL+<3W8 +[@+Qr`6ԌjrnH6hENdHE`1ѡSZ;n !j8V2?Cm(# 7#he9̰&R0N~w* |R2|zfag?zsq&f_tKYSFKv\Dm6ŖI""i+iӖvqe.6Y8毞pwpKV)b+-g!\~YY1K&er*$@2/gyJ<}0=-KۅϦ/✰nL7g>G,a=ѵi{qHJwWԴ\aD"d-d$ɶBnwEV .(#wCWPҧR%׫mdZUeIոj|!ѤNjI ?1d7k$0vN{cr]&s'Nr6͕ZqPVƐz-dEvjqK.~HJZ`IT Tzbգ ?DB30^ 9$SΩ$Z`0y;шXpBN-ᵐhjP1 QyQϏX [b}}DEpR4ZuF<^mft\jYعo<_#a<0IP-ᒩ soy3(6@m>(+ la +Ⱥ%_-CRzݼCWc~WKBN]?4 TOwÀ~DxDED(9#SOTqR!d[ڊ<#!^ߝHd7vp+`lx ;ZvCV&bE߉3.gNt\CiQT:ttm5K2:<၇ӻ[ MӶ;Dz/Va%RoO/6K  oi-煄֐^qcchzKg67̏2;3ڄGK3 p]z^.l-qj/p*-Y+;CJ {zLrMYÞ[b$a O磮R=8k ;"VsiIb{I~YP$s!'&2&rH6*FS/=uG (܂kKN`qTc}p'8#XERʯ~-t1. .( w)QKyMy\H$h,pRB0~: uXp7r߸?2A@~n;% (%27X!IUZ!*uׂm-TqK:s>`K/GTw"+ڲ", jN+c]ث-k"vYCHrzv*)2=ΊSO>c2E6Hh4͆ko!tM_U+$8`("!cY*qSC=GF*? n6@ofi#C` T|[ux:k9[H-[ vr([{er>' 'osǼbLxFj^bʴ}(ևwP>Ŕ:w>-c`Yۖ)Q {Uc Fgb' !w[ Je+sS]xd UlU)v?B'#(}#Gl'QB% *wPRS\Eo¥~)lA8 2 F$pƖq92`A31IF .p|%ψ!/ (8/~upϿ,ιڐ,5 ^*C"PlCkrt YkvT:FAB wd"5C1N4ؑ8(.pXPq馃\e-OnԴ*V Murr[s}(ihMg$9CLJPfL2@>%#\fPԐ.ۀfxSCRSWx]Շfozu_qdrr] {$ .w盹(rȔ C`lFbQ\0+*Jő`"_Q; ĽZ;?S1aw7Ou6_Q :RY7a=lF3;3,#Szw 4D9R:rˎh3>V%hEVR[#"r`)b'܊ QT'UG~H`f _/͌r¡#gAWbӲfy_Wk T\в8)q E FN88%ߩo$k)>X*E%5;v}nOv"9IT:l͑a 3K*|Pl?YG4Ϋ,]G[(4GE g2Klo>¯(8tʅiqI(T-Z͟ `X_(I G`h *}q5U-6(AfboJ< K1lEB$Ǵ΃u# Օ+ qG(\ 0 tJ5 \3P.owxO.c55pկp8Ž;SHjΌ S3$hNjA %&G8I% ?zDTBoZyLeeq e I=!ɂ1ȳM/tRuvʘS[kue&\e68A^>BBbap {Wge8kdjҮz 6v쩝 EF}oS8j%ܘz03o RQ2Ed, GoAy91eQ %0N`y@gZ#(c/Hj6CLiyA'Qx0,/90$' 9ʨwNT9S<9<䞭ʸC8IXGulz0Mճ!lt^;045th-懹a'V< Xl?(Hw8hra fW Mb`YAK_rڲ`+m*W2;lM1VgH c@ߴ!@XJ*G1ʃu E Dc| |0 ?E @&$&h=âQpGgp)C4Jׯ\YaubH_f(^vC֍z [X8?`BL(mB;#q$nPXp+ _Xc~z]"(Se4OM"U/% 3CMLε4<&ZHHs} g~eU;am}B x_M`[~QM2mӮYy9xA5!K2YaVDc&5De)DJ>He7nX$ǢY+NK>ʗZy'f|5.{c*]D']/J*V?5K:,pT&W/Ȟ3vI٩0g8qtV륈m9;=Ţ O_];S6.`V bFl vxs/H4cBlUuFM[G= vLiuG=d1[.?>mhaCn >ϥĨ'*Cm1"+.k@Lcio[,qf߾㱬GܴW^Ei`z4TψC_,= 2].{p2l6A;w [C=B[_a>5>Zے0BbgM _1t @Cb1gX"r|=O!mۣ$x`YEה{puD.Zo)Q=vt:a- ~+]df#O PҶ%?1kq8хk*2zd w:z%{r9f d#-%e⬃ gQ˫U[\+(#+U#=J f(Ypi7nikqdgzSjc^Ȅn?ZwI}ID%K,UI#m(| dv(&`c[*E'qx$}}cY?{E}ӖKq| 5f@ݽs EU4;OUT݅haExI( L&w f+n8qB "*|~Ci 2$;A\ ߗ\`ܒ-K,k^gM`ȓ-|kObc05g4h,Ud LFdDS|iݗnq,M* d] (֛Xqp¾[?Id*Ҕxɛ~#.^V˰_<-IZ@.MWXBWlU@=WaCv)Y.-Xf9N?UX } Opoo*."@E!cbmWXAS|(pfMVdJ'!N.H* JXa C#̷m;3/[:Y׹%`H'8KxPˏ[6?OuY\_5~,{W<2;J//ޫqH& %blMT ͧXY4AS^.fʧz!!XeհdjCα^ɫZ,s 4Z"d'6?j3po/ǻ8GXX+`X|S{3?>WVW8HJS(Swr5C,;2L*km1WxAvP]X;M2Do(<:m9ܒ yK̄e6%K*߀!먮5 V (.uQIԇYUp N{Uu ;ӽQuˎP%RG +{pd] %d1,c=E{` #k娌J8+[/;sɊ9Ҋm뎽E?¡+t3{VLI}aK[)NC&^3yQȃZ: TrS NJkc)AꤩdgY'Qm^xq^Y=˸vrwm+ h ڟ5DZ(SKJq9+YJ]Egǖ4`Pv`/EUq|Suq>^buoD|S_nA)/Zl׿{C< ϗr/ԁc#ř!\r)$[A#`OY;pB;(*ȃ&@^EF* !e!(Vá+0|j5} }1Gt yv$x+9Vx0HK,Qِ׀4ֵz`-uKv@{ak( ͇Y++Vd>H`}Ϥz_fA.a |oNL [Z۰NXn6u,?lI=ߠ<[Mk !;JzZ]9n1M*蕁'\й[x„i˭m^]ylKXa_)sj !ٳecDx~|jhLBe%OaB u4Gۼ j+49| (:#,<, qm&fĝ//Z;,QG9ř'gGԐq'¹9'8'Q[/e&3,S߀5W.%Kt~G_ea==Ϫai=:I>|2Ѫ$jدXfz YNnZP\?e+:;PcRߕ(u^+zOtTl`C|"H9bLk(.#Irݛ$[ _dhsBp5T]/\J>'\d ,м ~$Ȩ',nvR"|ɜt"lBܲ_q?}ߊy!)N40OyvPȹC!l_^E4'OȾGA*m6 [Az꩟B" V!TnaXqndؼe~AvTPfrYe&J'_A ’uGLȘ =b_gǺxkyl`?nr]r{*k- ƛʸ|捳#Z=b:TDۦʊp ([PTV*.ݥ(4.n@;j {( ~O>2Lr+Y@Δ4Sd&K*|,ܵw5e itEvL_?1~N i¯Vqo~Ѳ2M9aQh_ Kp ,M:2 rPv MZ!R{Q< P!J:P!ܓB 2S +zP+W,:>g:\a~NR־v$R,1QF_aE:'9?W3 JB C'wċ3U܂c!>qt߳bخ2~тzDF\yO 9˔̗iۂ7cG|>)r*36©rQP3[ '㟈ʾfNG{+5k 8ʓ3NiۉS^m+.F{@!"C*#6lE+>mAh>_q 3yi!9Rz- onx;#AàJ{xpC`c.mǞWxǾ̀aqs YX{[6?}uhyBZSƑ n\Fxǜ =,^CIfFbڒz-!7X>4bvV砡p+%&C#+4Brba'W4{;R$i}eٔ15mhtFF2 YH̆F?~]qѱ CvRlrdItoޡ|bJe)Sp`R_|4#N~({f{-6vB}T*w*; ܒ ^s]sb`~0mXvIzO^bYPK[4UAp,A{AɢZq/C7c.l"cG"N^=ҙlKNiK7L;੫.A8sZ).|*{ZH[F`cmج13s+ͪWg+d!rT'`٩\t`}`pk Vt8)&l.Xi\8Rp-o6lufF΀mGlNٯ]63|k 787`1b}\>zZJ:tOn-Ts;&ϪAb4W L+ZҖ'u'p_+NZ5]|Aӑ׮դQV OgxdIpIH :[wW<=WE'vF.lϐ% pw@ͫ3 2[׎RFǭj?LAGS?bmԁ.,6ک P؃z ʾpicEn@-qx"8H =Lb{H3R{P̘S͐x/ɮӼ*W6 >vƜ8r?L G`܀A`7opW7W|Ggɶ)&=•U'_g pJ! \XO)֪7 Ԟvt݊MF'd<\ff1.啋̞/;vR9!o>),$%MMbmT4yosdጝjo%ޗa-~,CV >Bg+ף/|.!dA;Ex?qJdty`q,Fk]"%n)o:\8$z|4FNrF܋3]Rz95GmHI^TeH(ĥWa 2Uf qpsw$!\D_v\&M&SWFb8$tC7ZpvKS4Q|g6YJ#EbbEEP(U]}R26vtMlbD2IF,eȲ#ZQ~h4\9 ɔթ%6Nmn],Ʃe ^ڞHc$6!c[KT 7I3LL:j0 9r3&+8V4~GZgt =`H} a躵uwG8pI+]3Yb3P^l]㩉~#(b$:dA!U~,YmzW)KMG(+^LM4z:92oR7Z.v%ָ2@PXLI̮MN͗%XY·e nfzCɯd'P2Z&PoGp-,<,F0fX E'0+]Vc'X#@Kdj60#g=,̉.=?j%Л,5PѮn"Z5zzл!8!-g!L\!0$@+1!9h?,uT;R)_ R, Wnhm}WeD1Гc vTmdūunGS2%$qf9ZzGY浣Q=zqD-a:ʡahw;|C U戉\5>6=5#1\5#Ɛv /Np(;&0vds+र%ṁz;Bc'p3T`C';oi:PNCӪd*9 GJw{8Xe)a{򷈩.1bڛYo#+[l%BwU:I-JVui[株S~+l]3Apt970g.s1t +%k6\wyȁ([\0eKԼ+΂%`.w.p$ЕGvJy W$s*0b_J͑fZ\Y[Aΐ:"=M':zvT[㴘 0t͞s=Q[Z.OȞd'MzY1&yT#+(;BsLo^\e5KN }U(^S4HNڂ5j|ΒAF`i<}$'F~-"bs9"VgMvudpu491"F<ѣ:>FYCne ",Zpw&ݬP5y-\ ۢ7&?-0[ۦ˾_7KE8MRCؔJa h(I3A;Σ!@Va4ЎHfFFKayR"]`p8s.jrEu s-]]!zDF>wâsqG_ *"y]3 F>GF\$ JS.hXY| .w&ɰ,n\KZ$-9焀Iqn_ՠ)i?EyTMglrzZ7E8>8`qi7pYE }-yAmAƐ ڂZ Q%ꐈ\)ytj"7]!o(v,_2 i*i K.EImY\P'ukrD.2"aVZ6DZj(OnȼղkpzkóQȉ0(12c=$a)a1~y-ܶ|=7= E73NFß.owo.ۦݛ?Qj ~(yϿ`%u>/~h er ~kn_V\9|W=s0+\1rqɒ-%Pe& %Er_2~ $ J*[JW tH։hkQD@ekI,S7|G ͼ$]D%ФDV CNW31Lek,U6&"9"(xgÉFq҉ҭ!u\@'`mYv wRa|R҂#Oh"ʨqЌ.fȞddQD,}{3]O:g~\S}>zvDB+ MaFKi<+e}H$tvH#r²؇%1ktPh 㜬v:i5t,)@c?UgYՉN.E67m 1#z:JQ p?yak Q×RWx9J/ 1Gc.uN!|'wqD)%6 zxطqQC#&?7ǯ&t63IDQx/h;gǫ5}Q'D@/}=>l9Os~ *%0{V]?~qķE&`៉ W|67GNj#:uN/652G?~Y>ʶiʩ[hok2 C\|=;'"HFZ8V3&hAWA Le("tp! endstream endobj 43 0 obj<>stream HKN0 o݇+I"ֵԊc[^G 8iZ3o{ic)+kKw$Od1Xؙ%,p% iJ[ OAS*]& A)\-7F҃ l-Em\f4i!J{K0cd\qFQWi}ruj !fJ,Wx8h.*htmv>G6&$g8 <9$APd-Ûpid` ;8;dꞕ3,(U01l+uBCy )M 8R!8a]ظO`1 endstream endobj 44 0 obj<> endobj 45 0 obj<>stream application/postscript Main.dvi Adobe Illustrator CS2 2009-01-12T16:59:05+05:30 2009-01-12T16:59:05+05:30 2009-01-12T16:59:05+05:30 256 248 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7n5M/L678si04XdtcPbx XMJkFu0Z4zCCnEeo1OTWqyS/zOzHbFWR67pU2p6Ylr/o7SiWCVvXiMkRMMiyEcOQ+1xp1xVjcXkn zYupW9wfMsq2kN3cXL2wNw5ZJ+PCPlJOwKxBfhVlZamtOoZVZB+XuvfVJLa/8y3d8fqscEE7SXMT CaK4aZZZFhmQN8BWMkUYhak1OKsh1fQJ9Qi0vjeNDPp06Ts6mYJLSJomV1SaNmB51ozN035CtVUm 8seSvMOj/oqOXzDLLY6YGT9HpHSKWJoEjVGMjSOAkqs6/FRQQq0AxVU8y+UfMmp391c6f5juLGGe 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 q7Yqqp5Q8tqtsrWSy/VDMbd5meZ1+s19Yc5GZir8t1JpiqNsdLs7EItqpihigitYoAx9NI4eXAKp NAfioT1O2Kpc3knyw8rSyWXqyGcXStJLK5SYSPLzi5OfTPqTO3wU3OKuTyT5ZSz+ppZ8bcRyQ8PV lP7uY1kSpatGq3/BN/MaqpvFaxxTSyqWJm41UsSihBxARei+9MVVcVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVYdZeZfNj6zpsE+nE6bM1+t/ci2njZRbyyrA6q5+EOiRnepbl8Nd6KswRw6 K4qAwBAYFTv4g0I+nFUq1e81CDVdGitCZEubiSO8goKegIHczFqFl9ORUXrQ8qHqKKptirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWvLGnHm4Xm QqciBVj0Ar3xVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVYZa+RL6HWdH1D68ippU1/N6Sq7eoL1pmWMs7MQqfWPiIoW4Lyr8PFVkGuaZPqWnR 2gKLIZoJHn+yYzFIshkiBWQc1KfBy2r191UzAoAK198VdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//Z uuid:605E2B299CE0DD11B008895C9E096A0F uuid:615E2B299CE0DD11B008895C9E096A0F uuid:5F5E2B299CE0DD11B008895C9E096A0F uuid:5E5E2B299CE0DD11B008895C9E096A0F endstream endobj 46 0 obj<> endobj 47 0 obj<>stream HKN0 o݇+I"ֵԊc[^G 8iZ3o{ic)+kKw$Ob3{'K/X4KҔT"M )7kAn1]/RZ<o*#G8Zڸ f4i!J{K0cd\qFQWi}ruj !fJ,Wx8h.*htmv>G6&$g8 <9$APd-Ûpid @nwRq0;dꞕ3,(U01l+uBCy )M 8R!8a]ظO2 endstream endobj 48 0 obj<> endobj 49 0 obj<>stream application/postscript Adobe Illustrator CS2 2009-01-12T17:04:03+05:30 2009-01-12T17:04:03+05:30 2009-01-12T17:04:03+05:30 240 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADwAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9SR3VrLPNBHMjz2/ETxK wLx8xyXmoNV5DcVxV5jbeU/Pd1p/mO31mW5uJLh1eyhMpSGR0nZ1eJzf3FE9MgGMwwpsPgJ3xV6n irsVdirsVdirTuiIzuwVFBZmY0AA3JJOKrYJ4LiCO4t5FmgmUSRSxkMjowqrKw2II3BGKr8Vdirs VdirsVdirsVdirsVdiqlc3Vrawma6mSCEFVMsrBFDOwRRyYgVZmAHviqE8xTatB5f1ObR4hPq0Vr O+nwt0e4WNjEp+b0xVhHlufzxeweXrvU7q8bhq00dxEIpYi9o1jKVa8Eljpj/BOOK8Ylj3WvJqHF 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 unL96VIdV//Z uuid:665E2B299CE0DD11B008895C9E096A0F uuid:675E2B299CE0DD11B008895C9E096A0F uuid:655E2B299CE0DD11B008895C9E096A0F uuid:645E2B299CE0DD11B008895C9E096A0F endstream endobj 50 0 obj<> endobj 51 0 obj<>stream HMN0 ojQBlT[v[+m9z5+iQ7s|+T?!,/E03˟KzitI];B23H^CЖ<#pZ\80@q_%AprZIwG9gBiQ8 AU^®O6Ub#Ӡ9/ @޻ (o䚘d8:^%3ˉv,Km#d`<vholQ%/r75c4qI>i7 &Dm3Xo^:8kMy$Egm_3qWNr`"3 endstream endobj 52 0 obj<> endobj 53 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-21T08:41:08+05:30 2008-12-21T08:41:08+05:30 2008-12-21T08:41:08+05:30 256 252 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA/AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FVK1AFrCAFUBF+F GLqNhsrEAsPA0xV10vKNRx5fvIzQOU6SKa1Hh1p+1074qq4qpMv+lxtxrSOQc+ZFKlNuHRq069vp xVVxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpXba uPq0VLWeQcFpJDCVjbbqgLEhT29sVW3erx+kvqWU3H1IqerEOPL1F40qftcqcP8AKpiqD1jzadPM FLQ1l5UjuHMDtxp/dALJzO/TbtiqronmFNXvBy0y60+SON+Jv4RDIw5Jy9KrFilactv5cVT3FXYq 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 uuid:991D60EF0CCFDD11B9CFFD91990D4EEA uuid:9A1D60EF0CCFDD11B9CFFD91990D4EEA endstream endobj 54 0 obj<> endobj 55 0 obj<> endobj 56 0 obj<> endobj 57 0 obj<> endobj 58 0 obj<> endobj 59 0 obj<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>> endobj 60 0 obj<>stream HWˎ<6_# X\֓U{\k/k 0#\KLJӞ؀YEITOcg1E#3222?UvӇ>|ZPªƿMWWve~tP˂q {v~cv!T'>٪)s4ŧR_tqslw|.gXE|mp?]ZUվI_>ҹM ~_䱩T1y W^7fVQ.CNþT0Q;0VuT/ kjds֦RF?!&SZ lSlr#Fr5b51$ уsysA!z}kި` ¢] .".5&n6t[L4Ű4Wnb>Y81[%Mj@.Gi];:w<90 3ўiP}>ϔHvKU#$opؑ)HZ@Oa<[q8&6@^g^z ._Fiܯ؃T?1X#j iU-?;D4 Aw%Ѡs$PPW&-b۞)ylΗ-vxKmpR7udzH0q{HֵFBi5[ 1APu|h1+ S$-3=5_=QK{@}{K%.nz$cf |588D?ut4L R}db"UD\J#֑@񻄨}`RMc}FɇqoZH=ϲ a4a~8FwA# /Z4b;?Ƽ/fao~Sr^ X@O[ zyz46kmv.8FD~29 Ԇ9u` O5͘; s(E\ylKyIbxz)"86,%}NBi+5rЯH@rIyMRP\N魆ۯUkcӍ8ɛ\0΁ofBb"[u ߹9|\drNG8Kj9%Qۊ)N#3&"rS"ڧ#3o+ީIe\P/C .9ܮ#;< NM3sBiTh Zs">v-P$U(RNl`8se(yիydMrŲ\n 7uVۛʚdsji]3Rť4r}.3c<;!S➜-S_*&>ykYu.1%7[[˺H>{!_S#o܁=:i|k5{ZBGqufRܣ$slLhZ_\ȯ RPѐ:JaQMr.E_mnq!jG9N67M ^.醤R'u3 a$=k"D_|f^66; UhxzB{IH?Iu C8АQȲ.㋆*u&&Zh9vhGpȥq]4wY ض:8/I8Kug H^v,pDɄTB0&=}wvo]AߺE2Q2Qș,ug" UNv->o/[`ͧ/,FCf /)-5=IEٓ)%,%WfLCcFY78ᖖf%tn1†q&=-49e+in8dj4}mnc pj݃5Є<Qz3 F E 2.JcqcvgͼPqݙw>gf!_q4DsC9\y-E׹'atQȻK`.ٙ >2(ist52g8UYKJK:v8q=$iѿO/mFKG-2x`B.pbw/sq48OZVQpPz Y9t! JFU#Jf;2ۤ*vw2h*&{\8|WGW%Fsz/ʄ ה{si㎁f 1bRg&B8آ$nPXWToӐH*i l\umY .ҧ>qn2bZG+۠)tJq4XGh)K8Mc7]XgeR2`&ueR&̄y e};鈞 Gl2'zA:Fľ~}ײ5dpVRK]}gzi"8IsBf;ڬMZvH";e<``23ŬZb[jd $eEL|C>!ܪn-M@ 5Qus=IK7;`G~m2c`)83(JN&ey[b@P`U;Noo0so]E?#Rۚrkl7A4m˲Boky{#t-s{6D`Cԅ.otQn&8~{wƛUBׄH櫓t[lJ̀7ew;h3ǵ<:y49]vKDb- oR8u,m9M搲'}lNT "RVyuKq2aAƹ+دLTX!y}[0 FRĘb1g5Bex"1aWH:R>wt2AM[c2h:[<1F93VV͆Dbj樮JWhj[vk֋I zDE%~#KGA0;Ÿj a(a}KtfKl_<2*b… g@IG#7Ng :k(qe!kDb);+ԀXWYvj䄸^?ȧwol8D?24+Ǩ$6u&*CRz6m2Mt%d*LuxRf+ [-2UbtRHbΨDO,h~9WeJ}]ޫtQиmQbnM{=K#xܹۜi(<:nW9=S$"hr8/yQJ>d}3e`Y4&OvqpЬ务8(r?S L1hأh@CwG !upZeNCyQD@)83~gX0x,B@z;;9|8T?E! 'C/GP +A[ "၇ fCYL$^rNq~w<.vnyn'oBMsmx~.yW{".sC-`=c˛nCdnWb{=T8˼DGs{ZAX_oK;nӄ<|Irg[pLGϔ|fab[ݮѯBt׳K.e ;=`GW[mB8bu@OY'dF/v 3mLFyq¢j\BMh5D,/ /b[[|u˦',B$n s>qu h=*SlPA3)Å*Mu Nt4RFO>\y?nvI~R[)O9tOfyū oo@F|ūѽ(]S]{B!~ ^TЃִÉvq}/W5bYaSfaJ < /}ӭzع0Iy.2POq͍vm׼f7pӼ.}8KZg.;P_eU¡/ebz7 "= mt*}O{r#"ͮ+9Q s'J$+(_Aݡ'Ŷf&i7Y[$?pRF{L(we+3SrZ_Ű( ژ7(z Ջ|ﵹ>zUބ&KAfk(1|b ad u@Kq`f;UL\NHvrJbi^+o "ۺ\bcM]?JP˒@x5Wz z">)^Qƭc ꇭph-a5+Ͻk6a8)'׈_`P(mwܜoUOdO;3U,̔gu:9l(| t acB H`# PBZc2V]QP18vS9ρb O0d{d`Ś aݫ=e]/VBMl]xEs-WUO=s^܋ u\5Q>Kxt4Ij8bwIRESG+(y&SDgAc2GV)` gh 6*+Y(>P7v&Qq[i^_al/^1t'YcZ Yvy}sHi @ON+oE lÆ\ގ KY;%N$楝@ xOܿU/=d @@jZdu4` Fv7F>@z @:=d/œ;)KmWPD4UUu!ZyfU;Y5f aڳMZGQKuH +TG.&urs9B&(SIA#&lكPC0]9b:w0gq/;E^bv; u[jc9!^tz朮xҎBھ%NWOubP0A#E)?ȎYD$gf$Y :"+.D9.b5tթ#کlShgݓ\_;>6r_u <7`~WبW=BiKUoJ=Z5?guJ9B܍ ^dV*96bGAO5Hdp,Ga2SzfkSؒda~,CV:~$ nY@7ҧ#켑WQFo]AsFSH-$pa5dwdLYaidaU7R&%8&E#Py$6>"z Y!rw8åF:FѠcQV'-oA'VQ ;W@Gl < lxRUtRdg_k"I=lqg$K,j_L+ 0Lx{䜡i5Ez/?(׵hc*gD`+ bEFTo B}b`9$ HWi p)#ˊhno2XYOXfh^ vJwK4X@<0(<'__Ի,@JG g\AV;#>!Z/e AJY${pAԿ#v9`o72Զ(2IA^Ofb=hD8T ݐ6=ct ÃUT-A4 _$OdNEQ*:S/gR!'߹W"#wݙ(BDJuICleX2N8Pi%$U[q&)cX9|# t>)YSgyqFyj<:(_Ij= T {LSk/h=VWi]z>hYM(LeV\3kaց^7AH lE.%`Y-z!s+2YN틒RD)}5Kڙ' nyj*LyĉejW# ¦df;7=ƝS#K,9Py({ݐhn'il,cwik Se V,y\^,Q)G؆'(N!:ڒ/.D, Ah틞eo{\k t6 DdPP$aNeI/Fz"FIcvҀ(e9|iC.;iIZʇ4peVHl a8(ş(-{l^yE /2qWJ $CyUy5q@JLAVpD(sn37^`#K4QP1Ke $kC<"mPtd ubpi (WϬE&>Kxy*Fo4 ^@VeޠyUFxk7 xހmtC7Em,5DY R7!ob ]>`ɑ=_kL+ 6IvPj:r+~u?JO2yMv6nNի&xW7mV's]rl#!U e YbҖ&ع3t<ܡ#!bG D5HG#_dca~jGO'R9989'+J\z*cy (4&f@= n5$҆"_$urF,Ua hpEFQM9:A+]OLe&Jz-r`y}aD}K)2tDNM2'bMc"`rSbY igSDD='ڥ߀V%C7 +~A9˶_FL?^Ș'ezJ ۾choTA.뉤=Ȟy0lpkSZ/`$O4T_J٠)y YTNڀhB\;2UJE9EV~lf#EtԊ(U0!*{JreZe X]ϓVSk|tɷtqv\9%KCK* 4 %G-̟4E\1a; *X!F*>$xgh|=4hP+5 9ÝJoIJ.z",f]%7ͫi0/rpfWi[]wJE(]vh+q>]{3|X4m]ߑsuVUĞȃ s+]B4O\~-ĔcY;>T*#vn$H Ύ̫?[;F0[?o`d;_},]VD:*j5S!v&|+RJݬDY=({]5T;tĸï&$Mٶ4R0jB UZLz} Iwh5xQl#IA=>!^4zRpYֈhȬVHZx@N2[Aq LG>T2)fŪdŸ¢qh#~eE3s,$up"LA⤵j_3ێ)ǛsܧtK&a:Zu&7 xA|dX+ɖKV1Yqľ~w"8eD7^` ~7k#a?%A` MN.ods$4(W'|*0G?c }rI,aFHeAT>j*Ǒrh!Ik/P0r޹|lĻ_Y@v>_G_C.#˂p۹\d,͐ٹHB* ^=ds lZv: BQ~A|r&ad'3I^^>j##/xГ v5 ~ #1 tzGF.dA MNTj֔bEc!O:ZP tZ-iLjMj=*h^۶x^ ~_}egPW6Rj?wiՍ| B>$r){eQҰ;Ss 9ϠR}F.#75"ȐNa-3jdlpƍǩ `ҸUC fO>F4r Vrထco`ONe_Vl#G@lS`3WF<$=M;8V)4Iسg;WvT->G+] = ְrj׸_Uf+a}#.Bv6?qUe=)^ڲ[y#Wx$b/Q.D v.dKAK^[j:a2C:<_J: )c:I'4C#^#8nh&mO x:,N)"J:) Nblb++Xu+xeL'{^OeU/)Vcؽfrar"\ ? -|5M Bֶ @/i>WAV'r+"`@n-f,v q:2^_r첱WXy@1ڢ8q9r ⧝UOdO\щ@󔳟 RP8ŗ쥣 \ X{k;j\n9P=j&}e6rn>ƟY@άx~+"0e#`o 1AVIbwбs_M= 0ڈ.Pys Em1rKeM|*Q3ȧ%GdF \fxnk\ٮXN'KK[[̤ 2e\_ȸ[ʽ jj T߂Hw=dI㞃{j(zBAMq1Ɂ*PU/) OC%)Vǩ,]3UzBU9ZOa8WnIfOn\O*PQG8COpʾ`'ؔP$fI;-'W|+YE=7"#ټbpWV Uջ@r )/̺)#"L#+_qY1<@ˇ8yy=+'לM.؈cgzW.ql#NFl=8b"=~jG}, J́befz^GZxk#Sף+[8.!єo{&}3M~B@%>FFPGJkAOO<[NW^8Ȓ#K6blծA' dqUzJ%:΃" Ib0RIF;\UxyCJYɉk=rv Y{b^Zyit" '  zEw,'[fӟe0C@b1TީȤIZMOD ֠yRgҳ* -_ԑ'ÿzRєlkwA7DžNW YBɳ\S)A4i]ǩ۞YڀAhR+59۶*@hmfǡ\(P7ꅚPɒ~j 4Ŵ' Fh6 JvQYuV- k6D 5=jUUMsh`Wm'/ot(~P*P!w-Z@adh[P>zzB# {K&Ct\e+:WM|*p%cW ]g-E +>K_ۖ9D8wMk؞7D[bl }b|Fefk甴}#BѶAqT|A!"{ph,9iW1Qi2Oy ~ew'"pl]{Z31M`^\~HmziZ!Pv*'dM ED>ȣռf\2>J)ATe8z,! H:*t9q oGx;m= 1Pf~"RmD6?>G{k n"Hj+hc t˫ Akx<uN82/lxFG$φ/d}[X6j=RΆ1E?TCT4,[v&vW+i^5;dށ,K/h#CzG T {kA:@bHCEƙE S='+} .#960܀&@#qCo \ 1؞CVԴوoG5&"AV͌ GO=ZrF-fuC,nt\o=;q.%uDI.tV/Mb#P"'G'lZ5[6&9 3P6aD.vD5rܪbgQ(als1f9\:S c3216k8ECC(L{$gMfƅ/Acwֿj$"%X@. WJkֹB2_Hh b__ @t:l]Ԝ< (As]>fk5t tTe*ዂP 1NH9PN2wH': gd!Cj鄓[ ʜN&[:d4Y K'꬀ݵy>Y(b9&=Xo1 fM0NBKD:XoŞ*^cF= сy,#%Ń?J "QBTjF#Qk|Jl0v~}H=X_hƕ ׊4`i(ӏ#ftw܅qɟ^' 9sE@.GP DDO H\p#\$ᵣT_k̘Zw hũy4Xg/VבF gݳE'rw=χwc v4p}%% Fe;I5 ,o`pCQu#]EH "(u;*3zZ2Q ./q+#F'p֎yL@1ϻ,4$Z(Wx$.{,^dy Bⷀ3ED0ċ"蒼r_|ⓣjzY#ew) 1`@1.{u_P-̿~}e@*PpCnd8Z5µСu]yaUkKUjHC8љI9tΘ7XTFCn{cXv\rGIÈK1,huB").-"cM ⰼ:G cz[J gS(3puuC׎sbߢc'mjw,*'>=Jʑ>QVЮoKE'>h+ĹAXUJ)%奯HvjcƲD@,;V!&*L\#و%$5ՃMcva-/D!HgyI g['"E0mPJiO6IrN d + m|h5[wH@N)'֠xgF!Pbz:A8kl]dmOXJY4Q'_;jqo~deϬm|x!9‰ın:q+-SꐪdVxۜ8J#UU|vhS7BU+,= !sAIg`.68L#ه8 1^L أ*4Z1:aÍ[\så@ d(AU浢ru5 Ü#uPW>>lG:Pӊ '$tuQSnH젓'y\VXo爃9yEy n^jN`g c}hc }8a;-^b#٩mO9)Xn IdðSe[zAMڰ/<ͦis|Sh_׫/b o?}q\LqFNY5;EnZpҴP"c\&;R<5jX1Q>>%1lK(vKukKKKI Iv.勼&*iTF>ݙt2HiR4. _Aˈ4|5,߿o/|Ӹvҁ ޠq!iI3~T Sw?hZI-/#u餔(!'A!Lm 2Z[x&'mCAS%KV:OM2O b}Kv)_eq~-ꓖyG;8Aw\itt5 YނxY غ@VYx\-;dw^lܓ]1ܖ3~!+~]tYn!Ǹ@S4GKES aˤL3р݅#^7Qٟ)hnniO!ZY,4 fMA6ͯ襏uJCv;z͇k[SYAc/vVEU7رW}w {lFG\KEqrB$WOUUQ1q6TTdg."KEUUعC"ps"n8r.?"qy<?٦'^%6GT:֔t4i,g8OlR$ɼj;}8xa;='F]rQ㹂ZLnZnlAeNgY#^}ޭ&ʟJ 5"z"VjR#{ke{BҐwR#?R#`sWh>tĠ[̰"Ԏmvsy u|@,'b|~2,ΡdA6&9 Bv4m+btOA 5aqZ#9IzYӂr&;'ohuЖK_Cȅoz"+jVW_ےOvDȰʳLE``=6>"L}2)7BBZƓ=xk㟧RO(,E;y2N3CfJGđ "f;qA~;e+_hKŋux3mYemG}˜cAH_-dT{|#=3ΈL-`t9`GDZ}K&;$^5ר-l`vw߷xqL*h3csܱ,34w iu8C;/Ρgks)ڒ6;Qz"͎6d \D.m9im\|&KSfei3%@\ K#)|D\uV(̈́i.e"wfG\ hf2Zrtv9*͎T$+ZG6pq3%pݮ)~q< Ls#ceяA+2y(aqU%]SQJf? ;q(ksEx:2TZYɑ33a?U#h}(;~;e+_9ت͎6=6[fhGanu3L=(쾂8צg8?/10   Pu}z2` YQ3MbXl&gBxC.QȦ=P>]+D8V t~>kzc;{|@o0SaE܈mmjDWarJP.b`˧ԞO #8RJ+**v۫bAs,tlŰrSk-a2&a W; +4p+N[HU 6-Gx ?/ͫ3#^P@Gs ٸ^&kSPVwĒZ?tn(p+x&&:FvRvGQAUpG̍I.~߼C29yAu /ײOub/I!ڋ9>_mUOja5iac4 Cr/vx"li[Ѯgnɑ]e6xJ=oEO&k#.IbeDCEq}Im*U t)(2=K$>]*r6>5Gݭ|VIMCFL4;$}((-rhʑ\qO.0 y?b~ߘJPTk_eB(grc\b (;NڎMp#Mw';,L)8JHйO]vv8b.‹ۄpCuaԴ_^:b00Tv8 ! j8>s:32K*@^c@zvCk+AA`.A09FZzAA+#ivܯ\ĦD=nHN9h09G0 Ǜ얮SPP =%z,)7G@@Dt="pr\DɇL0&y@׼ G>EL(q ?乤+ۤ?3 "{!EJ|Hn!6oFtSrlV1rS<^^E"h \^E^}:pS:\M<Qj?En¥*:MA `^q N!U]v9ش}!CZC`cc+M0 Omc_ZVyB^8 څt^0IƼcO-7cQ[Xcq˲^ w }!,!z,\]~Kզ|ay]jG*v"_+XϩODK*Q]pꈶW} ^u}Zhpc^ +WT+T.,W{Wm&j^]ȉn sQXK'P``Xcc1| Wct#%mEVZ0~ckUKe{ _H[*X9k g@ ]ڔ=fڬH/oRF6γYfu"N^ZAQ !h$FDdb_!Т+Z0N[BAuYn} GF,u$iű#a'-Dv@g&Ad I5qHk>cPs*zxݣ]:ۚUdnKʰ0*0BV%nԼA*ІjI"O1͘~FFO9r# ̍xy!]"9r} Sr(sKԑKrhqpٙ2Ck]ɴ8%R@GRPʎ D Oc+>,;r# ĸ_)EX`k55}^{nJM!uNZA.fE$:Aw L1l3jnn|F:lIX3#g kfCF@߼Fc{GxP_.4rN[Zmj%TAb6>K+xl)ZTuN 2;@c`#HB7+.u2 ' )x\w̼ZY&Y}7grhs(xnTqLbvCt[풎_FV)%%8F bfb`j1 Y.KZ%u,;*k#ȧF6F>&a/S ,{GQ^7ut'DÃoD"Wϖzmp) 9b2خ 0!˲Sk0S`L[b:{Ӱgȓr5-Xn%pasٛ#:]lrWhyXY#:I.a#9_;e8 Yac~#C>XM{ vdҪ]5'%dGyrkxs4 WmУJeJ#~(GyR ,%$皏aP̙ ';ZnN ˅Tꮕ'-ڵ!Wq,߅&d l ʑUzTa${?ڱbթD O΃LZAuoQ@UNˀ|zJUGA@#K a"|e.i`6ugk]dž!i0/8lqYDHAߣ@dhxQ?ʷf8n1`` +7lVꅛ]B&*N\vXMUCMr~} L>qb2 V+ B^,&b!S&GXMC{6|9rL )P\XY(&BۍB70#?ν PiGNPw[M}@ @X3F`1`Lx)!>e;rBݕZr7YrЭ 8Qx њ !U*Zͪ੤$I^ȹG$ih\.;aQJaP kJ'?!s mDVv B~i: 8Yuq@V>t`#|{%}4R/cلbЊkd[ݞD5}י'db>;Hѭ]~s,)~T?xSֶʰdtY4d*ldqS4cr 1*b"oĪ@cL|/gA3̏Ѭ) )U`s$rUSsp_Ҳ\&z& -, E\(㻌+u4D'V[IB?E:W.ҊS[ #c9Bh%݃'#Ow$7V\ޣ>ؗa;J*HIt/>/8AvB +/7`aLeCN.Q6mf*LYJ/}jߗvksKY&w Ъ jqǢvvqJݷt-%ۙ:ѹm}߆8[\ި>n1XlXUv h'w1nl[=7U:7%( ~.vl3ٮTFIn4 CF#B;MfAew&xUJNaD,.t!wޒ1)Q6f$BMoR126dAӹ͓n Ok-+>/#q*gPSBP0PlZoma<+o9WvE&Z7䷸A];Cװiu/;ݎt fv$E QEg s~Ȗ,nIڅb$)M*b[ԩ_^MS A*֖۲}_bN.ބ.LA 2vQ4d#_,yT e^s}%6UR#e>49x :zd-E zbiᨨ9rBqGUz!jЖ! *IԸƑ7DlvSېEdm@K 4SS}DjmBLy4Qh7=BkHebM{mEŊlԫ:/ $űXH_~=Fޤ ? <<mUODO5 *wv*D .\å|uq)`(~hVYՏkɍoF^W]μ4#ͥ AhM^dJ uttĮަĥ.G~VEgȵɩi&N#/njL_LZ̛s-gv.ڝ)HEӺ"d udؒK:m}1"%ךQ+۔@]pTk`v 0]_ѕ5j؁L׹K[m:vLSQ[Jf{q:ΗkR>`'J@kkjwV"$b.Mr="'EU O>"b'3Jx\-ʟ'%_P\fGh ɂVV7v:fOq!`^!i2z䔄~Fs;*2oUgxU"ֵPf b./JX)qdSM5ZV:Mu{h8FĻm+K'K7|4Yя#sZ>$),Ij4фQ?I/SRa2 .vm+@k<"2xS$q~tt0됫ʁHx@.kڣm+@<"|[D9S :VK#7i)^!Ñ6d s&¹k ٻH,e|bdhx| _e|=m5O\5?OaHDXټ?[VHD3RHV}"-C,[3zx[IƟQVfͯf}l9G o+H!qu]8UHJ=9+tmi>*Ibu$ё ՖP9  4@md*I;\D.2f>ڶ mGY:!S[2_+8k&<ڶ@SYw)ͺ nyu/VMZvYR<+s}YTu/,2ȝh%GyZLʊ3ᮅ0sۥ#*|I;k]]}MOdO!5vɾuڥP4R,U;hL= Nʄ\=T [.sM\xTD/#eƔpMA D]xCcpҾ?ڶ5-`bnkQq ѪަW +_/3lQïSHE ƹ񢦢ǡM ^ԎhQR~7%^ &O횋"ȫݢ<5-ZxYSJR^8*sYÞyqΧT{I~mTo߾oBϩEg:邧_|vvE7~lE>!Fv2ډc7=P_MMҖO$w8w,k; SCbEO<"D\:tK:TFы%IE M~"+TbcSU)Wʯ҉\;=y,LvaH\}׽H@B% EB 6];S,;WL׀vo#s?B1uU;Lgk}ndǯduBٮAdɚVV&kBi3Yɑ5pi ܹ_j:균s=5&Dbihe̓N;[t0y}~ψӾw]㮈y#!S%5+=z?7G6Rtp$hPDB?Ѷ z _8_e^gjkI1>:+4I/K _! G@:Md/mTاwvΦ5&Ԭ72wچXyHƖϺ*mTLժf0eXr2sOӓ:6 8pZ/UKt;+R2M3o?" m'zi=ƒ;_}tnّZC%fxi niXv50++Z 23se'ejS}:4 NZmvloow7_\%qmuuӉ_ťC:-pq6b1~KzNj 1-GRKZ]m%"s4 EC/S"῵@'xm7鹌LuxЮͱh~H쉢 $h7Ӿo~="V_>ly7XWoGٚOR*F0RWKV}TÐ'7ƥi+jv6|f;֎ă:FդچDD%lu W`2*vK9=~@d^p?@nIArN;gb^=:ԡEmF-g?1wΧ ",6XB䥭dP$͎ 1lV![Uqo%/Em+qO9竞ki/&rsP,F2[V?%,(((2@bC$VPc_+`![?H.TiZo+e>.=Hת ~b-89򴅚BżZҙ+8O.-U2ztP:Q Dl^RH5 GHF (uX}dh-0WNDYDkpɔLL"qUm[s#)!S]#$:G~pWO_ Sd@8ѰpXZ_B"ZzKT)LG6@ EҼlkݯg>NIE=ZؑÅNWz1kWen0sDǝoNktFPudE?.veztG)h^D#%+핾8BçVHeJF C1$D {´=yTe4Zl Gi߄;nA ()|-0oA )R"WL ;sZe%:eL !3[0JܓΔ =etN;7WaBԐ$-vIMZ@LM""mMR)+O?C @<\ ]%rM$lp;uӒl7DgmP|sũYUfU0W R ٠LjKU dQmF7C@XC1|{eFvмIkq޺ w+yyCE-7!zwt5e_ƱAdr'V!BYi9T|e"<9T"[ZwGjg*x\% !][Swt9ٍÖH H#}njnG QF;Dcq6t}j%[u'!? qmNODWcv͎h*?1:nm@|6lͰohzU׾HȏukWSLmoWp P~ߋm LLbTbd,;l؀Xא/+8ϰI-B÷vej7ݓ OUla#ôHikgPdŁZ-" 8aǡP"ۗm@b)G< #ٴ+m蜡>y!BG\- jI/XmD,?6} l|GbAt\J~ϥSW[#>e 7(S'Z f9p ntDv<;R|C#ȿKzlk"^)FG`p rȜIDbNw[D.KtHpY# U?ߐґV|{oL:%{7yjWY!;(# }d8v0/q0cv&D.WQvj @\}af8s6Po`D*BI|3DUȂ4#E.٣D۹VooCybf\5yɃ_+h@{)ur}#!Tn8D'k>Gez*R@*TC.~iFhi7EIv գZ$^$Nj RG5Mh?D z&Dk<ڶbp02:S8F(k/%brGWf9"dZOߨWpa s+l/r5Wa/nؽ~~?T7aC۩nB.7T7ĭ#%#/hv}mth/ vR6a(Ium;#./Q᪺)S}%MdE7*snF/D7jN )*_!AD}/>HOdp=\?PVҲ>^AJ_RgU0ٲǥbFhLi2*{Jaڝ-( VH?m[YﴪX/ ^˜._CTB- *H?ͻvm:)oܽ9\!΅̢.L.8¶K |{HV@̚@jd=_Ow8?E^ s_tpWB%O1n/.BQb~Ѹi%B#*!0қm*LuX1&9 V}T_8m-Ee1vx.؆AJkm*o$N5xo䨘Ԣ&NʂqRrWRL)_rB4?kA jىLF F$%%l=5D4PZV~lx` 2RTBrRrKaKTARǯ*U0ff.DL0aTʼnG:U,Zi!kɵLr},*K"IH,Uզ:i/SJ@i HW#$F0H."Y-54۷X_+\>!ww7˙ UhPx2%`܈BqS^HcC:qm#VB~vhF]B=xP5`q$z!a2_E7d dƋL%4cFz.ARZ|)hA n'qwraFS[R9!4~1B|!sqGx4wbV~u/kTNdC{ }udI_ǽ"7j>@\`raYa/-i]y"!uFzG[@ $Ds4rG0i2_-O+O'm9=,^G$[;S&4rcqSm}͑L9Lܽw}|lfȸ9E d eyo4`.l%oR7ad_䴥 ӚfⒼkS02w;~A̖侶eg0x:)3HHFTjiLzO#>n/Ruq#w|0t8[*2e)|2-ɘ#ur,ptG[D : 3kreNRя:pJڙһtAQ/YcO]=.ѱ}J߭z>xPǭr G }~C$@K=޸<LlѸЋammSh1pU`gigM5RGrٓn\tHra⨕t~ujGxzr S/89oS~9פL<] ֞_v\;#z4]H:vAMތO;1 ӀtoǯWtLR`]a\`FO;f*57#d_zi%!yC9㻉9B@48 Gte=yY, I3_o| 5=δqGChf߇SI d/qO*/X}ҙr@b?-LTFh_aH7;x bB UC~CHbA'Ȏk'sUWɴ/[d1ZU'dWb  KްNl,HxN}#W|8fe˴F2$f gY!Rsyg4::C+t5L6a¶R̓bQ` Ob-! |~тz;g(~M '"#ґaCOl.~Z=,7=·sܳ]_4Npc!DXohJwXeKkyJċlgccys\CU}ВO\eϝ5swɥbm2ܸ&D&IQzENh}!#SЋ)8]j N¬Kh?#,ڕ[-z4=v4>"Y}͵˜ȾQXf4-T!  \wqY|u ؗ}u.d$'$krg2bO_IejIRT4HaQnq5c_XSK̏LB{ Rf%Crmǁ⭠YRSKkx`z Ά&E3}^rѐ och@,3`g'H.Y$M0|t#s0ѐbnψ=!>7# 81mp$F+0݈-TGFJ9y854i_@ڡ*  @9XN'|;DY^ y /B.ZXhz"mw9 !dHA*v-y)oʺ]~*\f'Uj}-_!ne ;Ҩ p3 FlD.=풏=]OvDPj)S('tH7 h+Y(#&v\r=i,5h/N(1k_ew,e5cȵU4Y,'btInUz@I⛑j%_:"ȭۣȓEIz+E~9 &Ap*H$yfH:&pΠ񈔿녠! Cz ܯ@?8uEyZ)ҟWvO9GcA Y|-L(;| L^h~(k R`:2fϑ YK`pC6tgB1𯄵)UGތ2!yi1-hWRAID4-r̴muW.9⅁t")0m[VdbWA`+϶Ypty6u#"gʣ|i5}s~S/r=+&P ;=9 <33up/] A~!hɉ5PbsKɄ}A$S7QL:E"'0*L&.R֢HR"iĢbX[ځA]3ϵꉩ % ̼/@h Fqm7KvY psu(ס@یx WN~+(R<)-ZqF< DNyI)"(xo,m=c@] QI(m1J^Й`HYZR3iz7TIbsrajS. d5hn`~5R T^bWja]UL6+U/CxXZ Jr9t_M|3l능^o9s gB.mip_HX\Z*#ņSB5>n+ ,n R/7 يBQs%iJCdX[I~(T?n*FO9& |I؈Z[I F4|E~z_nߚrVoP ?Lxq Y 7:gJTܐo /Kw0֮/.$kUD9y3a+MbrI _Wafi.%Rh>!vf3evSs?"WxjJtR2`qc1/QI,+4)Y;LʚlIH6)I:liDeIYDf4*2*邖h'(aTI9|!ۨ$y*R|YΨO|h8tF2)x8th:eR|[NO4:)c,Y}PQGJNb3b():DM4R#Z+i Y~ v35 73.^Rx87WO=!jhFOob#?"u;Ub(uܳ㐥)w'\8 g ce*Z J70 JoޘXR>Ãz9ǚuQshHD,U%$~b LyBaqbVה! 1\Br+Fp]o$+`k$. p!y"x^=5xhx%Es#r{9H‹9*3OhlU8NAF d8AE2YҕX򄓋Z*I#Ɓ_ޣ0VB @HZ7&rU9,A&d @ZE}:@:o@y'eMKIWYmA'_J2;rށr%sɁ/(/+kc2ZPN}U yΟeķWY:&/BZKQWR\H wKM-50 " *)U6 . ~B.0M_ed1[z+zT W^O-8+r<မnӇoؖvSF00<~^B,.p9rx>h Bb}g*ӛ x]sad_@Xơ{A)n ><\}y_E)Vh1@G{W_W4 a yZ,=YS ({Cwٿή[5V5 یEZh۵"h2p+`6~جI*s?.ezh6"7ȫT >J(+ Yq"ʽ(r|nT G`""W:p7+YRDJͲTXdBVr h5L 9R'jINܼ7obV ni΁!(n+\9S70a7Lh0 '㭫 !9bV nңsGg dbujX'܁"*y1rzx5Dȓ4^[λUwp C2"?4x܆R)$SLg!Z҉EJRs- E `qOfDKoBBoDl@\ڱFP;Ix&ZakF-a S(GvK\ rۏEfyzyx _ڦun h2Hl[ ]c2 m@Xm z!6 XW{z|zOHLW׾M`{hqTR%%m<^ZhqDrL <ٺچ|@T\Emeq tw+u}[:Y{n=t(7l\ԯ&׃M~jN:޳/}xk+D 񯀵֣UgDO5= FJKmQ&HSd_>YV8reHA6rFYVЩjVZwe=D^ GӌeM-uj@?:)W%Ѥ+kƚ-Wr b=dϘ#n91ʭKG_kFjR -yk^Iݾ'N)(·*An juIJuOY5u&?k`(hVLiZK:)^*'Zoû& m<}r;#1`?N1VSxGe(WjeD˄i55!EQM k9˛Q!k鹆zC|f:QmN)ⲆO|xW =5 fH'[5 :RȆ4y^xy @)շ OPʭY-pU}R2cܨUU$Ld;}t6 rr0 qG]nn8Bv eϿh{ʞ02& (6 %7,ˆ,7O86n iYi![LďQZ!W }+x!J !4ӆrf뻅O%csQHڔfE,)^%G6 Ķsmac@BcF&ƤW$m\"1m x4zj,h=Rv$o؁\!3%[(~֔ZbR| KʀmĦqGu^yw#1E#^iԳE(9{h;9 @>) +!c"/-FGD< W,Ldjsh_aiyk6= "Bf ,_O ZpC YI_x(ӰA9GJho!H\=r) >ԍ6WȜjc] 2]Y֘׋l8,񰪃hV~)]StⲲl@F|Llfc{񸏄[+X Y5h0-<7_]hIbot%!Yv_6JM2`-t׵7l;MHL$U=q~wuCVu9?Qɾb:|oh3">eX02lsL9qR\a'Ei-dc8e#oAweyn@p0 7Nf'Ĭ("1+鮒uS:ayMs D8\^Ÿٯ! ;bCn3GbٶS~LdHh~*n+ =8Žȍ?(q<oD'-G.vU{8Kn0 g?⬮p4JuBңM휟?WDH"J 'jYL{8E)^#alKZ@W̒KFԞ: Y7o{m]*HrB!?qX $Q~K%֙N_m~m/e˩!2%j*dHML Y7ŠJ7:;0:v!l\-h!óIȠJ1 Xˇ{_j FWM lFRVuhhǸQ&wNE3WV7V^/D;r@>;E`QDaG/1!XD>s[-ԝo[4;,ܑ bQ ',>f]sCAoc ɛۊfFBZJ'Q_#,4P*O5ic-RvAe Bᒎ3ls Pp:(JuO$0;xm!'̞4ny@EPreډE!cئ;ZskTFr*.g/B.oL[CEOQGsR NAkڑg+Gf>:,Sβ <Ԧ%h{Л$dsz*[TTo8bwU۴t,yγS.={WB1>iEMrpsA׭{ ZdYCM;嫦q iNy<%xJҵO$ ʪ"ȈvnCUZ.si,C͌LMB5BM.?C^T(j|ht|09b] 8@ y_m)`ؘtةv!yg۲.HE!,mWu ? T XB2%^tK'5tatSVK}ZXR v@XC|y3s䭕[s>4,wL=__"Q!4~A,2w9"}|)x[ē.K};tIœ V:N\_ x1s铿bބn@HrK+5rҼЬ]LN@Mz/^\'!)oݢd([5G:|uTX&e"ܸZK''bt>$3 z9`tb8g%>(|>\W$7$@F{yE|] т~tũ[M`u 늮P+J+^C1qxX,q_ޜp@Rj(j^$BB>Ed)5+::>к|x"^$h@.55fr07sTFu)EjGz" FiYHh-EސzC,3nYѪnqNt/^5G5=&;-Xkh!lpֆWp5TG32g:tm3Wsٹ#w˜ObZOĹuŐozL~٭(e(h^ J:N0ٯ0lw/8Ze9 ֪y E dIG`rj雅w6s9o8oPz"^chA;=1G;!x(]E:#!lT-22kT[3K̀u}_+=p}Et?R@pUFڑ )dDBhN)cy|=cĀM X|N ikkۯH((Wǫ#:^!ڣc{BX[A 8}tĵ?M΋$^NAt7B10JAARVB7|@q)=WS;ϨbGI] 8fO\ܕQOsz]S/5tG*I_k!-9 yhOu/#JcE̜%ziy-ip_vM csb̆(5!W_#pnL#463l;toPyDt82³jlmpR>< m!KmHHGv2g1yk~nxv\-Iaٽb* ^ _Z? dsg:͑o!O8'k@T#NHS;I F &o>M kVdC_S/oа$2&NvƘq* >0WJʄ*Em f~](b.y$89,0̸o<9™‰O9դ{D\[J"%G=#z` 2D-B݉tq4@TYs2h}2 qI9 j/Ei#P&ӌ+-K(~)˽.o(g[(*YqB $pa:r` Mq1K7Y#431+LYo x O%tT=_Tg&nP/$߼ SLP\[Kh!QJ~_'Paצbᷲ`)P8M34[pzEhk^Xr!4_v_{W+_CZ㕡Tk@}E߸i(zg?/R$=ܦ4}>v'R1p Y*q`(}HExhOu`^}t/1jFߕt&o{ r_ZCh77AR#䀑u r+"aL1fmL\A9 ),D07RUPqM&1ONL:LLKQYf|te0 8řRj 1 W[`Tn֐[dTc Ĭ c&"wG#oK#kia`j1 ^F,֝QvoqToR\ Ѥ N?e$LSR4i@E MkOzp<2n o᲎29,V@e%N}&C`IT(cl/vǃ12[/Qu2Mhr]s8%ɾ:mM~%wRLsV̪Cu]m<0u:aL;E}EYIxJ=.Ξ\qsxޚ>بNScѹ4Ha_FmB?1-8oG8}Eob?{^oǘQ:jTū`gvʒ/}bMe ɒU'풶EGy{l%5 [e_Lm)3aL?t*͊7o=r֗3ْ}wTfzwbpȮ1 TQ2Nsл7%+4 [=B (Yt$cF[pM'mɈ2ԛ zׇ&I@A`IJቒj:龇V5H0mn*~zD-tBMT>T?հG2ZjĜ -7zwu`v*፱jq;RULR6Gh=͛ 1f5zl6NO>!fl6fC ͆l'o6 jl6mXF6Pb!lJVH RfرĽxsaXfC+ol6"$u͛ 3;6'6ditDl6qm6nm6lv- yRJljl6G͆b#jV2qXmjZm81%6s/F6st6D*Նښ鋭+6xjLՆpd,Mfha ]tܚ1| .Fy^mB*խOFzǀFʽssta&=ˇ\=G26/ T(զR^/>ŸH)ЌLZx:*7KvJh=7S#Pҧ8 GFp«Ԯ.cl}nJwxp ^W'<+R`LT0^=¥}2L_G W0ˠʄ;c2Lb/ F?$ف@<#o_t2rtIb@Ոk1nEdǢ4kc;R},bG VV4En|S `|,Z>cQDh,u"6g8)NE4^ͲTD3|r/mrhS=\ Sg,C8ZaJoن ]1YqNU8nrq4:nW/iezr^NeS.#DZ8a;VZ\f[q2:؎A -!;{qӡ]=d a֭8Z#8n ]dVR6b>$H8k5QM)ؐZB8Qeko.7`KZ76)=b dqSRyDPK!tJ¡v|;SJF ܉ ]z:Vh;Mhexs _ SQ랄O߅TD:̙'Nҳ)lzgAD#֛/,Y;|,u(΂`ɠ魯 X3Oj:_4'I.vسwurhd}foL (I4:լ~ObJ4{uI=jO=!$pv7nK{[7fc)*Y|ƼWb'/W?a Pދ3ݖ13D4ڃx-VwGL)o}vw;tv}_D9#":ͽA!!gQ!ڧmsO bXܧͶ>l{&ا)as>M)4|7縈ޕ1_ár[8Ũs> )6z+sVjCqO]}<- ‥ :Ն>i)fۑQzxhP0%}PBLV氵e9VCgioe{l'a;[$FH4$]i$ Z 톴9`GgZ!NvE|3sޝL2ZZGFeطY8KG"3 r-J;vʬIU2-*H:qNra%ҒdE՛9I#| [`c/<Ysإ!1b)01"b*P*L?NG,PAܐ]8q_@ #bS颱 5LSA3hàA$ޠ7gdб)CErƲr8AM="_u9*4jUㆨcXFtP  vG~9~;8*-L'ɧʍ8y?39>DAɭw7 QN3WfѲ7x@X%zl-F &^Zy?sAΨ*D8MO05~K@4臑Y N\҇Gs`dc{OrV>-iB:dgga=Z| s¥5j8,D{*O'xP:Ut2Jo.I YQ]DoKzBNq\ {U kpqW(bfkD.i%R+ʎ_%+&hvVL^zai~̔ Җ]7yEe' 6&+I<٥6-f^+됂j!jX58B=.j3^b)yJ_a'}ڵ^Z ֱĎ'Pr^f#"{q")duYYe/y+bMdO4:R3Za#vnJǏ4$EWt6vdBjX鋪:$q/_Lc ҹ!["_.Gٲ*/ZS]9DatAH5\DGiZHY]hW⪬?n}әuX Y߰z!Fv<#Ux# 9#bUm?ћϜ=_Ff]L}FtV ,ѰE+0,dnXQh0x E @KCK~q0$Kmx!K; &8ΚcD$=gʨv!Hq}iq!^n@US ]NKp DJ'?a.$%d"v3@b"4M>S͢f.jHrH)Pe7r2l 80[:sɣDAhB?%E~˘ X>tfoMK|OgZ!QA m*F2>@ k-&"JDɇDŽcfM1Nki#ƍ|s9aWΒsf//1sD Z!z 7׫RYܺx~SZwk RbϮɆ,ygjr?>qѧ2m߈:륩s;)s9sJ>D6l\Orʧ%7 J9mF A<7ࢇM mIx%=t/xk/KMh(5E!ٻ)!dI.V57{{ib7vQzӾdZ#b@V)d FG;f#!6-8j:'FʁӞŻs,͈e%`U08NՅ%7""ugA8m`IۻNp p׊u3ϛ;" qaI+K.܃\ }o(,H_Y\~ӑT4ӦmwԝDΈB)d]Amȳ展-g9[ȑ ӳĻ_"{WzEΙP Y2B.:&[v-Coȱ&>Sg7 ϼ!Z".Q2iE3DǏbA&]OX:z(%WWӦmWq46k#Fn)X5j_l $"WݑجX'?hHÖcAq[#yaKiܳȝ<ٮg>BbcChʝ/@"Bhrb "$7t5o`4;'͠N>iSN:mِE ּ*߼dxEf 9So,^OP].'7"%ѣYEX=0w!y냜{D&J̈cЕ{Wb2@5v(QI)yJf{F{딑Or1&(&|!!z7Ʃ>+2}!#?2%h]! 7$qdq\ pgM#p\8A |Ô:[Uސ^в/Icnwֆhd I<\GtRƒTBRtclɼ, OKhH){1l% /9x[yW^ t¿ Ic T}{eȝMiLd$&ƛjJ!(D!(HNEeqg-|aEAkW =qI m؁Ec/t_5'D zg׌B.pb `=dٰXh 2 &7$7"¥Q*U\\iWL544ZBtF׫H)I[SM:M//4UiP* YHAvrdbtnx]%ٱ*pWQ+xG}O}?A+D$E+@:\+BvQb"mъ:% ȯ Kjtqsh;gNJʁuk3R[loeUs2\$ukr&[@>[UtH҂_QZ} dgӉIk\Q͔ .@$^_YUksipBj CDV5VGOA;uv;UUP'u=Yu vA/T;{LNփޑG YY9[>J5ֈKL` Q˹2 "Vo`@:8) }596JF PmHu>fS s/b؟KZGNAxAF!c$&XvW)Ic{#^D/z"DhwB$Nc!^]Cl, *BV\EAОkSǑk? fn]nB]tѩsD0z"l`;;uhw(%Ż`FDzT@Z{C,UtwUE_ U弓Dfo~Alzx*˽}$Q<v#A;5MGcZtzw= Lì; &x\c>'`LJ|(ܮZn{/wD9vhC?TeQOx)twv*b{|EbrE'*>H(.)ČVQA¶LaS89@UGCsOGzpP3|rwxAs `+)vv!t #)^-?L+ x:Kr $9@]8BvM2.fӟX!6@ؖ`d`9 pqprmU*v_ ҊP-_gH1:m!T޼._^T,*ِlǷFigؚV絷T56 ׿v)7#{(6K\{ s9lyTVKR.2TV_X";ܙ>{s yNķ0A _@HT@2V ~ByV|%g]*\7gZͬҌGː &Q_܁ơ T]٠^hj"Zo1K=JN^Cޣ7qJ(^O0D}l$(nr{TtftJ,lǴ!v}he|.ȡXT09mǦ=IN vj3>.x*Tn?==U6D[[RzC+8`)3k%9&MYjdTJI^ܖ:u;_N-NfFRK!q27 ɻ3iuL_l2 Qx@N"WJfY|D!!vEO,d=>G>$IHXo5(rSF-zi`?܃dұMDo'KW`EF6퉹Zޟcz-,VaT;|Q{vf)Rϻ\ JmǃI Q7X- QHi˜md".Pj NapQQ]#K[rbT!GOdX/ 1"6:2 V6 j_p ;>Tl}GU)b/P'?1FcïS)/: z9 b 7U:Fpun4DARዩ_dDk׮"J+@3yѪ+_t˗/7N{ AN³Kг#)\zvQüʩNṽxvvgxf_@,v0pDGpDWgCEN:l2WDwj i"ngqvp;ޟ `^qл,_"m8*HS5⥏R "/j!m+<_,% ̪e,u0M '[Q^J-k[EJ|Eh)>ˬ4c³'0Ip=M" /_Pg ;}0ļ;.ia($pgw!Z$&bMSDa涃'6C A|e֩Y/˜WD3wNB|!;vĒއo-wV>Zf=7,ݾo|@'VjѡvN @dg}yk`T?ayc(pnk(VJI, JQCb; $hKx]ubB&A+Nl&y{C,2\ b=jّ븡^j$/x@@ANk,ᣊ=0 O׭"Y$ϩ 9-9^3J쒶D-@uKB=ɮƫ|Ȯ ; #m,#\sXwBC4{kq FV6Ҝe')84@ǔN#/swrT,PS2V_ȐO/3G?ĉֈr:5>*ߪvVa3ފpB40YLc^ lL#aW\% _8"X _Q[]YH#k " ֟y8<~;UJ;-rhuNs,ځ_M aȅ-6BxE̾S]GԎ !NNn[HIM$,72b2zoDr;il-̍Ha3[0mdEF*wa: v9y +IѴoCH)ZmB|Z_)+ʖ7\Ź-ASYEZE+eV;];]E]3^n!Z;U.Fw;׈g,(*2Ȭs#o0UpWV <0k2 &bҽWUG9үCTN΁'wOULxےz8؍'z:WD ju.b9'fh=i\ a  DlSKt+ ?ɮUI~o--GeIxGS9&A!əؒл[r[60c;d<0؁2HʫlMeJEovA Ý Zth ;d. aw+ҹ7PM'HFzy*= AONz':ٓuI٭4J(`0Dv3օWkEh1~(iYQ1P:uC##]If x!7cۦ=#["C'q ruRHK{'FfBGTAH!3)dޠ4W-hy'd.zBݲymD~ƅ } Vq%V >l|+0 I*l;wFҡQ_$)Ͷ_ 6) K S Ћ1r.H՘̸^e! q3U҄,Z˦i(R;iCc@ j,M"U~~S{w/#*PymMa~ILdN6GjgDFĩ;Hjs w(Dao/|#2Rhԭ y[oC X(J5[$2)K,HBz;B" [3hw.[8/MHL$Ob_!hH͇$H*YyX##RŻPIl;P=2C1dK8#bz kHdE%O4e3Wtp&#Ù}vJa}zRhᨮ Z@&7=]~33m/6}ѭEa`;,ێ0D|X;l]iEq'kTݻ)>vW)?Ҹ11I o}z t|9y3f8קa(;flXJt?.>x²ӻ_C;oћ"\L`X燻j'}Щ.I6*}Cƻ[`z-']SJRH/:] O,WlY1"ߗ11/*O)PQWDB5FF?1IڙF<ם޻Y4}-[m=z}sȞbQ_DmszZ.29pe^52] .qEGD@z][ғ[H@_}}v)9v  0ODUΛK j*ebIБlWI, S Ap /7$E1sQ(0R1H65{N㎧Xfg0F9n&g"ʴVDdd/W11]F&-ܬ)l)k/|so@GP.?Nf=CT⡽0= JԤG&tGϛ=_4{tk 7۳Iߟ&gL&Uq}?XV0"D+pJ.?@%!FZ0Q{֐B쩺U ^"܄vss~sVrv:jnM4YC6V?K!,3~E?snvԅ#i4/>HWͰKzv7,Nfp(^;ȊNx ^"m؅g7U=K#SWd-g/_mlai} EnXBEԔw墻c K VHq~[Y_d,;eq9eS]@$&E:j1%KXn~.n1W/eiWT0e3@~Xb&-IfZ'|fLS!G:JA|9ڝs4<{n RUKE,8 b"vkToۡg0歘m/5D]'@4d * I 2;'YZxҲh'K`q]=4a?3֚7GTxd!2pxD΂ًkh8}ljUVcOYi~zdHjLH 8Ƿ'|g @տ?"H?(3ъ8j>>nFNXMڷeQ`2S* [pwZoy^2Pah/@X_!n1Vt~=z$! h֭,t35ן+ 4}$ybXq\I]b 4'b:b! Vw%J,c.{*J֍Xhe%-2j8d$ۿS$Ttm96`2GIY>̒Aɂj/̒U`RK휏⡖ ---'{U#ĵ(kIQreZ>=d[r KK>lTATr递KzV;G2wDw&x;F ('̘huV2Kn)9FDj6ܒAFaATnrKZB*V,d$=L[Up{+@{]4\>i7UjvLOYjSKy>L#aI,;"=-5}7Oϡk@ (Zr29Kj ҧ&*ymҀuFRŽ7J jPYA°+Ԫ糦xssw ino9|g-B1pqu@xr9cjcDwNk(F]pԺ 2$kp>hg:qMQ/r\Õk~G VpnVlQ p\s8%[ |?wUs^Zu^ {zks5Zgͷ$!kǸ9꺳W&U5Ĺm]4x[ 퇰R8ܷ72X`˪x4}\Chzڻ+{3~ d ӽJg)n9$V1lV:"礜0r cWOyA0 #ԑӓr/@ V4fe@(7!CyM8C+TW-b"65F;597҅)!k2,ɜP16\FFR͚۝y^Yz +h4uhʇfTwU5֝ VWP'vVՖqߥJtm$JVÊg=':b$h"uWc+5dQʽ삿+=R@ 7xE愋tIas_?_AF5vؚ <6ݞ )/*u~V8sH@m(X*y OһAXrg.9sw ]czr)k^u)=.f<9x}t025`Go#*֪!Ox4"#猶_n4P$-27$,H;rFk+A[qA'4s䮚IX#zF9R9heլZL~З}z$$z{%pDz 7CV. Z4qlAC j;3!ڼ@MUjrl*T.WZ4pF--]2}= sO纲 +]KҖj6CۚbnQg+S,Î&/VR/I@.vR4U+Ŏnpb)I73-K.F(lˌ\V #-?ʤ 0ODLuXR&]9p0.¶C3sw<dMjVHgW1cYEM6\VςU,5\;:iVdQ<" :pS5`1lC,ZFPV=GR-zm-R)oG-0ڗF,z,>f\a`J#Kl Z#Ha~N1'>OoGMu* c%MNTY(zv\"gTqLyL,5)v ;ҧHYF&cUyxi&LvȤSx?p&tBM$qlZ9pE[Fk׿`d/ql _aJpj)K6 ڮ4Уz?ʯ`Ym=\& 1ϓ>_O/$X4[' "8e7:牑M#5Jmml4ڡgs\*+|єlC+X9բVqYO}]̩] qcf(a?&݅F ^). uLݶ]qmԯiCO$>ȿ&fZbf')O8?T>Jq7m(nR9qmg;_)5`&MyUA]Ya -;{ЃX[,fֻw]q|bEOX r^kIz3LMc}\#i7($HE oȞ\ųlxUrO@wT6W?񌛎 !{=&SFزWĿaKLB{ϖz݇L}:b\'ģpn^i4b ֪Ɇdcy\cNpnw 0EV]Q HsR #4 =?87xs"K0X|(\2% ѝx_l@,#$V%W* NJ#[ e,ߣqӎvY% Yg=@gJdtٓ[%+ ǭZ_evCe@d,<6Yn$&pl+;bڞ<1l-L MY' {/ن8 >oA-mza6[!وΉ};߁K#K5oƵC޷. '0nC={~*WܔY-aUʎ%^wAՎLY'= zb"aD'pl/wj}]PEaonH)9!G2/r E8XYa8ǘ:uHX:+\ս_@…zhop[J~$e*_˗X,ٸ[V°J!`P-E;T@^_S ;hʕJ0o.o@ͪ-30\[V;W1}Ŏ.AfDbu_$nCJsP"5Lic^&[!z B9n? 4@*+_)B-&X8:0( x~PbSu d@E=;q$uV_kR hU<콟b|20 ݠ8D|ű쟇S$[NQ{P˴d/Zv+ue'lȌ!2)6lK?$ę!m~F)ٛt=&(:ISC-.>iKqޤ~)v8cOb+3+usjw ̼VEi6ՠ9YڵFl9ʴ'Ynm<4{Tz#TS8$냦:x1yg/J"jE#=y)B/V$mqxt]twJu]nUK΄kkJxE[@D;ئ8ViGΛ );ٲ7 pR!Go) \NxT` yo=m!W[ՖO?r[)-j˧T3=m3$LМ X8᳝h=τSFƥ 7#`Qhj76=`*+_ 1a8o =1iDPofR Bi\T-$]Mgv;ߚKs{ `034OI+GTG8Eִ>Eyz1`~ ڱ_JaWDȡaV䉔r%Wd--\Zwʲ7A.|FEx?DfpAfjEKYoOn e8Ux R-(+LR-/%/~RlPz2ȑ;퇼/]R}29ѧ=ֱ@$!2֒eeuf#o$aclF=q?s>N}-,J_$c^~GC 2DZr+Ro#)'[Fյ6%c#Ex;еbQ=w_9yp\ 9)gUx]D(^ g=P oL>}b\*b ॱ姫ܶf.b,7Q>RU| S!0\R@#m n0@c:avdGhXj@ M*ü'S~oBDLEN"!^m~2QQC&@ *J`ݕ ֬96$ +`5tZ({\.01{i=3c,k^Cx3К^7eLClwmϋËPl44eX֚DyaqKGޣ!>>n~mTy)n~UWwmGF0.6ZOc/3=WyQAr"i/`\]OsSnmDɚJ3k,(Ҭ?Vx ,y?ՒfI罊ZA>Qs&kSwD" ww1?[>XfXiVGd8eK9e:J,KghCnn˗XA(Coi3^ږYnv  TB=(P3sRk S U^ܪݚKSvNiGޕiπW7Ԉ4>|vye-oO+y!n/wW !AU+[IgX8GDa7Pp DF=mu1@a X,s9g$.m۔'`$vngU4W42}7飘<\.iε l:sDmGQOH-l 9֎K4lb|$lz?L1s{!eÂgq{0xexܿcGw? 9D٦pQ9מg(絾DC/$)0D,oZr^8y54gyUz[Aju=kU_PѲ<1u`OF "2CeOP6rKAȐ2AI~AVEͮwկyh+"LoNQ+"{XB%'TI~fiaYF[fI#%EG3(|;.bv6T:'\;&Ƚ5os- k*T8kH5uiHll!f7sX7ZJ̷7k\ГU9K+\tOPfe: ghğ5b\W͓;źZyQjbMn5i'S뿣wN6Ռ A/J~ןs,*0o<5gʴ ,o&׆fx{9U.G`T-,xۅJESXϺT~AKu#ܿ4ǥWu'm'FA^3-0k />VC=1=&؋A; (AS:VԿ-YLTa49πE^cOg D=Cd<X =W07πtz/ks"g-G*okD";[gXAO(O~jZՁϙR2{Lj1WQt;סFQG ؏dzSu76ZtT_zL;%w cLl">R@#{ʵ#";Nէ#i7=6`^^ٝC0C`+e6m>Qd)V | zhbb/YȚvgTZXNBAK0m ]T|)f0!Wi!{ls7hwms#aHRd>2?pmhc`Ztӷ!`R9mvnd!BY51vrq؋Q))1Ƒrgs2y H\UXUcc 3s-%T k*>qR"joPʮfAn5 `xCd?27٭qe`5gD g(^]bKHJ1]@iLL,i)``!0T G5_"#x~G_0ArYmz"970?YMԋLcnSD8sێGJb|s/hZ:ٷ>" B1Gfˆ9"_DZtJ2ӫd76 `qpQ j'r%2Y3 ^nblE3VւX`t<}b5.}.m2&di.m\8INUܶg> ɒ7&@(X#Kt" v8n#_eZ?EDk<խpVXMxbN %G `jI,G:E^`'z/ED*MMp[|l֓W'FEc,c'+0w0wUY}zʱ\*#U.@69.?cKjh1GtŲLE8o4e~w#5 3%jeh3OSג线F _ {K׌\4`hoi7,:b.]veNrL2*xx5ІU`IwiQYa.~I0ێ` V? ܐOɼ!D_ykiҹZ m,fP*Th&\=(R̞+*W^>'J5mr $z{T"(W4aHk.UnrRy!܏cSTy*"Uj#UbJ G9\MD.VhUs%zܪUIҟ`$l4=%#oZ>*]-᪵n6!uy`~ɉu?_KF x06W[~5N( 8؆7S.M1f80g QptYD} 3g50kKgOF)nB`zAOO01lNhN a]k&TQr1 ip>ښ,ЀoF+ݹdzV\؉ ._w<6rSKzK G{ЗL&ix '{wݧІz1 GOfF~}H\N^}z뉛GOn{?zhkqAQ]5Mq(*~UG횂lhɀUL;|ehkrwhDd]@CdIM;,6?a uϸs("~5]^!;ߺshAڝz1 kKڧ" ;, Z +Ϲi<홸 Nӝ^1hkŐ"nAbc* [BM tE&R=$o8IB%H=CEDم{@^0nw {ޑ;䌦I=н s9KG4 s~թ͖owHM1k|A0B5[r\Y;ZWmB^yO?gN)%1l;@7_y݄p*T|qY' :!SaX':C#D$8aj:/jM49s^Sgnn6\ ]_AJ ڲ N>gŬN$%q z+IiH;0~^׃u{ƣ:+Πn A.̠j2(ΠugPufQI`S} O6ˋ /gaߣ~6.S͡]2(}ϡ@mŮ^q˷4Ž;)$dw;|%m$tNg1:S`"8b;*L/di"N]-gݫ{^A8Ld #-("-,~W?#|=ۄC p=HP~$Q :[\ 1'/.G{l>BQu8$!t_^~JtnkqWِS~ Tek~u{aAfE[7/lQ+Bk7 iWX^_ȃR,asi" m쐺qJuQʤ6i\# 6Y-AlTUqÞ&`Tw SKd/4mD>]m3 D_|oFA]V.+W;4դpvpiQ<>;7$=IՐ`sr'R ڝQI*a',=[N`mLs\!wj+1 CLyԦM-v1P/ނ+욟A/TS<4S3? r*ɱ%>E_ j/AR^ګDDj )([XOuy> ęL ֌5JU0Qs*F}اlI6aZhxM ׍qŠ1ωEE0pDEDZW&u?(X}VdH;bəܴD :o*AbG9= Pƭ͚h.AY-x=XԮ&?2+-@?X%TXa- hY[C%MdͺE@TafťI0H0+[JZS7}$db9xGQ>*|tGqol 6*O[0{3.Ӥ3dނ1YK'WD)=VR;3xڮ'KbW"}Mg6k}1 >߈O }-; ]J^mBS=k EU9ḍ]9D?bհ{a v񡃸p?BQc3gX>#;Fx88Z[CB-佦u0:L€j,5"cMXc^!bmphzAȎ'T~ *Vg=^ KE9*a_76Ҭ$ּ$ sOߏ(\+㉋w&TiKDFf7ԭ!d&x?&ȫ-=`FΔSc" ;pWx熁aE O}a_E& c!jHCfjYu&/QHuV)yĪY.b|䔾 7oյCw`nq\ߌF#jf(,UuDZgpgv ~FMS'|8̑"=+/=$6gznh=^g~ ~?83{p~ʘ~IK) CO`oaVUX*֮O?ɊQ!O<6m;X'U]!ZXS qV;a:`omI2W~ώlO|hyzDl(lb@s$עpTġ d%Q7mF ʄu&JcLSfY:%!O %C14Nt`XJ'`:i±R SδgX5{r1rMarcrň)BVŠSka9ĔF[$Ƥm9p?)I>/9ʡJ~234e^rfhesK5_J$QN2 h:O}ELx 9wx>xFV\2gxǩtqۉV!$&{1#Qr4DLcw4;bw|3NƸU{Eݙ-a볜>=Rm1yqͤ#c=PiB|AFo5p|:2p4Yx]:sE55ak"8*B]y]ZfQbb妨6j xJ?ү'*T~A,'kk:d@6@[vGܶЭw@CSCu)e3V hdP?(J2p\8_NĝUR F0ᰜIޘ/ Kr$X* S>B J 9Q`J+$.]P4L`Aeha/0]j[G-5bl4M00Yv:a=>1L@Q$S=4R ej#ѩ|r @()|'k3,j!6sI[V-ۥSV+J_*I*0Ҭ葞Z؅Qnv:2=g`4 Kl̙td}.ҳK/iX>RZH}?W3d-.[s;= z]ðNSN܆e*Sn+XVbfe$w,E f$ChsRԪ=ˊ\9&Wd4732FeK4$|ZqPU?~.5-Kr0eFzF/T_B7 JLy3m錇CRvsՊp(GNG|(FZq5& j k3snĦRPP+{ɘ*60Bqx$ƞ^9nȤVAwgIt! k 4ΎKTK3nyx;rF1Oيʼ׾o ?[hu:fh\WrPhgZLb'hHf@ A3 ̠k4ùu F-WqG3abV]+f., 2\hrF3vX;uH#}0^C553f83ATCU `:Te]m|OHdRNe 6M:>XWUjk;ҳ|+Y\`7oqB%GA+#@rrwi};(G*t6nۿa@ edtxE@lmJ^IP6ffߗ 1ق x4AQHZ (P, xiT=pYǒIV|%g)Γ(EA}Zl_i$'3qKs}̩p Lݎ tOsϭ#QqY@[ٞK8 q7GM ^L|[1F4J h(Ft!V w:r{ +V bKk# .]Te[J7C~v  "`767?Ս$G}b?p h񞍋tezfufCJ"QS dz8J ?`C77(r0+z-@<{t`"> =S,96!Ζv/UfJ=',] Uڟ9 :eL8|BZ|h!S7qMwlGA뾼"6 ʄ3cQ?2׌Ӷ>0oD՘iR>y{BOuj ΤgĻ9E,i> AGZŜ}`A.@WlX㬏hGQJ^'ӊCX^ƭa)YR1U6k7ۡy!kͬE58-Ob[㞟S5fX2 d*fh(4@̪KΡtoU~G(bk+[s1`ES/q]D9-_ &bKsDX?!Y([w_Qٻ>. JϏ*F}KjMQ!ٷvA 0`$gpycRn?:=5{Ls_%P'ƚQdâDA6_O7Y^E`G:I/JU˞Amp[}I>r9(U`QYiMi%t` $Abk2i\O!Jq {81w TYnea܉YDQ/lhksR/D80LkGLу]ypGW/ļay ;#`Iˍvxsv޾~/IIZMr").}~TvNHںZjBkԠ6,MY6mlz#,I2Ǒ)%|d4:Uwkq} KSW K()Z `|ɡ( ´# ^KAo[MzuGa^?ehu2GLRܾzftTu@Hz*v/$z<% j ٧VWDbx㘟kKqo1,(G$> =uq?Dix~؂ `O[;| /#l$sXdE7#91⭜}( ܺډTZK7pl$C\r)!{ 4|]j$DW?%0xUЖDN"q3%瀲<2oYo3YHgz @ޮ+*> o`I[+pXў{ZGGE;o 6]F'^}'mG!mƓЎr L'կWy.Wk uZ¹Ц4BC !:Z0^c͋ŝ6McLǚ t,t)8+qJ>S `SmjrJs>`j>5\kpb?ѹ&`DK.1v~п HsN67C NBP`;*_)?B3@ B* ybӶ =޼*^R1A%ۘ_kcDf}zuPg>M(3$sWGY4E]U}39rUy-RCܺyF7: 4sTZj'8>w|W9d *jy4I?LHB8'я7ŭd^"OEe$oo$xe AR3 _8+nϠ#0r F>xQu͆:i htdJ7rb^39O^ p|z#2У!MlVj3!vW2d(5h\'߈)Pų7FΒq~vLd /8Z؂X %g"ٴ=Ҳ @nyP2JD64.RX Sя@S\l`Ә>a&0qI \hDV\_'&[{Hʥ4ѣz1iN"K5Sjwk+WYrڕz_4TD-HJЅxR^x %QA"vkSwByM!rpOUdjGX ޑ *'D…]d-\m; .`zU! 8/m*@^QV&ֲ+k إ #KK1Ml"d5mo\L}D;rQVfӠ P[C@%lymg} 8{63xC"^'S>bzV۞5Y eŚ<VI,Z$5捱whܛOoNhCm#5hәMp WQ2iSE\|8OetrB-Ն0;\F@(W:_+M*|0ZO7z mҲ QxmD1aRoj>!\_ ړPI:k#}b4D;zZӣ VԣF6&"Wϛex;r@ >:Kdf>SF7o?;#=9tGBHU֗ (gaؕ/w; yM'H;m8ȜQu#n0ϡUZhXlh/TAo:2NIwmu)WSD @k8/}ͯ{6i\}V~ = )n"ys]uz UJ"򍜦3r6f [pɜAyIGNCG~v@* TXW0sك2j qJÅtx5 ,/8$Ke. ,diBdKRohŌLK- OВ8WX͘Mb?cQ8fcs"iYN2Mfr ddj6LU}A#rIR^!d3_Jn>f.؋\Ү $atl}uƺMl]n&k\1.So'hY5 v07DʱbWh`ĖuE@L"Wb1G$"$zEj׍i(:ꈹؒ½ށJs]J#³ DjlZQdJ]z7u@'퀨;r8:\]OuCNj<ӀSQK\h9+on"WzWiwEv/2H+[5@J ouR1b&GF-K.mjЍ\7s\b 7ɣ*(~.UW񱂟,9?HCI mU]cj 9˚ee23<'T3*B; nS/?B(/FAu/|>f.u$GV-6] Ahr 09p+C<-iӝ'QQ-V3<D^?(۬"]-q@>_1sX!q 99@Z%|=S#n+0oM6ܙIP!#R"qFFCgFgl\yD\,R[7S I$tzJ#_? T}bojΨMيOuFf(WuAGW4a +LK/,HS_oEiÄ'ˁT T^A X`_.QR7J]*`B~UV8a4  ga3;aȝ r^0Ҭ6֠8[kzVpHl&uC(ZaUiYRBR!/oh߇:;;\AnL1R/[5>u8och+:1=_,=XiUnOY M jri'lq/ilЏK͕3F<#<af%r<#*ylo."HW<vuLFipht-CXcr9Pa[Ӽ͍m35l+^gQ;Vߘ{ gi%aHSg W$^@h2'_x9vk_ӄ_ayNzNA VSBqu`$A@4AJ*:$s;U&6`!!]8vR\ H aĊ- L+;d R9L5kG@B9ydvVKVsN6l'Hn) K8D)BarMkA8=n)g>&ϔ!cj2>"?)czzx""8Q2AEB^٤A=^u7!^w/ىjWV9j;fo֯pKs[YwOӷ%ZyiʈlT&D9dO?LŲ ԋXZT'aG7oOGR/y~/HT)s{z!~4 ,n<|_x}s|vDɐ 7c8rYq~l8Q_FSOo)}co>Y: O?/ c;>Λ|~>>)|CCgx:3ф$h]v7jldB:u]vUnq^!dLYI\ǎ'yaȳv`w{D endstream endobj 61 0 obj<>stream HMN0 ojEBlT[v[+m9z5+iQ7s|+T?!,/E03˟KzitI];B23H^CЖ<#pZ\80@q_%AprZIwG9gBiQ8 AU^®O6Ub#Ӡ9/ @޻ (o䚘d8:^%3ˉv,Km#d`<vholQ%/r75c4qI>i7 &Dm3Xo^:8kMy$Egm_3qWNr`4 endstream endobj 62 0 obj<> endobj 63 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-21T08:42:34+05:30 2008-12-21T08:42:34+05:30 2008-12-21T08:42:34+05:30 256 104 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAaAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7zZeRdWt7eISa/PcXogu reW7kNwSfrNCrRj6zyQxEfDyZvob4sVRJ8p6uo4Q65OkRtfRZWNxIxmLozS83uCwVhHxoPiUM3F1 J2VTDRNCn0yadmvHuY50hBWVpnYPFCkJYNLLLs3p8txyqTVmxVIbX8vNRgkV08wXFqXuHub1bGMQ LO7MjLXm8xqCrFiSeVaH4BxxVD3vkDzcdPgit/N17NPBCYXWVmgWblMZBI0kJ9VXUGlQdwoA4gtV VXT8ubxbi7uv05Ml5dRxr9ciRo51ZEgjY8xJ8asIDVWru1SSRUqon/BOrjUbi5HmS9kt3nSe0tZX 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 uuid:9D1D60EF0CCFDD11B9CFFD91990D4EEA uuid:9E1D60EF0CCFDD11B9CFFD91990D4EEA endstream endobj 64 0 obj<> endobj 65 0 obj<>stream HKN0 o݇+I"ֵԊc[^G 8iZ3o{ic)+kKw$Od1Xؙ%,p% iJ[ OAS*]& A)\-7F҃ l-Em\f4i!J{K0cd\qFQWi}ruj !fJ,Wx8h.*htmv>G6&$g8 <9$APd-Ûpid` ;8;dꞕ3,(U01l+uBCy )HI\׆Pg[yZvR谈.lܧ5 endstream endobj 66 0 obj<> endobj 67 0 obj<>stream application/postscript Adobe Illustrator CS2 2008-12-22T11:34:27+05:30 2008-12-22T11:34:27+05:30 2008-12-22T11:34:27+05:30 256 172 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgArAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7VqGhfmQttMLXVJZRFcp GiCWCOaezV5ZGkErQOkUp9SKM/CRxjalC+yqNg07zv8AVWimkVNZm0mO2k1lfQMKXyRkmREKB+Pq Meqca78e2Ko7yJpWsaZpt3BqqUmkunliYyRSs0TKoTm0MVunMBaN8HXu32iqxqXR/wA259IUfpFr a8lvQ9wElt3ljtTDIOMZMKRkrMyN25AdF+wVWRWeneYbe6vHvvV1KK4hjb0xPGkXqCGJHVYyqFWM kbNXnxo3jiqWaVpfna0i0kE3CLZ2lpHd23r28kcs6Slbp3Zw0jc4iWB5jenfFXWWneejpkkurI91 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 2Q== uuid:5AC798D7EDCFDD118F4EBADC3BDF705D uuid:5BC798D7EDCFDD118F4EBADC3BDF705D uuid:59C798D7EDCFDD118F4EBADC3BDF705D uuid:58C798D7EDCFDD118F4EBADC3BDF705D endstream endobj 68 0 obj<> endobj 69 0 obj<> endobj 70 0 obj<> endobj 71 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageB]/Properties<>/ExtGState<>>> endobj 72 0 obj<>stream HWˎ]d7_K2hѬw1cd-ْ(۝,w|Asn灠[{=O~Z]w~sOÕ{xuU**Õ5w]PXwuyU {ë͗RX*"D&qneϬ. ~n?l C߾vm׭ޮ϶}*0_5]zc]DO:fxIP85bSU!7Cn͘mk$3ܩ4j9SQJwLzWW4Vm+5GJ+T_W]\͗P!¼v}yZ4rRNPrh[v͞!VbvD!e*=I:㘃9?F;$ Y`|vC6?.Q b/dT/ɗ EЊg0Ⱥ_b wS 8}y-ڢ$!jG'`0u~lBB26rI}n~\]h}g?'\1=UijE٧m^?)GI6';Qv>tBN/ЌSo7{^M1y=FuE:G*{{Gr}e1y_[ hTyb+:!a|\B[c^й`7ukL4̜qy=Q 9>3LQZJ?'0o\q4Jfz+MӦrgJ;=ґuiNScYHCY LN0Eip CW4 dw p3Hfjˏ]h҃0`߰ƧXo(vk19 9;Mixڠ߆a:ZƔ鈓}V"5rzIxJXs U./iK]bU[ &ZhVmPdq/ ;.\81J$k2I.WA? tɅjʅ:8P׮B$+6%1dԇRj2 VRWn z B[NkDf[?HP~,/{()Zmvf@@&1L  _4%D;㳻vO-c4A[S!n>7S["2|cc.sr1ōM`! hk㻝\"T SM.O9I4asd0@'?Ԍ^$I>@Nj^tQ}@"?6!%-vѨK2 ~'>ܘ<1}/.st&jzH\$VylwQǏ>Mۓb1n,9˥޿~0?v`ӼuS¦ J.LM=qK*=+4]hB"~>5G#3{ıG^9AM1UPguQ Ƹ.u)gԍ&]GSKKH5{ئ[짨tZxoa I 1&w_ֲؔ9'جbJl^8(PoSKIsܭW@ٯ9#x4pdd(No~ؠ7o"W^߷tl_äx5ST8>C8sOLuZݾ#xCwL[fpd8S59;$4 B"ݎ_->{~ɩWKb윧&gΝh>(?t{h ڨ `?tf|{}1lt ގ IA_VfOuž%_H0Il 6[\x 9rEb0Rk`u`$ZK }EZ papҌ)yHV1F$Mb `|EOZ)G9l"1_t_AbbUt}aFݛ n+%RK7E{O*ġLxlGO0GWwRUj6 d֑Ql8 HvUiXzXKt+FN? @ZFfvyɎݥA޶ξ&?X嶕+>{R`*0K[o)%[.|S.d&Iw}oA)K`f0sN>Z P->s]I|I#d3G4jkag/JNgZÓթFlUφy-pV1z\Js׌*K c}J"3t\ۣW:tC1z ; døgZ<~m~*9})UBgcslhJi,P=Y0Vp}*d~%ISڃwX$n>/Lw&2r{O*ZOIsn96v#:TAz<Bʳ[Oa!k!(?w2ɑ*&N>~p}9%BDK`)?MLR{з)P\0Qy}i$2Fk`+9N;zaV{ڒ5mrWaFJqCŚfLԗۼ,[쏡e MӪCfh3Z+M{ݮ )MMmׂG֦7xJ-=S8HN}ᬤldBrxCғz+αA'7[yͶc$J;w a՚V@ &,``PP`3MWZdaĨT]nLuVg~_(lbfPW3,/ڡ#"<9e_T: 0D@G?QWn;o(WkאYά؈" = bIQWg, FlUA}%2*r-9z_r#Zsg˰=~?Zώ`6V4RW}3/__.yO9|56acolhVj3L_(_]Pi`6A`XM󻷢KE{zS}n /<8O~j\ogRcHW A^ET6xF;ͿoDⓢh¢ml0VwG"g)x${.SPIT4 LJN-bE{$4(Wt^bH1rxKS F!HGf3r.TsKTcUhm{h$>:*hdִGJ$k`n;V뛑*nX~{[N3 ڸ#UĄ\;HNslcC _DԳ@ާZ}0M2D%Tm*̷[֛W =Eb~"Bfy+/Rmπ3/dJ@ͅ =66!q ]oJ^gW i?1[2xEʖ\dRRnI|/[Hl<\>φwFLш5}1ȴFZF8);VU! m1 t޺٧pVf0}q_Gij򈍅A># mȺRTW< S4dT5&m-g&z3cϕe2tt4$XFI&SN~.$̭d9C 0),d6MZX#!9:0Blޣb O`=; Ev#>stream AdobedC < s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjz?/7oߓ?(+.48k<թ^`& KHXV^BP??c?-;yr,go3_oC93㷙~/~[v7Xfoq??c?-;yr,go3_oC93㷙~/~[v7Xfoq??c?-;yr,go3_oC93㷙~/~[v7Xfoq??c?-;yr,go3_oC93㷙~/~[v7Xfoq??c?-;yr,go3_oC93㷘EOOϐW"W.mZ]7\k D!9 ԃn"V(QCS¢lٳf͛6lٳf͛6lٳf͟?9-N]f|ٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͜ro$>u+l9?#͛6lٳf͛6lٳf͛6lٳ?i˿Ϝ6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳMogҿm;_1'Dbf͛6lٳf͛6lٳf͛6|P9wuf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6p_ɿmWԭk$_6lٳf͛6lٳf͛6lٳfϊۿ.>rٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf 97SͿJ~[oğ͛6lٳf͛6lٳf͛6lCs[w4g]6lٳf͛6lٳf͛6lٳf͛6lٳf͛6l&Jy3_Rӝm"1|ٳf͛6lٳf͛6lٳf͛>(sn[朻˳f͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛8/IO6}+VsymF/6lٳf͛6lٳf͛6lٳgmoӗY9vlٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳg)ϥJ?Nv-bOf͛6lٳf͛6lٳf͛6l9mr3.͛6lٳf͛6lٳf͛6lٳf͛6lr]AHD!&>4?,?28<{9=*ZX%R9cEr%tqA$\ySʞjӼݦz>1_OGQӦF؞Q>qlٳf 97SͿJ~[oğ͛6lٳf͛6lٳf͛9懓?'ZN8'89=Y+86|R盼_t?#/製Rڙ<}a%fd_s_ߧR⟮ҿ8~7xӍ}MJ{gmoӗY9vlٳf͛6lٳf͛6lٳf͛6lٳc"3pY;%<&??2ROJYBGO]*p/ʼyYy8թ4C̟٤A+Žmu"Ih4 UiwkmWw($đ0ee$Ag)ϥJ?Nv-bOf͛6lٳf͛6lٳbSO O=oBM#E%ϜoqH0|Ϧ\sn[朻˳f͛6lٳf͛6lٳf͛6lٳf͛m?=>>2+ ;3W551pSnHG>4д`",ê[ksCϾN?+|nXƋ I+$t};U#nYNl%<[gIlٳf͛6lٳf͛6yrsqE̷"o.Wǘ53<5x,˫EUmQO/O$^~X\`oKp(FSjJHTEɀ"%g ENҴD0$qaZIܝg-l'Ͽ?џ.9-N]f|ٳf͛6lٳf͛6lٳf͛6lٳf͎OמWgLsf[+cݠ?3E'NaZ>D~q8~p6ڮAUӠ͚:ʥk𸵄7/5yhdm} PSn0Q%J0WFU ƿ&Jy3_Rӝm"1|ٳf͛6lٳf͛o/;Cf@4ky.M^UaK31I\Q9׭kjFg<0zE-μwUxYu䠰rٳf͛6lٳf͛6lٳf͛6lٳf'OfϫDg_Ϧ9f͞&!?枹{"y[3U׼ѢAwe].r:G y37C#rNgމ\C:hONmBZh=)`E"Dlٳf͛6lٳfMfO6)<}>w" j9RR:Y(]8X|٫Z 愵]G˟-t)#{ c,tOS6l_%1??Y]93?i˿Ϝ6lٳf͛6lٳf͛6lٳf͛6lٱaٿ?|lٳfϟ?[[-ak=FJu3Q;/%Мwv_Ԥ>Ϙe]s:ԭ$ĺs+TFN@ȟ/YLa\I-sG;:4LSPA;lٳf͛6l̿58-%/ Mhm|jV[~`ynE'eG*2HC,ݎTh~Y&Kc ]sʖɧ$}fŷʣ Df~隦Z6kwjVS%żvVu͛6l؅͵vWS88wwbI$ 9ں7/.4}+W'5; iBDGk2}9-F&^y=wI4US:/ޤhJvshd!Vx]9f͛6l_%1??Y]93?i˿Ϝ6lٳf͛6lٳb7Kswq#3: Ҭ@~͛6lٳf͛6liywH>kVy6lٳgÿy{ ;>}G_/+"A9_jt NKihWIuڹOqr_-y.3yu ~HSR{Xu\ZGPC͛6lֈ^lmWͺ /?-t]w[u8JZ)!Z@]T3W9[S'r{Q‚_#U[J3 Q4lHA&9iznamh}Y}k 1jB"I͛6lٳf;9[كOş~ݿݣ>\sn[朻˳f͛6lٳf͛6)ICC;巘4_VB}XJ]kȦjD|G;.=no/ـiUP(&kVNEGAIf͛6lٳf͛m?=>>͛6lXwo/AgϨEC6G]0[ìZc2iڅZL$02HWP;w+iz7j 8|kyC eQe54~~.1RĶ}w/<}+^Gb,Izzrp'rF)،an_Ӯu{U40T;kxE2K+*-Y=HW[sߙ +9$U?_ABV2ŏ8$2'g4o,Xi-ޣ2k.~mnu[VrͰb6lٳf͛6l_%1??Y]93?i˿Ϝ6lٳf͛6lٲ53y/ʺit9.‹u7eZ҂;g؟9#&4=\ߙzq>xë?$P!Ê SB/|;~Sk:\iZze<JHʡdUzF?UΏk*̿h7ȞQy{{dݷfw,~H/瞦秙O4%)-1@̡dA X TUEQ*  `͛6lٳf͛6q/ߘ~,s[w4g]6lٳf͛6l(r-%_$N%Rx#2ve9c~\kVy6lٳgÿy{ ;>}G_/Lʊ]Qvv!@074_o1K+IΕ}YO+*n.Csv=E>}TP )7<ǨE|ŸUWvel]-[{'6l7&;|s~fytEkA$qq4 TC3濐55 ?>1?Sb4O,N=#$g2IQQfZv^C{gt%G"0eu$A3f͛6lٳg-l'Ͽ?џ.9-N]f|ٳf͛6lٳfo䗗t\F_5ݫss}Ԑ`h#`89O6lyo#u/yLu6-hz6o[?x7n?EO~ʼn'A>v8x)~ nlٳf͛6liywH>kVy6lٳgÿy{ ;>}G_/Mm]sH3lʡW|oǙO4XZG/-3FΘ^TʯB% s,B>ϕ|P οU4h-E 4f̀-7N,/4^U 6$xQ)+ ">m~} h5=-Aa3O/5Kɾ[gUo DFj֟]_˓y?APq2pkLIx44$Yf͛6l K~b0sg˟moӗY9vlٳf͛6l,3K;gxKpq^ϖߜ?ֺ9F|9wuf͛6lٳf͒x,5:KM[z\cUo"i&B$P PѫQtsf͛#u3yk6:Nf%mzѶ拧H%u:~Nj#E. nSCo6F ѹ%Yf͛6lٱaٿ?|lٳfϐtznnG\jߣf msˊHncXVU u-M':iga[6?qH@Y(zqAZO$85 Ɗ`ٳf͛6lٳg?:|OU~sAuJu]$/$?h7<_GZ4/>7?+^ ZH휠+T0RT2 #PAٳf;9[كOş~ݿݣ>\sn[朻˳f͛6lٳaO*{X=ts:Gr'l8e9w7ԓ^y?SDR[,Fz6lٳgG[ռ9]K}[sqVWp%ܜ3pR+V #9f͛6lٱaٿ?|lٳmr~[~FyFolٳf͛69>?^{7}]'?7U}1͌HIb%/,BI:96A~cyNK/L4dO"oy)ߚl98 3:V_3+_kD7eԨX,lc mobJ'3V,ijdI$Ԟ)ϥJ?Nv-bOf͛6lٳf͛6l/ϫ;{n_-FY2^0jlpkON Vut*M&[WOq~pCpשow騉dZ[kD\"Ge*` {{"q diUt%XTu͜wr $'>9F|9wuf͛6lٳd{͞a~Y>盿#)-? /Xzާݭ/@VGiIQbnR1 _v gίB~ak?#ZUFx&{QZL Cu-":vpiNm$$UQl8/IO6}+VsymF/6lٳf͛6lٳf̀7OnZSoc1^X]DC**8852gv_]%>SVs$$=wLZߖw_ߘMatbܩyMͳp$0PWrAwr $'>9F|9wuf͛6lٳd#rDŴwa'ڤIt3?Vq7Dϻf͛6lA,huϘ(sn[朻˳f͛6ly@ϒ|s{O7꯭kZF{l^DFE[IM}W~k}7]I?Gw'o_ߚcdyM}W~k}7]I?Gw'o_ߚcdyM}W~k}7]I?Gw'o_ߚcdyM}W~k}7]I?G]7^wֿ1<7k}j`Vk{S"k'f͛6lٳf͛8/IO6}+VsymF/6lٳf͛6lٳf͛6lٳgmoӗY9vlٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳg)ϥJ?Nv-bOf͛6lٳf͛6lٳf͛6l9mr3.͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6l%<[gIlٳf͛6lٳf͛6lٳf͟?9-N]f|ٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͜ro$>u+l9?#͛6lٳf͛6lٳf͛6lٳ?i˿Ϝ6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳMogҿm;_1'Dbf͛6lٳf͛6lٳf͛6|P9wuf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6p_ɿmWԭk$_6lٳf͛6lٳf͛6lٳfϊۿ.>rٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf 97SͿJ~[oğ͛6lٳf͛6lٳf͛6l~+=_󗟕~mh>Y,弋VI F*32 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|1ߒ?p~H²{'C# 7 w\+/G|___ZocÎ7J͛6lٳf͛6lٳf͛6lٳ endstream endobj 74 0 obj<>stream Hbd`ad`ddqqvL)s)M+1 ZOek߅@R> endobj 78 0 obj<>stream application/postscript Adobe Illustrator CS2 2009-01-12T17:09:22+05:30 2009-01-12T17:09:22+05:30 2009-01-12T17:09:22+05:30 256 100 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAZAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A70PzR8srCJLn17csyBEM RcsshjAYeny+z9Yj5r1UmlK4qho/zk8kusrGadPRMfqAwtt6yGROlf2ACR1FR70VRg/M3yx6trFI 00b3jhLcGOoZiwWnJSV25KTv32qcVUpPzX8opLLGHnYQCVp39JlCCGX0Sfj4k1atOIPvvQYq3bfm v5NuNPuNQjnm+qWwgMrmCUMPrLtFHROPM1dONQKYqttPzT0G6uLqBLa7RraOKUl0RQyyuFA3eqsK 1IemKr7X80/KlxaT3PK4jFoITdRvC4MZnmMADEVX4XHxEGlPHFUP/wArk8kfVFvPWuPqkhYRzCCQ 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 vofB6vH7Q4c6fb7Ur38MVX4q7FX/2Q== uuid:87C148EE9CE0DD11B008895C9E096A0F uuid:88C148EE9CE0DD11B008895C9E096A0F endstream endobj 79 0 obj<> endobj 80 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 81 0 obj<> endobj 82 0 obj<> endobj 83 0 obj<> endobj 84 0 obj<> endobj 85 0 obj<> endobj 86 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 87 0 obj<>/Border[0 0 0]/Type/Annot>> endobj 88 0 obj<>/Font<>/ProcSet[/PDF/Text/ImageB]/Properties<>/ExtGState<>>> endobj 89 0 obj<>stream HWێ}߯GqWf; Ca"ey>6@~7uH]f€4Oszx;unoDy~YT.7F$Xo7)/\7>~+o/!^xGE_уysnWͮJme*$D}5JîC sWxR(][w!mB[%=~V9sn[P:z~WqѦ*Mq_5+TT '[+dݽ݇%=(|~KyA@<li3 0pnBcar Ո6;ڑʣ^ᵦeP{ 3z4bCI4M-$U}5g@؛DGЃc)Fx/2 ֟=ZӪonTCOFzS# e-g13aœXFT&Bﻮ N`+G` xoVm)"0oo(FY2y7Hu1OFx@̅_ČJ AX!F眬1 cyOP%Kz: ?II($WaBhqvaqT%gi mR!?V2H2:`lUӵk5d0"|- φ38l0;Y[=>? z@9 dRmSWhj8' *wʲ)pP MX!aU}kgD(M){Im ~y4цF֎m="Cml`‡ʚd/7&=$e.xpi55)ݕ&Aeȍ_ nsWI)şij[Ќ6b[YKz2 ^C:"4bh;L<VYzzZ+Q#u.),,7%zBjS5`Ȣl SFzr9O,S|r>vԝH7Dvo#*K0{<_ _6+V 6 v8>bw4S %&/姗C#_ 1cD}Mqpk )?w}u?`XIiI[V;o@HE WRG}WSjʬ;yR(eL?n l%~ OcqOrC8Z8Bqr*ZcDWJG;zA<IMS[spxeIE "Ձ0 e2rTBd3K0ՐDT?S: WkdM(CwGd0+t!.Rjb>5oVn7+蹌~fWs4$)E2&L,əA+&txt]nz+Њ6HƢal*ؕ (Զw&,4/gz:ar;שѳ:*%CQBځ_BM=jlz:ؤ]wƔ;=%: 1*/&^g[W75 u EʵD&~vBeQBI-'`Q>/Height 1710/Type/XObject>>stream ̖ ̖ L L ̖  L kn`d*0JJ-a'EG%LAY2,rRSr9*d$29*dY$_ xR6I ̦dY_ x*/v*!./%C *l~+!Dx3޿AdJvpDf@ס_fP8cM""<T}E x-h \1C20`!J XFIA (@cx2Z _̤2x:|0[RN0Z2 )pd!Q YZ D[-;2 C c\^@\9!@4Y 4P*F@<7(?)&xFT_ o)4#Xn)6 #vej~2`MCVDoq ]L@BʞC5eY8r2L'[ @aH_30`-!jχ#P VNDQE GR*̜d  xKA AqAq _ T bpԹT) %(3Y8Ԇ-\UlPdBF _8so8`)<) P+>ɹhCi#*0 !b0R 3 AOcyD>#dSo@9 hU_j Ucb6F$HAp/0Vw BrT28 ܽ\ԫ)P6j`%Ì `QqH__wza4lPd2rUaK{^BmTC- $05 fRL4dy<+6!a"7 Q# ̃Ї0\.3A]g^WU D-$@ DGhPLBD?]\KG !JA§rApC! Az A<_OSvT `x+QO І yE( pA?#.@͕y ӎ$B9 ASP !BMȠj6L 41^7) 9^ 7眃XNCZXAs.56 3}A5C>HKr@txfq!pYp@?"Gˆ|D]ȕ ɺH(`8,6A1F^"|8<~C2AB3_ˑwpyڐx.CI!FCr( _yqe.aᑹ_AA:_V_73ࠢ&`(SbJ 9cP=*e  y.MX(y '6ːXA0!:[u>K_!)9jE~"7!,D80f(8ܠ H |ݖ8)nY8u4 HA ?j=d5_I.`hx2 !s/MfR!a>p!pK,LYE#AV؎@^b(l2p< Ca &A!$3 %oAZ]c!\6{&+x6; 82 kaC:<͋L88I<9@PWѸm+. 2ŃfoǚAJEzw!pF?1/܁\6ˇ80d$JX7<2 !:LAP;zu={)!@ ™*ۼe4gWA`"@` 2_{6?ТPDg.d%%gfmD3!ekE̊br /_A jKuu_~PتlaC7R@ibl×#B8rma'!N3 ){S0 Ȏe.3<2܆hCNpPkY ]jp?U}n a}l/ !`GʠB8,D?3NאVة I \UA~ X#ȇ `hK#1 8AR.",n Ad@VKAn___?w X//+]`6Ad6H1Q300t 6H(jB9;# lP6 N;`Or GP<!A*``Xi}__?? aÐ1hc, `΁;Uk{.Z!ՃɃUw!E`3B n&PF&CIY2=3aDs.nr. yɐiD 6':  ("-^*y .[acg̓DAm|xc C\nr 9_aM?!#r1 2h3"EA8d|bܱf!\ܒtkz/:Y!4B^Aq@䦆AG#9j! bk"G 07r;A,ap͂aoY CCe5܈}{ d" Avdd> zCP† ˅bA{Mm6āaȏB/q\Y bA_D"pn` rw1"( 3; ȀUW_H##f773e8J/KF|pG[D@ߐ^`pPRqҸB9nH+Cr!7N)ȮnT_EkO_8: 4\.nåY"ϲ ?>\ J"g'#"V>N 1 82Ad529p Np Pk6P\ 3d( _ynqpC@PX-=F,S@ !2q4FB().VKR  qQݝ ? i`D6+*IW3?2#X!-AKq< 8D|ˁ腸 0  }!dmACd(_\( W29 ڡghrߑ^@|Zrk|307!l .E DncAHMCPLgb #x6AT 0ѐ?wr KC]A_y*A .0c-]W/Zr\ G cĂaA>$"el! h-<"_(r 9 JȊhrd k?#lFC"  l63 7}()ٝ)4ˆԆ3 B .YnZ2N>ds1ey cAw&  S = B>A/DQlk Grˑn6\d2V9G : [2y$×dC1 ऋrަC9 6" 2;-g;3̽޷ߑ 0iDb<! dv(ɘdfL@-G 0R2@\# Y2X Z.EpYN/lPDC${OD0(K!܃Q 2%27!2@2E߿_߻O;ΠXP.V$)pe,O8<8>0AAD'c C'g;30d j"(>,~U4K9 *Sg!6ϞcMG܁F>C2&e_#z|fN 5V(R yxx2e:sa dZK x/q"S;%|f̆Be v[eUI` ]&DC-ȃdxh!iP<0A8F̌;a!bcck =^ PT(8O\U0Ρʐ1\qAjDUFC("@1_1> H=pe;'  dqN 0e#x. ?_ A@x5 1OnY'a /kl28 }s`?र80!3?D6܇ ; ?__{2cʰPBs\ jB!ALh !yːce (`r C~C.8x!߇> AEH!^e   pC0h<, 0 ǐb0AdhoGfG`fBh>!|! 9/|' 0tH#>JB# \d*X ;X 4R܁aP1(yfFl8}%|Ԇs!He8*9BpÈ{?ׯw'8 e >8+CBPO/EUd( fauGca"'">z՗/ klay=x_%@ A~: 5?eN)> ˏ{8)"PɌur(Ƞ@r^#D2\ڰCd1-r5/fA!9 !o 0e؂Cc0b> p6c% &?^ "UHHv o @b )V@DRq׿0D+`|@jE#`s0!q~>|!aOr RTF B㌊?_-![a ǼD2;Of6'>]l$.v{rZyPc;p  %뢃ب!c!C= S!`0^#E FȹIH0 _5ߐ"wpY yڨg#[f̲˃!%< ׿_b@(!"KǑDrV?E? (SHRbr,UC|y[ fAD|A_( g `/X \‘D3؆ E#€dx0A0P`٠mxDr>G2܃r>w@1z]߿(.P h4HkCRw- @ G$~?~V~"l"܃PLr,@Y`T7 D#rQPqǓ0?[OqϖF? ,v/~a;ac_i"!xM=`,b88U`  /Ƞs`P4pe@Ò PXj qH޿u}k__@.Ǘ(Gb<"5͌?~A?>;& 9*9@`Hj(#a8Wu< c;-2ve Rz!0|&UCe)Hq W* bz}_/_hA$A#[40v[`8xnD}"8\d3!HG;.  vF 5 0AAT! @/_V?9:x_Xu"א`?_s/}`" ^5&Uu:w5`FF<"{)_҃?4[E#㬊\AeJQaG2PbT^J0NA!w-Xaˏ>X ~N@ Αa7'|œӗy *<0\ TX?? F ?`DABqn [ N`p!v{gcetXpԠa `r#C ԃ0^_#͐ >"#)|8>/ _"O}X/F")PyG~>{D?p>"7?HW 1#P\!qR\6ͬ~ %#g /޿0[%R["< 1̦p0 +@Sc3pqG5j1e ``jK\x+yjvU_U pȨNpe y rZGq|(r K8#_UIue8?"GP8^?{__e`x0vdAH+;4-"TK,yH` 9)m9?O' Ix<4 J0A.|[0`Bw_b.|qP D|8 1DD/;.c8 d3  ܐd|%gx/quk!q_f Fsh3Xx2<|`|\4S!p3/\r?_rqK>0E=vM <;U͞\+dQITCK.m=VXJkKUUV@I7%:†]_ .v. hTjP_=d62z"T0PCh|0WBz2ǿ`20/#󯝍gyP?.wX_f3Sw,D??kia?ӧRޚ[m&꾴pMxhZ\pG!!ȑ"A@d?!))3L"4t.ܗZTTti@N!^_h3ˑm 8<)ڀW(K !3|/ \ wK M5iPP[ eO U¯Y l’(+8tCKB  ݢ$p4<(i /h!~ Mw߈~ۧ!_ YDTqK#x*ȑ2C,ox2XCFG" ".!CfEٛ "( !! 0A @do82T̈_Wp2 `@4Vבʶ dlIniO Q_~E2t AZ/D|*0?jy e|(@XGD?ʀN l|?$Eq~C "/4C@T{Rd3v0L [PC(S_5 DRDH>|u\x4  G CDr v". Xf`0A @v C-`X|GY<\} <?#臤  2?9j̊[Ajq_ $ !A*(Td:h^v 9,0_\)/UvC"D3F//. q)/20(D?xb+((wP:DC̓O_!{xe/vt?/ib&ʸ}9 AHr2 O'.OXeAR 0Gr?h>Iq/8_Șw[Mp|qAB젋Y! |XG ЩDp|G#̤!+ݑJXça">8~aAt" )Ka/țH g@,p~pW'> 1Dy^qdJ&3l%v `x224d KpR/Ac ݠW5 g c:G%i@U#G"$vf:g`}) B?*#!{ ?p[2^ !Z(, (dDr*$D8NT#ؙ~*2XI'OO)4^/ 8npO#af^ 27 yJD!ȮX< =8B8C4f G)זе k"1A`ȳKn"#T("< f0d%.F<$dHq_ [OC3elJz&e `7r2(~G5#/$.BނQJg 82n |0_ gd .F"n1)&Aa&@cH)>2.f@ʩڳ/˩"A"9 HB?9n Îd?œ q2vȩA~h (SoÕ3U^fdID?2Kb ~ZFd ?~K`69G4 _8'|" % èfF'0N w%N69  ʀ<AQN  r3@Ϛ}Fq  _9h̕?BJ5îyr1 a&M0てl'!\q,h.l<HL)V#M̍/0F(eu@(` 063쌷Y˂*PB3Y$KF#2+~}rq`I Y E%AGy- 9uYFHC `30!!?_#Aǹd) ܂cjvvv MGx.V;U2`/iUYȊ a (16=! ) G /̼U;xsPI |#1L(CI]))R7 26P$GX,qFc#"f%C ^|.u>A}28'!0^vf X wc |dܞ;#'-1 /&C:ʁ|?1r)!AUE @p >^xE@c̡Eg5;$3A9$C%("`7A"O"ʮ)Ͱ/0u C/ iDl(8.gS)](vS+*tP#<(*%z"sOB;HCX%<.Ap#%UbF ?"H!+ _a<|Rf"h.‚],9 "p|0E?d.Ԉ>4' e+ܴtB"V L$KUx0`ccds3.6 2`D'χ' z_ڮl>#D.4XvOa߯OV)`\}aܜ f+Lx: dD`x`b X"O c+aP7PH6׶Y! kb Kdݸh"8vl S: A0l7 !CRjwo-U"\A9 KLlI&äp~FC2%Í׿`+# 2`8`>t#/ ̆ x_% vkHELS)pSFP "p\Ab!8)')G*b0a ֐2 "qÐlߺ fev wa!ȣ ܔw X&˞ Ge e%uk0ppdq _jjAF7NWΡ988G]XhK}Z62>!r``(YkXd;0[8pfB!X ٜl4J P`%_k)7Y`d8}x!(ń ? XrJ쪏@@3^K i%P>! t!Z!r.B! !)i; Y2J +2Z +2Z (Sa 0`e0% 0D2yWC$D! )d`NC$1z c!{ }) lrUdaDzLy)!]7, ]elEJEQx92 #AL 9*r "S"sXc+3`1<2"? \{!@^IC h8<8> ĿJ`EI 0A}+dPPY_dX}3^Y/@Ac vIu `Wv2 } `wwY̕odr}]QjLx"dad X8/  AoH[D4__J `xRà â=.AB7e@HȤ6xǑou>Aq|2,<]50K A?  p~I[2T b"iT lVCg(d(@ `ȫ*ay#3_r6;d3ȱ@| 8_ ,O&Aд;K.\,? /Cd~E~ }:JB  ʐd@( c~eń.~?v/.Yِ0] p|x$H?`pdW/?ԏc__ ~>X ~! 3`gB?HA#|x/@B譂ࠓqUGODp5!$1Ɇ/w,6?lSA( @#l5;H! dLCB /Q8- ".9$\!$+<9OC2|8/,+<;HEq0C e2̈́#(O y͔88_0 F"r( =X  ;~8@b QC)_d!v pRTy(%q?zh¿|?+\D@Ce~? #\\ˆpDBd6b0eXȐ#jハ#;*/퐣10WA@Uy,|4#u< eGaC]x$v& p")@ |Av=d\?XÃ' 0셁p͵?!0?f,)!vH)6~_UEG9ȂB/G4$;$ ooBHC_?>3J@/k1bu\?f) )rcU p8ـen%A[#xR> ggxY~BvC.ky?"tuAD('h< rǑ?w ʨhFZC;J ~hf%Fc0_}sy0_ʨ0I`` X<(/|]u?Pz_د!; dWd&Մl4eP G!o!\fe@׋¾0YP_ '#-Eٜ>\x0'#z;Y' DAu+̋ y|nH_X\O ^Cc7!"Fç?3 j geq$N\y`d Vaa /_ ,PD !0C.@(FIA B0X\6Hh"H j0 q&c:ݍQCn p x M%m?ްǐ`_# Uґ^pL$j`J1q-%v k8r'@y,@/ &R5pܷ)$R࠲\bb Bp$X~AQ0A`PR,^[Mi?O/F?uA! Mpar㇔d V;K @QJjG _rW_/U j"8ALNd™phT;Z0y I'Bg $]?zk;^׾ v*#^F:(x3PpH-2 P(?!W"GHD`!0w#!P WUA+ J`͊K9 -qv`A!rN#0|2# |C%I@_|( ߬4ǂ6;P)AyR,>! F9 9 SHf̹IXw`qB#Ld A_dOVFC9   8t c$Fk.@܃U!/d:@oh8~hs.l6lCԁf2' ߩ`!Dpk!. ~?zk yP !W d[A A HnAжQm:\ZB̗ <'"LVA"DA pȠ' N !HG  M #R0?_pc2" Hi9' ڌrJ.8"ʀ YA~"`b@2ÆY 0Y Q|h $`Q A4-)nn–'ceY6Kk *L?㏅ǕnG=냃UX|`"D)b dH-忒 H\z`ȃx<2Yc)LA,x1pm47T3Hă!" 7ׅ_&cd@/!\a"d![P|FE l~CaX9 7i A@)n&Co 3pErD\$Bς bC.b@&,_hX?_1doG 5<" Ad;oP|AT (A-ȋ%H#B &)d?~ +.88r6AXT ~YؙG@" h_p.^+vLp_"Ñ mTGP^ 203!A aw> tB 0AaL;!L p~r!a& sˉOLG ?Lx.YAAb+qP0R7G_82츿 S0_ +IB#g*. !H  ȅD"2+ (R2S20v?__ao#P+ A?G%tp~  ą2Mn/DH! Y9 |+͐' ->󔃂 H$220X/ l1l'!Xe x?ȴ8xCh F? iD |)ޡ9g 2*Ju``X@QLL,_T t  `#ˈ[] Lڱ!C8#pFG? C; AGAYpF@3ba ߝ@-Ho`dud" Ȑ2j .d^<BxLC߇@dÈ~=b}cUwAJ=9ZF>EVG!!rW@ %K bd9Q 2 "JA Hc0'\ 03a\^CFID_vJ Ȃ,;  Ep19;#=f(vf#_k אl@3x_Qd1O,?q?||_ΗDk2N/D,C8AAdL?ax0^I ~d@Hp dj 0> h2 \'TS#Hz[# IdZt„+`׈â.ˑZ ?!"GK1}JX _ pLڃ\80et .X, 3P*Q{-apҞ%K@UW_K#D $z8<9 p|/Md APR8M a.fPPeMƁaD#r:`po?. C8௘ 3 @! L W6Z1"s y  -X2 寄[ !#ˀ_M2~A`P`P/}~jpnr [Wy:R\@ ~T YEp\ @E 8MQPX,dg- P~V U86UA X/|.P<Y!*k?9!#`PJ"c5RO'C@'-#*0ExRȾR4khݐnVhϾ>wa~C)l | kA?CLpA9#1Î|ÐF!8:q@܁se?d }9]T)ف 慵`# >l >ml%6f0%%%$%%$$%w 0P@̕C$7 d! dA'kW"S#G JJ))2J< z~_W]2 ? ȧl226i?̡_@_6H_]G CC/}vdpxY1ivW/ ;a0O"O _?!6#vAW;~?Jwh;X/7ڏL*ȏC?T2?v?䔿_]?x8c8 0PA% @,Id#$`z C endstream endobj 91 0 obj<>/Height 1519/Type/XObject>>stream >Q#@}F[O"p< ) Hh U<6d X 1|̕A1@@k28 ׮@}JɸHɽd@3,Hnd!n` "@ ̖h`d&/#Ȕ2^d,_/jKRo$4HrLa#&E.\.lrX^\B%$d13[ Dt?c??FA P CM"$`0錷$@R! AOA/ <3Q\2ege\`t])\#ܽ2ǝ2C LGxR|a8X%@_ݥO"828/!%5d4? ː^vpgŠ~IO(,ID}" \'c@`s0r!8g2v?0d Hrn"(5DO7_# #X-ŁG;ˆ!?;VP\L?5?-H;O"4?࠱8e~2܂g)i~Pe;Nx8eJfX|0ȫ G4 %rZ .͆`X  r&ȻQ2[r8BW#üW.edX~X8,Gd8c,߂L -2xC= fgBRPD2 fR;?a?o!t9(/"ScCC( k` /W- 6!*\4;4 ,Akxm{!P"A  `1 q_ 7rC;- fp9%ycPE/z_\Pά;w b!8 r v7#8!kMeqYN)d͹=˹]̇|Ay"? !:7p \<q#ޏ,Yab  I(HG pN 83C(_7K_x(AC@; ,M9&pd`Q`L.whx.G]lUkk%,#$"P!sx!+2PA)X2d $rjG /8ey %f\[|jK܊8/^[~g>N;r#Ȑ@r9dYA20"G8DvCXKk 0%1 l?@ZpjApo8>(Jꁤ FG !!^;EoI aT0L~aldpDLJE CrR,r#r8 DPb _Oハ=) 0c. !1Qspd0/!Pq;1EG BX.AAqN%Bӓ+~~_" Po? _kt2Y.>x3qR({J+u" !{I!܋audb &~#O(̉ET58up~d ?8v۪ ~! ! ]{<@\/ 1\' J#/Jpo(<ǿWeN8L ,A|@yکAn<ÆAK,! 9&࠸ r}5^Yre™82d\)a0DE`AK"lA rv%Ɓ?%%/Z1Fp4(9.\Cɸ.?ZYK~ɱH!rqMH4!d~0J5?jP/Pଂ/`< 2,,Go_3 y7|̸Q_ _Ki'~l\~@{1Dk囒D|^~C1@3h`cdA& dqP_KYYQBǗ)Dߏan qDPY`",]oBRW ~? :Y2 AK̀p] V(r2YB#?Z@ȏ_/G9@d p^9@c>ȯD#2dM!W %_W"_i?;XX(^B!as#Wp_ߕAtY3,~2,y{@vL|7"_E~#_2܆XaP\eϒ'qcfo\1`eAPr2Qzdpd\lr QA23dUydpi5o?_!G)!d!lBc<;CBȸx??3 vV,(/_ȐX>#v  bf?2qkƀ2Zx,R0ˑdq˿bF /̪ wwZ36:D26-ސOH) !S2%Q~@g..A2H?[D-\Ah$ ႐F8#KAkïepn," )܄NCTN,KR .|׿}~C'_Ӂ$d^?A>˹V Cd8-!$/d08Y\ jA5R$&v C.!$Bpx"q?T!I\:Ǚu䩂 ]k _\y8Ґ { F7 Ńb|(AA CU(XC 2#Xڭ޿|4 ,QH9U2:>C 8/ px89KWOfh("0b.?8A$2% _%"80R,WA0f<_.07 x3 ZFTB x.G"L/tD/ !'A[8\~G z+~E2v& !|;2Xg@i,;?.>PNv6 ]5?~ E4eϑHy lCcK 0_/CJ-' !`6DH>*IDW#1Av^8lG_'d9J]Ig ‘×l_i>; /x eGZ@x#',/_ @7^dHL =rBPp$Ȋpm+dE*E(4aO/!Ȑ AAp@ϑgB drf /v d~2=jHF2ʂLg^ I)~->FZ kI B^o)\ _D>íz+&bTr2a! Qb-a1:!? ;Q ?rd-0@8~R)eT?[/AN<$_cD~HPfHJ(K!"?p[܃_Ca ! 0.v ?| _@o  P $\q|rh>_C B k ',|dMIsȓ\Lfap ~Ȼ8xX0gGxax:ꗇ@]V/[ 3eCbspfp?*'GvT / `  Ӻl( o@EQ@x)5CD\ $^ G|Cn*%˅-ZAx`%8`Xx/" y EêzʑbHa JBDa.FE^0Ȼ".X;R(8d _;S?> .vr?E|?օ8%0|?-3,BasᐓߏC20 8?C f7] F99zd9r ,_Xn.km &z!3%~ $?g -z38X86gyoxd1rP 1?s9h |K2 v8Uh=pz#?tKⳲah"Z a[p߰4|(,!Ƨ`b28  ' :F_@ ~[&A<g 7x/Âx7\ްEpr(MW 2-_x; E W̌ SA"p"*_`+ F@<2I ׂy\C‚BCc@0^!/mD3#Æh_!V[`ƒxkݮ 9&`?"B\" dp'Jc"CcvU-҂ ! 2S;q_e >J?Ug,r(/໻x)nC!"#pL |˂q< @-bZ ?/rp\.MES O+J2YDvkBlG;T 帻%Pm,  Ix-ȭc"B H|Pȝ C*p_F-j?CC?] ?!ܲu endstream endobj 92 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 93 0 obj<> endobj 94 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 95 0 obj<> endobj 96 0 obj<> endobj 97 0 obj<> endobj 98 0 obj<> endobj 99 0 obj<>/Shading<>/Font<>/ProcSet[/PDF/Text/ImageB]/Properties<>/ExtGState<>>> endobj 100 0 obj<>stream HW]w} ~ؾŲ'iҘi|; @ 'X,fg޹3{{v׫[THtQ^4)TN/WE* [ VkyZ|nc_e^'>* i⢺8te݄,ڕ(.tպ"K>F'6ڶQXZ _Ĥp{~૮W.ͱ7u1V,~ŢSyb"li2Zl\y[oʚ VTDG&NWӰ3ٰ AZ.n&`,/h{hcד%*âEk`{v=plUe3>M_񩍪u_ ԭb(uc@iv5լ+X1p?uyD=VXkq(@8/c%Ƒ YŒ]洿ÆWF*__wfÀZR!J L,Q( "ڄu:|:*pnHqSz$\EWCi"a#q+@Vvƒ i)PҶ& QbGq"Bh]Wu3<7u%y[<1,;ݓ/u$~6Wp+{Շ]Оl` }_Qs"~Mw\ Ƴ.߱A R^pǒl,'ۂěW*G<-Wh?xYE|#c 4^$U[RaQLM+شiQ:h,3T^gG;ɪl B(8(q~Q?K#^3CNRxSi?zuo KKsq.m;HX%MwhWEbR—>TlHGݐϕ$gCg͞QUtϳ g c 8b/Y 惂9Sm*c:!^ԋmֻSWNt߯Z>|׌ǡ<<=1itHp:RM9=VC+9IJ(+tY<_Bk'(?VىX*{C`i2}kLWUp= iQM#T-{+*=d~gWJ"ū /黯-BilscBWs#ssvfƫ'ե&>KC:Qֶ}u2 JoW:rtEwL0Of^Q pf,=1S(׾LaivrI 0_RXs*b~k+T`Q^2(ti.A$pXйBi(K `cq/)èv*QBr8t!&i0Ujо-Eܖ>p\lBX.*o}GθNE Ἁ:j1~e`;q+u*Z1b*SP&cƇ f5⸇HmU<;~ 0&| endstream endobj 101 0 obj<>/Height 1710/Type/XObject>>stream " L ̖ ̖ L ̒ L C ?  JJ %PA}5JY)*r IW#G%Lr,2,r,@d@l_< DYdd? xcVA@ܧ. "3loȎ| d2`y28dr?#@2G d8d5F`.8g`C#@N HdwB; }@,# _Pԧ!c.UIJ50wA824lA8qq B垑# ETB%0B Ae#zA}I $,N^o /Z B Xd)x?$!2G!4( !OC+!D 8#*nEO! ="|u!2S&Hf9ۉ⋆QL^EoWT ""fAI2 -FB`by\ \0S"(dp<6 5 - Xl  zr$05 NdAȮAy 5nAY ) BKy޾yCl@ ft"AVx$P1!A 썊TBd0DΡha?, ! 4]D4AdGRAY"D6,Dp8?^# 31"אny! 3& ]>YLȌIʆAE3+#s6?m_2 d@kF x 2p?&p"E`5eLly*AnW!p l-ND`-ɂԂ\,Uvx$4 쑐j\g\"BAg[ oLk"Y:kYN 0SDؿ~˂RʐX G] -JD.4Pd0hdR. f1HU_]~<ʨ`pN@*C8G \3 rֿ _8?fq6%Ⱦ \<s\.Kr `m{7DW !z)ƙo~R_JM)0EU0tG2U<*쎊G#g5#P쏮kGɰp TP- aB#C!ӿ_d(":-;TXgV6 xp͂H@r Cd x59q/석^RV!p  x+y7G< 8 ӆ@ԿÐ0#311$H3r8C Kz2W(pe| H7>DWr܂rT|Y'\8 !G&9n gYg27"@D VhՅqAe[U l\BNKzn E4#stDoIi 2J_[uSNT'!.h` ;DFH5쩭: o8@i0 C0&d HdT"Ǒ8@Ot {#GHr8K#uGI ӲĀ܉@$.!S! +j_ہٕG <)*,ERPMA+[q9ek dLuqG_-^2PʣNgn nkIAEHH6"*Ar 'AIp!QdO !NCGb* `y(Zܠ&ǂdۓ`yHjId27r + lwȻ"ȯrq$}H&[ _!He0""!x{&\63`#( @N ˑJr 7F9pA7"&;@&l9d< !LL CR$p#rBx4* ) y^l6 oD@ y`!RÃ#aN™*d$.6@`sc0-2pq3|a8;G,r,!٨4zY-d"$` 4Yr8>+py ݼla<O!/؆q/~GX#"PVG/P Cq=w˅~G Bk)"Y a",⇇ SLe 兡+,4ȂH ӄC:rd3ԃA8tC;r=^^ׯk!};D pC8A*0wTLP/ j39 -&>>6.88 D( 㐣? qTW 5?&?"C,_(e<\ _$0F!sCfW- 3Pdq>Ap0#0jn\Sǂ `!2%%.Af]^ +ξA F&C` 2 A@QxJc-GA@g_ETnCm{AH1<d),(?cgl.)猸iP@5HW ߮[&@<N" ?y5fA /e*aڬ!^ p#"nA("oX8ɜ"0;I! @"/D<3gPD28$H:"Z p[ x.AD ρpXp~4ԃ<̍[9 ͋K> 8tNAf&F#r_C/R$NT6 )B{ؠv04jv "46 $pob<"4dT0d3? {l?;fAh:׳ZslL{!B.LȬ VE9si 5#" "AE.ݠ l #l6VKX0pESr&QRPb$ 2[ #`NDP 0r4 $(GprGÙ0Rkd ,}>_ q6#$Y3 `jj# iCYl9 "~r c!G  a~nEB4N@ \Gd0D}G;Kg@ϝI4zM_[0 1810 B#{&v-ӹaB|<⸈P(9g6 *yxt ɱ!"VC8w? U "6\3?*C4}/cX!X.\2oBp>f49!, ճBNB\C9Ps b`Tdy0בσtAF̲6(^qɀj0 "+3[As  7!|a+ ײG``y) <y !D fab Y-fL1TFׇ눍]wm Ci$I0@# E (Y]F;@ +_|G7!pDAh#yc \s!0rC-:#K xσ͔eɹ/p`\8l&vނ! Lpi5^u `;`Y 8gz !w*ξآ(tN :2 |)r hF 0. >kf`CS (?<~N YnHA9. qr83A2jAHoDzp5C{o5 DlD+Wo 0"82`J8.#a Ac1LC)kP0##Lwdp~G dq<|hCbGc|4)~G# G0HAHhaTh Ŗ`D!HP.Dd BNFCxLuv@a6d/ ŐO-“#qf N[3Hf„2<ӂ#@_Gd#Â%d6>9y)b A:-ט+y xecFAKCFʴq_#HuO܄ro e Î#6;.p8z+`x(oAC &4 Rxx.P̤ٯB;4n%`x38PPnC ^ >A܈ Iy1H)2퐴 QMr2Ye_rP.f C"7\ D_R@7KHd6v6~ 9pϘ<6Dž a >btDrǢ; B!9/d_\0Q7qYl2ξ} 2@:l&Gwetnv. Ԏْ&qq39_#G:呞G o8GYnPq",dQa8""|`ŕ-PYD0 dDnOQHP-<2(iŬYN$sao߿_!9=8}Ȁ@&b ByS@0e&ʣD]hmY (q G Ngk !hCA ܆}gQK~0,T@3U_:a,y;k;V'/r_b*WuPMl"id*g-!@! xmGcy\f`2.u9-/i0S$!KV ɠ.G鬊Ĩ6_rTȮC9{Yw `O/|iOu/uk\>?9) HUȲ g#iמdvFąT`D6A| C,mntωq)/ IP(%@ڎAAt ) TA_/ƂF 2$ص/4a0P'7r*P[T΀ ODdl?ʐ(?_J,(ě3Jaq:!P%F9FXEkKC(p˃%C/!d2T !!*Ap\ F) X6?W!w 2YPY(g},. …ȅKpX#]r#J3 !xccw ^ ǹua??! 0KO-A_.~d/Cx~䠈 +( W'*( 4 G 0Jw1[y/9PNy@g.!ppճC" R?W?:0" Ld\\'54AY\ ",C\_>C@ , ,Dc29 kc#Av;~ߐ!c#!~J$Ӑ?"AԂ?_V $CGDfDeO AFyi_:{O1\(D;!l"!H e.)wIPs@_?8(!8' ̲Dq"RZ3-]`x6r !Ia`"( !j WN(7!XK"c;@\y E ΧEb؈Djԛ9N4N`ɎCg_}W":.0e#ㅝg @k S(rrc2Du _\FpnC-ǝMN()N˂6 @ܸ[_І,q8 ul6KBR=  0d,1LȔ!8/6Y."&ޠeC; w?k`~^@̬%6OBq3?¸)x:tACxr - a廑 h XcP?"A_u_E} F<4X#":<#^t40!Kw!&`~ <0XAhY]XY @Q?#!T'v,CֿpGv'NUx%R= ABdQ%_ȨtKd4,ƜCA~uBÖ"0.&RA H,%0+D36)/< 5#4\FD7,`y4c?#g`Qk)+q*\U_GFd?S?Nz 1L03, rc;S";Z`4G)DӇA.ODb!D)A RW!#r k" 0Ba pCH 2l&82 0%O  pq?T /&t)9Ez+ -22*0YVQ@<$dPk !_+x>A`rn(&AD/<4 Q2\d1 q y92P\v@ÖjR( Av@AuN2J]6D_ȣQ3c(:.A| a|d_ DyK14W3ȁxȦd%$h+P9SB# ߢ%!R+! __U_@*pA-9 i0r1+  G`+AyvA8@˿}0(?*Ha$(Ճd,F+M3vK8~ !z#KDn A!EBS-}hZzׂQ|>~9H² ^ $M s r{Jc x-~}o焐yJȁBip !2oA[ C=D#J~?⢁o0ȶnB4'pK!JvQAzE 0^W{q(-(|fr>#N|D0|M #&Ba|m8!]݄#hxA/LC"2E܂Vˌ"N&08v_U??gb^Ts!`d34(Bm:ed6[ 7 *.l{#G/s o*?(y˿:ee/PhA\rA&.8( _L:eqAYitPT6&CX@<쮢Ȃ)r^`{v M4׿O^r?$D-#1*0dH)(2E!C@ c@BrEAJB\00n<~8 䠋?k383iX=\ 9^.ɠt|5<jFG 0ë_)@J:!>AF*PDHgc!7ǢZ` [Q8=D3(7&f?2\VAaz ;JVBSC"x"9N?^ZjIUp51+̨M 3ˑmSג\,BD0]?U2 *a ` Ppb A\aP "$9c9A]2;TEFC;:;eB#à]y#.# A\w?fSG`+1lD `_A9r=aK9b??:y彯 O;kap-3"`s"64 x28"6!yS dc lDdW".=(Xd\8Q\)3C TR|?>㌺;7 | JB-+%@qS`8\aKdž%NQ?s!dIA?%@-C~` C#|d!bP5|;zxAp\r Ie-D'cD_cqFőV j xBGeZ0^":X(0eW Q((!Oec9FB0A}u% |`"+ʖd9߃2d+T 0 ]VDؿ .>Fࠉ9.Z<$0+وg +W Cf/ #P OleÈMZE6  \@jvcAx8{ ^p+ ̘x:$nÐ80\O!B #aÐ^  ^lYȏ Mj]xD?>IUTGKt@θ}!!bLB@㋱ ]  CLrADb Hc!A2[6!axGETxD:Mb3xB8 _Ԇ`oM8<9UR? %QR C!##Pऔ9&'`8 ɣ<" 3XN ~/IA}CDJc$d2˕aD;$~T8AKi82+##ẺsG[B!G sV -ua Bߤ"Nva1pDu[3e V88<\8#0Dq` -q8{ d)2>E~5 k AϿ_d fK!a0pk@aP|d2 ? (rJ>ÔvUG!:c,s;5}K}Vf 7J7*Bh\%$Q%Wyy2da(dfD8@GTA@@fP_K 4 `bU!C%IT3'C A8x!d IlY Ӈxy%0rcS#"RUȷd$ t"W"/??P# J(__":C 11|A!tp ܯWN' D>P4/&Ksd.W,pI$7\iAd" ?z{~#"̌2 0d.܊B~AY,! @PCc:" D6Tq%7rƿ>A 3h k_?ˋZ#GY2\gdb0a" ᨃ4̖*kaȃ_f 3%A2𠤠 ` S. 2,(A/~\"ŏ| /?|8/wc2<6Ei: ̦?;SaTat2,QA+)??;$1v~?Ӆ TfU?2V2US=s//,!*/] dG ~uн0y4My2pAi~O/=̦N /+A!sR$%o2!`a|01% 2I3v8U6P%asI̒:+PL"r:쎿ܠ: "GC@E86PᒠPG^8r87ǯ l))@үجtF?r0"3MkE`0D.yM^?"/pU!? `2 <&š . #[ *#diwa ȃ FU?D7C?ȫH~FD{ q Aspg B!(y8OPrfAHOY!3  `|2"U , _;~B6RtCH ? # q hOAk?Q`_p ?q(c D`@ ?$ E"@c+CgDwGV"׭,0<~?@Q1A@D0>8E?a]! 8/,2@|AK_e5 x2+9<"G_"쁈 +X`? .:\ؚ{(pX'C?ظ 2s.~#^v)@ dEf#[36 ~v"yAdX" C"`)\@.D" o}恤w$2DI `d0=$;$BC [?aCGβa'TZ"HVe@!/`S%%xFKa ?_! E,@ r9 AȣCA<) <;!2#55CGqX$rLPYjhnr F9[ Ed( d>z0@ (LˊT8"A`KPX/_NYd/!DH(?eZ@X@"~r*(5Շ +\ 8ːP(!:aS0@"9v "L#2D$8 qB7[-fZ@v; ޿~":;G9t4#HPPɹ cn7! V#_?{?w‚$mar {C C!91`D\AL?%s C<zg2? aW"+a`(PPX3@̇$3 FnGR fW/"YpQȢh2@"0 /_^H]Z>a0rd xa/PA`00B2媌.9a r;#r8DpVNfA& ,A"#@XXD3׆\a^8 '7U{)ha _X=pnlCYLs0Rn:6 $HL9\Z\>#yB.8:- I"R gP߃9 l֋Q̔ 8A  RW#jBQVP2lh4ܴ3)k*~fx~g[Eyǂ #jZE#ȭu˭B(vG3%2Gd- - הƘJ(F|FqCO߯߅;Z88":"@ .Fq (p f9Bu,) g?±|pO),ᆬ9 Ö82G rk"Js 1e_6 XBc ^R*30*ȃA-{k @PCH}SO  9 AqൂYg VAk\DDEऀ[:+WJ3A jjqya <DX`2+lɽAȅRYg0!qd~JUŦҋ0!zI; 4-v${#!~EKl6:fF$#p_,7Ee.#,"<-͂e Du^8? MB BNe@JpPHgu ~ 0P_"ɠf!AvBjMBA/?ddFx>!Vpa!~J>6 ྥK}Sc>v`h//!VGRaF,P.GX&@NK`~EoSB+ BkÐ'cd AȐzC„P")?+̆E#PP@%1 {L _p@ǐwXh G\c D@2fS0^ di;B2R |0^0Y]_\ X,H/@~Y6 // +??%/jI'%{ <[?.Bv, B??"$TYŁ(>D,l-A@*cDH Ɂ&@.0-(pBZFg ݏ`@(Q((C.كq0 }<ȀBB@ƾA!G_ cI Ѣ#0q87Hv E,r'dp|2!Z/ vjG?#~o! r  M!Yɋ 2CwDtvdJed! !AH8Ds!C#a K! Ã#SO!%RW8/ ޝ P2L*c( l!qA|&Ȗw[-Ջ9dJ| dL)*Y*Jesd ?'靆?]IKws_a!#";a_rx;Ix( Gg&kdpC'.-G_ # ?DjPr8_e0C!? 4 /䛩 R_ 0?ێP[ //?_G .K*/?w]G^G8|:׿,`O X/;("K_A' ?N EH1W?ie 8S?P@_Z  aʃK O| 1WJ/bMWBΈr?aD?];.ޜ/ػ 1A#dHDLPOa9ظGr/b._R 1x  d1T9Úā_/\];J2PD FSbd&e; )_!_#fGGC;3 vR'?8AƈAXq!3@dTu/! RZ! 6TGd68U)#]jHxC.t3ARS# h记:S7)H x9/ݢW R=$#-C &+ɵ ";a,_Ǖ3b{BT+"Ï 0 PCO_GJd1> cPX,l@^sAAK|_CmS/fE`H64-Ah \/"= W`!5 ? ›BdA/6/ɐ"ǂ-,33a5I2Ao*B<8#e?)..T"!hc! `xdmRh_ pA L" +Ȍg F@rI[ & 8%0G%9jJ -u4 샳]`4Bk.)*irPDp_d"/ xX {UD  8X9@,pǫ-Z# P-א_cYNAU`. KoG(khՑL1ߔByo \-$jAed%zY\d+sqw |@\>ߐnTprYnLulHs0 f!\2dl2dl2`l2l2d,2h2(2`(2Ȕ2k  JJ %PAK%%\AJJJ2,EEEDY"_B\2PT \}9 6](qBvC_(l!BbF LNF?_! vp/":? k/v?㮿/2/_c)/?Yc e 2 q2ˆ@2vG d G e8d/E #8QG# f2Sd`JhG`d2`Fd C endstream endobj 102 0 obj<>/Height 1540/Type/XObject>>stream >΀< >8`mDX3%!!.bE3r i`Kf"A@ܷ,zȣq`BAC !* xw#( j H_e0 1,2r(|CV! ZQzGp+Q d:q=V.>C@BA!r( C4r0CAr nD04PAF88!FC)9B!GV8I 25H BGGׂ8‚8vZq R C1 !Ddض<͢C+d{# 8xK#R;#M""ӈT9 9,n6 @ɰ:tl;sS:=șz`B"#B-5Ѝ#CCA' {֫HבSN ' Pܸ>pE@2L dr˲ܧ#!@""-PӪx 񅈨گv  A!ׇJ p<w  zIP\Y nAyS bp7)_U*L8#Yt!aH@` _usam%VׂF`xre C#u i` qm/4|eVhC#j \ ɺf̃dPHCY`(2P?CIlR xn` dQ[<`BPkIl AJL2ʐj&B [2 f>dHjDr85͂ _ @2C˾CTan6H]H1x_!6BA/.kY\ \rܱޜ/eYl$6?㈈ܐ4!g`\r [΀2nAXrB&|\!t@Rz w!،fa CkoP(GlJCNJIY ҲpF4&ȀnGA\p 0Dh pTChF\$,Հj. %X(<|\2CAڲ C4z :DsH,r ApD|2Cd3G0;?i[It\dpX#;pǕœ N9 cWr(y/ fA|9aq9`P _qGq|hG~Yl%bDH#wG7"$ 7&9iVr܉$Qb1ȴ#BH0l^#4vEd4!!PD ?ef} ~(~Ga<"y)H7G!Rce1!8 HQM`Պ GBm/"9S.T' (T4vA+ Pa̴A+"! -א]p,IQ GZ 882ar&dX 5}r20h5lq@8"aP8.!r; R;:~ dWŸB!5e*~A!"L>AXrx]I3> @4 h @2lvTpe5cHhᲩ H6".A}(oYKe]GΡf0Ї_ZB  !Y|R_v\" P.AKci [r1\) i,[A} T Dc=d? 7A miP33b z8rc@޲ yC2rёaH.!_[q0 0vR FJMas .###`X3<;ق 0@ 㐚A 9&~B Ì7.b  ,rr, `3 F\ig"@ U EO 5$z+\y @S`xk"dpQAU 4Fj HC;7٤ (TC,9D!(&d?92UdZ `,Fv.A .Lf G p=C6B+1yQ%X╂ \ HA0=?_| E3fThQȨi% e!2eTl!0p*yȘk$™r8qqS?S_i pq$X23!ZCc} rY<)rté r vp䀈!Hdcc D0n4A)%%@`0\ȣ n?ɽ@p4faG.ː26"Ȃ8R 2pr p`H|/(DdgP|D 1! ~8[ !/ aD2e7<. "f!lcXgBd (G2 q23/ oQ/ [ `x1] DwH28d 2'>A/? ?\[c8apB y٠6H6І^?MȹD|VF?̴܁hN00=DzjrBZSڞ8_2!" #N2-A #٬d0FXCEqjGhl5Ã~"&@np%؂2 ܄* !͏&D:h>dph+cIY'}" N4A As%RRTaW^?`x/r^Y{%`# b'PS @" j@.\`C0Ļe,yCB?,ph_ț"w@= g\l y 91t)U {?a!2$/ <.(2cppqP5A\drٜ )EdBj0 C@ Ðư⼱ D POT{]Wtp'! Ab!x(D<9>G H~^xp|r *0axkH.\r b+oT~< R(V@4`?d! pPEp0Q C8 d$5aPN;R 6.v}ϔB H aA']ِiHf.r@<\`e܃F"˹2܀K \!pPG8_NX~G iq dvK2ˁ>A #D5\+cmx)`x#ئB"~>D x8c&`~a 2(+rܴayP%b _  ӱ3,r"!+l\گ߯_^YD2!9 D&0A|!2Jcy CC93 c#DA @JKAVn_~k pl/6?ȵѱn'pdIi3v/$\ DF|O9 |r F_"0&jlOsL#GG(x"6dTHS. A p_y W#!@LH)%`G#oSjo;,;&|d٘(C;%<"dC/6Sgal6KXa.ʘdrVYrdP2cJډxy#i;(;5`*04CEDR"ADQB-J0aJJC-J_#$Yls+]Wj" ` /KP`HHr.JCDԆ3\:j6 c$3|F)姎1Z!O@,A2p`cL !R 9 ?_Вɛ0T5Qہr@s0q0B!_ yx ^C6qARD"~#gr [{_@Yb5a C; ,g eyÃu`r5́ad1G`g6' B<dA a_. B8k?n( 2;3~@d8`!(4!(,'.φQ8 Y  *t 8"0[ˌ`o .Y+D!6S?G|)Ph! H389ݙ@X37;- \!$CxG^T)n*q M$5AD/8_V Am7!>_!xF:+x(PcCY!CJ 'h "]l58vR3 8:*;qlDȗ#D=E"#q .AFpVpϘ/HkpS X؊!xX<lSb@9lPD w4 ZA##k.o\iK"8LwG"4z,Qdqs;skY!#[(N:p/`ظL86D4B,"*AuL,,l ?! !9ezȘ1cNA0di’rӄEÎvSp<<ѕV7.6@Y݇@ 3LdyT*AE;K"#r-ҁ|mfL|H` 6fZ? , `DžtA0ygT0_@%d&" DfBaL-v8d;& 7 xe0Dd IG y67D AAB_@XATLGs[ ˲؎]l:0PBrv@rC8|y)9 0 9-ɴÐ:&Rɐi̔,,.r9v7$DJYJlXL6|q !"r^9( 3r18! E[:0cD yrX^\py  &UAѶl=  F/l߅D8@  d<[qj--. ܃C@pzn|yG?/Ex%k< !lZUD;r܂BAփ-8y j?_& B9CIȢ``!)G,"8.f( ~" Ab>?, ClԆgrd p@vq&;Td?$E$f M8kx<ϲ1腊 E0_;2 6EԂ\r8/ ]$6@HAg!D&9pɏ; gS 8ËCG_èGC9 9!~: ߆0>N=rnE1ɹ08qGp/P~ˆgYCsGF#'6qѿ~dM?qG PCKXu0]?q}]㨎WT xG^CߙpCcu<DŽPCe 1kPwmB!G"/2= "-G"¯r/q Bd# "A彆Vf `B ̃ (/7#8>RfO#oI<,#?J#_˟PTZ` A~D^|p/Jpr$$~8dp_tjϪ̆d|"uلmZ0DGh!x(, K ^C@3X^X>#6]_203'ɲ3o0S;9? Y>@Gs8jȣ7$qDP0G$|wal?rrpQ~KxNrpp4#RY hA!eØ. _C;@D ~J^FC d3MLL)`waG~velG 2Yr;i2 80. d;%2~f!_ CI!`O.E6!7NA}$?!d6Ak?C:~ Gg εg?8@ᔣmٗ ΂"?!;#\CQ27ǎl4?J@"_/ Ȇ ød*~Cf":Q(`E G`8܂ ABA"C9 dd0 7 d!GjF.f ?` q//=C4scHV@׵K`a Ƨ29df#?̓\'/#fS ]W\w#KG`fiP=cCC!O厽?;eAq;>r_w#Qc[c2Fl.C|tXDt0_k:(qUTeDq¾U 8?rB>8 rO15yP 0P_2@fv)hd ;?;4`/'`Cd! k R>?rmU dǃ܆?ᒱwb`;3A;ȸh>F?XRO u䕗.23]| (/EJi ~ pD P(F &C%/c"lqwSl;@yDI^T(>6 (..A ppx/Sc )`U˪+.wdW.n!fE_dGx?!'CAGB?ʑxY e, # ǡޚ1Ȩ$ 2|H?;5P_T8/!Բ*(`0 &C>HCB&k!Q_G $j/~y gD˅ \y4/y#r?! !\0`+ Px(B_A,!@Ho//r_ }d@6v =d $Wd4Ða+a8:cv <>T)&!1q'D؟g!>Cf@ŸDC!ǂGcAxN2\!8hj5Ÿ~IF?hZ /" PR?XkPU W$ T<ɤb7 A?05(B~T' ClD2r,A^<`ؘ,>2e !Q8(6iM xe<()vZ%C_?] [ `<;s [C> e0Av2AUSU~v@Y>@7 B$ ~ qD2GW{Ax9UYAEJ#]+c%X>d8R`3`qG!4W** ˳`rp m! C$3 nbe9M5@h"9ـ`>( Xr , A8 '2A lv8Uv6Ppț#!hq"@D%2qr%d B0(-9y7r )re-?wR(!q <+K*G`X2( nh(PxD(dT"#EXa?ȠB%`S P> C-ӃY7(|C!I夨q4A#rG? <`w@2edfJBaC`_݅$Ch7 8)-%DG%!Ts"B$3) &)d!q0Y(_d9؂@/X8́D34!y b~2*9ؙB#?HCo"R`a& ECrwG cɬ<܂*"M!Ƞg c#r͈ ˾C>‚xx" !p+3 %d{Bawh0Ȱ_p~CPCh/S faA7h p;܍/ e0C 8">>?F9 !A86|G?vP/T 0Dcy\T6z? eA󲱝8 S/8J/A؊AS~AD  vJ?{ \ .:;V # 㠃aaLDt=xG\qP({PNs\qoFDz66PPR:$Hq iuXE&8U0;">V[8ƈA \{>`uGj"H?“Ay=|6 ̀.eYt  00B"@AcB b" ` c[~GOÞy"D#=#9d&߹脐+1rqX>Ce٬ "N XuSa_r\_PG#A<)+Xקz 80Xb1B!6bGf]+ͯ#YuE)#Ep vCy|/ Zq_g`ckX!@`ȘkfhE@S   E2&A-?~ r{(\Cc&8:D I@+5H1G8v^ո-[ -%3ʗ嫄ExA0 ?O r2LnX?%<.& k|2`D٩%0_r j8D,_deA/ѱ`6Z"oyD49<0^<_ z B>9uc#]9qm" (qp}:kC^#Ј? $ kEÝ-U" x)s%Ad,d.??Lx"w-R/K#PyhkAdM2 -)X %Rq6J7( 6A,j^rpȹ!A ~ p83pD9 8 y @^ <AJN|dr'2 ٯlDoq0lpA -b2@?ry_AhfL~Em%Dao2 5yi|!5ɑLK|0}>_o_ c,a||?A6" P``.UAvM*j| r.FKL,XK "/ 08_ 6qkW~ | !3 9^.?d(S 2jned#8?%tW@d;YK>A L; x\}_5`j2$ Dp!Pb+B<9_Yи R&E3-p| 5_dk4 /l>"#vL6KmTTσ}rp~>M?C#]w v/)^Br5mMsG?b0#7r `^Sb!v8gMd 6}pp_ xs8*AJA d d1085w& 77% xA0 / Hg7,8\К "oc٬ cC10 BL.VG5OwƄLCB rpXCpepV[ {@ 7"iGA?@CD|%@ܹH^#Sr8p~?x4 JrlX@C)6xOTC4uqCC;8gq#EB υ8|!rBycG01(8_[HA /vA _Q9 L/vӐLg: Ca|qȷN?C᝕?wV2; !Lx-rj$d $A2<A+\RW$@ )7!`j,\0/;, @&=? ~C4~v 2`5mc ~C,n.v67.dN On9,d ^ !28~Hh/Pp " R_$쯡A FH  +2CfU~Ax8ȃ">8RnR'!Wqt+d[+h! ecCjP>> !^9 ץ=?_J>#5Cy !ucMҌ? 8X|W P]^,y #d?|E!G9^?WN8?;,< Y(X?`~2L3H0@ C@ ρ\ Y 62MɈ[0hLE(^yp bp`K2/W A x)d@C s7 @FDI]Y#8< 3z0 AǑ$ZC9T")j `c@ 0܂L]Q$v1 0*Gs͂4lP&Bȭ % ,lr&-?ȏYm%pd4 RA +9PN6Ao rw!G $ dfw<̀HgBV/XAo ൗLe&䰃n#0AC""2IF P^\(@x`A+lTq0dppr!e>C9PdG93`D3jF\H"s#;22 ^##~X5 8U2ˎ[YdD̞ vp3 C?9 +48#?+v!  \lC nH7YE="!!CC\0?ɀĄp pPPg60VC4 \ڢAA" ,8VRdTcr1Y !Jw aqRX|  "PkjFTb ~Dq9pÆ\'a0vj0w" PC6Ayt9ÐYYrl $x/8"!C(ȏ:9h;?!&0x-6893#!͉C1p؈2t$<)'0&`1KklZv$<#82M?#,FBW4Sa!#uD D2).>!CD2f»ǂn&v 80r @DY+,!2 \20a 2%lWzIAޡ>#<<MK{\NqLS pჵ#yc' \!k% =l0C8bg50wGPhG__v n)>t#.Ccl5 G<0X/a>0ŧp_pw -eyGge[!iCitN/c̒ [3X/ x>_#./"G>dJoBC<0px! $\ReD?3vB pD 6j:py6U ,~% \2>GG8# @MG 1e7l(g /賗 _=\ (9k & 0 |9DN8<%,p3DCG\4yJB|&W3gk%FX!9iG  =#!*07!:!͸2o,_,A Ծ$Q5u g) qD,S`/jY)gfCED.#̜? vG !p\R87X0X{X2/!YZ<+ySk1./2' (tQX@_v0_#A4 0]9 ԱG?1q_׫|B|1'ǎ/ X`r8d DzP'_q^C88+/P"c09C8j?_5 x9Q? Ñ ##Gr7#L"ycf.!RY ,"\-a\ER_ <Ol]_ gG2_fDl``X@о_S! G /2YurQe Q`Ȩ_,/qV}"a_WG苏)#7c|:h9z+zA~YƄdZEFK@0?!쨋rB.R7" ʭ- "!>ZHee"N`] a{ (X|e떁pA\ °fb`#-a 0F3s/$xChB(r,0.v6` Y }dh*A`ih KPCPJ,?=_pئH.e !#3@#ddtkQ_B91uAW9!uPmaP\q{v*' iypwdn}!nJ!)c@!9g@F. `d qpo wLˇF)d1?]?  }Ax/+G̒l6_NDrBAN [ނ__!CB5\/>Mo\8?⓿xZA~e}pxp|#8/ [T/+6S#7ul~"?ׅ_ ? ^ &ao|'o+H_K  0y\|/ol Jv'*Q? )Jlq C;~Mzl?ڬ8?migh/ _8=Xiy'ɈiC _ jd ~.9KW 恣€>xc!6# -5W |?zGk"%<(r 希i nO<4 ^>8x'2!徤==q3T^L~X ɎB!GƄG&9d+(1#Iü!4u\o#>@OCp bJDACT<APh_}|30HeVXdp `2 `\! "̠+H~c˃dw+J`. ? +OT "0<~ dV #P5S !g" FK"\+`p_W8`(gٟW N񕒇 200 PC.Dur0A":ȟ?B_(U q#]8r`f,ˋ))& bRG,0\|/Ub?0sAE"T Ax0AL@Z +l Ap_.取Ч̍/; !IȊA3 <<#Seˆ"5Ej!d?() R20# #j/ qF2΃ g(#g>AFaseR qT,Q c ^C Yk_~;XԱX 81Acfn @}fj[x)IJi  `|<,vxjX-`J8`(wrKd -:2֬6cOdH,AlaZ*r̥|_ۍv_6,9 W f?i T $`J~aZ_Dungl]U` `lp'[ڃhacO0Dfx $`@|ܤ5pU71C)dh5 A\+;Z_@|ި  ƫ/ tO !NrA~?! hJjŮ +v_Ȏ370ʏW` >l??)`Xbo  endstream endobj 103 0 obj<>stream  endstream endobj 104 0 obj<> endobj 105 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 106 0 obj<> endobj 107 0 obj<>stream HMN0b$!vŭD+ĦA%uؖ*WcnI+@,F7Blb +/E03+PiI3ߘF8٩6 y XW3\-iQzki[Àqrj=zZn3]בnHA4NhDa"j_>R5{ruYS-9DJPӳ\IB3|S NNqGM !D ]1\j#K"]! 1BmSԠ( endstream endobj 108 0 obj<> endobj 109 0 obj<> endobj 110 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 111 0 obj<>stream HWID!]i($ݢV{"QUh UQx ExAήg/^˙-.\ygʢ$ Y< eqObLp5~ViZl]F˪mZE*:0X#DsBV#p?/nY XS@KHj@wNXi wn38J C9c \q|uj{mW hè7ę6?P(}S.MuNSai[{o ڌS9%(Ov2qiJNS&=N}P#٨u)om('Jqs] Ɯ^ Ju8IcDc 3T&aLH/DCϝ)zS2B=O{ ڕ?t\{ qssb=HzϹ<Vw?GWv|2K:U[hA9URD?S"[u?v;=5'XT>|(jT.. ;Zn('FCH-bTl W_?(P[jy+Db5AqV!m(rc^jt2SOmwjFc]lK^jx]J>QH,.?OՌe(0N3Y|Ǎ)orU2fMɆ/]_ZT-_z-}7|s"PɘQ6crHwq؜A2z]AGlB2O<)B8Zs4YQUBɖT?1GBM&gHŴъ[d>!:9J<̐Aym~MQA1Jtn7f#~LJķ};ZƆyn ۾B?slj­J%-?]!6 &uV=GMJ;;)hL,5n}:o֑Y6>i]6f%m Lxs%.DԞP؛CgF?AٳaPvIc'u&)d鲂4~N\JM//QÓ/T)dDe A.w IuVMSEOkXRVU?|ԃ2g߸PHvp#.6g[co.LL6o|z$2vz'BOEpCNan h},]enꔕULc6]GWϏreY( !a ! )0% |Ԟ{:MNS4pcK|uq-}&"n`.6H6z"~;nyq)M'I}r7q im*{`Ι!iInH^z8?|G+3>Dބxabq;{X)CUQL54 y[¡iA=- |QVͩtIآYិ{$i+?b.禓Ola#;F,#SB}Jo!-vmcbk[J0GF&F 5"4Sb[\k8XTiפjsTyX0mя\bO\~mM('pCt-O Y7RCrԬWP oԝ>3tQ!!N=QUP-I4ajdbgVL*z*9Inp Amk&Vn=T(Oʼnbʈc,7OJykW~)\͞'HbH9j kY&;R|قR}Ke&pޠk;"Tnu,fOO9\ AqrUj']MJìqM-;3Fnjl˿)[(3~]+˔b5͔;I?JTK~ >(Z_NB XU l;CVi7wR8orAl̥S \?6[_Gl]gfIP.2։-_1'2q1_ 15ɷgܠ@C;liRYK7WWwR̲ N :o d`DB/ov*3 p;x2 8f.%@.@J9st|F>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 114 0 obj[/Separation/Black/DeviceCMYK 121 0 R] endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj<>stream LBLKJP+AdvMacMthIt : AdvMacMthItx.]*XUk¾RHsxTvecb`j7>aYYґǤʢު-d)xPp5c[K=t+V:zzxvy|~{z~qsysxtqzj endstream endobj 118 0 obj<>stream HTP1n0 2ȎWCSдDjJ):y#}mtKqv kGKPX.:ZԵ8{+CkyDxR Bޕ? Afy]=1f ^idE#B]ٯb,qwc*L._#$sK|w>ywaiV endstream endobj 119 0 obj<> endobj 120 0 obj<> endobj 121 0 obj<>stream Hˮl۶ɶm۶m۶];1 nCІ1 o1l0m&_3Ll0LmӚf0l0m[,n KZҖ,o+ZVլn kZֱo6ln [ֶlo;vn{:qG:юq':NqӜ g:q.q\ Wծq\7nqwqz< OzӞ</z^׼ oz>| _׾|?~ endstream endobj 122 0 obj<> endobj 123 0 obj<> endobj 124 0 obj<> endobj 125 0 obj<> endobj 126 0 obj<> endobj 127 0 obj<>stream H4TkL[6 4ssld˒II& !KM m|W M[`c0 .@KYZe[iN}_}zGJJJJv=q[(5 /=orpyų_矼B~_{_yϞ%GC$@x@K  NBNB=.vh$lY6to?voK+KMTjI-eeѲvw":AP)iʗn+ψdgMKRp}jCxqIHhʵ\ 6ViĜяk'vL̳uLr%֎:Qg9uCs5z.FM)8ԴFp|/3.mEZ%< fܓT:ixAxylzl>ϔ+arx($= +_)MĜ/N/dpp?b]rO]rYh WYs m> "`Ҟ&E *\oHوM| #HQЭUTxTj,j|Ytfڿt3qD{C ,q+hƠ%AQ.>ʂ/6mh@hZG:~#181|Oe!^$R# ^{fj9JxwSI4ev> bb1"p 0Wd)PcL@C Pr*c79yx_#>*ގJZ4[$݀723dt_5|I/b)m"7 _³q+], 1G sD6K9]Os%T!IO-6?e$Ɏ, Ŧl&46Y]x~ҤE@;Mo~L׌TU b:Z'ni\K3ǡS`-h3/k"_<k(r[*z,4wdx$݁Vl1?kUrJ~*P[%}$Q(5|1ݴ$uz'FW@t3ذ.YA$ˬi(kow :-M~'T _Dpjnu֊cx>cRД"w3@.(+ Wk[_A?>E( x>%țD'3Q} 1D5~K8Oy؟nS*R6vC0U&ZQspHro .ಌHV\E.Z҅,<_09 U:ȅ4cQKux}. 6Ac;ZXxjd7NR]"R` zxpemv#xKwS's#x.kRLnЕ/%.]F8&q'*6r`C(,S7t)iW4 daͰ|?1gvW'Ϸ; ?z!*"-Mh}Xʃ=F5bh 8 Qd'cـfSh=&/iOAΤ:@[b;\Zи,C^Nw&e*nd̩D{Bl) n`tZQVHφVKdAeR6?o&ww5u1nڻUF-bШ30K80=|L1C] vf*?Vlq?rY|zPh|^wV8~Sc=3kP!2ˆ3J5} ?kgL(:gz1;Ldt{{}pX}xC}XAm\W4ݙ/{gv;L8#'iR_HB0M1`d@zV/$ FBEĵ ym:L;OgŪ%:o̘S1%$O1鑁ځ?;5R?$\ %c V:>*OהNa sx?HU&q"T%g|/ Y$za6mX- wa^B+da88};>|喈bK6אYc *9ejk^98+ilj ZFc;s9YRQV-DaQ-1peR)7.KJURjH a荇Nh#W~ZC"WH]B?o_ZǾ=Z׆3o~]Q>/|S] o YΛTZ#b2Uȉ<dPZ\-Rɳhcs{z)'<yXfgbD&ϤjN$NZOhС.rF=|{=HSHYݠA[揗J"cc~.d\_0xΦkՍ}X{ݥwC`k=]["NJ$4`N>=C/0z 3mcUq,4 H D^`Z9A#-5/deOt4 tƛenqO6 w-גŭ9}RA#J)t!xN/DOݽ=Q1_5(j.W|Yܟēdڛ\n W1 wLd HFݎfCi1|K*xA9O;B dJà̔ 7>9mtJX#i<ÖWA&E=h4Ä]Kdy0#eYb: T{rW4PX $!oB!&} qC8v W**XPQFNwa>9g8>g0QEfrXWJu&ᨑprE]h`HN 4Fw~lV**UP-QR1;7ކ&~Ҿ|mop60GeĦ#v/^=^'Wm(΄⨰TqP`#!ិ S( F ( l7!í|:/D@$扃deMMqOF$HQcC#HYE7\"094W+,!2φ߉ sfmC 1`17ma/jhg9e&hP>9Trd1Sv\JnxBz*!FfxMAww [dc$𷛎4Gga E7 X2R&[϶焏hu>zbYF侽Ǭs}:йNauN5c497o$59 Qz-.57C( endstream endobj 128 0 obj<> endobj 129 0 obj<>stream x$A 0Ы̲]I "X{"D|3P΅DoRa/渏D]l׵i&)mw2uTLž\L2w!DXU?}{3 endstream endobj 130 0 obj<>stream 8;Z\70il1G%*csubYhf$WSW"0-F.dc-"(1koc_u1(-:r4*KmjkAQr#B2[(7%8_Um. qYL%h>h-BSYtUYR\9?#l_SgEL2%>.LV]uO^:DUUOO]%,CLc*(a%=hPA)C&1$A!JD-BG$ksQYX9]@JkT'EW!hPRd+q?k*]#Y]G\it`:@@19 KQ*0N5`]g@+luXQk["5AJ+QY_TG2%nf!VDk1qtY)V1oZIZ%(ROhV[+>c_D(DJ(4+i =8?H@9;T^o8j55QpY?hBEEF6cJl(6m+kpr*L4[pCUBJY8X1Gd+J7rUlfeJo*TA&.HMQ'U`u M?CNQRY!fYRpobGOF*AE0%&_WH2Q,)l%-'qLEp&a=VknZ"Us9"Qdm"`GFX6)UKCG: 8aCroSli(DDSU.Z]j`P_WLR%hs2L.EEV/1iKk;Ir.]F^,Dq^$mN,3"e endstream endobj 131 0 obj<>stream 8;Z\7D0j)B#j1ASr5X53T:V53/;bO*(pQ`GDU6Ce`K/s#.fq$nQU1$Mea^.FXri5( -#b'oiMUcoI<]k@iQ7T+0gb7L[?Xu.(4;X3?b.oBZ!jh+j1ZqQgpYGhN&jMBgfWFT 7pbc;YL(s3+Rnkt-[e@;`mIL26sn(A==Xh?AhZq"SO66BJu!!pnmO(efQ&n54X(^T mRA._dWB&_k1#;UJ,aD((45A)VqXj`qS(;%$QaeR'-3VAUQRDQJB&Csk%H4f@W=+k IB4OOX`1A#7`\Z;Ls!>j;htQaVmCNI[]Q:^]@.C>G'rXY18q@NIB[2=R(4q";^.o8qSRD7YXYaH3Nq5KNdQq-7+""$maOk,VgI%JW[ce *PuH3dS^_6_RAZ1=WTOgE:-VuNPkPAoSb@D-+Ior e[Y.c^6I7[G+7B.Q?ra2EDfatO;^&tjL>P?)bH#bEMR<(VadR;D+JLXC=Y@"$``U7 &JQ=hNMOR$b/\m:^pPg3pdYtW"H.'g29VtVH2[>S,,6U%Vs`3(B:pU[b:HRRgJ4jE 6mg1(:TBo#3iG]9`^ 9R4!kJ2`55/Y[Ej_QY?S<[GRaVc]fahn\f?\LPLIXYZKbki,"pBa8"(TAVtpS1T>i Q2.!:fK?l'kHj6[i7#m<%6f8-^'4SI;."_~> endstream endobj 132 0 obj<>stream 8;Z\6CRTku%-6G"rl]`&&#\JLb>ST8_G\u-NSW0S0UWe\MYFjs@s>jKeGTcgR4pn' ^uuoL:eF%#WK@?jR@Ymq":,&3^]9AOYqT$tXpi3AocQClGoe.enf-"pb:2(kEf=Lj HQ4%^&+J\-k.o2F-;rM^O]#I5dgGZq5kTTU>e5ROBjD[6@Q6A?4OP=G\CrL:e2j:Z k2M,38!t*.%D_M:R?\a2RGgHI>cs+G29-A%61&-!@c*n'qT\M`@HcXUb+3O08+#Kc qfM.HrCEe!CkYWFq&sn/oG)$ldIJUVA=j$9^Y"-hk`+KUB4>=)$)-Cqs'M#Uj,MGQ Fuo%T:oYKhkMEB@_'^o^=_.>4mbng12KlLD' >)^!e3Z`LQ:dD$]Mg4I=d[dUt,EHOI7*G0=COPP3V9^kI:Jjd@0k ?;iF?#K51AWATW[)EV"?3*`48=r"T,Yp+MAjA@d%;phD < endstream endobj 133 0 obj<>stream 8;Z\6fl=qQ%&Fg?e;sL[.b.9J&r2Ra*1LIs'7&4i1-?Vh&E:GQ\R(9TF`j9_Tsl?+ VOjFBE]G0@]UYr:ckDia?6FC2\0`i7rQWCkWdBUm.ujbpagJK-LARH*m^A:Z&:mU A!R[gNGL?9Ys[V0j^KN#`H[1)k/^(kIsck+oRRcDR:elLo3a3'Z&Q&EB8u*#eU>oWJYa1R d>D;`1Ppr7Y$P5F-50kRb,Af+5p!$1ZuKU"n]L_?/Wju,&dqZM/]T8]?u6*f=P9ck &J_2n519#Y_&ZlYq/30M(o[EQ<*YHu&dKP]PF$GK=NA147?1;mmq&_TO:&-41j[QC YT!\VS1>>ug+@PRM3_"k@eHi=%hUC67rrlkCY*qL7L.C$)Hkk.F5<45NfRgEos43T U70;O5\(!0.HPR/IORs,bq'CC41SkqZTL_@bi:SG"2YaKBni`B[h;40aB12ln^'3B jSLnRZG*#Jf[<%mFk7E3j*KfGGGRk5L__6%*$E+:e5]@B09H8"^gYXR23NGh^'4SU*_0l~> endstream endobj 134 0 obj<>stream 8;Z\6>IK/,%-2L^rF8([a&Q_5=$Zl/OGC3PrFe;-/We28+\;5]eWt>sZ$@FBBHq*\:9Gm'Nos1oIM(2c+V"Og7aeVM9RmX,Ghp-RH3^k9E;r*W" $jR`RMq@(#=dV-h8sFqKX."G"oL'6>q0TuE++_?SXK,M!bo[/Y2N&VNV$4DcS:DNR W\ojg`8uFR'+CrI5b\!m@&<@;4Fdt1Gh]X,(8:*;S?$40j'pF.=Ou7oFr!Do:9BI( ']Kb)h`Lb*#ch)Q2>'Vk'X%HW_o;'rO]5'HXf0k[OB/h=:c#EG"mUhL_K7W:J`cJW E9%fuOS7l7A]k_1Z^W?,@TlT8mfQ))odPHMe.ERQk_-JM)7nq=:^b 5LsDZ7'ZeA9*^ZJA&.4(#>>1YgbaNS)>b?Qbs?+W~> endstream endobj 135 0 obj<>stream 8;Z\7gU2\W%*YuBrC]BI6U/&PZu_QmJUg&>a2c2p.g@>a+eVL#Zd+MH*`t3X5!j20 J7*&a_q[tT:@5@s(c%.(MTc)94FD`[k=Oc5@F18=99NMfPY45`/)7q/35ts-"cSl= Y:GAc*a:=%S`LDd4j)fr"=IeU%Ua+.EZ>=ToC)iBgp/!PnVth:4Z%bScuY%SI\t)o *2s9%nU^s3NH(M#_o(sqK\B1i5W2@QjCrCM\O`%WRX:YJ@n[WW%TC&g?D`LLV@E`, @._F$m1fm,T6Vpi+Qe0D4bJ[O=E_:AC]?eY/efFK&C(0W`ca,I5FqP-Lin*PG I7$Fg$2P=tZ7f`0(s_?^b2lSP9%B7"#]`@F_Dhs:<6F$^(1Z=L1s?&2)'7oDF2o-% @=dNR>1Lol0FNXaae])jYGj7rKXLRpN#ANc&6dim,d(=N/$`qVFcF-k8DGl8 Sl+p(GnqLf-gr4,FGWlD&jVfk4?3sY4U;O$I&5!O2Yn7MbF#p&rM,bL/m3WH9HYt% o7+2`rrW8/gpX3~> endstream endobj 136 0 obj<>stream 8;Z\7;6n(^#i+YfH_6nXlSL>n.KTXGH1/YqFJ9N%"VKK#(,#.V#Z"t)-h;umcZ&sC Cq">&]Gq;f8*]--NoW7CDA>S_P`7La%`5(g$UUiYkcer^Y0]q_Co4bXO3GoEkHe*' 3t'TkWhgn=%Npl(Rr95[-9;0C G[;-iNdlZI"Uu\kl)gE2!Fu>eW(%_"cloJ*K0`nfVlPt=NT*IsLV&;F:_,3`VtX%cceo WD/(=;qY(W)q2n`burR3&!EcHNpUMKj=5fTh(So9N4sO5_JPP:dk)WA%Y_dt@uji: @5>P!!((0&/H~> endstream endobj 137 0 obj<>stream 8;Z\7#nhk5%*\@+r=Aqe5CBA/ONS2uJ4D](dhrO(fdmui\Hb4/:"(ERI 3"@#2BFk/s?@a.'j1uCZkO).H1<7h-;tYj/rD;t5[FILAp?kGE-`\qrTgpuBMS:W.j.>2B1%)7>,)'Vq4oN2u r>?sgrkT8[JO$Ajr+9D73+n)+(/jF:2C;kA(/Md?A".\=Z)/Y;P@0funeAJGnH33p f-O:u4RMCki!^W>:^,5^/,sWgSH@T';?kjGM;;`njAND#^2WBkEO9\4^-Oqa7o(!U QS^?RkZU2C*S[6-j#>RjQ-6HV7QHX=>&;;8eNehd2rQa>Ng[H->d71HVW^]<603_, n/25k%tX?~> endstream endobj 138 0 obj<>stream 8;Z\td1(U[#Xk63I@QIC1o3B0fkm%1@q ]gl,E*dDch.[^bqi'PL/8ddPDU(sR9Tfi"Plc@5mAn(AYbf&S926lil],unH:EJ!J ;IS3_UbH)"Zs)_%+-UiS2dpX(ZZYEXD,84:i$F(o%F>^W?RO;LP\o2f/Eg,(2YkY* %g)e3z^d$KW!*0q60`~> endstream endobj 139 0 obj<> endobj 140 0 obj<> endobj 141 0 obj<> endobj 142 0 obj<> endobj 143 0 obj<> endobj 144 0 obj<> endobj 145 0 obj<> endobj 146 0 obj<> endobj 147 0 obj<> endobj 148 0 obj<> endobj 149 0 obj<> endobj 150 0 obj<> endobj 151 0 obj<> endobj 152 0 obj<> endobj 153 0 obj<> endobj 154 0 obj<> endobj 155 0 obj<> endobj 156 0 obj<> endobj 157 0 obj<> endobj 158 0 obj<> endobj 159 0 obj<> endobj 160 0 obj<> endobj 161 0 obj<> endobj 162 0 obj<> endobj 163 0 obj<> endobj 164 0 obj<> endobj 165 0 obj<> endobj 166 0 obj<> endobj 167 0 obj<> endobj 168 0 obj<> endobj 169 0 obj<> endobj 170 0 obj<> endobj 171 0 obj<> endobj 172 0 obj<> endobj 173 0 obj<> endobj 174 0 obj<> endobj 175 0 obj<> endobj 176 0 obj<> endobj 177 0 obj<> endobj 178 0 obj<> endobj 179 0 obj<> endobj 180 0 obj<> endobj 181 0 obj<> endobj 182 0 obj<> endobj 183 0 obj<> endobj 184 0 obj<> endobj 185 0 obj<>stream Acrobat Distiller 7.0.5 (Windows) yes Elsevier 2009-04-07T09:38:50+05:30 2009-04-07T09:38:50+05:30 application/pdf doi:10.1016/j.cageo.2008.08.009 yes uuid:f2c4f92d-fc92-43e5-a712-f109fa5b06eb uuid:ff293f7b-8ba4-4795-ac02-f42f424eed0e endstream endobj 186 0 obj<> endobj xref 0 190 0000000000 65535 f 0000095880 00000 n 0000096102 00000 n 0000096211 00000 n 0000096318 00000 n 0000096422 00000 n 0000096531 00000 n 0000096640 00000 n 0000096925 00000 n 0000102640 00000 n 0000103039 00000 n 0000103254 00000 n 0000103538 00000 n 0000103595 00000 n 0000105550 00000 n 0000105789 00000 n 0000106231 00000 n 0000106313 00000 n 0000118893 00000 n 0000118929 00000 n 0000119371 00000 n 0000119453 00000 n 0000128964 00000 n 0000129000 00000 n 0000129442 00000 n 0000129524 00000 n 0000141038 00000 n 0000141074 00000 n 0000141391 00000 n 0000141501 00000 n 0000141608 00000 n 0000141717 00000 n 0000141825 00000 n 0000141935 00000 n 0000142045 00000 n 0000142299 00000 n 0000151276 00000 n 0000161050 00000 n 0000161086 00000 n 0000161528 00000 n 0000161610 00000 n 0000161789 00000 n 0000162080 00000 n 0000278193 00000 n 0000278635 00000 n 0000278717 00000 n 0000304359 00000 n 0000304395 00000 n 0000304837 00000 n 0000304919 00000 n 0000324711 00000 n 0000324747 00000 n 0000325189 00000 n 0000325271 00000 n 0000342901 00000 n 0000342937 00000 n 0000343281 00000 n 0000343391 00000 n 0000343499 00000 n 0000343609 00000 n 0000343825 00000 n 0000426264 00000 n 0000426706 00000 n 0000426788 00000 n 0000444284 00000 n 0000444320 00000 n 0000444762 00000 n 0000444844 00000 n 0000461793 00000 n 0000461829 00000 n 0000462103 00000 n 0000462211 00000 n 0000462508 00000 n 0000467885 00000 n 0000482618 00000 n 0000482823 00000 n 0000483029 00000 n 0000483472 00000 n 0000483555 00000 n 0000495584 00000 n 0000495620 00000 n 0000495994 00000 n 0000496061 00000 n 0000496299 00000 n 0000496410 00000 n 0000496521 00000 n 0000496631 00000 n 0000496786 00000 n 0000496941 00000 n 0000497163 00000 n 0000501165 00000 n 0000532420 00000 n 0000540311 00000 n 0000540685 00000 n 0000540752 00000 n 0000541126 00000 n 0000541193 00000 n 0000541435 00000 n 0000541546 00000 n 0000541653 00000 n 0000541891 00000 n 0000545291 00000 n 0000571086 00000 n 0000593688 00000 n 0000593887 00000 n 0000593999 00000 n 0000594374 00000 n 0000594443 00000 n 0000594818 00000 n 0000594887 00000 n 0000595093 00000 n 0000595247 00000 n 0000598992 00000 n 0000599041 00000 n 0000599555 00000 n 0000599610 00000 n 0000599778 00000 n 0000600000 00000 n 0000600362 00000 n 0000600648 00000 n 0000600709 00000 n 0000600874 00000 n 0000601455 00000 n 0000601531 00000 n 0000601918 00000 n 0000602089 00000 n 0000602516 00000 n 0000602815 00000 n 0000606843 00000 n 0000607002 00000 n 0000607247 00000 n 0000608049 00000 n 0000608954 00000 n 0000609713 00000 n 0000610587 00000 n 0000611366 00000 n 0000612185 00000 n 0000612804 00000 n 0000613420 00000 n 0000613781 00000 n 0000613816 00000 n 0000614529 00000 n 0000614570 00000 n 0000614611 00000 n 0000614652 00000 n 0000614693 00000 n 0000614734 00000 n 0000614775 00000 n 0000614816 00000 n 0000614857 00000 n 0000614898 00000 n 0000614939 00000 n 0000614980 00000 n 0000615019 00000 n 0000615058 00000 n 0000615098 00000 n 0000615138 00000 n 0000615178 00000 n 0000615218 00000 n 0000615258 00000 n 0000615297 00000 n 0000615335 00000 n 0000615375 00000 n 0000615415 00000 n 0000615454 00000 n 0000615493 00000 n 0000615533 00000 n 0000615573 00000 n 0000615614 00000 n 0000615654 00000 n 0000615694 00000 n 0000615733 00000 n 0000615774 00000 n 0000615814 00000 n 0000615854 00000 n 0000615894 00000 n 0000615934 00000 n 0000615974 00000 n 0000616014 00000 n 0000616054 00000 n 0000616094 00000 n 0000616134 00000 n 0000616175 00000 n 0000616212 00000 n 0000616245 00000 n 0000616355 00000 n 0000620036 00000 n 0000000000 65535 f 0000000000 65535 f 0000000000 65535 f trailer <> startxref 116 %%EOF octclip-2.0.3/DESCRIPTION000644 001750 001750 00000000665 14332203524 014670 0ustar00topotopo000000 000000 Name: OctCLIP Version: 2.0.3 Date: 2022-11-07 Author: José Luis García Pallero Maintainer: José Luis García Pallero Title: GNU Octave clipping polygons tool Description: GNU Octave package to perform boolean operations between polygons using the Greiner-Hormann algorithm. Depends: Octave (>= 3.6.0) Url: https://bitbucket.org/jgpallero/octclip Autoload: no License: GPLv3+, modified BSD octclip-2.0.3/COPYING000644 001750 001750 00000104513 13655034206 014220 0ustar00topotopo000000 000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . octclip-2.0.3/NEWS000644 001750 001750 00000003725 14332203606 013662 0ustar00topotopo000000 000000 Summary of important user-visible changes for version 2.0.3: ------------------------------------------------------------ ** Correct bugs pointed out in Savannah (none of them related with computations) Summary of important user-visible changes for version 2.0.2: ------------------------------------------------------------ ** Bug correction pointed out by Vladimir Spevak (vspevak@gmail.com) Summary of important user-visible changes for version 2.0.1: ------------------------------------------------------------ ** Minor changes in src/Makefile Summary of important user-visible changes for version 2.0.0: ------------------------------------------------------------ ** API changed, added XOR operation, and help strings rewritten Summary of important user-visible changes for version 1.0.9: ------------------------------------------------------------ ** Minor changes due to http://wiki.octave.org/Remove_class_of_function_from_documentation_strings Summary of important user-visible changes for version 1.0.8: ------------------------------------------------------------ ** Minor changes in src/Makefile Summary of important user-visible changes for version 1.0.7: ------------------------------------------------------------ ** Minor changes and corrections in help strings Summary of important user-visible changes for version 1.0.6: ------------------------------------------------------------ ** All calls to ismatrix() are changed by isnumeric() Summary of important user-visible changes for version 1.0.5: ------------------------------------------------------------ ** Only minor changes in Mercurial repository managment Summary of important user-visible changes for version 1.0.3: ------------------------------------------------------------ ** Change 'autoload' option to 'no' by default ** Correct the way of calculation of the minumum perturbation number ** Add number of polygons output argument ** Fix number of input arguments control ** Documentation updates octclip-2.0.3/INDEX000644 001750 001750 00000000142 13655033577 013762 0ustar00topotopo000000 000000 toolbox >> OctCLIP Category Kernel functions _oc_polybool Category Driver functions oc_polybool