DIRECTORY Matrix3d, RealFns, SV3d, SVLines3d, SVVector3d; SVLines3dImpl: CEDAR PROGRAM IMPORTS Matrix3d, RealFns, SVVector3d EXPORTS SVLines3d = BEGIN Edge3d: TYPE = SV3d.Edge3d; Edge3dObj: TYPE = SV3d.Edge3dObj; Line3d: TYPE = SV3d.Line3d; Line3dObj: TYPE = SV3d.Line3dObj; Matrix4by4: TYPE = SV3d.Matrix4by4; Point3d: TYPE = SV3d.Point3d; Vector3d: TYPE = SV3d.Vector3d; CreateEmptyLine: PUBLIC PROC [] RETURNS [line: Line3d] = { line _ NEW[Line3dObj]; }; CopyLine: PUBLIC PROC [from: Line3d, to: Line3d] = { to^ _ from^; }; EqualLine: PUBLIC PROC [a: Line3d, b: Line3d] RETURNS [BOOL] = { RETURN[a.base = b.base AND a.direction = b.direction]; }; AlmostEqualLine: PUBLIC PROC [a: Line3d, b: Line3d, errorDegrees: REAL, errorDistance: REAL] RETURNS [BOOL] = { angle: REAL _ SVVector3d.AngleCCWBetweenVectors[a.direction, b.direction]; angleOK: BOOL _ ABS[angle] < errorDegrees OR ABS[angle-180.0] < errorDegrees; IF NOT angleOK THEN RETURN[FALSE]; RETURN[ABS[ DistancePointToLine[[0.0, 0.0, 0.0], a] - DistancePointToLine[[0.0, 0.0, 0.0], b]] < errorDistance ]; }; LineFromPoints: PUBLIC PROC [v1, v2: Point3d] RETURNS [line: Line3d] = { line _ CreateEmptyLine[]; FillLineFromPoints[v1, v2, line]; }; LineFromPointAndVector: PUBLIC PROC [pt: Point3d, vec: Vector3d] RETURNS [line: Line3d] = { line _ CreateEmptyLine[]; FillLineFromPointAndVector[pt, vec, line]; }; LineNormalToLineThruPoint: PUBLIC PROC [line: Line3d, pt: Point3d] RETURNS [normalLine: Line3d] = { }; FillLineFromPoints: PUBLIC PROC [v1, v2: Point3d, line: Line3d] = { OPEN SVVector3d; line.direction _ Normalize[Sub[v2, v1]]; line.base _ Add[v1, Scale[line.direction, DotProduct[Sub[[0,0,0], v1], line.direction]]]; }; FillLineFromPointAndVector: PUBLIC PROC [pt: Point3d, vec: Vector3d, line: Line3d] = { p2: Point3d _ SVVector3d.Add[pt, vec]; FillLineFromPoints[pt, p2, line]; }; FillLineNormalToLineThruPoint: PUBLIC PROC [line: Line3d, pt: Point3d, normalLine: Line3d] = { }; CreateEmptyEdge: PUBLIC PROC RETURNS [edge: Edge3d] = { edge _ NEW[Edge3dObj]; edge.line _ CreateEmptyLine[]; }; CopyEdge: PUBLIC PROC [from: Edge3d, to: Edge3d] = { CopyLine[from.line, to.line]; to.start _ from.start; to.end _ from.end; }; -- end of CopyEdge FillEdge: PUBLIC PROC [v1, v2: Point3d, edge: Edge3d] = { FillLineFromPoints[v1, v2, edge.line]; edge.start _ v1; edge.end _ v2; }; -- end of FillEdge FillEdgeTransform: PUBLIC PROC [fixed: Edge3d, transform: Matrix4by4, edge: Edge3d] = { start, end: Point3d; start _ Matrix3d.Update[fixed.start, transform]; end _ Matrix3d.Update[fixed.end, transform]; FillEdge[start, end, edge]; }; CreateEdge: PUBLIC PROC [v1, v2: Point3d] RETURNS [edge: Edge3d] = { edge _ CreateEmptyEdge[]; FillEdge[v1, v2, edge]; }; -- end of CreateEdge DirectionOfLine: PUBLIC PROC [line: Line3d] RETURNS [direction: Vector3d] = { direction _ line.direction; }; DistancePointToLine: PUBLIC PROC [pt: Point3d, line: Line3d] RETURNS [d: REAL] = { U: Point3d; U _ DropPerpendicular[pt, line]; d _ SVVector3d.Distance[pt, U]; }; Distance2PointToLine: PUBLIC PROC [pt: Point3d, line: Line3d] RETURNS [d2: REAL] = { U: Point3d; U _ DropPerpendicular[pt, line]; d2 _ SVVector3d.DistanceSquared[pt, U]; }; DropPerpendicular: PUBLIC PROC [pt: Point3d, line: Line3d] RETURNS [projectedPt: Point3d] = { OPEN SVVector3d; projectedPt _ Add[line.base, Scale[line.direction, DotProduct[Sub[pt,line.base], line.direction]]]; }; NearLinePoints: PUBLIC PROC [l1, l2: Line3d] RETURNS [p1, p2: Point3d, parallel: BOOL _ FALSE] = { OPEN SVVector3d; A, B: Point3d; N, M, P: Vector3d; k: REAL; A _ l1.base; N _ l1.direction; B _ l2.base; M _ l2.direction; k _ DotProduct[M,N]; IF ABS[1.0-ABS[k]] < 3.808737e-5 -- within 0.5 degrees of parallel. Numerically stable this ain't. THEN {parallel _ TRUE; RETURN}; P _ Sub[N, Scale[M, k]]; p1 _ Add[A, Scale[N, DotProduct[Sub[B,A], P]/(1.0-k*k)]]; p2 _ Add[B, Scale[M, DotProduct[Sub[p1,B], M]]]; }; DistanceLineToLine: PUBLIC PROC [l1, l2: Line3d] RETURNS [d: REAL] = { OPEN SVVector3d; U, V: Point3d; parallel: BOOL; [U, V, parallel] _ NearLinePoints[l1, l2]; IF parallel THEN RETURN[DistancePointToLine[l1.base, l2]]; d _ Distance[U,V]; }; NearEndpointToPoint: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [endpoint: Point3d] = { IF ABS[pt[1]-edge.start[1]] <= ABS[pt[1]-edge.end[1]] THEN { IF ABS[pt[2]-edge.start[2]] <= ABS[pt[2]-edge.end[2]] AND ABS[pt[3]-edge.start[3]] <= ABS[pt[3]-edge.end[3]] THEN RETURN[edge.start] ELSE GOTO DoMath } ELSE { IF ABS[pt[2]-edge.start[2]] > ABS[pt[2]-edge.end[2]] AND ABS[pt[3]-edge.start[3]] > ABS[pt[3]-edge.end[3]] THEN RETURN[edge.end] ELSE GOTO DoMath; }; EXITS DoMath => IF SVVector3d.DistanceSquared[pt, edge.start] <= SVVector3d.DistanceSquared[pt, edge.end] THEN endpoint _ edge.start ELSE endpoint _ edge.end; }; Distance2PointToEndpoint: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [distanceSquared: REAL] = { distance2ToPLo, distance2ToPHi: REAL; distance2ToPLo _ SVVector3d.DistanceSquared[pt, edge.start]; distance2ToPHi _ SVVector3d.DistanceSquared[pt, edge.end]; RETURN[MIN[distance2ToPLo, distance2ToPHi]]; }; NearEdgePointToPoint: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [onEdge: Point3d] = { projectedPt: Point3d _ DropPerpendicular[pt, edge.line]; IF LinePointOnEdge[projectedPt, edge] THEN onEdge _ projectedPt ELSE onEdge _ NearEndpointToPoint[pt, edge]; }; Distance2PointToEdge: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [distanceSquared: REAL] = { projectedPt: Point3d _ DropPerpendicular[pt, edge.line]; IF LinePointOnEdge[projectedPt, edge] THEN distanceSquared _ SVVector3d.DistanceSquared[pt, projectedPt] ELSE distanceSquared _ Distance2PointToEndpoint[pt, edge]; }; DistancePointToEdge: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [distance: REAL] = { projectedPt: Point3d _ DropPerpendicular[pt, edge.line]; nearEndpoint: Point3d; IF LinePointOnEdge[projectedPt, edge] THEN distance _ SVVector3d.Distance[pt, projectedPt] ELSE { nearEndpoint _ NearEndpointToPoint[pt, edge]; distance _ SVVector3d.Distance[pt, nearEndpoint]; }; }; LinePointOnEdge: PUBLIC PROC [pt: Point3d, edge: Edge3d] RETURNS [BOOL] = { dx, dy, dz, max: REAL; dx _ ABS[edge.end[1] - edge.start[1]]; dy _ ABS[edge.end[2] - edge.start[2]]; dz _ ABS[edge.end[3] - edge.start[3]]; max _ MAX[dx, dy, dz]; IF dx = max THEN RETURN[Between[pt[1], edge.start[1], edge.end[1]]] ELSE IF dy = max THEN RETURN[Between[pt[2], edge.start[2], edge.end[2]]] ELSE RETURN[Between[pt[3], edge.start[3], edge.end[3]]]; }; -- end of LinePointOnEdge NearEndpointToLine: PUBLIC PROC [line: Line3d, edge: Edge3d] RETURNS [endpoint: Point3d] = { distance2ToPLo, distance2ToPHi: REAL; distance2ToPLo _ Distance2PointToLine[edge.start, line]; distance2ToPHi _ Distance2PointToLine[edge.end, line]; IF distance2ToPLo <= distance2ToPHi THEN endpoint _ edge.start ELSE endpoint _ edge.end; }; DistanceLineToEndpoint: PROC [line: Line3d, edge: Edge3d] RETURNS [distance: REAL] = { distance2ToPLo, distance2ToPHi: REAL; distance2ToPLo _ Distance2PointToLine[edge.start, line]; distance2ToPHi _ Distance2PointToLine[edge.end, line]; IF distance2ToPLo <= distance2ToPHi THEN distance _ RealFns.SqRt[distance2ToPLo] ELSE distance _ RealFns.SqRt[distance2ToPHi]; }; DistanceAndEndpointLineToEdge: PROC [line: Line3d, edge: Edge3d] RETURNS [distance: REAL, endpoint: Point3d] = { distance2ToPLo, distance2ToPHi: REAL; distance2ToPLo _ Distance2PointToLine[edge.start, line]; distance2ToPHi _ Distance2PointToLine[edge.end, line]; IF distance2ToPLo <= distance2ToPHi THEN { endpoint _ edge.start; distance _ RealFns.SqRt[distance2ToPLo]; } ELSE { endpoint _ edge.end; distance _ RealFns.SqRt[distance2ToPHi]; }; }; DistanceLineToEdge: PUBLIC PROC [line: Line3d, edge: Edge3d] RETURNS [distance: REAL] = { U, V: Point3d; parallel: BOOL; [U, V, parallel] _ NearLinePoints[line, edge.line]; IF parallel THEN RETURN[DistancePointToLine[line.base, edge.line]]; IF LinePointOnEdge[V, edge] THEN distance _ SVVector3d.Distance[U,V] ELSE distance _ DistanceLineToEndpoint[line, edge]; }; NearEdgePointToLine: PUBLIC PROC [line: Line3d, edge: Edge3d] RETURNS [edgePoint: Point3d] = { U, V: Point3d; parallel: BOOL; [U, V, parallel] _ NearLinePoints[line, edge.line]; IF parallel THEN RETURN[edge.start]; -- any point on edge will do IF LinePointOnEdge[V, edge] THEN edgePoint _ V ELSE edgePoint _ NearEndpointToLine[line, edge]; }; DistanceAndPointLineToEdge: PUBLIC PROC [line: Line3d, edge: Edge3d] RETURNS [distance: REAL, edgePoint: Point3d] = { U, V: Point3d; parallel: BOOL; [U, V, parallel] _ NearLinePoints[line, edge.line]; IF parallel THEN { distance _ DistancePointToLine[line.base, edge.line]; edgePoint _ edge.start; -- any point on edge will do } ELSE { IF LinePointOnEdge[V, edge] THEN { distance _ SVVector3d.Distance[U,V]; edgePoint _ V; } ELSE { [distance, edgePoint] _ DistanceAndEndpointLineToEdge[line, edge]; }; }; }; Between: PRIVATE PROC [test, a, b: REAL] RETURNS [BOOL] = { SELECT a FROM < b => RETURN [a <= test AND test <= b]; = b => RETURN [test = b]; > b => RETURN [b <= test AND test <= a]; ENDCASE => ERROR; }; END. ÆSVLines3dImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Last edited by Bier on February 18, 1987 Contents: Procedures for performing geometric operations on lines and points in 3-space. Making Lines line and pt determine a plane. Within that plane, compute the line that is perpendicular to line and passes throught pt. Our first job is to find the nearest point on the line to the origin. base = v1 + [(O-v1)oN] N. FillLineFromPoints: PUBLIC PROC [v1, v2: Point3d, line: Line3d] = { Our first job is to find the nearest point on the line to the origin. originInWorld: Point3d = [0,0,0]; originInLine: Point3d; lineInWorld, worldInLine: Matrix4by4; zInLine: REAL; line.direction _ SVVector3d.Normalize[SVVector3d.Sub[v2, v1]]; lineInWorld _ Matrix3d.MakeHorizontalMatFromZAxis[line.direction, v1]; worldInLine _ Matrix3d.Inverse[lineInWorld]; originInLine _ Matrix3d.Update[originInWorld, worldInLine]; zInLine _ originInLine[3]; line.base _ SVVector3d.Add[v1, SVVector3d.Scale[line.direction, zInLine]]; line.mat _ Matrix3d.SetOrigin[lineInWorld, line.base]; }; line and pt determine a plane. Within that plane, compute the line that is perpendicular to line and passes throught pt. Making Edges to.startIsFirst _ from.startIsFirst; Direction and Distance for Lines Returns the unit direction vector of line. [Artwork node; type 'Artwork on' to command tool] Dropping a perpendicular from V to line [A, N]. We drop a normal from the point onto the line and find where it hits. The line equation of the normal we drop can be found using FillLineNormalToLineThruPoint above. The projectedPt U is: U = A + [(V-A)oN] N. [Artwork node; type 'Artwork on' to command tool] Find the points of closest approach of lines [A, N] and [B, M]. Method: Let l1 be (A, N) and l2 be (B, M). Let p1 be U and p2 be V. Find U on (A, N) and V on (B, M) such that (U-V)oM = 0 (U-V)oN = 0. Let k = MoN. If k S 1 then d = DistancePointToLine[A, (B, M)]. Otherwise, U = A + [((B-A)oP)/(1-k2)] N, where P = N- kM. V = B + [(U-B)oM] M. d = Distance[U, V]. Distance for Edges Comparing Edges to Points Look for an obvious winner first. If that fails, do math. Perpendicular distance if possible, else distance to nearest endpoint. perpendicular distance if possible, else distance to nearest endpoint. Assumes pt is on edge.line. Is it on edge? Comparing Edges to Lines distance _ DistanceLineToEndpoint[line, edge]; edgePoint _ NearEndpointToLine[line, edge]; UTILITY FUNCTIONS Êá˜J˜Icodešœ™Kšœ Ïmœ1™™>KšœF™FKšœ,™,Kšœ;™;Kšœ™KšœJ™JKšœ6™6K™K™—šžœŸœŸœ/˜VKšœ&˜&Kšœ!˜!K˜—šžœŸœŸœ4˜^K˜K˜K™y—L™ šžœŸœŸœŸœ˜7KšœŸœ ˜Kšœ˜Kšœ˜—šžœŸœŸœ˜4Kšœ˜Kšœ˜Kšœ˜Kšœ$™$KšœÏc˜—šžœŸœŸœ$˜9Kšœ&˜&Kšœ˜Kšœ˜Kšœ ˜—šžœŸœŸœ9˜WK˜K•StartOfExpansion4[m: ImagerTransformation.Transformation, v: VEC]šœ0˜0K–4[m: ImagerTransformation.Transformation, v: VEC]šœ,˜,Kšœ˜K˜—šž œŸœŸœŸœ˜DKšœ˜Kšœ˜Kšœ ˜—L™ šžœŸœŸœŸœ˜MK™*Kšœ˜K˜K˜—š žœŸœŸœŸœŸœ˜SKšœ ˜ Kšœ ˜ Kšœ˜K˜K˜—š žœŸœŸœŸœÏuœŸœ˜UKšœ ˜ Kšœ ˜ Kšœ¡œ%˜'K˜— artworkFigure–Ó40.21667 mm topLeading 40.21667 mm topIndent 1.411111 mm bottomLeading 0.5 0.3 1.0 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 6 pt outlineBoxThickness 1 pt outlineBoxBearoff•Bounds:0.0 mm xmin 0.0 mm ymin 76.55278 mm xmax 37.39444 mm ymax •Artwork Interpress• Interpressƒ Interpress/Xerox/3.0  f j k j¡¥“ļ= ¤ ¨  y ¡£ r j3² ¢ ¨¡¡¨¢¯“¢°“¢·“¡¡¨&ž™ƒã—˜ r j r j¡¡¨Ä; ¤Äl'©å ¢ ¥ ¨Ÿ ™¡ Ÿ ¡“¡¡ ¡™ k é¡¡¨¢¯“Aå™AÄÔ¯©Äl'©ÄÔ¯©ÄÙ J¡”ÄBgfÄÔ¯©ÄBgfåÄÙ J¡”ÄBgfÄØk©Äl'©ÄØk©ÄÙ J¡”AÄØk©AåÄÙ J¡”¡¸ k é r j¬ ¤• ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁA– k é¢¯“¢°“¢·“¡¡¨&ž™ÄGéqÄaê[—Ä Ä+»*—ÄGéqÄaê[—ÄD•rÄ[ A—˜ r j¬ ¤3š ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁN– k é r j¬ ¤mÀ ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁU– k é r j¬ ¤”» ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“Á U = A + sN– k é r j r j¡¡¨Ä; ¤&ž ¢ ¥ ¨Ÿ ™¡ Ÿ ¡“¡¡ ¡™ k é¡¡¨¢¯“ÄV˜©ž™ÄV˜©Ä¥Ð©&ĥЩÄÙ J¡”ÄZT©Ä¥Ð©ÄZT©žÄÙ J¡”ÄZT©Ä©Œ©&Ä©Œ©ÄÙ J¡”ÄV˜©Ä©Œ©ÄV˜©žÄÙ J¡”¡¸ k é r j¬ ¤5é ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁV– k é r j r j¡¡¨Ä; ¤Ä*Í6ÄÍÇ1 ¢ ¥ ¨Ÿ ™¡ Ÿ ¡“¡¡ ¡™ k é¡¡¨¢¯“ij&ÄÍÇ1™Ä³&ÄJ£Ä*Í6ÄJ£ÄÙ J¡”Ä*˜5ÄJ£Ä*˜5ÄÍÇ1ÄÙ J¡”Ä*˜5Ä€·kÄ*Í6Ä€·kÄÙ J¡”ij&Ä€·kij&ÄÍÇ1ÄÙ J¡”¡¸ k é¢¯“¢°“¢·“¡¡¨Ä*Í6ÄÍÇ1™Äl'©å—˜¢¯“¢°“¢·“¡¡¨Äa[ă\m™Ä…!¦ÄÜ—Ä'"Ä@5—˜ k é k gšž3™3Icenter™/—K˜šžœŸœŸœŸœ˜^Kšœ¦™¦Iblock™Mšœœ™KšŸœ ˜Kšœc˜cKšœ˜N–Ó54.68056 mm topLeading 54.68056 mm topIndent 1.411111 mm bottomLeading 0.5 0.3 1.0 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 6 pt outlineBoxThickness 1 pt outlineBoxBearoff–:0.0 mm xmin 0.0 mm ymin 80.08055 mm xmax 51.85833 mm ymax – Interpress–´Interpress/Xerox/3.0  f j k j¡¥“ļ= ¤ ¨  ƒ3¡£ r j=Á ¢ ¨¡¡¨¢¯“¢°“¢·“¡¡¨£™®ï—˜¢¯“¢°“¢·“¡¡¨R‘™r—˜ r j r j¡¡¨Ä; ¤R‘ ¢ ¥ ¨Ÿ ™¡ Ÿ ¡“¡¡ ¡™ k é¡¡¨¢¯“Äs¤©‘™Äs¤©Ä;©RÄ;©ÄÙ J¡”Äw`©Ä;©Äw`©‘ÄÙ J¡”Äw`©Ä ÷©RÄ ÷©ÄÙ J¡”Äs¤©Ä ÷©Äs¤©‘ÄÙ J¡”¡¸ k é r j r j¡¡¨Ä; ¤£ ¢ ¥ ¨Ÿ ™¡ Ÿ ¡“¡¡ ¡™ k é¡¡¨¢¯“ÄL±©£™ÄL±©Ä©©Ä©©ÄÙ J¡”ÄPm©Ä©©ÄPm©£ÄÙ J¡”ÄPm©Ä¬Ù©Ä¬Ù©ÄÙ J¡”ÄL±©Ä¬Ù©ÄL±©£ÄÙ J¡”¡¸ k é r j¬ ¤Z† ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁA– k é r j¬ ¤¡ ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁB– k é¢¯“¢°“¢·“¡¡¨£™Ä1SÄbå\—ļô ¡Äea—Ä1SÄbå\—ÄW·iăgy—˜¢¯“¢°“¢·“¡¡¨R‘™Äe‹Äk*Q—ÄKeÄ–Ó—Äe‹Äk*Q—Ä-AÄ74—˜ r j¬ ¤5À ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁM– k é r j¬ ¤f± ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁN– k é¢¯“¢°“¢·“¡¡¨£™ÄM¢mÄGˆG—˜ r j¬ ¤]œ ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁU– k é r j¬ ¤”» ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“Á U = A + sN– k é r j¬ ¤”­ ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“Á V = B + tM– k é¢¯“¢°“¢·“¡¡¨ÄQ¾Ä/w/™ÄM¢mÄGˆG—ÄM qÄ|Ù—ÄM¢mÄGˆG—ÄQ)vÄRŸP—˜ r j¬ ¤4• ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁQ– k é¢¯“¢°“¢·“¡¡¨ÄˆÛ¬Ä4'™Ä*ˆ/Ä-¡%—˜¢¯“¢°“¢·“¡¡¨Ä¸'Äó™ÄC‰SÄ|í*—Äf¶}Ä™å9—˜¢¯“¢°“¢·“¡¡¨Ä*ˆ/Ä-¡%™Ä S0ÄQ§C—ÄZWjÄ1Ÿ(—ÄB÷LįµŒ—˜ r j¬ ¤Xó ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁU'– k é r j¬ ¤ŽÓ ¢ ¥ ¨ÅxeroxÅ tiogafontsÅ Helvetica12£¡ “Ä  ¤ ” •  —¡¡¨  Š¡²“ÁV'– k é k é k gšž3™3O™?—K˜š žœŸœŸœŸœŸ œ˜bP™EP™*Mšœœ œ™Pšœ œ œ+™?Pšœ ™ Mšœœ¡œ%œ™WKšŸœ ˜K˜K˜KšœŸœ˜Kšœ@˜@K˜KšŸœŸœŸœ B˜cKšŸœ ŸœŸœ˜K˜Kšœ9˜9Kšœ0˜0K˜K˜—š žœŸœŸœŸœŸœ˜FKšŸœ ˜Kšœ˜Kšœ Ÿœ˜Kšœ*˜*KšŸœ ŸœŸœ#˜:K˜K˜—L™K™šžœŸœŸœŸœ˜]Kšœ:™:šŸœŸœŸœŸ˜˜BKšŸœ6˜:K˜K˜—š žœŸœŸœŸœ Ÿœ˜YKšœF™FKšœ8˜8Kšœ˜KšŸœ#˜%KšŸœ0˜4šŸœ˜Kšœ-˜-Kšœ1˜1Kšœ˜—Kšœ˜K˜—K™š žœŸœŸœŸœŸœ˜KKšœ+™+KšœŸœ˜KšœŸœ˜&KšœŸœ˜&KšœŸœ˜&KšœŸœ ˜KšŸœ ŸœŸœ,˜CKšŸœŸœ ŸœŸœ,˜HKšŸœŸœ-˜8Kšœ ˜—K™K™šžœŸœŸœŸœ˜]Kšœ Ÿœ˜%Kšœ8˜8Kšœ6˜6KšŸœ"Ÿœ˜>KšŸœ˜K˜K˜—šžœŸœŸœ Ÿœ˜VKšœ Ÿœ˜%Kšœ8˜8Kšœ6˜6KšŸœ"Ÿœ(˜PKšŸœ)˜-K˜K˜—šžœŸœŸœ Ÿœ˜pKšœ Ÿœ˜%Kšœ8˜8Kšœ6˜6šŸœ"Ÿœ˜*Kšœ˜Kšœ(˜(K˜—šŸœ˜Kšœ˜Kšœ(˜(K˜—K˜K˜—š žœŸœŸœŸœ Ÿœ˜YKšœ˜Kšœ Ÿœ˜Kšœ3˜3KšŸœ ŸœŸœ,˜CKšŸœŸœ$˜DKšŸœ/˜3K˜K˜—šžœŸœŸœŸœ˜^Kšœ˜Kšœ Ÿœ˜Kšœ3˜3KšŸœ ŸœŸœ ˜AKšŸœŸœ Ÿ˜.KšŸœ,˜0K˜K˜—š žœŸœŸœŸœ Ÿœ˜uKšœ˜Kšœ Ÿœ˜Kšœ3˜3šŸœ ŸœŸ˜KšœŸœ*˜5Kšœ ˜5K˜—šŸœ˜šŸœŸœ˜"Kšœ$˜$Kšœ˜K˜—šŸœ˜KšœB˜BKšœ.™.Kšœ+™+K˜—K˜—K˜—K™Kšœ™K˜š žœŸœŸœŸœŸœŸœ˜;šŸœŸ˜ KšœŸœ Ÿœ ˜(KšœŸœ ˜KšœŸœ Ÿœ ˜(KšŸœŸœ˜Kšœ˜——KšŸœ˜K˜—…—#žIE