DIRECTORY CD, CDApplications USING [--NewApplicationI,-- BoundingRect], CDBasics, CDCallSpecific, CDCells, CDDirectory, CDDirectoryExtras, CDInterestRects, CDIO, CDOrient, CDProperties, CDRepetitions, TokenIO; CDRepetitionsImpl: CEDAR PROGRAM IMPORTS CD, CDApplications, CDBasics, CDCallSpecific, CDCells, CDDirectory, CDDirectoryExtras, CDInterestRects, CDIO, CDOrient, CDProperties, TokenIO EXPORTS CDRepetitions SHARES CDDirectory = BEGIN RepPtr: TYPE = CDRepetitions.RepPtr; RepRec: TYPE = CDRepetitions.RepRec; pForRepetitions: REF CD.ObjectProcs ~ CD.RegisterObjectType[$Repetitions]; RepositionElementsR: CDDirectory.RepositionElementsProc -- PROC [me: CD.ObPtr, objToReposition: CD.ObPtr, oldSize: CD.DesignPosition, newBound: CD.DesignRect, design: CD.Design] -- = BEGIN rp: RepPtr ~ NARROW[me.specificRef]; IF rp.ob=objToReposition THEN { rp.offsetOfFirst _ CDOrient.MapPosition[ itemInCell: newBound, cellSize: oldSize, cellInstOrient: rp.orientation, cellInstPos: rp.offsetOfFirst]; CDDirectory.RepositionAnObject[design, me]; } END; ComputeBoundsR: CDDirectory.ComputeBoundsProc -- PROC [ob: CD.ObPtr] RETURNS [CD.DesignRect] -- = BEGIN rp: RepPtr = NARROW[ob.specificRef]; sz: CD.DesignPosition = CDOrient.OrientedSize[rp.ob.size, rp.orientation]; toffset: CD.DesignPosition = [(rp.count-1)*rp.offset.x, (rp.count-1)*rp.offset.y]; r1: CD.DesignRect = CDBasics.RectAt[rp.offsetOfFirst, sz]; r2: CD.DesignRect = CDBasics.RectAt[CDBasics.AddPoints[rp.offsetOfFirst, toffset], sz]; RETURN CDBasics.Surround[r1, r2]; END; AdjustItselfR: CDDirectory.AdjustItselfProc -- PROC [objToReposition: CD.ObPtr, newBound: CD.DesignRect] -- = BEGIN AdjustItself[objToReposition]; END; AdjustItself: PROC [me: CD.ObPtr] = BEGIN rp: RepPtr = NARROW[me.specificRef]; rp.offsetOfFirst _ [0, 0]; IF rp.offset.x<0 THEN rp.offsetOfFirst.x_ -(rp.count-1)*rp.offset.x; IF rp.offset.y<0 THEN rp.offsetOfFirst.y_ -(rp.count-1)*rp.offset.y; END; InternalCreateRepetition: PROC [ob: CD.ObPtr, count: NAT, offset: CD.DesignPosition, orientation: CD.Orientation] RETURNS [CD.ObPtr] = BEGIN repOb: CD.ObPtr = NEW[CD.ObjectDefinition]; rp: RepPtr = NEW[RepRec]; sz: CD.DesignPosition = CDOrient.OrientedSize[ob.size, orientation]; repOb.p _ pForRepetitions; count _ MAX[1, MIN[count, 512]]; repOb.size.x _ sz.x+(count-1)*ABS[offset.x]; repOb.size.y _ sz.y+(count-1)*ABS[offset.y]; repOb.level _ ob.level; rp.ob _ ob; rp.offsetOfFirst _ [0, 0]; IF offset.x<0 THEN rp.offsetOfFirst.x_ -(count-1)*offset.x; IF offset.y<0 THEN rp.offsetOfFirst.y_ -(count-1)*offset.y; rp.orientation _ orientation; rp.offset _ offset; rp.count _ count; repOb.specificRef _ rp; RETURN [repOb]; END; CreateRepetition: PUBLIC PROC [design: CD.Design, ob: CD.ObPtr, count: NAT, offset: CD.DesignPosition, orientation: CD.Orientation_0] RETURNS [CD.ObPtr] = BEGIN repOb: CD.ObPtr = InternalCreateRepetition[ob, count, offset, orientation]; [] _ CDDirectory.Include[design, repOb]; RETURN [repOb]; END; DrawMeForRepetitions: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN ENABLE UNWIND => IF pr.nesting.first=aptr THEN pr.nesting _ pr.nesting.rest; rptr: RepPtr _ NARROW[aptr.ob.specificRef]; rel, sz: CD.DesignPosition; o: CD.Orientation _ CDOrient.ComposeOrient[rptr.orientation, orient]; dummyApp: CD.ApplicationPtr _ NEW[CD.Application]; xi: REF INT; dummyApp.ob _ rptr.ob; rel _ rptr.offsetOfFirst; sz _ CDOrient.OrientedSize[rptr.ob.size, rptr.orientation]; pr.nesting _ CONS[aptr, pr.nesting]; WITH CDProperties.GetPropFromApplication[aptr, $CDxIndex] SELECT FROM intP: REF INT => xi _ intP; ENDCASE => { xi _ NEW[INT]; CDProperties.PutPropOnApplication[aptr, $CDxIndex, xi]; WITH CDProperties.GetPropFromApplication[aptr, $CDxIndexProperty] SELECT FROM ixP: ATOM => { CDProperties.PutPropOnApplication[aptr, ixP, xi]; }; ENDCASE => NULL }; FOR i: INT IN [0..rptr.count) DO p: CD.DesignPosition _ CDOrient.MapPosition[ itemInCell: CDBasics.RectAt[rel, sz], cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos ]; IF pr.stopFlag^ THEN EXIT; xi^ _ i; pr.drawChild[dummyApp, p, o, pr]; rel _ CDBasics.AddPoints[rel, rptr.offset]; ENDLOOP; IF pr.nesting.first=aptr THEN pr.nesting _ pr.nesting.rest END; QuickDrawMeForRepetitions: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN ENABLE UNWIND => IF pr.nesting.first=aptr THEN pr.nesting _ pr.nesting.rest; rptr: RepPtr _ NARROW[aptr.ob.specificRef]; rel, sz: CD.DesignPosition; o: CD.Orientation _ CDOrient.ComposeOrient[rptr.orientation, orient]; dummyApp: CD.ApplicationPtr _ NEW[CD.Application]; xi: REF INT; dummyApp.ob _ rptr.ob; rel _ rptr.offsetOfFirst; sz _ CDOrient.OrientedSize[rptr.ob.size, rptr.orientation]; pr.nesting _ CONS[aptr, pr.nesting]; WITH CDProperties.GetPropFromApplication[aptr, $CDxIndex] SELECT FROM intP: REF INT => xi _ intP; ENDCASE => { xi _ NEW[INT]; CDProperties.PutPropOnApplication[aptr, $CDxIndex, xi]; WITH CDProperties.GetPropFromApplication[aptr, $CDxIndexProperty] SELECT FROM ixP: ATOM => { CDProperties.PutPropOnApplication[aptr, ixP, xi]; }; ENDCASE => NULL }; FOR i: INT IN [0..rptr.count) DO p: CD.DesignPosition _ CDOrient.MapPosition[ itemInCell: CDBasics.RectAt[rel, sz], cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos ]; IF pr.stopFlag^ THEN EXIT; xi^ _ i; rptr.ob.p.quickDrawMe[dummyApp, p, o, pr]; rel _ CDBasics.AddPoints[rel, rptr.offset]; ENDLOOP; IF pr.nesting.first=aptr THEN pr.nesting _ pr.nesting.rest END; Another: PROC [me: CD.ObPtr, from, to: CD.Design] RETURNS [CD.ObPtr] = BEGIN rp: RepPtr = NARROW[me.specificRef]; RETURN [CreateRepetition[to, rp.ob, rp.count, rp.offset, rp.orientation]] END; IncCount: CDCallSpecific.CallProc -- PROC [design: CD.Design, aptr: CD.ApplicationPtr, x: REF] RETURNS [done: BOOL_TRUE, removeMe: BOOL_FALSE, include: CD.ApplicationList_NIL, repaintMe: BOOL_FALSE, repaintInclude: BOOL_FALSE] -- = BEGIN sz: CD.DesignPosition _ aptr.ob.size; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; rptr: RepPtr _ NARROW[aptr.ob.specificRef]; newOb: CD.ObPtr = CreateRepetition[design, rptr.ob, rptr.count+1, rptr.offset, rptr.orientation]; IF ap.ob.size#newOb.size THEN { relativeNewBound: CD.DesignRect _ [x1: 0, y1: 0, x2: aptr.ob.size.x, y2: aptr.ob.size.y]; IF rptr.offset.x>=0 THEN relativeNewBound.x2 _ aptr.ob.size.x+rptr.offset.x ELSE relativeNewBound.x1 _ rptr.offset.x; IF rptr.offset.y>=0 THEN relativeNewBound.y2 _ aptr.ob.size.y+rptr.offset.y ELSE relativeNewBound.y1 _ rptr.offset.y; ap.location _ CDOrient.MapPosition[ itemInCell: relativeNewBound, cellSize: aptr.ob.size, cellInstOrient: aptr.orientation, cellInstPos: aptr.location]; }; ap.ob _ newOb; include _ LIST[ap]; repaintMe _ TRUE; removeMe _ TRUE; repaintInclude _ TRUE; END; DecCount: CDCallSpecific.CallProc -- PROC [design: CD.Design, aptr: CD.ApplicationPtr, x: REF] RETURNS [done: BOOL_TRUE, removeMe: BOOL_FALSE, include: CD.ApplicationList_NIL, repaintMe: BOOL_FALSE, repaintInclude: BOOL_FALSE] -- = BEGIN sz: CD.DesignPosition _ aptr.ob.size; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; rptr: RepPtr _ NARROW[aptr.ob.specificRef]; newOb: CD.ObPtr = CreateRepetition[design, rptr.ob, rptr.count-1, rptr.offset, rptr.orientation]; IF ap.ob.size#newOb.size THEN { relativeNewBound: CD.DesignRect _ [x1: 0, y1: 0, x2: aptr.ob.size.x, y2: aptr.ob.size.y]; IF rptr.offset.x>=0 THEN relativeNewBound.x2 _ aptr.ob.size.x-rptr.offset.x ELSE relativeNewBound.x1 _ -rptr.offset.x; IF rptr.offset.y>=0 THEN relativeNewBound.y2 _ aptr.ob.size.y-rptr.offset.y ELSE relativeNewBound.y1 _ -rptr.offset.y; ap.location _ CDOrient.MapPosition[ itemInCell: relativeNewBound, cellSize: aptr.ob.size, cellInstOrient: aptr.orientation, cellInstPos: aptr.location]; }; ap.ob _ newOb; include _ LIST[ap]; repaintMe _ TRUE; removeMe _ TRUE; repaintInclude _ TRUE; END; TransformToCell: CDCallSpecific.CallProc -- PROC [design: CD.Design, aptr: CD.ApplicationPtr, x: REF] RETURNS [done: BOOL_TRUE, removeMe: BOOL_FALSE, include: CD.ApplicationList_NIL, repaintMe: BOOL_FALSE, repaintInclude: BOOL_FALSE] -- = BEGIN rptr: RepPtr = NARROW[aptr.ob.specificRef]; cob: CD.ObPtr = CreateRepetitionCell[design: design, ob: rptr.ob, count: rptr.count, offset: rptr.offset, orientation: rptr.orientation ]; removeMe _ TRUE; repaintMe _ TRUE; include _ LIST[NEW[CD.Application _ [ ob: cob, location: aptr.location, orientation: aptr.orientation, selected: aptr.selected, properties: CDProperties.CopyProps[aptr.properties] ]]]; repaintInclude _ TRUE; END; EnumerateRepeatedObjects: PROC [me: CD.ObPtr, p: CDDirectory.EnumerateObjectsProc, x: REF] = BEGIN rptr: RepPtr = NARROW[me.specificRef]; p[rptr.ob, x]; END; ReadRepetition: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN ob: CD.ObPtr = CDIO.ReadObject[]; count: NAT = TokenIO.ReadInt[]; offsetx: INT = TokenIO.ReadInt[]; offsety: INT = TokenIO.ReadInt[]; orientation: CD.Orientation = CDIO.ReadOrientation[]; RETURN [ InternalCreateRepetition[ ob: ob, count: count, offset: [offsetx, offsety], orientation: orientation ]]; END; WriteRepetition: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN specific: RepPtr = NARROW[me.specificRef]; CDIO.WriteObject[specific.ob]; TokenIO.WriteInt[specific.count]; TokenIO.WriteInt[specific.offset.x]; TokenIO.WriteInt[specific.offset.y]; CDIO.WriteOrientation[specific.orientation]; END; NewApplicationX: --IMPORTED-- PROC [ob: CD.ObPtr, location: CD.DesignPosition_[0,0], orientation: CD.Orientation_0, selected: BOOLEAN _ FALSE, properties: CD.Properties_NIL] RETURNS [CD.ApplicationPtr] = BEGIN inr: CD.DesignRect = CDInterestRects.GetInterestRect[ob].r; off: CD.DesignPosition = CDOrient.MapPosition[ itemInCell: inr, cellSize: ob.size, cellInstOrient: orientation, cellInstPos: [0, 0] ]; a: CD.ApplicationPtr = NEW[CD.Application _ CD.Application[ ob: ob, location: CDBasics.SubPoints[location, off], orientation: orientation, selected: selected, properties: properties ]]; RETURN [a] END; CreateRepetitionCell: PUBLIC PROC [design: CD.Design, ob: CD.ObPtr, count: NAT, offset: CD.DesignPosition, orientation: CD.Orientation_0] RETURNS [CD.ObPtr] = BEGIN ap: CD.ApplicationPtr; pos: CD.DesignPosition _ [0, 0]; co: CD.ObPtr = CDCells.CreateEmptyCell[]; cp: CD.CellPtr = NARROW[co.specificRef]; count _ MAX[count, 1]; IF offset.x<0 THEN {pos.x _ -offset.x*(count-1)}; IF offset.y<0 THEN {pos.y _ -offset.y*(count-1)}; FOR i: NAT IN [1..count] DO ap _ NEW[CD.Application_[ob: ob, location: pos, orientation: orientation, selected: FALSE]]; pos _ CDBasics.AddPoints[pos, offset]; cp.contents _ CONS[ap, cp.contents] ENDLOOP; co.size _ CDBasics.SizeOfRect[CDApplications.BoundingRect[cp.contents]]; [] _ CDDirectory.Include[design, co, "-repetition-"]; RETURN [co]; END; ReplaceDirectChildForReps: CDDirectory.ReplaceDirectChildProc = BEGIN rp: CDRepetitions.RepPtr = NARROW[me.specificRef]; found _ rp.ob=old; IF found THEN { rp.offsetOfFirst _ CDOrient.MapPosition[ itemInCell: CDBasics.MoveRect[[x1: 0, y1: 0, x2: new.size.x, y2: new.size.y], off], cellSize: old.size, cellInstOrient: rp.orientation, cellInstPos: rp.offsetOfFirst ]; rp.ob _ new }; END; NewReplaceDirectChildForReps: CDDirectoryExtras.ReplaceDChildsProc = BEGIN found: BOOL _ FALSE; rp: CDRepetitions.RepPtr = NARROW[me.specificRef]; FOR replaceList: CDDirectoryExtras.ReplaceList _ replace, replaceList.rest WHILE replaceList#NIL DO rep: REF CDDirectoryExtras.ReplaceRec = replaceList.first; IF rep.old=rp.ob THEN { IF rep.newSize#rep.oldSize OR rep.off#[0, 0] THEN { rp.offsetOfFirst _ CDOrient.MapPosition[ itemInCell: CDBasics.MoveRect[ [x1: 0, y1: 0, x2: rep.newSize.x, y2: rep.newSize.y], rep.off], cellSize: rep.oldSize, cellInstOrient: rp.orientation, cellInstPos: rp.offsetOfFirst ]; rp.ob _ rep.new; found _ TRUE; EXIT } }; ENDLOOP; IF found THEN { newR: CD.DesignRect _ ComputeBoundsR[me]; IF newR#CDBasics.RectAt[[0, 0], me.size] THEN { newSize: CD.DesignPosition _ CDBasics.SizeOfRect[newR]; oldSize: CD.DesignPosition _ me.size; newBase: CD.DesignPosition = CDBasics.BaseOfRect[newR]; AdjustItself[me]; me.size _ newSize; IF design#NIL THEN CDDirectoryExtras.RepositionObject[ design: design, ob: me, oldSize: oldSize, baseOff: newBase ] } } END; InitRepetitions: PROC [] = BEGIN rp: REF CDDirectory.DirectoryProcs ~ CDDirectory.InstallDirectoryProcs[pForRepetitions]; rp.enumerateChildObjects _ EnumerateRepeatedObjects; rp.adjustItself _ AdjustItselfR; rp.repositionElements _ RepositionElementsR; rp.computeBounds _ ComputeBoundsR; rp.replaceDirectChilds _ ReplaceDirectChildForReps; rp.another _ Another; pForRepetitions.drawMe _ DrawMeForRepetitions; pForRepetitions.quickDrawMe _ QuickDrawMeForRepetitions; pForRepetitions.internalRead _ ReadRepetition; pForRepetitions.internalWrite _ WriteRepetition; CDDirectoryExtras.InstallReplaceDChildProc[pForRepetitions, NewReplaceDirectChildForReps]; CDCallSpecific.Register[$TransformToCell, pForRepetitions, TransformToCell]; CDCallSpecific.Register[$IncCount, pForRepetitions, IncCount]; CDCallSpecific.Register[$DecCount, pForRepetitions, DecCount]; END; InitRepetitions[]; END. CDRepetitionsImpl.mesa (part of Chipndale) Copyright c 1983, 1984 by Xerox Corporation. All rights reserved. by Christian Jacobi October 27, 1983 3:36 pm last edited Christian Jacobi November 19, 1984 7:53:55 pm PST NonDefaultIR: PROC[ob: CD.ObPtr, iR: CD.DesignRect] RETURNS [BOOL] = INLINE { RETURN [iR.x1#0 OR iR.y1#0 OR iR.x2#ob.size.x OR iR.y2#ob.size.y] }; --do not use all the interestrect feature useIR: BOOL; iR: CD.DesignRect; [iR, useIR] _ CDInterestRects.GetInterestRect[ob]; IF useIR OR NonDefaultIR[ob, iR] THEN { iR _ CDOrient.DeMapRect[ itemInWorld: iR, cellSize: ob.size, cellInstOrient: orientation ]; iR.x2 _ iR.x2+(count-1)*ABS[offset.x]; iR.y2 _ iR.y2+(count-1)*ABS[offset.y]; CDInterestRects.SetInterestRect[repOb, iR] }; --hang two properties on the application; both pointing to the same int containing the --repetition number; --the first property has the name $CDxIndex --the second property name is the value of the property $CDxIndexProperty --do drawing --hang two properties on the application; both pointing to the same int containing the --repetition number; --the first property has the name $CDxIndex --the second property name is the value of the property $CDxIndexProperty --do drawing --creates a new application, does neither draw nor include it into any world --modifies location such that ob...insideRect is at original location useIR: BOOL; iR: CD.DesignRect; [iR, useIR] _ CDInterestRects.GetInterestRect[ob]; ap _ NewApplicationX[ob: ob, location: pos, orientation: orientation]; IF useIR OR NonDefaultIR[ob, iR] THEN { iR _ CDOrient.MapRect[ itemInCell: iR, cellSize: ob.size, cellInstOrient: orientation ]; iR.x2 _ iR.x2+(count-1)*ABS[offset.x]; iR.y2 _ iR.y2+(count-1)*ABS[offset.y]; CDInterestRects.SetInterestRect[co, iR] }; ÊĘšœ1™1Jšœ Ïmœ7™BJšœ/™/Jšœ?™?—J˜šÏk ˜ Jšžœ˜Jšœžœ%˜9Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœž˜Jšžœ˜Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜J˜—šÏbœžœžœ˜!Jšžœžœfžœ!˜•Jšžœ˜Jšžœ˜—Jšž˜J˜Jšœžœ˜$Jšœžœ˜$J˜Jšœžœžœžœ"˜JJ˜šŸœ$˜7JšÏc|œ˜~Jšž˜Jšœ žœ˜$šžœžœ˜šœ(˜(Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ+˜+J˜—Jšžœ˜—J˜šŸœ ˜.Jš 1œ˜3Jšž˜Jšœ žœ˜$JšœžœD˜JJšœ žœG˜RJšœžœ4˜:JšœžœQ˜WJšžœ˜!Jšžœ˜—J˜šŸ œ˜,Jš ?œ˜AJšž˜Jšœ˜Jšžœ˜—J˜šÐbn œžœžœ ˜$Jšž˜Jšœ žœ˜$Jšœ˜Jšžœžœ/˜DJšžœžœ/˜DJšžœ˜—J˜šÏn œžœžœ žœ žœžœžœ™NJšžœ žœ žœžœ™AJ™J™—š¢œžœžœžœ žœžœžœžœ ˜†Jšž˜Jšœžœ žœžœ˜+Jšœ žœ ˜šœžœ>˜DJšœ)™)Jšœžœ™ Jšœžœ ™Jšœ2™2—Jšœ˜Jšœžœžœ˜ Jšœžœ ˜,Jšœžœ ˜,Jšœ˜Jšœ ˜ Jšœ˜Jšžœ žœ)˜;Jšžœ žœ)˜;Jšœ˜Jšœ˜Jšœ˜šœ˜šžœžœ™'šœ™Jšœ™Jšœ™Jšœ™Jšœ™—Jšœžœ ™&Jšœžœ ™&Jšœ*™*J™——Jšžœ ˜Jšžœ˜—J˜š¢œžœžœ žœ žœžœ žœžœžœžœ ˜šJšž˜JšœžœB˜KJšœ(˜(Jšžœ ˜Jšžœ˜—J˜š ¢œžœžœžœžœ ˜dJšœžœ ˜šž˜Jšžœžœžœžœ˜L—Jšœžœ˜+Jšœ žœ˜Jšœžœ@˜EJšœ žœžœžœ˜2Jšœžœžœ˜ Jšœ˜Jšœ˜Jšœ;˜;Jšœ žœ˜$JšœW™WJšœ™Jšœ+™+JšœJ™Jšžœ6žœž˜EJšœžœžœ˜šžœ˜ Jšœžœžœ˜Jšœ7˜7šžœ>žœž˜Mšœžœ˜Jšœ1˜1Jšœ˜—Jšžœž˜—J˜——Jšœ ™ šžœžœžœž˜ šœžœ'˜,Jšœ'˜'Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšžœžœžœ˜Jšœ˜Jšœ!˜!Jšœ+˜+Jšžœ˜—Jšžœžœ˜:Jšžœ˜—J˜š ¢œžœžœžœžœ ˜iJšœžœ ˜šž˜Jšžœžœžœžœ˜L—Jšœžœ˜+Jšœ žœ˜Jšœžœ@˜EJšœ žœžœžœ˜2Jšœžœžœ˜ Jšœ˜Jšœ˜Jšœ;˜;Jšœ žœ˜$JšœW™WJšœ™Jšœ+™+JšœJ™Jšžœ6žœž˜EJšœžœžœ˜šžœ˜ Jšœžœžœ˜Jšœ7˜7šžœ>žœž˜Mšœžœ˜Jšœ1˜1Jšœ˜—Jšžœž˜—J˜——Jšœ ™ šžœžœžœž˜ šœžœ'˜,Jšœ'˜'Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšžœžœžœ˜Jšœ˜Jšœ*˜*Jšœ+˜+Jšžœ˜—Jšžœžœ˜:Jšžœ˜—J˜š ¢œžœžœžœ žœžœ ˜FJšž˜Jšœ žœ˜$JšžœC˜IJšžœ˜—J˜šŸœ˜!Jš Ãœ˜ÆJšž˜Jšœžœ˜%Jšœžœžœžœ˜2Jšœžœ˜+JšœžœX˜ašžœžœ˜JšœžœE˜YJšžœžœ4˜LJšžœ%˜)Jšžœžœ4˜LJšžœ%˜)šœ#˜#Jšœ˜Jšœ˜Jšœ!˜!Jšœ˜—Jšœ˜—Jšœ˜Jšœ žœ˜Jšœ žœ˜Jšœ žœ˜Jšœžœ˜Jšžœ˜—J˜šŸœ˜!Jš Ãœ˜ÆJšž˜Jšœžœ˜%Jšœžœžœžœ˜2Jšœžœ˜+JšœžœX˜ašžœžœ˜JšœžœE˜YJšžœžœ4˜LJšžœ&˜*Jšžœžœ4˜LJšžœ'˜+šœ#˜#Jšœ˜Jšœ˜Jšœ!˜!Jšœ˜—Jšœ˜—Jšœ˜Jšœ žœ˜Jšœ žœ˜Jšœ žœ˜Jšœžœ˜Jšžœ˜—J˜šŸœ˜)Jš Ãœ˜ÅJšž˜Jšœžœ˜+šœžœ.˜5Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ žœ˜Jšœ žœ˜šœ žœžœžœ˜&Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ3˜3Jšœ˜—Jšœžœ˜Jšžœ˜—J˜š¢œžœžœ0žœ˜]Jšž˜Jšœžœ˜&Jšœ˜Jšžœ˜—J˜šŸœžœ œ˜AJšž˜Jšœžœ žœ˜!Jšœžœ˜Jšœ žœ˜!Jšœ žœ˜!Jšœ žœžœ˜5šžœ˜"Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜—Jšžœ˜—J˜šŸœžœ œ˜>Jšž˜Jšœžœ˜*Jšžœ˜Jšœ!˜!Jšœ$˜$Jšœ$˜$Jšžœ(˜,Jšžœ˜—J˜š ¢œ  œžœžœžœ$žœ˜sJš œ žœžœžœ žœžœžœ˜XJšœL™LJšœE™EJšž˜Jšœžœ7˜>šœžœ'˜.J˜J˜J˜J˜J˜—š œžœžœžœžœ ˜;J˜J˜,J˜J˜J˜J˜—Jšžœ˜ Jšžœ˜J˜—š¢œžœžœ žœ žœžœ žœžœžœžœ ˜žJšž˜Jšœžœ˜Jšœžœ˜ Jšœžœ#˜)šœžœ žœ˜(Jšœžœ™ Jšœžœ ™Jšœ2™2—Jšœžœ ˜Jšžœ žœ˜1Jšžœ žœ˜1šžœžœžœ ž˜šœžœžœIžœ˜\JšœF™F—Jšœ&˜&Jšœžœ˜#Jšžœ˜—JšœH˜Hšœ5˜5šžœžœžœ™'šœ™Jšœ™Jšœ™Jšœ™Jšœ™—Jšœžœ ™&Jšœžœ ™&Jšœ'™'J™——Jšžœ˜ Jšžœ˜—J˜šŸœ&˜?Jšž˜Jšœžœ˜2Jšœ˜šžœžœ˜šœ(˜(JšœS˜SJšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ ˜ J˜—Jšžœ˜—J˜šŸœ(˜DJšž˜Jšœžœžœ˜Jšœžœ˜2šžœHžœ žœž˜cJšœžœ2˜:šžœžœ˜šžœžœžœ˜3šœ(˜(šœ˜Jšœ?˜?—Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœž˜ Jšž˜J˜—Jšœ˜—Jšžœ˜—šžœžœ˜Jšœ)˜)šžœ'žœ˜/Jšœ žœ,˜7Jšœ žœ˜%Jšœ žœ,˜7Jšœ˜Jšœ˜šžœžœž˜šœ#˜#Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜——J˜—J˜—Jšžœ˜—J˜š¢œžœ˜Jšž˜JšœžœQ˜XJšœ4˜4Jšœ ˜ Jšœ,˜,Jšœ"˜"Jšœ3˜3Jšœ˜Jšœ.˜.Jšœ8˜8Jšœ.˜.Jšœ0˜0JšœZ˜ZJšœL˜LJšœ>˜>Jšœ>˜>Jšžœ˜—J˜Jšœ˜Jšžœ˜J˜J˜—…—3‚KL