DIRECTORY Core, CoreClasses, CoreOps, CoreProperties, GList, HashTable, IO, Rope;

CoreClassesImpl: CEDAR PROGRAM
IMPORTS CoreOps, CoreProperties, GList, HashTable, IO, Rope
EXPORTS CoreClasses = 
BEGIN OPEN Core, CoreClasses;
recordCellClass: PUBLIC CellClass _ CoreOps.SetClassPrintProc[NEW [CellClassRec _ [name: "Record", layersProps: FALSE]], PropRecordPrint];

PropRecordPrint: CoreOps.PrintClassProc = {
recordCellType: RecordCellType _ NARROW [data];
CoreOps.PrintIndent[indent, out];
IO.PutRope[out, "Internal wire:"];
CoreOps.PrintWire[recordCellType.internal, out, indent, level];
CoreOps.PrintIndent[indent, out];
IO.PutF[out, "%g instances", IO.int[recordCellType.size]];
FOR i: NAT IN [0 .. recordCellType.size) DO
instance: CellInstance = recordCellType.instances[i];
EachWirePair: CoreOps.EachWirePairProc = {
publicName: ROPE = CoreOps.GetFullWireName[instance.type.public, publicWire];
actualName: ROPE = CoreOps.GetFullWireName[recordCellType.internal, actualWire];
subWires _ CoreOps.GetShortWireName[publicWire]=NIL AND publicWire.size>0;
IF NOT subWires THEN IF Rope.Match["[*]", actualName] 
THEN out.PutF[" %g: %g(%g^);", IO.rope[publicName], IO.rope[actualName], IO.int[LOOPHOLE[actualWire]]] 
ELSE out.PutF[" %g: %g;", IO.rope[publicName], IO.rope[actualName]];
};
CoreOps.PrintIndent[indent, out];
IO.PutF[out, "CellInstance %g: %g", [rope[GetCellInstanceName[instance]]], [rope[CoreOps.GetCellTypeName[instance.type]]]];
CoreOps.PrintIndent[indent, out];
IO.PutRope[out, "	Actual wire: "];
IF NOT CoreOps.Conform[instance.actual, instance.type.public] THEN out.PutF["\n*** Actual and Public do not conform\n"];
FOR j: NAT IN [0 .. instance.type.public.size) DO 
[] _ CoreOps.VisitBinding[instance.actual[j], instance.type.public[j], EachWirePair];
ENDLOOP;
CoreProperties.PrintProperties[props: instance.properties, out: out, indent: 1, level: level];
ENDLOOP;
};

givenNameProp: ATOM _ CoreProperties.RegisterProperty[$GivenName, CoreProperties.Props[[CoreProperties.propPrint, CoreProperties.PropDontPrint]]];

CreateRecordCell: PUBLIC PROC [public: WireSeq, internal: WireSeq, instances: LIST OF CellInstance, name: ROPE _ NIL, props: Properties _ NIL, giveNames: BOOL _ FALSE] RETURNS [recordCell: CellType] = {
internals: HashTable.Table _ HashTable.Create[internal.size];
AddInInternals: CoreOps.EachWireProc = {[] _ HashTable.Store[internals, wire, wire]};
data: RecordCellType;
size: NAT _ GList.Length[instances];
data _ NEW [RecordCellTypeRec[size]];
size _ 0;
FOR i: NAT IN [0 .. internal.size) DO 
[] _ CoreOps.VisitWire[internal[i], AddInInternals];
ENDLOOP;
FOR i: NAT IN [0 .. public.size) DO 
IF ~HashTable.Fetch[internals, public[i]].found THEN ERROR; -- public public[i] is not part of internal
ENDLOOP;
FOR list: LIST OF CellInstance _ instances, list.rest WHILE list#NIL DO 
data[size] _ list.first; size _ size+1; 
IF NOT CoreOps.Conform[list.first.actual, list.first.type.public] THEN ERROR;
FOR i: NAT IN [0 .. list.first.actual.size) DO 
IF ~HashTable.Fetch[internals, list.first.actual[i]].found THEN ERROR; -- actual list.first.actual[i] is not part of internal 
ENDLOOP;
ENDLOOP;
data.internal _ internal;
IF giveNames THEN {
Fetch: PROC [table: HashTable.Table, key: REF] RETURNS [value: REF] = {
value _ HashTable.Fetch[table, key].value;
IF value=$None THEN value _ NIL;
}; 
Store: PROC [table: HashTable.Table, key: REF, value: REF] = {
[] _ HashTable.Store[table, key, IF HashTable.Fetch[table, key].value=NIL THEN value ELSE $None];
}; 
FindPossibleName: CoreOps.EachWirePairProc = {
value: REF;
name: ROPE _ CoreOps.GetShortWireName[publicWire];
IF CoreOps.GetShortWireName[actualWire]#NIL THEN RETURN;
IF name=NIL THEN RETURN;
value _ HashTable.Fetch[actualPossibleNames, actualWire].value;
IF value=$None THEN RETURN;
IF Rope.Equal[NARROW [value], name] THEN RETURN;
Store[actualPossibleNames, actualWire, name];
}; 
AddInExistingNames: CoreOps.EachWireProc = {
name: ROPE _ CoreOps.GetShortWireName[wire];
IF name=NIL THEN {
value: REF _ Fetch[actualPossibleNames, wire];
IF value=NIL THEN RETURN;
Store[existingNames, value, wire];
} ELSE Store[existingNames, name, wire];
};
AddName: CoreOps.EachWireProc = {
name: ROPE _ CoreOps.GetShortWireName[wire];
value: REF;
IF name#NIL THEN RETURN [subWires: FALSE];
value _ Fetch[actualPossibleNames, wire];
IF value=NIL OR Fetch[existingNames, value]#wire THEN RETURN;
CoreProperties.PutWireProp[wire, $GivenName, $GivenName];
[] _ CoreOps.SetShortWireName[wire, NARROW [value]]; 
};
actualPossibleNames: HashTable.Table _ HashTable.Create[]; -- association actual -> possible name for the actual.  $None indicates at least two different names.
existingNames: HashTable.Table _ HashTable.Create[equal: HashTable.RopeEqual, hash: HashTable.HashRope]; -- association name -> wire that will get that name.  $None indicates a conflict
FOR i: NAT IN [0 .. data.size) DO
[] _ CoreOps.VisitBinding[data[i].actual, data[i].type.public, FindPossibleName];
ENDLOOP;
[] _ CoreOps.VisitWire[internal, AddInExistingNames];
[] _ CoreOps.VisitWire[internal, AddName];
};
CoreOps.FlushNameCaches[internal];
recordCell _ CoreOps.CreateCellType[recordCellClass, public, data, name, props];
};

CreateInstance: PUBLIC PROC [actual: WireSeq, type: CellType, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [instance: CellInstance] = {
instance _ NEW [CellInstanceRec _ [actual: actual, type: type, properties: props]];
IF name#NIL THEN instance _ SetCellInstanceName[instance, name];
};

GetCellInstanceName: PUBLIC PROC [instance: CellInstance] RETURNS [name: ROPE] = {
name _ NARROW [CoreProperties.GetCellInstanceProp[instance, CoreOps.nameProp]];
};

SetCellInstanceName: PUBLIC PROC [instance: CellInstance, name: ROPE] RETURNS [sameInstance: CellInstance] = {
CoreProperties.PutCellInstanceProp[on: instance, prop: CoreOps.nameProp, value: name];
sameInstance _ instance;
};

CorrespondingActual: PUBLIC PROC [instance: CellInstance, public: Wire] RETURNS [actual: Wire _ NIL] = {
EachWirePair: CoreOps.EachWirePairProc = {
IF publicWire=public THEN {actual _ actualWire; quit _ TRUE};
};
[] _ CoreOps.VisitBinding[instance.actual, instance.type.public, EachWirePair];
};

Compose: PROC [xToY, yToZ, xToZ: HashTable.Table] RETURNS [ok: BOOL _ TRUE, overWritten: BOOL _ FALSE] = {
EachX: HashTable.EachPairAction = {
found: BOOL;
z: HashTable.Value; [found, z] _ HashTable.Fetch[yToZ, value];
IF NOT found THEN {ok _ FALSE; quit _ TRUE; RETURN};
overWritten _ overWritten OR NOT HashTable.Store[xToZ, key, z];
};
ok _ NOT HashTable.Pairs[xToY, EachX];
};

CreatePermutedRecordCell: PUBLIC PROC [iconPublic: WireSeq, schCell: CellType, table: HashTable.Table, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [recordCell: CellType] = {
AddInternal: PROC [wire: Wire] = {
IF NOT CoreOps.Member[internals, wire] THEN internals _ CONS [wire, internals];
};
internals: LIST OF Wire _ NIL; 
public: Wire _ CoreOps.CopyWire[iconPublic];
actual: Wire;
schPublicsToRecordPublics: HashTable.Table _ HashTable.Create[];
BEGIN -- fill public and initialize schPublicsToRecordPublics
RegisterPublicMapping: CoreOps.EachWirePairProc = {
[] _ HashTable.Store[iconToRecord, actualWire, publicWire];
};
iconToRecord: HashTable.Table _ HashTable.Create[];
[] _ CoreOps.VisitBinding[iconPublic, public, RegisterPublicMapping];
FOR i: NAT IN [0 .. public.size) DO AddInternal[public[i]] ENDLOOP;
IF NOT Compose[table, iconToRecord, schPublicsToRecordPublics].ok THEN ERROR;
END;
BEGIN -- fill actual while filling schPublicsToRecordPublics
Map: PROC [schPublic: Wire] RETURNS [actual: Wire] = {
actual _ NARROW [HashTable.Fetch[schPublicsToRecordPublics, schPublic].value];
IF actual#NIL THEN RETURN;
actual _ CoreOps.CreateWires[size: schPublic.size];
[] _ HashTable.Store[schPublicsToRecordPublics, schPublic, actual];
FOR i: NAT IN [0 .. actual.size) DO actual[i] _ Map[schPublic[i]] ENDLOOP;
};
actual _ Map[schCell.public];
FOR i: NAT IN [0 .. actual.size) DO AddInternal[actual[i]] ENDLOOP;
END;
recordCell _ CreateRecordCell [public: public, internal: CoreOps.CreateWire[internals], instances: LIST [CreateInstance[actual, schCell]], name: name, props: props];
};

ReverseCellInstances: PUBLIC PROC [instances: CellInstances] RETURNS [rev: CellInstances _ NIL] = {
rev _ NARROW [GList.Reverse[instances]];
};

InstanceIndex: PUBLIC PROC [recordCell: CellType, instance: CellInstance] RETURNS [index: INT _ -1] = {
rct: RecordCellType _ NARROW [recordCell.data];
FOR i: NAT IN [0 .. rct.size) DO
IF rct[i]=instance THEN RETURN [i];
ENDLOOP;
};
transistorCellClass: PUBLIC CellClass _ CoreOps.SetClassPrintProc[NEW [CellClassRec _ [name: "Transistor", layersProps: FALSE]], PrintTransistor];

transistorTypeNames: PUBLIC ARRAY TransistorType OF ROPE _ ["nE", "pE", "nD"];

transistorPortNames: PUBLIC ARRAY TransistorPort OF ROPE _ ["gate", "ch1", "ch2"];

PrintTransistor: CoreOps.PrintClassProc = {
tran: Transistor _ NARROW [data];
IO.PutF[out, "\n\ntype: %g, length: %g, width: %g", IO.rope[transistorTypeNames[tran.type]], IO.int[tran.length], IO.int[tran.width]];
};

CreateTransistor: PUBLIC PROC [args: TransistorRec, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [cellType: CellType] = {
tranNames: ARRAY TransistorType OF ROPE _ ["nE", "pE", "nD"];
tranPublic: Wire _ CoreOps.CreateWire[LIST[
CoreOps.CreateWire[name: "gate"],
CoreOps.CreateWire[name: "ch1"],
CoreOps.CreateWire[name: "ch2"]
]];
cellType _ CoreOps.CreateCellType[
class: transistorCellClass,
public: tranPublic,
data: NEW [TransistorRec _ args],
name: name, props: props];
};
unspecifiedCellClass: PUBLIC CellClass _ NEW [CellClassRec _ [name: "Unspecified", layersProps: FALSE]];

CreateUnspecified: PUBLIC PROC [public: WireSeq, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [cellType: CellType] = {
cellType _ CoreOps.CreateCellType[
class: unspecifiedCellClass,
public: public,
data: NIL,
name: name,
props: props];
};
sequenceCellClass: PUBLIC CellClass _ CoreOps.SetClassPrintProc[NEW [CellClassRec _ [name: "Sequence", recast: RecastSequence, layersProps: FALSE]], PrintSequence]; 

PrintSequence: CoreOps.PrintClassProc = {
cell: SequenceCellType _ NARROW [data];
IO.PutF[out, "\n\nBase cell type: %g", IO.rope[CoreOps.GetCellTypeName[cell.base]]];
IO.PutF[out, ", count: %g", IO.int[cell.count]];
IO.PutRope[out, "\nsequence wires:"];
IF cell.sequence#NIL THEN FOR seq: NAT IN [0 .. cell.sequence.length) DO
IO.PutF[out, " %g", IO.rope[CoreOps.GetShortWireName[ cell.base.public[cell.sequence[seq]]]]];
ENDLOOP;
IO.PutRope[out, "\nflat sequence wires:"];
IF cell.flatSequence#NIL THEN FOR seq: NAT IN [0 .. cell.flatSequence.length) DO
IO.PutF[out, " %g", IO.rope[CoreOps.GetShortWireName[ cell.base.public[cell.flatSequence[seq]]]]];
ENDLOOP;
IO.PutRope[out, "\nstitch wires:"];
IF cell.stitch#NIL THEN FOR seq: NAT IN [0 .. cell.stitch.length) DO
IO.PutF[out, " [%g, &g]", IO.rope[CoreOps.GetShortWireName[ cell.base.public[cell.stitch[seq].this]]], IO.rope[CoreOps.GetShortWireName[ cell.base.public[cell.stitch[seq].that]]]];
ENDLOOP;
};

RecastSequence: RecastProc = {
seqCell: SequenceCellType _ NARROW[me.data];
public: Wire _ CoreOps.CopyWire[me.public];
newInternal: Wire _ NEW [WireRec[public.size+seqCell.count]];
instances: LIST OF CoreClasses.CellInstance _ NIL;
FOR w: NAT IN [0..public.size) DO
newInternal[w] _ public[w];
ENDLOOP;
FOR cell: NAT DECREASING IN [0..seqCell.count) DO
newWire: Wire _ NEW[WireRec[public.size] _ public^];
cellTypeName: ROPE _ CoreOps.GetCellTypeName[seqCell.base];
IF seqCell.sequence#NIL THEN FOR seqWire: NAT IN [0..seqCell.sequence.length) DO
seqElement: NAT _ seqCell.sequence[seqWire];
newWire[seqElement] _ newWire[seqElement][cell];
ENDLOOP;
IF seqCell.flatSequence#NIL THEN FOR seqWire: NAT IN [0..seqCell.flatSequence.length) DO
seqElement: NAT _ seqCell.flatSequence[seqWire];
size: NAT _ seqCell.base.public[seqElement].size;
actWire: Wire _ NEW[WireRec[size]];
FOR i: NAT IN [0..size) DO
actWire[i] _ newWire[seqElement][(size*cell)+i];
ENDLOOP;
newWire[seqElement] _ actWire;
ENDLOOP;
IF seqCell.stitch#NIL AND seqCell.count>1 AND cell<seqCell.count-1 THEN FOR seqWire: NAT IN [0..seqCell.stitch.length) DO
this: NAT _ seqCell.stitch[seqWire].this;
that: NAT _ seqCell.stitch[seqWire].that;
newWire[that] _ newInternal[public.size+cell+1][this] _ CoreOps.SetShortWireName[CoreOps.CopyWire[ seqCell.base.public[this]], NIL];
ENDLOOP;
instances _ CONS [CreateInstance[
actual: newWire,
type: seqCell.base,
name: IF cellTypeName=NIL THEN NIL ELSE IO.PutFR["%g%g", IO.rope[cellTypeName], IO.int[cell]]],
instances];
newInternal[public.size+cell] _ newWire;
ENDLOOP;
new _ CreateRecordCell[
public: public,
internal: newInternal,
instances: instances, 
name: CoreOps.GetCellTypeName[me],
props: NIL];
};

CreateSequence: PUBLIC PROC [args: SequenceCellType, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [cellType: CellType] = {
public: Wire _ CoreOps.CopyWire[args.base.public];
IF args.sequence#NIL THEN FOR seq: NAT IN [0..args.sequence.length) DO
wire: Wire _ public[args.sequence[seq]];
newWire: Wire _ NEW[WireRec[args.count]];
FOR i: NAT IN [0 .. args.count) DO
newWire[i] _ CoreOps.SetShortWireName[CoreOps.CopyWire[wire], NIL];
ENDLOOP;
public[args.sequence[seq]] _ CoreOps.SetShortWireName[newWire, CoreOps.GetShortWireName[wire]];
ENDLOOP;
IF args.flatSequence#NIL THEN FOR seq: NAT IN [0..args.flatSequence.length) DO
wire: Wire _ public[args.flatSequence[seq]];
newSeqLength: NAT _ args.count * wire.size;
newSeq: Wire _ NEW[WireRec[newSeqLength]];
IF wire.size=0 THEN ERROR;
FOR i: NAT IN [0..newSeqLength) DO
newSeq[i] _ CoreOps.SetShortWireName[CoreOps.CopyWire[wire[0]], NIL];
ENDLOOP;
public[args.flatSequence[seq]] _ CoreOps.SetShortWireName[newSeq, CoreOps.GetShortWireName[wire]];
ENDLOOP;
cellType _ CoreOps.CreateCellType[
class: sequenceCellClass,
public: public,
data: args,
name: name,
props: props];
};


END.

���~��CoreClassesImpl.mesa
Copyright c 1985 by Xerox Corporation.  All rights reserved.
Barth, March 23, 1987 1:04:31 pm PST
Spreitzer, January 10, 1986 4:08:14 pm PST
Bertrand Serlet October 19, 1986 2:43:33 pm PDT
Pradeep Sindhu April 30, 1986 9:35:06 pm PDT
Mike Spreitzer November 18, 1986 2:31:35 pm PST

Record
might be an actual
First pass visiting all bindings
Second Pass finding all short names to find conflicts
Third pass affecting the names when appropriate
This function (that could be in HashTable), adds in table xToZ the pairs found by enumerating xToY and following in the yToZ table.  
Transistor
Unspecified
Sequence
�Ê-��–
"cedar" style˜�codešœ™Kšœ
Ïmœ1™<K™$K™*K™/K™,K™/K™�—KšÏk	œ?žœ˜QK˜�•StartOfExpansion[]šÏnœžœž˜Kšžœ,žœ˜;Kšžœ˜Kšžœžœ˜—headšŸ™Kšœžœ'žœ/žœ˜ŠK˜�šÐbnœ˜+Jšœ!žœ˜/Kšœ!˜!Kšžœ ˜"Kšœ?˜?Kšœ!˜!Kšžœžœ˜:šžœžœžœž˜+Kšœ5˜5š œ˜*Kšœžœ=˜MKšœžœ@˜PKšœ0žœžœ˜Jšžœžœ
žœžœ˜6Kš
žœžœžœžœžœ˜gKšžœžœžœ˜D—K˜—Kšœ!˜!Kšžœy˜{Kšœ!˜!Kšžœ ˜"Kšžœžœ8žœ6˜xšžœžœžœ"žœ˜2KšœU˜UKšžœ˜—Jšœ^˜^Kšžœ˜—Jšœ˜K˜�—šœžœ˜’K˜�—šŸœžœžœ1žœžœžœžœžœ
žœžœžœ˜ÊKšœ=˜=Kš œG˜UKšœ˜Kšœžœ˜$Kšœžœ˜%Kšœ	˜	šžœžœžœžœ˜&Kšœ4˜4Kšžœ˜—šžœžœžœžœ˜$Kšžœ.žœžœÏc+˜gKšžœ˜—šžœžœžœ%žœžœžœ˜HKšœ(˜(Kšžœžœ<žœžœ˜Mšžœžœžœžœ˜/Kšžœ9žœžœ¡7˜~Kšžœ˜—Kšžœ˜—Kšœ˜šžœžœ˜š
Ÿœžœžœžœ	žœ˜GKšœ*˜*Kšžœ
žœ	žœ˜ Kšœ˜—šŸœžœžœ	žœ˜>Kš	œ!žœ#žœžœžœ˜aKšœ˜—šŸœ˜.Jšœžœ˜Jšœžœ(˜2Jšžœ&žœžœžœ˜8Jšžœžœžœžœ˜Jšœ?˜?Jšžœ
žœžœ˜Jšžœžœžœžœ˜0Jšœ-˜-Jšœ˜—šŸœ˜,Kšœžœ"˜,šžœžœžœ˜Kšœ™Jšœžœ$˜.Jšžœžœžœžœ˜Jšœ"˜"Jšœžœ"˜(—K˜—šŸœ˜!Kšœžœ"˜,Kšœžœ˜Kš
žœžœžœžœžœ˜*Kšœ)˜)Kš
žœžœžœ"žœžœ˜=Kšœ9˜9Kšœ$žœ˜5K˜—Kšœ;¡e˜ Kšœi¡P˜¹Kšœ ™ šžœžœžœž˜!J˜QJšžœ˜—Kšœ5™5Kšœ5˜5Kšœ/™/Kšœ*˜*K˜—Kšœ"˜"KšœP˜PK˜—J˜�šŸœžœžœ)žœžœžœžœ˜KšœžœE˜SKšžœžœžœ0˜@K˜J˜�—š
Ÿœžœžœžœžœ˜RKšœžœB˜OK˜J˜�—š
Ÿœžœžœ žœžœ!˜nKšœV˜VKšœ˜K˜K˜�—š
Ÿœžœžœ(žœžœ˜hš œ˜*Kšžœžœžœ˜=K˜—KšœO˜OK˜J˜�—Kšœ…™…šŸœžœ%žœžœžœžœžœ˜jšŸœ˜#Kšœžœ˜Kšœ>˜>Kšžœžœžœžœ	žœžœ˜4Kšœžœžœ˜?K˜—Kšœžœ˜&K˜K˜�—šŸœžœžœHžœžœžœžœ˜´šŸœžœ˜"Kšžœžœ!žœ
žœ˜OK˜—Kšœžœžœžœ˜Kšœ,˜,Kšœ
˜
Kšœ@˜@šžœ¡7˜=šŸœ˜3Kšœ;˜;K˜—Kšœ3˜3KšœE˜EKš
žœžœžœžœžœ˜CKšžœžœ<žœžœ˜MKšžœ˜—šžœ¡6˜<šŸœžœžœ˜6Kšœ	žœ?˜NKšžœžœžœžœ˜Kšœ3˜3KšœC˜CKš
žœžœžœžœžœ˜JK˜—Kšœ˜Kš
žœžœžœžœžœ˜CKšžœ˜—Kšœcžœ>˜¥Kšœ˜K˜�—š
Ÿœžœžœžœžœ˜cJšœžœ˜(J˜J˜�—š
Ÿ
œžœžœ0žœ	žœ
˜gKšœžœ˜/šžœžœžœž˜ Kšžœžœžœ˜#Kšžœ˜—Kšœ˜——šŸ
™
Kšœžœ'žœ3žœ˜’K˜�š	œžœžœžœžœ˜NK˜�—š	œžœžœžœžœ˜RK˜�—šŸœ˜+Jšœžœ˜!Kšžœ2žœ'žœžœ˜†Kšœ˜K˜�—šŸœžœžœžœžœžœžœ˜Kšœžœžœžœ˜=šœ&žœ˜+Jšœ!˜!Jšœ ˜ Jšœ˜Jšœ˜—šœ"˜"Jšœ˜Jšœ˜Jšœžœ˜!Jšœ˜—Kšœ˜——šŸ™Kšœžœ
žœ4žœ˜hK˜�šŸœžœžœžœžœžœžœ˜|šœ"˜"Kšœ˜Kšœ˜Kšœžœ˜
Kšœ˜Kšœ˜—Kšœ˜——šŸ™Kšœžœ'žœIžœ˜¥K˜�š 
œ˜)Jšœžœ˜'Kšžœ%žœ+˜TKšžœžœ˜0Kšžœ#˜%š
žœžœžœžœžœžœž˜HKšžœžœH˜^Kšžœ˜—Kšžœ(˜*š
žœžœžœžœžœžœ!ž˜PKšžœžœL˜bKšžœ˜—Kšžœ!˜#š
žœ
žœžœžœžœžœž˜DKšžœžœKžœK˜´Kšžœ˜—Kšœ˜K˜�—šŸœ˜Kšœžœ
˜,Kšœ+˜+Kšœžœ&˜=Kšœžœžœžœ˜2šžœžœžœž˜!Kšœ˜Kšžœ˜—š	žœžœž
œžœž˜1Jšœžœ!˜4Jšœžœ)˜;š
žœžœžœžœ
žœžœž˜PKšœžœ˜,Jšœ0˜0Kšžœ˜—š
žœžœžœžœ
žœžœ"ž˜XKšœžœ!˜0Jšœžœ(˜1Kšœžœ˜#šžœžœžœž˜Kšœ0˜0Kšžœ˜—Jšœ˜Kšžœ˜—šžœžœžœžœžœžœ
žœžœž˜yKšœžœ ˜)Kšœžœ ˜)Kšœžœ˜„Kšžœ˜—šœžœ˜!Kšœ˜Kšœ˜Kšœžœžœžœžœžœžœžœžœ
˜_Kšœ˜—Kšœ(˜(Kšžœ˜—šœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ"˜"Kšœžœ˜—Kšœ˜K˜�—šŸœžœžœ žœžœžœžœ˜€Kšœ2˜2š
žœžœžœžœžœžœž˜FKšœ(˜(Kšœžœ˜)šžœžœžœž˜"Kšœ>žœ˜CKšžœ˜—Kšœ_˜_Kšžœ˜—š
žœžœžœžœžœžœž˜NKšœ,˜,Kšœžœ˜+Kšœžœ˜*Kšžœ
žœžœ˜šžœžœžœž˜"Kšœ@žœ˜EKšžœ˜—Kšœb˜bKšžœ˜—šœ"˜"Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜—Kšœ˜K˜�K˜�——Kšžœ˜K˜�—�…—����68��Gã��