cryst/0000755001325400021140000000000015064274357011403 5ustar gaehlerusercryst/grp/0000755001325400021140000000000015064274357012173 5ustar gaehlerusercryst/grp/spacegrp.gd0000644001325400021140000000323514053147612014304 0ustar gaehleruser############################################################################# ## #A spacegrp.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Declarations for IT space groups ## ############################################################################# ## #F SpaceGroupSettingsIT . . . . . . . .available settings of IT space groups ## DeclareGlobalFunction( "SpaceGroupSettingsIT" ); ############################################################################# ## #F SpaceGroupDataIT . . . . . . . . . . . data extractor for IT space groups ## DeclareGlobalFunction( "SpaceGroupDataIT" ); ############################################################################# ## #F SpaceGroupFunIT . . . . . . . . . constructor function for IT space group ## DeclareGlobalFunction( "SpaceGroupFunIT" ); ############################################################################# ## #F SpaceGroupOnRightIT . . . . . . . .constructor for IT space group OnRight ## DeclareGlobalFunction( "SpaceGroupOnRightIT" ); ############################################################################# ## #F SpaceGroupOnLeftIT . . . . . . . . .constructor for IT space group OnLeft ## DeclareGlobalFunction( "SpaceGroupOnLeftIT" ); ############################################################################# ## #F SpaceGroupIT . . . . . . . . . . . . . . . constructor for IT space group ## DeclareGlobalFunction( "SpaceGroupIT" ); cryst/grp/spacegrp.grp0000644001325400021140000035312414053147612014507 0ustar gaehleruser############################################################################# ## #A spacegrp.grp Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Data for IT space groups ## ############################################################################# ## #M SpaceGroupList2d . . . . . . . . . . . . . . .data for 2d IT space groups ## BindGlobal("SpaceGroupList2d", [rec( 1:=rec(generators:=[],basis:=[[1,0],[0,1]], normgens:=[[[1,0],[0,1]],[[-1,0],[0,-1]],[[0,1],[1,0]], [[1,1],[0,-1]],[[-1,-2],[1,1]]], normsize:=infinity)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]]] ,basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[-1,0],[0,-1]], [[0,1],[1,0]],[[1,1],[0,-1]], [[-1,-2],[1,1]]],normsize:=infinity)), rec(1:=rec(generators:=[[[-1,0,0],[0,1,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,1]],[[-1,0],[0,-1]], [[1,0],[0,-1]],[[-1,0],[0,1]], [[1,0],[0,1]]],normsize:=4)), rec(1:=rec(generators:=[[[-1,0,0],[0,1,0],[0,1/2,1]] ],basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,1]],[[-1,0],[0,-1]], [[1,0],[0,-1]],[[-1,0],[0,1]], [[1,0],[0,1]]],normsize:=4)), rec(1:=rec(generators:=[[[-1,0,0],[0,1,0],[0,0,1]]], basis:=[[1/2,1/2],[0,1]], normgens:=[[[-1,0],[0,1]],[[-1,0],[0,-1]], [[1,0],[0,-1]],[[-1,0],[0,1]]], normsize:=4)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[-1,0],[0,1]], [[-1,0],[0,-1]],[[1,0],[0,-1]], [[0,1],[1,0]]],normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[1/2,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[-1,0],[0,1]], [[-1,0],[0,-1]],[[1,0],[0,-1]], [[0,1],[1,0]]],normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[1/2,1/2,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[-1,0],[0,1]], [[-1,0],[0,-1]],[[1,0],[0,-1]], [[0,1],[1,0]]],normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]], basis:=[[1/2,1/2],[0,1]], normgens:=[[[-1,0],[0,-1]],[[-1,0],[0,1]], [[-1,0],[0,-1]],[[1,0],[0,-1]], [[0,1],[-1,0]]],normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[0,1],[-1,0]], [[-1,0],[0,-1]],[[0,1],[1,0]], [[1,0],[0,-1]]],normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[0,1],[-1,0]], [[-1,0],[0,1]],[[-1,0],[0,-1]], [[0,1],[1,0]],[[1,0],[0,-1]]], normsize:=8)), rec(1:=rec(generators:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[1/2,1/2,1]]], basis:=[[1,0],[0,1]], normgens:=[[[-1,0],[0,-1]],[[0,1],[-1,0]], [[-1,0],[0,1]],[[-1,0],[0,-1]], [[0,1],[1,0]],[[1,0],[0,-1]]], normsize:=8)), rec(1:=rec(generators:=[[[0,1,0],[-1,-1,0],[0,0,1]]] ,basis:=[[1,0],[0,1]], normgens:=[[[0,1],[-1,-1]],[[1,1],[-1,0]], [[1,1],[0,-1]]],normsize:=12)), rec(1:=rec(generators:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[0,1],[-1,-1]],[[0,-1],[-1,0]], [[1,1],[-1,0]],[[1,1],[0,-1]]], normsize:=12)), rec(1:=rec(generators:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[0,1],[-1,-1]],[[0,1],[1,0]], [[1,1],[-1,0]],[[1,1],[0,-1]]], normsize:=12)), rec(1:=rec(generators:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[0,1],[-1,-1]],[[-1,0],[0,-1]], [[1,1],[-1,0]],[[1,1],[0,-1]]], normsize:=12)), rec(1:=rec(generators:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]], basis:=[[1,0],[0,1]], normgens:=[[[0,1],[-1,-1]],[[-1,0],[0,-1]], [[0,-1],[-1,0]],[[1,1],[-1,0]], [[1,1],[0,-1]]],normsize:=12))]); ############################################################################# ## #M SpaceGroupList3d . . . . . . . . . . . . . . .data for 3d IT space groups ## BindGlobal("SpaceGroupList3d", [rec( 1:=rec(generators:=[],basis:=[[1,0,0],[0,1,0],[0, 0,1]], normgens:=[[[1,0,0],[0,1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,-1],[0,-1,0],[1,1,1]], [[0,1,1],[-1,0,0],[0,0,-1]], [[1,1,1],[0,0,1],[0,-1,-1]]], normsize:=infinity)), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,-1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,-1],[0,-1,0],[1,1,1]], [[0,1,1],[-1,0,0],[0,0,-1]], [[1,1,1],[0,0,1],[0,-1,-1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,2],[0,1,0],[0,0,-1]], [[1,0,4],[0,-1,0],[-1,0,-3]], [[1,0,-2],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[-1,0,-2],[0,1,0],[1,0,1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,-1,0],[0,1,0],[0,0,-1]], [[1,0,0],[-2,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[1,0,0,0],[0,1,0,0], [0,0,-1,0],[1/2,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,2],[0,1,0],[0,0,-1]], [[1,0,4],[0,-1,0],[-1,0,-3]], [[1,0,-2],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[-1,0,-2],[0,1,0],[1,0,1]]], normsize:=infinity), c:=rec(generators:=[[[1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,-1,0],[0,1,0],[0,0,-1]], [[1,0,0],[-2,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,1/2,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,2],[0,1,0],[0,0,-1]], [[1,0,4],[0,-1,0],[-1,0,-3]], [[1,0,-2],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[-1,0,-2],[0,1,0],[1,0,1]]], normsize:=infinity), c:=rec(generators:=[[[1,0,0,0],[0,1,0,0], [0,0,-1,0],[1/2,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,-1,0],[0,1,0],[0,0,-1]], [[1,0,0],[-2,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,2],[0,1,0],[0,0,-1]], [[1,0,4],[0,-1,0],[-1,0,-3]], [[1,0,-2],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[-1,0,-2],[0,1,0],[1,0,1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,-1,0],[0,1,0],[0,0,-1]], [[1,0,0],[-2,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[0,0,-1],[0,1,0],[1,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[1,0,2],[0,1,0],[0,0,-1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,1,0],[-1,0,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]], [[2,1,0],[-1,0,0],[0,0,1]]], normsize:=infinity)), rec(b:=rec(generators:=[[[-1,0,0,0],[0,1,0,0], [0,0,-1,0],[0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,2],[0,1,0],[0,0,-1]], [[1,0,4],[0,-1,0],[-1,0,-3]], [[1,0,-2],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,-1]], [[-1,0,-2],[0,1,0],[1,0,1]]], normsize:=infinity), c:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,-1,0],[0,1,0],[0,0,-1]], [[1,0,0],[-2,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[-1,-1,0],[0,1,0],[0,0,1]]], normsize:=infinity)), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0], [0,0,1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[0,0,-1],[1,0,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]]],normsize:=16) ), rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=8)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,1/2,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=8)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,0,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=8)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=8)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,1]]],normsize:=16)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/4,1/4,1/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,1,0],[0,0,1]]],normsize:=16)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,0,1],[-1,0,0],[0,1,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,1/2,1/2,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[1,0,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[0,0,-1],[1,0,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/4,1/4,1/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[0,0,-1],[1,0,0]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[3/4,3/4,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [3/4,0,3/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[0,0,-1],[1,0,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[1,0,0],[0,0,1]]],normsize:=48)), rec( 1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,3/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,1/2,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [3/4,1/4,1/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,3/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,3/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,3/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,3/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,3/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,3/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,1/2,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/4,3/4,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,1/2,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [0,1/2,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,1/2,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,0,1/2,1]], [[0,1,0,0],[-1,0,0,0],[0,0,1,0], [1/4,3/4,1/4,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[1,0,0],[0,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=16)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( 1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( 1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,2/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,1/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( 1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( 1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( h:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/3,2/3,2/3],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,-1,0],[1,0,0],[0,0,1]], [[1,1,0],[0,-1,0],[0,0,1]]],normsize:=12), r:= rec(generators:=[[[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[-1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]]],normsize:=12)), rec( 1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0,1, 0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,2/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,2/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,2/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,1/3,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/3,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[0,-1,0,0],[-1,0,0,0],[0,0,1,0], [0,0,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[0,1,0,0],[-1,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,1,0], [0,0,1/2,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[0,1,0],[-1,-1,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[-1,0,0],[0,0,1]], [[0,1,0],[1,0,0],[0,0,1]], [[1,1,0],[-1,0,0],[0,0,1]]],normsize:=24)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/4,1/4,1/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/4,1/4,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/4,0,1/4,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,3/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/4,3/4,3/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,1/4,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [1/2,1/2,1/2,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,1,0], [1/4,1/4,1/4,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/2,1/2,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,0,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1,0,0],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,1],[1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,-1,0],[0,0,1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [1/2,1/2,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,3/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [1/4,1/4,1/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[3/4,1/4,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/4,1/2,3/4,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,1/2,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,1/2,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [1/2,1/2,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,3/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [3/4,3/4,3/4,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48), 2:= rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0,1,0 ],[1/4,3/4,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [3/4,1/2,1/4,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,0,1/2],[0,1/2,1/2],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,1,0],[1,0,0],[0,0,1]], [[0,0,1],[0,1,0],[1,0,0]], [[1,0,0],[0,0,-1],[0,-1,0]], [[1,0,0],[0,1,0],[0,0,-1]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[0,0,0,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,0,0,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [0,0,0,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48)) , rec(1:=rec(generators:=[[[-1,0,0,0],[0,-1,0,0],[0,0, 1,0],[1/2,0,1/2,1]], [[-1,0,0,0],[0,1,0,0],[0,0,-1,0], [0,1/2,1/2,1]], [[0,1,0,0],[0,0,1,0],[1,0,0,0], [0,0,0,1]], [[0,1,0,0],[1,0,0,0],[0,0,-1,0], [3/4,1/4,1/4,1]], [[-1,0,0,0],[0,-1,0,0],[0,0,-1,0], [0,0,0,1]]], basis:=[[1/2,1/2,1/2],[0,1,0],[0,0,1]], normgens:=[[[-1,0,0],[0,-1,0],[0,0,1]], [[-1,0,0],[0,1,0],[0,0,-1]], [[0,1,0],[0,0,1],[1,0,0]], [[0,1,0],[1,0,0],[0,0,-1]], [[-1,0,0],[0,-1,0],[0,0,-1]], [[0,-1,0],[0,0,-1],[-1,0,0]], [[1,0,0],[0,0,1],[0,1,0]], [[1,0,0],[0,0,-1],[0,1,0]]],normsize:=48) )]); cryst/grp/spacegrp.gi0000644001325400021140000001207313232361435014310 0ustar gaehleruser############################################################################# ## #A spacegrp.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Extraction functions for IT space groups ## ############################################################################# ## #M SpaceGroupSettingsIT . . . . . . . .available settings of IT space groups ## InstallGlobalFunction( SpaceGroupSettingsIT, function( dim, nr ) if dim = 2 then if nr in [1..17] then return List( RecNames( SpaceGroupList2d[nr] ), x -> x[1] ); else Error( "space group number must be in [1..17]" ); fi; elif dim = 3 then if nr in [1..230] then return List( RecNames( SpaceGroupList3d[nr] ), x -> x[1] ); else Error( "space group number must be in [1..230]" ); fi; else Error( "only dimensions 2 and 3 are supported" ); fi; end ); ############################################################################# ## #M SpaceGroupDataIT . . . . . . . . . . . data extractor for IT space groups ## InstallGlobalFunction( SpaceGroupDataIT, function( r ) local settings; if r.dim = 2 then if r.nr in [1..17] then if IsBound( r.setting ) and r.setting <> '1' then Error( "requested setting is not available" ); fi; r.setting := '1'; return SpaceGroupList2d[r.nr].1; else Error( "in 2d, space group number must be in [1..17]" ); fi; elif r.dim = 3 then if r.nr in [1..230] then settings := SpaceGroupSettingsIT( 3, r.nr ); if IsBound( r.setting ) then if r.setting in settings then return SpaceGroupList3d[r.nr].([r.setting]); else Error( "requested setting is not available" ); fi; else if 'b' in settings then r.setting := 'b'; return SpaceGroupList3d[r.nr].b; elif '2' in settings then r.setting := '2'; return SpaceGroupList3d[r.nr].2; elif 'h' in settings then r.setting := 'h'; return SpaceGroupList3d[r.nr].h; else r.setting := '1'; return SpaceGroupList3d[r.nr].1; fi; fi; else Error( "space group number must be in [1..230]" ); fi; else Error( "only dimensions 2 and 3 are supported" ); fi; end ); ############################################################################# ## #M SpaceGroupFunIT . . . . . . . . . constructor function for IT space group ## InstallGlobalFunction( SpaceGroupFunIT, function( r ) local data, gens, vec, name, norm, S, P, N; data := SpaceGroupDataIT( r ); gens := ShallowCopy( data.generators ); for vec in data.basis do Add( gens, AugmentedMatrix( IdentityMat( r.dim ), vec ) ); od; if r.action = LeftAction then gens := List( gens, TransposedMat ); norm := List( data.normgens, TransposedMat ); name := "SpaceGroupOnLeftIT("; S := AffineCrystGroupOnLeftNC( gens, IdentityMat( r.dim+1 ) ); else norm := data.normgens; name := "SpaceGroupOnRightIT("; S := AffineCrystGroupOnRightNC( gens, IdentityMat( r.dim+1 ) ); fi; AddTranslationBasis( S, data.basis ); SetName( S, Concatenation( name, String(r.dim), ",", String(r.nr), ",'", [r.setting], "')" ) ); P := PointGroup( S ); N := GroupByGenerators( norm, One(P) ); SetSize( N, data.normsize ); SetNormalizerPointGroupInGLnZ( P, N ); if data.basis = One(P) then SetNormalizerInGLnZ( P, N ); fi; return S; end ); ############################################################################# ## #M SpaceGroupOnRightIT . . . . . . . .constructor for IT space group OnRight ## InstallGlobalFunction( SpaceGroupOnRightIT, function( arg ) local r; r := rec( dim := arg[1], nr := arg[2], action := RightAction ); if IsBound( arg[3] ) then r.setting := arg[3]; fi; return SpaceGroupFunIT( r ); end ); ############################################################################# ## #M SpaceGroupOnLeftIT . . . . . . . . .constructor for IT space group OnLeft ## InstallGlobalFunction( SpaceGroupOnLeftIT, function( arg ) local r; r := rec( dim := arg[1], nr := arg[2], action := LeftAction ); if IsBound( arg[3] ) then r.setting := arg[3]; fi; return SpaceGroupFunIT( r ); end ); ############################################################################# ## #M SpaceGroupIT . . . . . . . . . . . . . . . constructor for IT space group ## InstallGlobalFunction( SpaceGroupIT, function( arg ) local r; r := rec( dim := arg[1], nr := arg[2], action := CrystGroupDefaultAction ); if IsBound( arg[3] ) then r.setting := arg[3]; fi; return SpaceGroupFunIT( r ); end ); cryst/tst/0000755001325400021140000000000015064274357012215 5ustar gaehlerusercryst/tst/subgrp.tst0000644001325400021140000000300513246017026014235 0ustar gaehlerusergap> START_TEST( "Cryst: subgrp.tst" ); gap> SetAssertionLevel(1); gap> le := rec( latticeequal := true ); rec( latticeequal := true ) gap> ce := rec( classequal := true, primes := [2,3,5] ); rec( classequal := true, primes := [ 2, 3, 5 ] ) gap> so := rec( primes := [2,3,5] ); rec( primes := [ 2, 3, 5 ] ) gap> l1 := List( [1..17], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 2, i ), le ) ) ); [ 0, 1, 1, 1, 1, 3, 3, 3, 3, 1, 3, 3, 1, 2, 2, 2, 4 ] gap> l2 := List( [1..17], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 2, i ), ce ) ) ); [ 13, 16, 10, 6, 6, 16, 8, 4, 8, 5, 6, 2, 5, 5, 3, 3, 3 ] gap> l3 := List( [1..17], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 2, i ), so ) ) ); [ 13, 17, 11, 7, 7, 19, 11, 7, 11, 6, 9, 5, 6, 7, 5, 5, 7 ] gap> l1 + l2 = l3; true gap> l1 := List( [1..23], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 3, 10*i ), le ) ) ); [ 3, 3, 3, 3, 7, 7, 7, 1, 3, 3, 3, 3, 7, 7, 2, 2, 2, 4, 4, 3, 3, 3, 5 ] gap> l2 := List( [1..23], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 3, 10*i ), ce ) ) ); [ 40, 10, 10, 10, 14, 6, 6, 7, 8, 8, 4, 8, 4, 12, 9, 6, 4, 8, 5, 8, 4, 2, 2 ] gap> l3 := List( [1..23], i -> Length( MaximalSubgroupClassReps( > SpaceGroupIT( 3, 10*i ), so ) ) ); [ 43, 13, 13, 13, 21, 13, 13, 8, 11, 11, 7, 11, 11, 19, 11, 8, 6, 12, 9, 11, 7, 5, 7 ] gap> l1 + l2 = l3; true gap> STOP_TEST( "subgrp.tst", 10000 ); cryst/tst/zass.tst0000644001325400021140000000077013254463540013726 0ustar gaehlerusergap> START_TEST( "Cryst: zass.tst" ); gap> SetAssertionLevel(1); gap> List( List( [1..17], i -> SpaceGroupIT( 2, i ) ), > g -> Length( SpaceGroupsByPointGroup( PointGroup( g ) ) ) ); [ 1, 1, 2, 2, 2, 4, 4, 4, 4, 1, 2, 2, 1, 1, 1, 1, 1 ] gap> List( List( [1..23], i -> SpaceGroupIT( 3, 10*i-7 ) ), > g -> Length( SpaceGroupsByPointGroup( PointGroup( g ) ) ) ); [ 2, 8, 8, 16, 16, 64, 64, 64, 4, 8, 8, 4, 16, 16, 3, 3, 2, 6, 4, 4, 4, 4, 4 ] gap> STOP_TEST( "zass.tst", 10000 ); cryst/tst/cryst.tst0000644001325400021140000002675615036140335014120 0ustar gaehlerusergap> START_TEST( "Cryst: cryst.tst" ); gap> SetAssertionLevel(1); gap> C := SpaceGroupIT( 3, 133 ); SpaceGroupOnRightIT(3,133,'2') gap> m := IdentityMat(4); [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] gap> C^m; gap> C := SpaceGroupIT( 3, 133 ); SpaceGroupOnRightIT(3,133,'2') gap> P := PointGroup( C );; Size( P );; P; gap> NormalizerInGLnZ( P ); gap> G := SpaceGroupIT(3,68); SpaceGroupOnRightIT(3,68,'2') gap> pos := WyckoffPositions(G); [ < Wyckoff position, point group 1, translation := [ 0, 0, 0 ], basis := [ ] > , < Wyckoff position, point group 2, translation := [ 0, 1/4, 1/4 ], basis := [ ] > , < Wyckoff position, point group 2, translation := [ 0, 1/4, 3/4 ], basis := [ ] > , < Wyckoff position, point group 1, translation := [ 1/4, 1/4, 0 ], basis := [ ] > , < Wyckoff position, point group 3, translation := [ 0, 1/4, 0 ], basis := [ [ 0, 0, 1 ] ] > , < Wyckoff position, point group 3, translation := [ 1/4, 0, 0 ], basis := [ [ 0, 0, 1 ] ] > , < Wyckoff position, point group 4, translation := [ 0, 0, 1/4 ], basis := [ [ 0, 1, 0 ] ] > , < Wyckoff position, point group 5, translation := [ 0, 0, 0 ], basis := [ [ 1/2, 1/2, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] > , < Wyckoff position, point group 6, translation := [ 1/4, 1/4, 1/4 ], basis := [ [ 1, 0, 0 ] ] > ] gap> WyckoffStabilizer(pos[5]); Group( [ [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 1/2, 0, 1 ] ] ]) gap> S := SpaceGroupIT(2,7); SpaceGroupOnRightIT(2,7,'1') gap> P := PointGroup(S); Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]) gap> N := NormalizerInGLnZ(P); Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], [ 0, -1 ] ], [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ]) gap> gen := Filtered( GeneratorsOfGroup(N), x -> not x in P ); [ [ [ 0, 1 ], [ 1, 0 ] ] ] gap> n := AugmentedMatrix( gen[1], [1/5,1/7] ); [ [ 0, 1, 0 ], [ 1, 0, 0 ], [ 1/5, 1/7, 1 ] ] gap> S2 := S^n; gap> c := ConjugatorSpaceGroupsStdSamePG( S, S2 );; gap> S^c=S2; true gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > c := ConjugatorSpaceGroupsStdSamePG( S2, S );; > if not S2^c=S then > Error( "Cryst: conjugator test failed" ); > fi; > fi; gap> C1 := [ [ 4, -3, 0 ], [ -3, -1, 0 ], [ 1/5, 1/7, 1 ] ]; [ [ 4, -3, 0 ], [ -3, -1, 0 ], [ 1/5, 1/7, 1 ] ] gap> C2 := [ [ -1, 4, 0 ], [ -1, -2, 0 ], [ 1/9, 1/13, 1 ] ]; [ [ -1, 4, 0 ], [ -1, -2, 0 ], [ 1/9, 1/13, 1 ] ] gap> S1 := S^C1; IsSpaceGroup(S1); true gap> S2 := S^C2; IsSpaceGroup(S2); true gap> C := ConjugatorSpaceGroups( S1, S2 );; gap> S1^C = S2; true gap> S1 := AffineCrystGroupOnRight( > [ [ [ -1, 0, 2, 0 ], [ -2, 1, 2, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 1/2, 1 ] ], > [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 1/2, 0, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, 0, 0, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ] ] ] ); gap> gap> S2 := AffineCrystGroupOnRight( > [ [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ], > [ [ 1, 0, -2, 0 ], [ 2, -1, -2, 0 ], [ 0, 0, -1, 0 ], [ 0, 1/2, 0, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, -1, 0, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, 0, -1, 1 ] ], > [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ -1, 1, 1, 1 ] ] ] ); gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > c1 := ConjugatorSpaceGroups(S1,S2);; > c2 := ConjugatorSpaceGroups(S2,S1);; > if not ( S1^c1 = S2 and S2^c2 = S1 ) then > Error( "Cryst: conjugator test 2 failed" ); > fi; > fi; gap> G := SpaceGroupIT(3, 214);; gap> iso := IsomorphismPcpGroup(G);; gap> H := Image(iso);; gap> h := Cgs(H)[1];; gap> g := PreImage(iso, h);; gap> h = Image(iso, g); true gap> IsomorphismPcpGroup( PointGroup( G ) );; gap> gen := GeneratorsOfGroup( SpaceGroupIT(3,149) ){[1..3]};; gap> Gr := AffineCrystGroup( gen ); gap> Gr = AsAffineCrystGroup( Group( gen ) ); true gap> TranslationBasis( Gr ); [ [ 1, 0, 0 ], [ 0, 1, 0 ] ] gap> InternalBasis( Gr ); [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] gap> CheckTranslationBasis( Gr ); gap> StandardAffineCrystGroup( Gr ); gap> TransParts( Gr ); [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] gap> PointHomomorphism( Gr ); [ [ [ 0, 1, 0, 0 ], [ -1, -1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], [ [ 0, -1, 0, 0 ], [ -1, 0, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, 0, 0, 1 ] ] ] -> [ [ [ 0, 1, 0 ], [ -1, -1, 0 ], [ 0, 0, 1 ] ], [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, -1 ] ], [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] gap> Gl := AffineCrystGroupOnLeft( List( gen, TransposedMat ) ); gap> Gl = AsAffineCrystGroupOnLeft( Group( List( gen, TransposedMat ) ) ); true gap> TranslationBasis( Gl ); [ [ 1, 0, 0 ], [ 0, 1, 0 ] ] gap> InternalBasis( Gl ); [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] gap> CheckTranslationBasis( Gl ); gap> StandardAffineCrystGroup( Gl ); gap> TransParts( Gl ); [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] gap> PointHomomorphism( Gl ); [ [ [ 0, -1, 0, 0 ], [ 1, -1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], [ [ 0, -1, 0, 0 ], [ -1, 0, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 1 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] ] -> [ [ [ 0, -1, 0 ], [ 1, -1, 0 ], [ 0, 0, 1 ] ], [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, -1 ] ], [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] gap> SpaceGroupIT(3,213) < SpaceGroupIT(3,217); false gap> G := SpaceGroupIT(3,183);; gap> W := WyckoffPositions(G);; gap> C := [ [ 3, 1, 0, 0 ], [ -1, -2, 0, 0 ], [ 2, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];; gap> IsSpaceGroup( G^C ); true # The next checks verify that including a translation component in conjugation # works correctly, as from . gap> C := [ [ 3, 1, 0, 0 ], [ -1, -2, 0, 0 ], [ 2, 0, 1, 0 ], [ 1/2, 0, 0, 1 ] ];; gap> IsSpaceGroup( G^C ); true # Test that caching of Wyckoff followed by conjugation works as expected # Use Set because the order of the Wyckoff positions is semi-arbitrary. gap> Set(WyckoffPositions( G^C )) = Set(WyckoffPositions(SpaceGroupIT(3,183)^C)); true gap> G := TransposedMatrixGroup( G ); gap> W := WyckoffPositions(G);; gap> IsSpaceGroup( G^TransposedMat(C) ); true gap> Set(WyckoffPositions( G^TransposedMat(C) )) = Set(WyckoffPositions(SpaceGroupOnLeftIT(3,183)^TransposedMat(C))); true # Test Wyckoff positions in a case that involves an empty basis (see ). gap> G := SpaceGroupIT( 3, 12 );; gap> W := WyckoffPositions(G);; gap> IsSpaceGroup( G^C ); true gap> G := SpaceGroupIT( 3, 208 ); SpaceGroupOnRightIT(3,208,'1') gap> M := MaximalSubgroupClassReps( G, rec( primes := [2,3] ) ); [ , , , , , , , ] gap> List( M, x -> Index( G, x ) ); [ 2, 2, 2, 4, 4, 4, 3, 27 ] gap> List( Cartesian(M{[2,3,5]},M{[4,7,8]}), > x -> Index( G, Intersection2(x[1],x[2]) ) ); [ 8, 6, 54, 8, 6, 54, 16, 12, 108 ] gap> gen := GeneratorsOfGroup( M[1] );; gap> Centralizer( M[1], gen[1] ); gap> Centralizer( M[1], Subgroup( M[1], gen{[3]} ) ); gap> C := RightCosets( G, M[3] );; gap> CanonicalRightCosetElement( M[3], Representative(C[2]) ); [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ] ] gap> List( M, TranslationNormalizer ); [ , , , , , , , ] gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > List( M, AffineNormalizer );; > fi; gap> List( M{[2,5,7]}, x -> Orbit( G, x, OnPoints ) );; gap> List( M{[3,6]}, x -> OrbitStabilizer( G, x, OnPoints ) );; gap> List( M, x -> IsomorphismPcpGroup( PointGroup(x) ) );; gap> G := SpaceGroupOnLeftIT( 3, 208 ); SpaceGroupOnLeftIT(3,208,'1') gap> M := MaximalSubgroupClassReps( G, rec( primes := [2,3] ) ); [ , , , , , , , ] gap> List( M, x -> Index( G, x ) ); [ 2, 2, 2, 4, 4, 4, 3, 27 ] gap> List( Cartesian(M{[4,6,7]},M{[2,5,8]}), > x -> Index( G, Intersection2(x[1],x[2]) ) ); [ 8, 16, 108, 8, 16, 108, 6, 12, 81 ] gap> gen := GeneratorsOfGroup( M[1] );; gap> Centralizer( M[1], gen[1] ); gap> Centralizer( M[1], Subgroup( M[1], gen{[3]} ) ); gap> C := RightCosets( G, M[3] );; gap> CanonicalRightCosetElement( M[3], Representative(C[2]) ); [ [ -1, 0, 0, 0 ], [ 0, -1, 0, 0 ], [ 0, 0, 1, 1 ], [ 0, 0, 0, 1 ] ] gap> List( M, TranslationNormalizer ); [ , , , , , , , ] gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > List( M, AffineNormalizer );; > fi; gap> List( M{[3,7]}, x -> Orbit( G, x, OnPoints ) );; gap> List( M{[5,6]}, x -> OrbitStabilizer( G, x, OnPoints ) );; gap> List( M, x -> IsomorphismPcpGroup( PointGroup(x) ) );; gap> G := SpaceGroupOnRightIT( 3, 214 );; gap> K := Kernel( PointHomomorphism( G ) ); gap> NaturalHomomorphismByNormalSubgroup( G, K );; gap> G := SpaceGroupOnLeftIT( 3, 222 );; gap> K := Kernel( PointHomomorphism( G ) ); gap> NaturalHomomorphismByNormalSubgroup( G, K );; gap> G := SpaceGroupOnRightIT( 3, 222 );; gap> C := ConjugacyClassesMaximalSubgroups( G, rec(primes:=[2,3,5] ) );; gap> List( C, Size ); [ 1, 1, 1, 4, 3, 27, 125 ] gap> List( C{[1..6]}, x -> Length( AsList(x) ) ); [ 1, 1, 1, 4, 3, 27 ] gap> L := AsList( C[5] ); [ , , ] gap> List(L, x -> RepresentativeAction( G, L[1], x, OnPoints ) );; gap> List( C, x -> Normalizer( G, Representative(x) ) );; gap> G := SpaceGroupOnLeftIT( 3, 222 );; gap> C := ConjugacyClassesMaximalSubgroups( G, rec(primes:=[2,3,5] ) );; gap> List( C, Size ); [ 1, 1, 1, 4, 3, 27, 125 ] gap> List( C{[1..6]}, x -> Length( AsList(x) ) ); [ 1, 1, 1, 4, 3, 27 ] gap> L := AsList( C[5] ); [ , , ] gap> List(L, x -> RepresentativeAction( G, L[1], x, OnPoints ) );; gap> List( C, x -> Normalizer( G, Representative(x) ) );; gap> STOP_TEST( "cryst.tst", 10000 ); cryst/tst/wyckoff.tst0000644001325400021140000000062213554311016014403 0ustar gaehlerusergap> START_TEST( "Cryst: wyckoff.tst" ); gap> SetAssertionLevel(1); gap> List( [1..17], i -> Length( WyckoffPositions( SpaceGroupIT(2,i) ) ) ); [ 1, 5, 3, 1, 2, 9, 4, 3, 6, 4, 7, 4, 4, 5, 4, 4, 6 ] gap> List( [1..23], i -> Length( WyckoffPositions( SpaceGroupIT(3,10*i-3) ) ) ); [ 1, 5, 5, 4, 27, 5, 15, 4, 9, 11, 5, 9, 12, 8, 7, 4, 6, 14, 15, 6, 11, 8, 9 ] gap> STOP_TEST( "wyckoff.tst", 10000 ); cryst/tst/testall.g0000644001325400021140000000070114053147612014021 0ustar gaehleruserLoadPackage( "cryst" ); alltests := DirectoriesPackageLibrary( "cryst", "tst" ); # crystcat tests will only be run if crystcat is present exclude := ["crystcat.tst"]; if LoadPackage( "crystcat" ) = true then exclude := []; fi; TestDirectory( alltests, rec( exclude := exclude, exitGAP := true, testOptions := rec( compareFunction := "uptowhitespace") ) ); FORCE_QUIT_GAP(1); # if we ever get here, there was an error cryst/tst/manual.tst0000644001325400021140000001347015036140335014216 0ustar gaehlerusergap> START_TEST( "Cryst: manual.tst" ); gap> SetAssertionLevel(1); gap> S := SpaceGroupIT(3,222); SpaceGroupOnRightIT(3,222,'2') gap> L := MaximalSubgroupClassReps( S, rec( primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 3, 27, 125 ] gap> L := MaximalSubgroupClassReps( S, > rec( classequal := true, primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 27, 125 ] gap> L := MaximalSubgroupClassReps( S, > rec( latticeequal := true, primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 3 ] gap> L := MaximalSubgroupClassReps( S, rec( latticeequal := true ) );; gap> Length(L); 5 gap> List( L, IndexInParent ); [ 2, 2, 2, 3, 4 ] gap> P := Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]); Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]) gap> norm := [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], > [ 0, -1 ] ], [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ]; [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], [ 0, -1 ] ], [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ] gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > if not norm = GeneratorsOfGroup( NormalizerInGLnZ( P ) ) then > Error( "Cryst: NormalizerInGLnZ failed" ); > fi; > fi; gap> SpaceGroupsByPointGroupOnRight( P ); [ , , , ] gap> SpaceGroupsByPointGroupOnRight( P, norm ); [ , , ] gap> SpaceGroupsByPointGroupOnRight( P, norm, true ); [ [ ], [ , ], [ ] ] gap> if IsPackageMarkedForLoading( "CaratInterface", "" ) then > if not ( 3 = Length( SpaceGroupTypesByPointGroupOnRight( P ) ) and > [1,2,1] = List( SpaceGroupTypesByPointGroupOnRight( P, true ), Length ) ) > then > Error( "Cryst: NormalizerInGLnZ failed" ); > fi; > fi; gap> S := SpaceGroupIT(2,14); SpaceGroupOnRightIT(2,14,'1') gap> W := WyckoffPositions(S); [ < Wyckoff position, point group 1, translation := [ 0, 0 ], basis := [ ] > , < Wyckoff position, point group 1, translation := [ 1/3, 2/3 ], basis := [ ] > , < Wyckoff position, point group 1, translation := [ 2/3, 1/3 ], basis := [ ] > , < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] > , < Wyckoff position, point group 3, translation := [ 0, 0 ], basis := [ [ 1, 0 ], [ 0, 1 ] ] > ] gap> sub := Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]); Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]) gap> IsSubgroup( PointGroup( S ), sub ); true gap> WyckoffPositionsByStabilizer( S, sub ); [ < Wyckoff position, point group 1, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] > ] gap> ForAll( W, IsWyckoffPosition ); true gap> WyckoffBasis( W[4] ); [ [ 1, -1 ] ] gap> WyckoffTranslation( W[3] ); [ 2/3, 1/3 ] gap> WyckoffSpaceGroup( W[1] ); SpaceGroupOnRightIT(2,14,'1') gap> stab := WyckoffStabilizer( W[4] ); Group([ [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ] ]) gap> IsAffineCrystGroupOnRight( stab ); true gap> orb := WyckoffOrbit( W[4] ); [ < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ -2, -1 ] ] >, < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] >, < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, 2 ] ] > ] gap> Set(orb); [ < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ -2, -1 ] ] > ] gap> G := Group( (1,2,3), (2,3,4) ); Group([ (1,2,3), (2,3,4) ]) gap> H := Group( (1,2,3) ); Group([ (1,2,3) ]) gap> C := ColorGroup( G, H ); Group([ (1,2,3), (2,3,4) ]) gap> ColorSubgroup( C ) = H; true gap> ColorCosetList( C ); [ RightCoset(Group( [ (1,2,3) ] ),()), RightCoset(Group( [ (1,2,3) ] ),(1,2) (3,4)), RightCoset(Group( [ (1,2,3) ] ),(1,3)(2,4)), RightCoset(Group( [ (1,2,3) ] ),(1,4)(2,3)) ] gap> List( last, x -> ColorOfElement( C, Representative(x) ) ); [ 1, 2, 3, 4 ] gap> U := Subgroup( C, [(1,3)(2,4)] ); Group([ (1,3)(2,4) ]) gap> IsColorGroup( U ); true gap> ColorSubgroup( U ); Group(()) gap> ColorCosetList( U ); [ RightCoset(Group( () ),()), RightCoset(Group( () ),(1,3)(2,4)) ] gap> List( last, x -> ColorOfElement( U, Representative(x) ) ); [ 1, 3 ] gap> S := SpaceGroupIT( 2, 10 ); SpaceGroupOnRightIT(2,10,'1') gap> m := MaximalSubgroupClassReps( S, rec( primes := [2] ) ); [ , , ] gap> List( last, x -> TranslationBasis(x) = TranslationBasis(S) ); [ false, true, false ] gap> C := ColorGroup( S, m[1] );; IsColorGroup( PointGroup( C ) ); false gap> C := ColorGroup( S, m[2] );; IsColorGroup( PointGroup( C ) ); true gap> sub := MaximalSubgroupClassReps( S, rec( primes := [2] ) ); [ , , ] gap> List( sub, Size ); [ infinity, infinity, infinity ] gap> sub := Filtered( sub, s -> IndexInParent( s ) = 2 ); [ , , ] gap> Length( AffineInequivalentSubgroups( S, sub ) ); 2 gap> SpaceGroupSettingsIT( 3, 146 ); "hr" gap> SpaceGroupOnRightIT( 3, 146 ); SpaceGroupOnRightIT(3,146,'h') gap> SpaceGroupOnRightIT( 3, 146, 'r' ); SpaceGroupOnRightIT(3,146,'r') gap> STOP_TEST( "manual.tst", 10000 ); cryst/tst/crystcat.tst0000644001325400021140000000342115036140335014570 0ustar gaehlerusergap> START_TEST( "Cryst: crystcat.tst" ); gap> SetAssertionLevel(1); gap> S := SpaceGroupBBNWZ( 4, 29, 7, 2, 1 ); SpaceGroupOnRightBBNWZ( 4, 29, 7, 2, 1 ) gap> S := WyckoffStabilizer( WyckoffPositions(S)[1] ); gap> cl := ConjugacyClasses( S ); [ [ [ 1, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0 ], [ 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, -1, -1, -1, 0 ], [ 0, 1, 0, 1, 0 ], [ 1, 1, 0, 0, 0 ], [ 0, -1, 0, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, -1, 0, 0, 0 ], [ 0, 0, -1, -1, 0 ], [ 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, -1, 0, 0, 0 ], [ 0, 1, 0, 0, 0 ], [ 1, 1, 1, 1, 0 ], [ 0, -1, 0, -1, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, -1, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ], [ 0, 0, -1, -1, 0 ], [ 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0 ], [ 1, 0, 1, 0, 0 ], [ 0, 1, 0, 1, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ 0, -1, 0, -1, 0 ], [ 0, 1, 0, 0, 0 ], [ 1, 1, 1, 1, 0 ], [ -1, -1, 0, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ 0, -1, 0, -1, 0 ], [ 1, 1, 1, 1, 0 ], [ 0, 1, 0, 0, 0 ], [ -1, -1, 0, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G, [ [ -1, -1, -1, -1, 0 ], [ 0, 0, 1, 1, 0 ], [ 1, 0, 1, 0, 0 ], [ 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 1 ] ]^G ] gap> Size( cl[1] ); 1 gap> G := SpaceGroupBBNWZ( 4, 29, 7, 2, 1 ); SpaceGroupOnRightBBNWZ( 4, 29, 7, 2, 1 ) gap> H := MaximalSubgroupRepsTG( G )[4];; gap> C := ColorGroup( G, H ); gap> ColorPermGroup( C ); Group([ (2,4)(3,8)(5,6), (2,5,6,4)(3,7,8,9), (1,2,6)(3,7,5)(4,9,8), (1,3,8) (2,7,4)(5,9,6), (), (), (), () ]) gap> P := PointGroup( C );; Size( P );; P; gap> IsColorGroup( P ); true gap> STOP_TEST( "crystcat.tst", 10000 ); cryst/README0000644001325400021140000000421515064274357012265 0ustar gaehleruser The GAP 4 package Cryst, previously known as CrystGap, is the successor of the CrystGap package for GAP 3. During the porting process to GAP 4, large parts of the code have been rewritten, and the functionality has been extended considerably. Cryst provides a rich set of methods to compute with affine crystallographic groups, in particular space groups. In constrast to the GAP 3 version, affine crystallographic groups are now fully supported both in the representation acting from the right and in the representation acting from the left. The latter representation is the one preferred by crystallographers. There are also functions to determine representatives of all space group types of a given dimension. Cryst is implemented in the GAP 4 language, and runs on any system supporting GAP 4. This version requires at least GAP version 4.5. It is recommended, however, to use the most recent version of GAP. Certain commands may need other GAP packages such as CARAT or XGAP. Both CARAT and XGAP are available only under Unix. CARAT may be required by functions that need to know normalizers or conjugators of finite unimodular groups in GL(n,Z) (see the section on normalizers of the Cryst manual). The function WyckoffGraph needs the package XGAP. Cryst is distributed with GAP, and does not require any installation. It is loaded with the GAP command gap> LoadPackage( "cryst" ); Cryst has been developed by Bettina Eick, Institut Computational Mathematics, Fachbereich Mathematik und Informatik, Technische Universität Braunschweig, Pockelsstr. 14, D-38106 Braunschweig, Germany e-mail: beick@tu-bs.de Franz Gähler, Fakultät für Mathematik, Universität Bielefeld, Postfach 10 01 31, D-33501 Bielefeld, Germany e-mail: gaehler@math.uni-bielefeld.de Werner Nickel, Fachbereich Mathematik, AG2, Technische Universität Darmstadt, Schlossgartenstrasse 7, D-64289 Darmstadt, Germany e-mail: nickel@mathematik.tu-darmstadt.de For bug reports, suggestions and other comments please use the issue tracker on the GitHub page of the package: https://github.com/gap-packages/cryst/issues cryst/htm/0000755001325400021140000000000015064274357012173 5ustar gaehlerusercryst/htm/biblio.htm0000644001325400021140000000234515064274357014151 0ustar gaehlerusercryst : a GAP 4 package - References

cryst : a GAP 4 package - References

[BBNWZ78]
H. Brown, R. Bülow, J. Neubüser, H. Wondratschek, and H. Zassenhaus.
Crystallographic Groups of Four-Dimensional Space.
John Wiley, New York, 1978.
[EGN97]
F. G"ahler, B. Eick and W. Nickel.
Computing maximal subgroups and wyckoff positions of space groups.
Acta Cryst A 53, 467--474 (1997).
[Hah95]
T. Hahn, editor.
International Tables for Crystallography, Volume A, Space-group Symmetry, 4th Edition.
Kluwer, Dordrecht, 1995.
[Won95]
H. Wondratschek.
Introduction to space-group symmetry.
In Internation Tables for Crystallography, Vol. A Hah95, pages 711--735.

[Up]

cryst manual
September 2025
cryst/htm/chapters.htm0000644001325400021140000000106715064274357014522 0ustar gaehlerusercryst : a GAP 4 package - Chapters

cryst : a GAP 4 package - Chapters

  1. Introduction
  2. Affine crystallographic groups

cryst manual
September 2025
cryst/htm/theindex.htm0000644001325400021140000001627015064274357014523 0ustar gaehlerusercryst : a GAP 4 package - Index

cryst : a GAP 4 package - Index

_ A C I M N P S T W

_

\^, for an noexpand`AffineCrystGroup' 2.4

A

AddTranslationBasis 2.3.3
Affine crystallographic groups 2.0
AffineCrystGroup 2.1.7
AffineCrystGroupOfPointGroup 2.2.3
AffineCrystGroupOnLeft 2.1.4
AffineCrystGroupOnRight 2.1.1
AffineInequivalentSubgroups 2.8.5
AffineNormalizer 2.8.4
AsAffineCrystGroup 2.1.8
AsAffineCrystGroupOnLeft 2.1.5
AsAffineCrystGroupOnRight 2.1.2

C

CentralizerPointGroupInGLnZ 2.8.2
CheckTranslationBasis 2.3.4
Color groups 2.9
ColorCosetList 2.9.4
Colored AffineCrystGroups 2.10
ColorGroup 2.9.1
ColorHomomorphism 2.9.7
colorings, inequivalent, for space group 2.10
ColorOfElement 2.9.5
ColorPermGroup 2.9.6
ColorSubgroup 2.9.3
ConjugacyClassesMaximalSubgroups, for an `AffineCrystGroup' 2.5.2
ConjugatorSpaceGroups 2.8.6
Construction 2.1
construction, of an AffineCrystGroup 2.1
cryst 1.0

I

InternalBasis 2.3.2
International Tables 2.11
Introduction 1.0
IsAffineCrystGroup 2.1.9
IsAffineCrystGroupOnLeft 2.1.6
IsAffineCrystGroupOnRight 2.1.3
IsColorGroup 2.9.2
IsomorphismFpGroup, for a `PointGroup' 2.4.2
IsomorphismFpGroup, for an `AffineCrystGroup' 2.4.3
IsomorphismPcpGroup, for a `PointGroup' 2.4.4
IsomorphismPcpGroup, for an `AffineCrystGroup' 2.4.5
IsPointGroup 2.2.2
IsPointHomomorphism 2.2.5
IsSpaceGroup 2.3.5
IsStandardAffineCrystGroup 2.3.6
IsStandardSpaceGroup 2.3.7
IsSymmorphicSpaceGroup 2.3.9
IsWyckoffPosition 2.7.3

M

Maximal subgroups 2.5
maximal subgroups, for an AffineCrystGroups 2.5
MaximalSubgroupClassReps, for an `AffineCrystGroup' 2.5.1
methods, for an AffineCrystGroup 2.4

N

normalizer, in affine group 2.8
normalizer, in translation group 2.8
normalizer, of an AffineCrystGroup 2.8
NormalizerPointGroupInGLnZ 2.8.1
Normalizers 2.8

P

Point group 2.2
point group, of an AffineCrystGroup 2.2
PointGroup 2.2.1
PointGroup, for a colored `AffineCrystGroup' 2.10.1
PointHomomorphism 2.2.4
power, for an `AffineCrystGroup' 2.4.1

S

SetCrystGroupDefaultAction 2.0
Space groups with a given point group 2.6
space groups, for given point group 2.6
SpaceGroupIT 2.11.4
SpaceGroupOnLeftIT 2.11.3
SpaceGroupOnRightIT 2.11.2
SpaceGroupsByPointGroup 2.6.5
SpaceGroupsByPointGroupOnLeft 2.6.3
SpaceGroupsByPointGroupOnRight 2.6.1
SpaceGroupSettingsIT 2.11.1
SpaceGroupTypesByPointGroupOnLeft 2.6.6
SpaceGroupTypesByPointGroupOnRight 2.6.2
Special methods 2.4
StandardAffineCrystGroup 2.3.8
Subgroup, for color groups 2.9.8
subgroups, maximal, for an AffineCrystGroup 2.5

T

Translation lattice 2.3
translation lattice, of an AffineCrystGroup 2.3
TranslationBasis 2.3.1
TranslationNormalizer 2.8.3
TransposedMatrixGroup 2.1.10

W

Wyckoff positions 2.7
WyckoffBasis 2.7.4
WyckoffGraph 2.7.9
WyckoffOrbit 2.7.8
WyckoffPositions 2.7.1
WyckoffPositionsByStabilizer 2.7.2
WyckoffSpaceGroup 2.7.6
WyckoffStabilizer 2.7.7
WyckoffTranslation 2.7.5

[Up]

cryst manual
September 2025
cryst/htm/CHAP001.htm0000644001325400021140000001003415064274357013637 0ustar gaehleruser[cryst] 1 Introduction [Up] [Next] [Index]

1 Introduction

The Cryst package, previously known as CrystGAP, provides functions for the computation with affine crystallographic groups, in particular space groups. For the definition of the standard crystallographic notions we refer to the International Tables Hah95, in particular the chapter by Wondratschek Won95, and to the introductory chapter in BBNWZ78. The principal algorithms used in this package are described in EGN97.

The present version for GAP 4 has been considerably reworked from an earlier version for GAP 3.4.4. Most of the porting to GAP 4 has been done by Franz Gähler. Besides affine crystallographic groups acting from the right, also affine crystallographic groups acting from the left are now fully supported. Many algorithms have been added, extended, or improved in other ways.

Our warmest thanks go the Max Neunhöffer, whose extensive testing of the GAP 4 version of Cryst in connection with XGAP uncovered several bugs and led to many performance improvements.

Cryst is implemented in the GAP 4 language, and runs on any system supporting GAP 4. However, certain commands may require that other GAP packages such as CaratInterface or XGAP are installed. In particular, the routines in Section Normalizers are likely to require CaratInterface, and the function WyckoffGraph (see WyckoffGraph) requires XGAP. Both CaratInterface and XGAP may be available only under Unix.

The Cryst package is loaded with the command

gap> LoadPackage( "cryst" ); 
true

Cryst has been developed by

Bettina Eick
Fachbereich Mathematik und Informatik
Technische Universität Braunschweig
Pockelsstr. 14, D-38106 Braunschweig, Germany
e-mail: b.eick@tu-bs.de

Franz Gähler
Fakultät für Mathematik, Universität Bielefeld
Postfach 10 01 31, D-33501 Bielefeld, Germany
e-mail: gaehler@math.uni-bielefeld.de

Werner Nickel
Fachbereich Mathematik, AG2, Technische Universität Darmstadt,
Schlossgartenstraße 7, D-64289 Darmstadt, Germany
e-mail: nickel@mathematik.tu-darmstadt.de

For bug reports, suggestions and comments please please use the issue tracker on GitHub:

https://github.com/gap-packages/Cryst/issues/

[Up] [Next] [Index]

cryst manual
September 2025
cryst/htm/CHAP002.htm0000644001325400021140000013472415064274357013655 0ustar gaehleruser[cryst] 2 Affine crystallographic groups [Up] [Previous] [Index]

2 Affine crystallographic groups

Sections

  1. Construction
  2. Point group
  3. Translation lattice
  4. Special methods
  5. Maximal subgroups
  6. Space groups with a given point group
  7. Wyckoff positions
  8. Normalizers
  9. Color groups
  10. Colored AffineCrystGroups
  11. International Tables

An affine crystallographic group G is a subgroup of the group of all Euclidean motions of d-dimensional space, with the property that its subgroup T of all pure translations is a discrete normal subgroup of finite index. If the rank of the translation subgroup T is d, G is called a space group. The quotient G/T is called the point group of G.

In this package, affine crystallographic groups are represented as groups of augmented matrices of dimension d+1. Most functions assume a group of rational matrices, but some may also work with cyclotomic matrix groups. In particular, it is possible to compute the translation basis of an affine crystallographic group given in a cyclotomic representation, and to pass to a rational representation by conjugating with that basis. Further functionality for cyclotomic crystallographic groups is currently not guaranteed.

Augmented matrices can take one of two forms. Matrices of the form

                     [ M 0 ]
                     [ t 1 ]
act from the right on row vectors (x,1). Such a matrix is said to be an affine matrix acting on the right. Since in GAP all groups act from the right, this is the preferred representation of an affine transformation.

The second representation of affine transformations is by augmented matrices of the form

                     [ M t ]
                     [ 0 1 ]
which act from the left on column vectors (x,1). Such matrices are said to be affine matrices acting on the left. This is the representation usually adopted by crystallographers.

Cryst supports affine crystallographic groups in both representations. Every affine crystallographic group is constructed in one of these two representations.

Affine crystallographic groups in different representations should never be mixed, however. It is recommended to adopt one of the two representations, and then to stick to that decision. In order to facilitate this, there is a global variable CrystGroupDefaultAction, whose value is either RightAction or LeftAction. The initial value is RightAction, but this can be changed with

  • SetCrystGroupDefaultAction( action ) F

    where action must be either RightAction or LeftAction. Constructor functions without explicit representation qualifier then will construct an affine crystallographic group in the representation specified by CrystGroupDefaultAction.

    2.1 Construction

  • AffineCrystGroupOnRight( gens ) F
  • AffineCrystGroupOnRight( genlist ) F
  • AffineCrystGroupOnRight( genlist, identity ) F

    returns the matrix group generated by gens or genlist, which must be affine matrices acting on the right, as affine crystallographic group acting on the right. An already existing group S of affine matrices acting on the right can be converted to an affine crystallographic group acting on the right with

  • AsAffineCrystGroupOnRight( S ) F

    The property

  • IsAffineCrystGroupOnRight( S ) P

    is true exactly for those groups which have been constructed in the above two ways.

  • AffineCrystGroupOnLeft( gens ) F
  • AffineCrystGroupOnLeft( genlist ) F
  • AffineCrystGroupOnLeft( genlist, identity ) F

    returns the matrix group generated by gens or genlist, which must be affine matrices acting on the left, as affine crystallographic group acting on the left. An already existing group S of affine matrices acting on the left can be converted to an affine crystallographic group acting on the left with

  • AsAffineCrystGroupOnLeft( S ) F

    The property

  • IsAffineCrystGroupOnLeft( S ) P

    is true exactly for those groups which have been constructed in the above two ways.

    It is recommended to adopt one representation for affine crystallographic groups, and then to stick to it. To facilitate this, routines are provided which assume a default representation.

  • AffineCrystGroup( gens ) F
  • AffineCrystGroup( genlist ) F
  • AffineCrystGroup( genlist, identity ) F

    calls AffineCrystGroupOnRight or AffineCrystGroupOnLeft with the same arguments, depending on the value of CrystGroupDefaultAction.

  • AsAffineCrystGroup( S ) F

    calls AsAffineCrystGroupOnRight or AsAffineCrystGroupOnLeft with the same argument, depending on the value of CrystGroupDefaultAction.

  • IsAffineCrystGroup( S ) F

    calls IsAffineCrystGroupOnRight or IsAffineCrystGroupOnLeft with the same argument, depending on the value of CrystGroupDefaultAction.

  • TransposedMatrixGroup( S ) A

    returns the transpose of the affine crystallographic group S. If S is acting on the right, its transpose is acting on the left, and vice versa.

    2.2 Point group

    The point group P of an affine crystallographic group S is the quotient S/T, where T is the normal subgroup of all pure translations. P is isomorphic to the group generated by the linear parts of all affine matrices contained in S. In Cryst this latter group is identified with the point group of S.

  • PointGroup( S ) A

    returns the point group of S.

  • IsPointGroup( P ) P

    returns true if and only if P has been constructed as the point group of an affine crystallographic group S.

  • AffineCrystGroupOfPointGroup( P ) A

    returns the affine crystallographic group S, from which P has been constructed.

  • PointHomomorphism( S ) A

    returns a homomorphism from the affine crystallographic group to its point group.

  • IsPointHomomorphism( H ) P

    returns true if and only if H has been constructed as the PointHomomorphism of an affine crystallographic group.

    2.3 Translation lattice

    The vectors by which the pure translations in an affine crystallographic group translate form a discrete lattice, L, called the translation lattice of S.

  • TranslationBasis( S ) A

    returns a basis of the translation lattice of S. The basis returned is unique for the translation lattice.

  • InternalBasis( S ) A

    returns a basis used internally for many computations. It consists of the translation basis B of S, extended by further standard basis vectors if B has not full rank.

    If a generating set B of the translation lattice of S is known from somewhere, this knowledge can be added to S with

  • AddTranslationBasis( S, B ) F

    This function must do further work, so that SetTranslationBasis cannot be used for this purpose. If doubts arise about the correctness of the translation basis that has been added by hand, one can check the correctness of the stored value with

  • CheckTranslationBasis( S ) F

    An affine crystallographic group S acting on d-dimensional Euclidean space is called a space group if its translation lattice has rank d.

  • IsSpaceGroup( S ) P

    tests if the affine crystallographic group S is a space group.

    Since many computations are done internally in the InternalBasis of S, we say that S is in standard form if the InternalBasis is the standard basis of Euclidean row space or column space, respectively. This means that the translation lattice is generated by the first k standard basis vectors, where k is the rank of the translation lattice.

  • IsStandardAffineCrystGroup( S ) P

    checks if S is in standard form.

  • IsStandardSpaceGroup( S ) P

    checks if S is a space group in standard form.

  • StandardAffineCrystGroup( S ) F

    returns a conjugate of S which is in standard form.

    If an space group is a semi-direct product of its point group with its translation subgroup, S is said to be symmorphic.

  • IsSymmorphicSpaceGroup( S ) P

    checks if the space group S is symmorphic.

    2.4 Special methods

    In the representation by augmented matrices, affine crystallographic groups are infinite matrix groups. Their infinity is relatively trivial in the sense that they have an abelian normal subgroup of finite index. Nevertheless, for many operations special methods have to be installed that avoid to attempt algorithms that never finish. These methods all make essential use of the exactness of the sequence of homomorphism 0 -> T -> S -> P -> 1, where T is the translation subgroup of S, and P its point group.

    All operations for general groups that make sense for affine crystallographic groups should work also in that case. In particular, there should be no restrictions for finite AffineCrystGroups. For infinite groups, some restrictions apply, however. For instance, algorithms from the orbit-stabilizer family can work only if the orbits generated are finite. Note, however, that Normalizer, Centralizer and RepresentativeAction in an AffineCrystGroup work even if the corresponding orbit is infinite.

    Some methods installed for affine crystallographic groups have a special behavior.

  • \^( S, conj )

    If S is an AffineCrystGroupOnRight, the group conj^-1 S conj is returned. conj must be an affine matrix acting on the right. If S is an AffineCrystGroupOnLeft, the group conj S conj^-1 is returned. conj must be an affine matrix acting on the left.

  • IsomorphismFpGroup( P ) A

    returns an isomorphism from the PointGroup P to an isomorphic FpGroup F. If P is solvable, F is given in a power-commutator presentation.

  • IsomorphismFpGroup( S ) A

    returns an isomorphism from the AffineCrystGroup S to an isomorphic FpGroup F. If S is solvable, F is given in a power-commutator presentation. The presentation of F is an extension of the presentation of the point group P of S used in IsomorphismFpGroup( P ).

    If the package polycyclic is installed, Cryst automatically loads it, and then provides special methods for IsomorphismPcpGroup.

  • IsomorphismPcpGroup( P ) A

    with P a solvable PointGroup, returns an isomorphism from P to an isomorphic PcpGroup pcp. For details about PcpGroups, we refer to the documentation of the package polycyclic.

  • IsomorphismPcpGroup( S ) A

    with S a solvable AffineCrystGroup (i.e., one with a solvable PointGroup), returns an isomorphism from S to an isomorphic PcpGroup pcp. The presentation of pcp is an extension of the presentation of the point group P of S used in IsomorphismPcpGroup( P ).

    2.5 Maximal subgroups

    Since an AffineCrystGroup has infinitely many maximal subgroups in general, in the computation of maximal subgroups it must be further specified which maximal subgroups are desired. Recall that a maximal subgroup of an AffineCrystGroup is either latticeequal or classequal. A latticeequal subgroup has the same translation lattice as the parent, while a classequal subgroup has the same point group as the parent. In the classequal case a maximal subgroup always has prime-power index, whereas in the latticeequal case this is so only in dimensions up to 3.

  • MaximalSubgroupClassReps( S, flags ) O

    returns a list of conjugacy class representatives of maximal subgroups of the AffineCrystGroup S.

  • ConjugacyClassesMaximalSubgroups( S, flags ) O

    returns a list of conjugacy classes of maximal subgroups of the AffineCrystGroup S.

    In these two functions, the argument flags specifies which maximal subgroups are computed. flags is a record which may have the following components:

    flags.primes := [p1 .. pr]
    only maximal subgroups of p-power index for the given primes p are computed

    flags.latticeequal := true
    only latticeequal maximal subgroups are computed

    flags.classequal := true
    only classequal maximal subgroups are computed

    flags.latticeequal and flags.classequal must not both be bound and true. flags.primes may be omitted only if flags.latticeequal is bound and true.

    gap> S := SpaceGroupIT(3,222);
    SpaceGroupOnRightIT(3,222,'2')
    gap> L := MaximalSubgroupClassReps( S, rec( primes := [3,5] ) );;
    gap> List( L, IndexInParent );
    [ 3, 27, 125 ]
    gap> L := MaximalSubgroupClassReps( S,             
    >                  rec( classequal := true, primes := [3,5] ) );;
    gap> List( L, IndexInParent );                                                 
    [ 27, 125 ]
    gap> L := MaximalSubgroupClassReps( S,
    >                  rec( latticeequal := true, primes := [3,5] ) );;
    gap> List( L, IndexInParent );                                       
    [ 3 ]
    gap> L := MaximalSubgroupClassReps( S, rec( latticeequal := true ) );;
    gap> Length(L);
    5
    gap> List( L, IndexInParent );                                       
    [ 2, 2, 2, 3, 4 ]
    

    2.6 Space groups with a given point group

  • SpaceGroupsByPointGroupOnRight( P ) O
  • SpaceGroupsByPointGroupOnRight( P, norm ) O
  • SpaceGroupsByPointGroupOnRight( P, norm, orbsflag ) O

    where P is any finite subgroup of GL(d,Z), returns a list of all space groups (acting on the right) with point group P, up to conjugacy in the full translation group of Euclidean space. All these space groups are returned as AffineCrystGroupOnRight in standard representation. If a second argument is present, which must be a list of elements of the normalizer of P in GL(d,Z), only space groups inequivalent under conjugation with these elements are returned. If these normalizer elements, together with P, generate the full normalizer of P in GL(d,Z), then exactly one representative of each space group type is obtained. If the third argument orbsflag, which must be false or true, is also present and true, all space groups up to conjugacy in the full translation group are returned, but these space groups are collected into orbits under the conjugation action with elements from norm.

    gap> P := Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]);
    Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ])
    gap> norm := GeneratorsOfGroup( NormalizerInGLnZ( P ) );
    [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], [ 0, -1 ] ],
      [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ]
    gap> SpaceGroupsByPointGroupOnRight( P );
    [ <matrix group with 4 generators>, <matrix group with 4 generators>, 
      <matrix group with 4 generators>, <matrix group with 4 generators> ]
    gap> SpaceGroupsByPointGroupOnRight( P, norm );
    [ <matrix group with 4 generators>, <matrix group with 4 generators>, 
      <matrix group with 4 generators> ]
    gap> SpaceGroupsByPointGroupOnRight( P, norm, true );
    [ [ <matrix group with 4 generators> ], 
      [ <matrix group with 4 generators>, <matrix group with 4 generators> ], 
      [ <matrix group with 4 generators> ] ]
    

  • SpaceGroupTypesByPointGroupOnRight( P ) O
  • SpaceGroupTypesByPointGroupOnRight( P, orbsflag ) O

    returns a list of space group type representatives (acting on the right) of the point group P. As in the case of SpaceGroupsByPointGroupOnRight, if the boolean argument orbsflag is present and true, not only space group type representatives, but all space groups up to conjugacy in the full translation group are returned. These are then collected into lists of space groups of the same space group type.

    gap> SpaceGroupTypesByPointGroupOnRight( P );
    [ <matrix group with 4 generators>, <matrix group with 4 generators>, 
      <matrix group with 4 generators> ]
    gap> SpaceGroupTypesByPointGroupOnRight( P, true );
    [ [ <matrix group with 4 generators> ], 
      [ <matrix group with 4 generators>, <matrix group with 4 generators> ], 
      [ <matrix group with 4 generators> ] ]
    

  • SpaceGroupsByPointGroupOnLeft( P ) O
  • SpaceGroupsByPointGroupOnLeft( P, norm ) O
  • SpaceGroupsByPointGroupOnLeft( P, norm, orbsflag ) O

    works the same way as SpaceGroupsByPointGroupOnRight, except that the space groups acting from the left are returned.

  • SpaceGroupTypesByPointGroupOnLeft( P ) O
  • SpaceGroupTypesByPointGroupOnLeft( P, orbsflag ) O

    works the same way as SpaceGroupTypesByPointGroupOnRight, except that the space groups acting from the left are returned.

  • SpaceGroupsByPointGroup( P ) O
  • SpaceGroupsByPointGroup( P, norm ) O
  • SpaceGroupsByPointGroup( P, norm, orbsflag ) O

    calls SpaceGroupByPointGroupOnRight or SpaceGroupByPointGroupOnLeft with the same arguments, depending on the value of CrystGroupDefaultAction.

  • SpaceGroupTypesByPointGroupOnLeft( P ) O
  • SpaceGroupTypesByPointGroupOnLeft( P, orbsflag ) O

    calls either SpaceGroupTypesByPointGroupOnRight or SpaceGroupTypesByPointGroupOnLeft with the same arguments, depending on the variable CrystGroupDefaultAction.

    2.7 Wyckoff positions

    A Wyckoff position of a space group S is an equivalence class of points in Euclidean space, having stabilizers which are conjugate subgroups of S. Apart from a subset of lower dimension, which contains points with even bigger stabilizers, a Wyckoff position consists of an S-orbit of some affine subspace A. In Cryst, a Wyckoff position W is specified by such a representative affine subspace.

  • WyckoffPositions( S ) A

    returns the list of Wyckoff positions of the space group S.

    gap> S := SpaceGroupIT(2,14);
    SpaceGroupOnRightIT(2,14,'1')
    gap> W := WyckoffPositions(S);
    [ < Wyckoff position, point group 1, translation := [ 0, 0 ], 
        basis := [  ] >
        , < Wyckoff position, point group 1, translation := [ 1/3, 2/3 ], 
        basis := [  ] >
        , < Wyckoff position, point group 1, translation := [ 2/3, 1/3 ], 
        basis := [  ] >
        , < Wyckoff position, point group 2, translation := [ 0, 0 ], 
        basis := [ [ 1, -1 ] ] >
        , < Wyckoff position, point group 3, translation := [ 0, 0 ], 
        basis := [ [ 1, 0 ], [ 0, 1 ] ] >
         ]
    

    In the previous example, S has three kinds of special points (the basis is empty), whose representatives all have a stabilizer with the a point group in the same conjugacy class (with label 1), one kind of special line (the basis has length 1), and the general position.

  • WyckoffPositionsByStabilizer( S, sub ) O

    where S is a space group and sub a subgroup of the point group or a list of such subgroups, determines only the Wyckoff positions whose representatives have a stabilizer with a point group conjugate to the subgroup sub or to a subgroup contained in the list sub, respectively.

    gap> sub := Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]);
    Group([ [ [ 0, -1 ], [ -1, 0 ] ] ])
    gap> IsSubgroup( PointGroup( S ), sub );
    true
    gap> WyckoffPositionsByStabilizer( S, sub );
    [ < Wyckoff position, point group 1, translation := [ 0, 0 ], 
        basis := [ [ 1, -1 ] ] >
         ]
    

  • IsWyckoffPosition( obj ) R

    checks whether obj is a Wyckoff position.

    gap> ForAll( W, IsWyckoffPosition );
    true
    

  • WyckoffBasis( W ) O

    returns a basis of the representative affine subspace of the Wyckoff position W.

    gap> WyckoffBasis( W[4] );
    [ [ 1, -1 ] ]
    

  • WyckoffTranslation( W ) O

    returns a point of the representative affine subspace of the Wyckoff position W.

    gap> WyckoffTranslation( W[3] );
    [ 2/3, 1/3 ]
    

  • WyckoffSpaceGroup( W ) O

    returns the space group of which W is a Wyckoff position.

    gap> WyckoffSpaceGroup( W[1] );
    SpaceGroupOnRightIT(2,14,'1')
    

  • WyckoffStabilizer( W ) O

    returns the stabilizer of the (generic) points in the representative affine subspace of the Wyckoff position W. This stabilizer is a subgroup of the space group of W, and thus an AffineCrystGroup.

    gap> stab := WyckoffStabilizer( W[4] );
    Group([ [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ] ])
    gap> IsAffineCrystGroupOnRight( stab );
    true
    

  • WyckoffOrbit( W ) O

    determines the orbit of the representative affine subspace A of the Wyckoff position W under the space group S of W (modulo lattice translations). The affine subspaces in this orbit are then converted into a list of Wyckoff positions, which is returned. The Wyckoff positions in this list are just different representations of W. Their WyckoffBasis and WyckoffTranslation are chosen such that the induced parametrizations of their representative subspaces are mapped onto each other under the space group operation.

    gap> orb := WyckoffOrbit( W[4] );
    [ < Wyckoff position, point group 2, translation := [ 0, 0 ], 
        basis := [ [ -2, -1 ] ] >
        , < Wyckoff position, point group 2, translation := [ 0, 0 ], 
        basis := [ [ 1, -1 ] ] >
        , < Wyckoff position, point group 2, translation := [ 0, 0 ], 
        basis := [ [ 1, 2 ] ] >
         ]
    gap> Set(orb);
    [ < Wyckoff position, point group 2, translation := [ 0, 0 ], 
        basis := [ [ -2, -1 ] ] >
         ]
    

  • WyckoffGraph( W [, def ] ) O
  • WyckoffGraph( S [, def ] ) O

    displays the incidence relations of a set of Wyckoff positions graphically. This function is available only under XGAP. In the first form, W is a list of Wyckoff positions, which must belong to the same space group. In the second form, S is a space group; in this case, the function is applied to the complete list of Wyckoff positions of S. In both forms, a second argument, def, is possible, which is a record with optional components title, width and height, specifying the title, width and height of the graphic sheet on which the graph will be displayed.

    Each vertex of the graph represents a Wyckoff position. Vertices are arranged in horizontal layers, determined by the dimension s of the Wyckoff position and the size s of its stabilizer. For each layer, the list [ d, s ] is displayed at the right border of the graphic sheet. The vertical positions of the layers are ordered according to the dimension of the Wyckoff position (primary criterion, smaller dimension above) and the size of the stabilizer (secondary criterion, bigger stabilizer above). Two Wyckoff positions are connected if the closure of the lower one contains the upper one. Two Wyckoff positions are connected by a line only if there is no Wyckoff position in between. The connection line is labelled with the number of affine subspaces contained in the lower Wyckoff position that contain a fixed representative affine subspace of the upper Wyckoff position. For instance, if the lower Wyckoff position consists of a space group orbit of lines (and thus the upper one of an orbit of points), the label of the connection line is the number of lines in the orbit which cross a fixed representative point of the upper Wyckoff position.

    The initial layout of the graph is not always optimal. In particular, several connection lines can be drawn on top of each other, so that it is not easy to see who is connected with whom. With the left mouse button, the graph can be rearranged, however. Just drag each vertex to a more suitable place. Note, however, that a vertex can not leave its layer. For more details, please consult the XGAP manual.

    By right-clicking on a vertex, a popup menu with information on the Wyckoff position of that vertex appears. It informs on the size of the WyckoffStabilizer, the dimension of the Wyckoff position, the length of the WyckoffOrbit (modulo lattice translations), the translation and basis of a representative affine subspace, the isomorphims type of the WyckoffStabilizer, and the ConjugacyClassInfo of the point group P of the WyckoffStabilizer. The ConjugacyClassInfo lists for each conjugacy class of elements of P the number of that class, the order, trace and determinant of its elements, and the size of the class. This information is useful to identify the geometric operation of the stabilizer. The isomorphism type and ConjugacyClassInfo may not be displayed initially. It this case, they can be obtained by left-clicking on them, or by left-clicking on the button labelled all. Unfortunately, the popup window cannot be resized automatically, and since the ConjugacyClassInfo needs several lines for the display, the information may be hidden behind the border of the window. You will have to use the slider of the popup window to make it visible, or resize the window with the help of your window manager. Alternatively, you can right-click again on the same vertex, in which case a new popup window of sufficient size appears.

    2.8 Normalizers

    At present, most of the functions in this section require that the GAP package CaratInterface is installed (and compiled). Otherwise, they are available only for space groups from the crystallographic groups catalogue or the International Tables (section International Tables).

  • NormalizerPointGroupInGLnZ( P ) A

    returns the normalizer of the PointGroup P in the group of all unimodular transformations of the lattice spanned by the InternalBasis B of the AffineCrystGroup S of P. If S is in standard representation, this is the same as Normalizer( GL(dim,Integers), P ), otherwise it is Normalizer( GL(dim,Integers), P^(B^-1) )^B. This notion probably makes sense only if S is a space group. Note that P must have elements with integer entries (which is the case if S is a space group).

  • CentralizerPointGroupInGLnZ( P ) A

    returns the centralizer of the PointGroup P in the group of all unimodular transformations of the lattice spanned by the InternalBasis B of the AffineCrystGroup S of P. If S is in standard representation, this is the same as Centralizer( GL(dim,Integers), P ), otherwise it is Centralizer( GL(dim,Integers), P^(B^-1) )^B. This notion probably makes sense only if S is a space group. Note that P must have elements with integer entries (which is the case if S is a space group).

  • TranslationNormalizer( S ) F

    returns the normalizer of the space group S in the full translation group. At present, this function is implemented only for space groups, not for general AffineCrystGroups. The translation normalizer TN of S may contain a continuous subgroup C. A basis of the space of such continuous translations is bound in TN!.continuousTranslations. Since this subgroup is not finitely generated, it is not contained in the group generated by GeneratorsOfGroup( TN ). Properly speaking, the translation normalizer is the span of TN and C together.

  • AffineNormalizer( S ) F

    returns the affine normalizer of the space group S. The affine normalizer AF contains the translation normalizer as a subgroup. Similarly as with TranslationNormalizer, the subgroup C of continuous translations, which is not finitely generated, is not part of the group that is returned. However, a basis of the space of continuous translations is bound in the component AF!.continuousTranslations.

  • AffineInequivalentSubgroups( S, sub ) F

    takes as input a space group S and list of subgroups of S, and returns a sublist of affine inequivalent subgroups. Note that the affine normalizer of S must be discrete in the current implementation. If it is not, fail is returned.

    For two space groups S1 and S2 of the same dimension (and acting from the same side),

  • ConjugatorSpaceGroups( S1, S2 ) F

    returns an affine matrix m such that S1^m = S2, of fail if no such matrix exists, i.e., if the two space groups are not equivalent. This function requires that the GAP package CaratInterface is installed (and compiled).

    2.9 Color groups

    A color group C is a group whose elements are colored in the following way. The elements having the same color as the identity element One(C) form a subgroup H of finite index n. H is called the ColorSubgroup of C. Elements of C have the same color if and only if they are in the same right coset of H in C. The labelling of the colors, which runs from 1 to n, is determined by a fixed labelling of the right cosets of H. The list of right cosets of H is stored in the attribute ColorCosetList. The color of the elements of a coset corresponds to the position of the coset in that list. Elements of H by definition have color 1, i.e., the coset with representative One(C) is always the first element of the ColorCosetList of C. Color groups which have a parent inherit their coloring from that parent, including the labelling of the colors. As with other groups, color groups having no parent are their own parent.

    Right multiplication by a fixed element g of C induces a permutation p(g) of the colors of the parent of C. This defines a natural homomorphism of C into the symmetric group of degree n. The image of this homomorphism is called the ColorPermGroup of C, and the homomorphism to it is called the ColorHomomorphism of C.

  • ColorGroup( G, H ) F

    constructs a colored copy of G, with color subgroup H (which should have finite index in G). Color groups constructed in this way are always their own parent. It is not possible to set their parent attribute to a different value.

    Groups which may be colored include, in particular, AffineCrystGroups, but coloring of any finite group should work as well.

  • IsColorGroup( G ) P

    checks whether G is a color group.

  • ColorSubgroup( G ) A

    returns the color subgroup of G.

  • ColorCosetList( G ) A

    returns the color labelling cosets of G.

  • ColorOfElement( G, elem ) F

    returns the color of an element of G.

  • ColorPermGroup( G ) A

    returns the ColorPermGroup of G, which is the permutation group induced by G acting on the colors of the parent of G.

  • ColorHomomorphism( G ) A

    returns the homomomorphism from G to its ColorPermGroup.

  • Subgroup( C, elems ) O

    where C is a color group, returns the colored subgroup U of C generated by elems. The parent of U is set to the parent of C, from which the coloring of U is inherited.

    gap> G := Group(  (1,2,3), (2,3,4) );
    Group([ (1,2,3), (2,3,4) ])
    gap> H := Group( (1,2,3) ); 
    Group([ (1,2,3) ])
    gap> C := ColorGroup( G, H );
    Group([ (1,2,3), (2,3,4) ])
    gap> ColorSubgroup( C ) = H;
    true
    gap> ColorCosetList( C );
    [ RightCoset(Group( [ (1,2,3) ] ),()), RightCoset(Group( [ (1,2,3) ] ),(1,2)
        (3,4)), RightCoset(Group( [ (1,2,3) ] ),(1,3)(2,4)), 
      RightCoset(Group( [ (1,2,3) ] ),(1,4)(2,3)) ]
    gap> List( last, x -> ColorOfElement( C, Representative(x) ) );
    [ 1, 2, 3, 4 ]
    gap> U := Subgroup( C, [(1,3)(2,4)] );
    Group([ (1,3)(2,4) ])
    gap> IsColorGroup( U );
    true
    gap> ColorSubgroup( U );
    Group(())
    gap> ColorCosetList( U );
    [ RightCoset(Group( () ),()), RightCoset(Group( () ),(1,3)(2,4)) ]
    gap> List( last, x -> ColorOfElement( U, Representative(x) ) );
    [ 1, 3 ]
    

    2.10 Colored AffineCrystGroups

    If C is a colored AffineCrystGroup whose ColorSubgroup is lattice-equal (translationengleich) with C, then the PointGroup of C can consistently be colored. In that case,

  • PointGroup( C ) A

    returns a colored point group. Otherwise, the PointGroup of C is an ordinary, uncolored group.

    gap> S := SpaceGroupIT( 2, 10 );                                  
    SpaceGroupOnRightIT(2,10,'1')
    gap> m := MaximalSubgroupClassReps( S, rec( primes := [2] ) );    
    [ <matrix group with 4 generators>, <matrix group with 3 generators>, 
      <matrix group with 4 generators> ]
    gap> List( last, x -> TranslationBasis(x) = TranslationBasis(S) );
    [ false, true, false ]
    gap> C := ColorGroup( S, m[1] );; IsColorGroup( PointGroup( C ) );
    false
    gap> C := ColorGroup( S, m[2] );; IsColorGroup( PointGroup( C ) );
    true
    

    Two colorings of a space group S are equivalent if the two ColorSubgroups are conjugate in the affine normalizer of S. For instance, a list of inequivalent index-2 ColorSubgroups of S can be obtained with the following code:

    gap> sub := MaximalSubgroupClassReps( S, rec( primes := [2] ) );
    [ <matrix group with 4 generators>, <matrix group with 3 generators>, 
      <matrix group with 4 generators> ]
    gap> List( sub, Size );
    [ infinity, infinity, infinity ]
    gap> sub := Filtered( sub, s -> IndexInParent( s ) = 2 );
    [ <matrix group of size infinity with 4 generators>, 
      <matrix group of size infinity with 3 generators>, 
      <matrix group of size infinity with 4 generators> ]
    gap> Length( AffineInequivalentSubgroups( S, sub ) );
    2
    

    Note that AffineInequivalentSubgroups requires the GAP package CaratInterface to be installed. Otherwise, this function is supported only for AffineCrystGroups constructed from the crystallographic groups catalog.

    2.11 International Tables

    For the user's convenience, a table with the 17 plane groups and the 230 space groups is included in Cryst. These groups are given in exactly the same settings (i.e., choices of basis and origin) as in the International Tables. Space groups with a centered lattice are therefore given in the non-primitive basis crystallographers are used to. This is in contrast to the crystallographic groups catalogue, where always a primitive basis is used.

    For some of the 3D space groups, two different settings are available. The possible settings are labelled with the characters '1', '2','b','c','h' and 'r'. If only one setting is available, it is labelled '1'. For some space groups there exists a point with higher symmetry than the origin of the '1' setting. In such cases, a second setting '2' is available, which has this high symmetry point as origin. This second setting '2' then is the default setting. Space groups which have a unique axis can have this axis in b direction (setting'b') or c direction (setting 'c'). 'b' is the default setting. Rhombohedral space groups are given in a hexagonal basis (setting 'h') and in a rhombohedral basis (setting 'r'). 'h' is the default setting.

  • SpaceGroupSettingsIT( dim, nr ) F

    returns a string, whose characters label the available settings of the space group with number nr and dimension dim.

  • SpaceGroupOnRightIT( dim, nr ) F
  • SpaceGroupOnRightIT( dim, nr, setting ) F

    returns space group number nr in dimension dim in the representation acting on the right. In the third argument, the desired setting can be specified. Otherwise, the space group is returned in the default setting for that space group.

  • SpaceGroupOnLeftIT( dim, nr ) F
  • SpaceGroupOnLeftIT( dim, nr, setting ) F

    returns space group number nr in dimension dim in the representation acting on the left. In the third argument, the desired setting can be specified. Otherwise, the space group is returned in the default setting for that space group.

  • SpaceGroupIT( dim, nr ) F
  • SpaceGroupIT( dim, nr, setting ) F

    returns either SpaceGroupOnRightIT or SpaceGroupOnLeftIT with the same arguments, depending on the value of CrystGroupDefaultAction.

    gap> SpaceGroupSettingsIT( 3, 146 );
    "hr"
    gap> SpaceGroupOnRightIT( 3, 146 );        
    SpaceGroupOnRightIT(3,146,'h')
    gap> SpaceGroupOnRightIT( 3, 146, 'r' );
    SpaceGroupOnRightIT(3,146,'r')
    

    [Up] [Previous] [Index]

    cryst manual
    September 2025
    cryst/doc/0000755001325400021140000000000015064274357012150 5ustar gaehlerusercryst/doc/manual.tex0000644001325400021140000000226715064274127014151 0ustar gaehleruser\input ../../../doc/gapmacro.tex \Package{Cryst} \Package{CrystCat} \Package{CaratInterface} \Package{XGAP} \BeginningOfBook{cryst} \UseReferences{../../../doc/ref} \TitlePage{ \centerline{\titlefont Cryst} \medskip \centerline{\titlefont ---} \medskip \centerline{\subtitlefont Computing with Crystallographic Groups} \medskip \centerline{\titlefont ---} \medskip \centerline{\subtitlefont A GAP4 Package} \bigskip\medskip \centerline{\secfont Version 4.1.30} \bigskip\medskip \vfill \centerline{\secfont Bettina Eick} \bigskip \centerline{\secfont Franz G\accent127ahler} \bigskip \centerline{\secfont Werner Nickel} \bigskip \bigskip \centerline{\secfont{\Month} \Year} \vfill \centerline{Copyright {\copyright} 1999--2025 by Bettina Eick, Franz G{\accent127 a}hler, and Werner Nickel} \bigskip \centerline{This software is released under the GPL version 2 or later (at your preference).} \centerline{For the text of the GPL, please see https://www.gnu.org/licenses/.} } \OneColumnTableOfContents \FrontMatter \Chapters \Input{introduction} \Input{cryst} \Appendices \Bibliography \Index \EndOfBook cryst/doc/manual.mst0000644001325400021140000000046413232361435014143 0ustar gaehleruserpreamble "" postamble "\n" group_skip "\n" headings_flag 1 heading_prefix "\\letter " numhead_positive "{}" symhead_positive "{}" item_0 "\n " item_1 "\n \\sub " item_01 "\n \\sub " item_x1 ", " item_2 "\n \\subsub " item_12 "\n \\subsub " item_x2 ", " page_compositor "--" line_max 1000 cryst/doc/manual.pdf0000644001325400021140000051272415064274357014133 0ustar gaehleruser%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 616 /Filter /FlateDecode >> stream xÚ}TMoœ0½çWp©Ìzü…Ý[R%‘ªªŠÔUrhz ï‚BÛíö×wŒM6I«ž<ÏóÞ¼¸XŸ­®L‘F+•¬· W1Ñ‹"Y?&ßÓOC–#Kã”ýXN¸fx’s Ú`€Üs^øä\-X®„¯—c¡Á "4B!l,Ø=÷û©nwYÎ “ê© Ñ‰©lšn7”}UoBêzÈ8K»}?¾ð¼Ò}¢ ýÑEQsFo5Gšó¢›L°´ÜxÖ§2#U»Y›;Uä`J_QJ'¹à=»Ía‡ U:Ö]JJ@l6QZR€ 1î\¸‰L)ö²Ô3:ç ¥»³Ññ«¡lGÍ3FZК' ð4Èr)e’¿Ê•UCêæ¤¢¬æoŠßeB‘ú– 3Ã×(Æ5á ™- µëÅsýäž–œqœ²,!ë5×akÈ*#€|Ù‡Þ|ê]vL*PÚR3Âì1›P ÅëjdwáÛzAÝ3ü-JÒìY¡µ–vCÏs2)}8†çiôBxúÂÅl ƒÙ( àèÝfê½Ù qå§TðZ²4V+ÛÇÜe†½ØLïdó“7b±™3¼x;šuU=vÛéàáåàÂÉ’\ãÊÑE–}û¸LUD^ß| ÁO¿¡nˆ;J<<ºx£)§åò=S¬œB|ìöñ´ÜÖ ®Ý8Ê#„?„‰4cDúBâ~\y¢î½ŽÉùã_±j·ý[fô¬Ÿ;Š»TÓÔW«Ãái•®ÝQ Iw«¦Þ¸vtãj–tv¹>û­Ú8 endstream endobj 30 0 obj << /Length 785 /Filter /FlateDecode >> stream xÚå˜Moœ0†ïû+|„îøÛ>&Q[¥R«JEê¡í°l‚J`¤MúëkÀ^hØ—îV{a_­ÇÏ;}o^½Ñ 1µÅ;Ä4Åš+¤€`NŠ·èKpU•mV¶Mø-~·yoû!HQ$)à (Jï7ö¶ß`‰êÛƒ$²šh"ºì†4 l$•݈°¡æðCý€$Œ®Ë¶‰ªíCÚæUÙ€8§˜ñn€^ËžG%˜ÆT<Í~¦aq){QD6Œ‰VÒ,Çï4}LÔűû @Ë,Œ¨€ ­Ÿš6)Šê¶Nöwy:¼½fø°oìÿFÙg>;£1Žc3:âˆÐ k¦ÆÁdFša.òšaFØ{b“¡ikçGD臑±39õ?”)ˆ9ød+ÓIHËø2|§qð}B}¬ò²õycsƾVÎÊ9kÀˆm­‚`»Ò– pgsÄ!A”M‘  ³Â>·yjW9‘’œ-þÚZüŒc`z¿Ó8üÜáÿ´ÏÒ<)ì÷Y{WmmÙ$`èy$¿š¥?2[[ú‰Ää2}§qô…£ÿ>yÌï=ýæá¦/A–¿vâÜõ,÷‘ÖʬçFc¢Ø"w¯qÜå!ë“4›Týfxþ™·wÃSâ¾ÌC*‚!AæJÓþï C+úoÁ7sð'ÈÖÂ×€éòŽë$½rè?‡ŠOé÷@Pí:¼;¶É» +?BªÓÍ›" 0ëÁÜZ ¤ÝEa¹åôg‚v&|¨j[vò_YÝÓfô\žýì f‚leÑçœc»Ô–á;ƒoý~QÕBí:øO,Á­Í*±=º¾lÒ˜+‰¼Æ¹`êA¶\¸èËÐp°¼êŽ”o½-LÒb>{ÒšZË4`–™;g>¹{Èê²ïò}ˇö¬•ÜY×óPsêI?ÛêO°­4€ÀBÉ—oN¨îÞ yQïÀe~Säà I×Ç< W>0·»»ò!³mòd¼•“)Ûq~$r'꣺.·Ùã‹áÎv—“Aáþĺù* endstream endobj 58 0 obj << /Length 2396 /Filter /FlateDecode >> stream xÚ­YÝÛ¸Ï_aÜ“ D\‘ú¢®@q·¹d“¢IÜ)z¹Z¦-aeÉÕÇm¶}g8¤lÉŠ½[öÁ9œþf8ÜÛûW7ïd²H#‡2Å3ûö°Ñàƒº© |ª$Êû•ô—j]jcåWoï_qØå/ø‚G!>_ÄÝÙþ,0Xfñ¢Ù tž#ôN(oñÞŒ\`ÊÎ(ôÛ{•§Ñïg¢e‚4žˆ†¿‘XKtEì„•sÀKŒ—åêÐ9l×O4ù««M£º6ËõÃTù X§×qs„—0eG¸Y%f° RÉ¢ ¹Œ#º"zÂêˆ\*pçjCãS¯3Ä:çêæÉºóI\ž*ˆEì§,¼€xGšse,¡ÛÛO_þÈsß‹¦ò¦®ei. œ02R1D¾ ÙfphŠ*+æ²Á§*wukßÒwßê Œ+Âo—vÍÆi»±±•YS¬O¶MÍŸ¤ ‚óU8ÝÅ#N˜°oï>¥É¬!Ç{vVGsQæ„‘…ÕðÒˆÙ$"¤Ñùäv–þêB«–k­­ˆ "3ä²¢é­Qr}\q¸«Íþ ápeÛÔ{©Š~µjÊo²š¨/¿£>Ö ÒçÏPHÿ á˜~¬[ $#ƒpè',ñ8kPö…5ÄÉj‡!^ús…" pŠ«úð$>…XœÀÖ S›º²r1òâÚ»FUÿ¥©;£/çX–<æ¢ÓW¸tŸEQ€?nIå%ÀExI‘Å­nmå¬'Õ,Ÿ'`œ¥Œo÷dÈÙ“»Z–›b—w¯IžBJ’1®ªlk,›‚©t?œ“tƒtÜ㤵•³$¥Þv´hbNÙ²Ž>¶}i¼Úþ€–ÕFKÁ%á OVÎIÌBê\aKJÖdH»ÙèÍë¹ÊC#ý·NW†ÀÄ.S*a Û»BÐðœÄNd Í=RO-œ„ô¦-U³×Æ·a¢ËUõÐÒxgwF‚‰ê >é¾ÊÉ©bÎDÀ¿ãT2§NUËaýú¦®E òºµì‡c·…)³Ô@-T/­ cS’º³å~˜2?¾~Ó}¨oOnð‡4sq9‹}ñÜv"’©#-,W~•Œõ9öS­Ï„1*Ã!Àþkþp6 Q8ñ™ÆyM«07.ë®ÑaûÍ«ª²´¥ÛdÊøÝ~oò¯n èÂ\¦gýt¹†\qr/ò™9ø‰w^4Šz Ø/쥑c4ŹŠ~ÑqfÝDb«^ñ’¼$=ñ¢TÕ®§¶H0hzÓmE]¹%L¶p"½§FСçÚUè‹!¿D3F2ÞSØ:µ¬½l(5ÓM§.ÐîMaŠ}Ö¦=V !¸×È÷Ê4»¤èÿô…‰"ÄPÑÑ´ ;8D]ÍÀVd-}µ}–Ó®ùY¦, ‡Ã¼ÞãRgZ°í œ»Ès ∥á`Áù¢…C޾~[ÒcÒ§J•É*êAõ•;ÚÐÙ8&\.AŒêÌJmÍ í4ä´”Onø¯Ç0*ºýˆù)T‰R²T^ê%-¡wB9SzOØÑ‚É3±Ê@s,vZì[¢+"!H%¡‹´¸ŠeYPuGO(Ü„œwÞ5sSh­äËÝC°D„£‡A·ÕˆÍ­>î!…¦¿¬’`ù”mºò‚h¿ú‘ßj}VÐÃmLÀ¬WMæ/ã7egM.t&8 X,/ÛÌÒ\9fD©ÜøÈ4sw7äLòkùH$À|ÈGŒ˜ÞÖ³ ôålzU^?Þe0öLLˆ™gj×ït3ˆs Ž·‡[ó㌷Á­KŽ×wÍчŸºÞ[·l3wݽ l{Bkê|d5ÁRÁŸ•i}Í>¦“p2öC_’úƒ|fKmm@¯pÇ+ûœ¾©o¦Nõú’kpâ'@ý"­n ]°.76Nò¼^ù\·ÝÖ„açæÜ§_ŸÓoÀDnvàýçzÇNi4ÕO€HÎúªðÖNÎ3|ÅÊ2Oú©\¨þT8×ÿï»=ãÏXÞ ûõü{- AD~ò2ãý-<Ôª÷‚"Œ¾“*þ×,/ë¶Ý­@û»ì®Q_ƒ ±ê$ƒåâPÈôŒñŸi¹ PÖ¥1ÆàŠoœ¬ËÖƒÒ(Á‰)ÜÓˆí\é£ÑØ^µVí¶ßA+âþtÚ×bÞÃÞÔ¶±¥V­>÷n0äË¢m{7×(ë3«,XE÷¾_Ï¡M¯¤ã„“wÝ¡ýñæfɹ_3P첬çú¨›7˜RoŒÜöÆ•ÿõk[” endstream endobj 74 0 obj << /Length 2126 /Filter /FlateDecode >> stream xÚÍXK“Û¸¾ûWè(UFXø¨=9ŽíšT\•ÊÎmwŠ’˜‘H-H®=ÿ>ÝèER˜;§=ýÂ×àïï~ú”¥«ÜˆDËxõ°_%Zd*]%&‘1«‡Ýê×µÚüþðOG‘%8½_Å©™ÌVY*’TáûýoQ¤š éW[™µ\mu,²8!ŠÒn¶2Z?w}q:µ[\ŽuéÈ%H4YÂä,ù`7*Z·Ã¥#òh•‹üŠ‘&ùøòÆŽÞkzi릟XBÃ`lÊ(&;[sAÐѤÑHt¡´¦µ{DLŠz8íRH!EùT\ìÂü"ûÁz û¥¬3s(\(Á¤­.¶êÀýÎZäÆWêˆ Ž»†ÃyBz.z[—o ¢h=晨´„R“/p)g^IäˆË¿Ü&#!¯™XzÇ8Ælžµ¾´œVœ¦ëýДœ,ð·èºá\á8AâŸ'ÑüZ¬˜4ÎÛzG‹X«fßµÄ-ªgqêZÚøu5°µO4ïò¬•˜^žËSÛ·gò¿ …{çL0z–S.…íër8v££5¢AKHÅœ’;ú¿´]W?ž*úë[ú–íù2øäÈIM.’L<ññi0ÀK Ôé ê´#5nù ¯˜KÝp’g §à t²ž`ë”EÓ%ª†À”Ь”']G#š!9ð{=[÷çcÀ[„Ï´V¶Í‡ÃƬa­9ТDP²§? \j‰Äc¯8Õ=óÜ·–™ÏÍ ð©™D2ŒÇŒ5X &œžé·i}¦ 8Õ¾ªvb€É…¼Ÿ„´™…´Ë‚\¬úâ aÌy°mª1õÑ2œ~ÀºsÇIþËŒÝHî*’RˆÇ³WZD›J‘ÇŠôüu³5ž/ô‰èóûÌeÉŒ²§œP.{Êœ¢tñ“¯÷¶=ÓhT×Ö‡#¯R€äkÛ"¤¿Ò!»ì[ÛÝ&6ÇBfcUÿ-2Q AÆØs{šoDΪ²6cÑø9`ŒU[ÞjU]Nt¨Cr-Lδ_†òH£b”o4E)"_wE½c—µô}¬|+ × ¥eÞÈg¬ÀýfÏý瀞’÷×¾Ò˜iÙÏ#¡¯®øüþß!h¸U@ ÎD ç"̈YÂÅÆN¯;?Y/óÚ>Øj_Ar¨ÝdI„ag!7LÑ7n×<¤¹_;«®‚ìõ=ÒÞ²0è‘SLñZêø¿b=ÅzŠu3£Œ~0ÖYÎWH¨ˆjlÜñ€F¤yjÖ§jÏ‹Îqð-ÛÓpæñëAg<—·ƒ>ù ½™=˜ÆA?é~ØY–=ÃÎjéëI=é çÀÅ{•ž8‡³ GºÝÀÁåJdp}œÿMŒ…`>t„´í®½ŒõHžWÙÊv"Q…óÔðؽn¼©RËñRÑ —Kk{×}æ ×àÌm‘ÇYŸ}pŒm~[jó…¡Ô'æë„FëºÐìÇD±$–™ƒº®-Û2ó{×Û¡ÝX7/õGP1Ð"Ü(jLæº'QHw3qSBŠàÜ®v›!Ûâ½Ò--D]wl‡ÓŽ@ÊØœZšB0#ÙªNïîhþHE¶ÁŒ¤¾g‰uç%C³ ‰r‡îBˆ•@*sÀ÷Ä)û1¦«~ Þ8½? “îh–š`ÚÔðˆ7tp[xšOq £]UÖ+)î÷ž÷¶vç:Ùq¤HÔ¡(khh‹Þ+qz7ʵ<ëÂu¢ÏáÔ>ºžÆ¢ó [[ûï+Z‘ Œ‰ðÂá3žþ?ª}1œú÷®Ï]U$Tž]_;¶*Ë û·œ™Wæ4T´âÔ†oU»6þVHEXD˜ß°ü¿(<>d|Ò 1Ãe2’ü rß‹¼Œq¤§Y´¤rVÔMÝ×ο0{kÒ­ä,&ΦfpÈk —ìÅûÕ‹JÅ \ÙÕÔ¹˜YýýxÞ ß–Ç¢9ø<â!¨Ó)l¬Ýô̳yíæfÔ*B|Æ'­4ÍVRhÿ¤|v·ŠÙ•ì—ªL/l©(ÉÞäbâ™™¨¼'o^å^ûFªO|›¼ eO¨k¿‚‘xâÊ µÉCê,$ “Eé<¸×‘„šô8^†{¢„‰òï„;¸W¾ øk0¾÷É™S÷ä:W~ðzO_w`QÔÒÓ ÞXñ÷rªËš­]tTâ´vž!þèj¬?.ÿ)åªÂwE€¹Ò+C¿,Ú$¼½È+9>Ž+¢Ê?ƨÀ«„Â'{ÈÒN§M@À]ª„ŒÌ‹‰’£Ü“Í.?/‡¹ñõAØ•ìwÞý¬àïå endstream endobj 85 0 obj << /Length 1644 /Filter /FlateDecode >> stream xÚíYIoã6¾Ï¯ðQb–«HÓi§HѢŌomŠ-ÇBÉäÌøß÷qÑæ¡¼$qCO¦Iê-ßò‰úqþá‡O:žh¤cO櫉¤©RLNæËÉ_Ñ—tQgE>Q#‚ÜïÇ"¯êrçVþ™ÿ 2pO ¢r‚áv(9!iA¸Ù2ó{f”!MÜFŠÈt&ðˆx‰´ÄÄ>Kb¤UR&mÀdbÀш2¨eZïJ¹ã,ª×©ðè1©Ëì››|0`¸é‡4OˤN—nå~òD(ĈÇôÐJ‚„j³(CÂà|(YÙZüu-ÖÎÚÇ<æìö^&«)€!¦yê÷¿iåסŠänÅ”13ç!bQi‚ÃkI<~sJ¢±Ì!.…p¶-LŒ%›MñP&[0†ÊÕà ÃV1Œ­bøuŠa`#7¾õ‹É¦L“åÞü!Q:%"úf@"‘C¼ôï¦ 2¡‹¼/`!ëÚã,V^á:˜éAw–n¸Hüâ}˜Ò>ä0ÁqôdKK¦•Ô…ûM|‹ef¾GÚÌz¤í#ÞN3n:•µÓ ¼fø5«×ÇÚ ¹&¥èÑ~"Îë'~ÛmuaYâ ƒèƒãjÁˆžÑJ F`rN™7pmËb §³?'öŠ}÷î}àôg'obêëÖÖià-i¨°1ÄIkˆËnˆÛÍÞÁ¾‚Êé㶨Ò^„W>t] 4Ãu2¥M¹™û4õQ¿hˆS“]Ùa:$÷…y²ÿxýÕ”dŸ†vœì+ ®‘$\øÆÌ¯J¼~KW£§OT½ï2mªÛu}br±kGh—:á¾€u‘wâœáâ$ç:—r‚‰ÆæåBÊ%Ê%iG¹dG¹Ì°G¹äå-8æçQ.%ã㔋"ÜU›Ó”KôXØ0.ã’c\Ò3.Éiƒ0.x¢¥ Ò3®!m 0nü¾* ÏñŠQŒéIÂ%t‹²P^˜¶zaÎé… £¹á­_ëøL¶|Ë‹PGÉ–ô8ÙŠ!Núl 4Àz°™õE§Û™¯‡æ»%G¶`ª%[V‰wA¶œ™—r-ñš-¤º¬A]Ðê4… '»èÑÊÁŸKµ|§‰¯LµÞ¦ÿ™Vô&3F‘àÊž<åÍ)™d’Ò`¿14Eñø˜æK«l>ÃB²,¶~oa3ÙnÞ–i 1ñ÷w°èœ‡ÁAâÃö@âÃ>‡Ì×’7jטrÈêæâß¡M™©·fb>UÎi˜\Y§Ù&³\þrÅþT×™Õg^ÝŠÔšÔLRvycÍ– ö½3Kªj÷Øœ€ûY¦NënãkÓtnþÉ+2Ý‘¼Ó‘ŽÞ¼˜âr†ÈîÞØË}z ·eÅ*~+âþ ^½1©ÓSçÚä0º00žFÀÈ;z@3¡PÓ”áó°'ýpŒ[g´Ž‡âÓKr¥ð„$QúàzH_•´¾ƒðä—„çÝUÃóx'á)ì÷ÉAõ$8Ÿɘ=£|ÎË$¯¶ðV±üÝÞ Ñ¡ÅÏQ{mò*4ÂBÝXáæb+x‰ò6»y÷i¨·~øH?|éñÛx¯é½Ž…nKÂÝ™#'înü*‰hwñ¾xé½fÞ×î3–¿XéüÓÝ@XÌê!(NPï‚ ë òPÔá5Œ¿írW.þeå)[ø ð·3UbãõÃÏóÿ1;}{ endstream endobj 101 0 obj << /Length 2286 /Filter /FlateDecode >> stream xÚÕZK“ã6¾Ï¯è£\e3|ŠÔ±g*Ùé­TeªÆ·djK«Ú–INgþ}À—^CÛê¶sØKK&!Ù×~ú%Á Jb?¬·’>HÅbòa=üÅ‹ÿ­ÿ 4ñ€†aŒ¨Ø’|Ú¥Ç6¯+*pD‘}>nDE`LËÜŽlêïM›î÷Õ‚àè[½ "J»bcga€‹¨:» ’„¢D®W\ù%W”¡„Øu)¢‹•À8ú²à8ªŠ²VRiVkVNô¡z8+Ëa½Ó²Ñ8:º¯©€¯û/‡JÇ^;¿x+ÄXì ª­åœ––mº]ÀßÎ0ÓÙã[íí£ç–'L!E:ö_ëKÄpâ ŠÆòk½Šžª¶X(Ed/¢”_â.މ'ø)À‚"w˯b¯S`i¥zÝåur1‚U—¸)$zœh+¢²ªéÞ6§gkUó«Û˜ýÞ’OVp2FQ :¬Ï–u[§e³OÛ¢*²A„^v ©FrJ ÏêPÕn×áw[é'qòKyõk^æuÚæ™%yþî>ñ¤û¢ÌÓÚ¾Óºm,ц¬žúeì0rHÛºØäîƒMU¶)ðÊœˆeh[b‚„œï'Èòzò¼ÄУcDd" Ã„D€çŠsð.2Ù˜±&`ìN‡?ÞpG~ºÈÀç ­¸Ñ F^‹vg߬áÅ#À˜1àè8A”°7ÁH”HLŒF<hWD¢0×K((„J"™²œ$¸Aœ9µŸ,.f¡X³žì‹Öç?Z“?°À!<Óñ:ÝÉ1W€Ü¤ÓØ€¦LÅãŽÏ£$.„…Ž$@-êðºÎÛS]6ï7<Á1¢n3<¡€Cä#ËÓ;Zþ©¹j{Ém§¹dÊ—yÍöR‡Ðˆ ˜>Æ*Ô™žŽMÿãB #":m}Ê AÒå=È[»Gié©*÷ß]¨…¶MpDûĆHÑcä.u.òœç¥+{A´Më8íENR÷Cà°(é“pÇ"ùI>scäsÈä3ç€.6ØEäóБ=n·ãŸ´fÆ Û^uH"bÔ‡úY‡TW’&*Gr è%0¸uƒ Úå"i´?KËm[W—`…]È…lUrÍ…å<ç#³1,ñ{'„ÏPvØÂ£9œqpqÀ•«y^Ã&|òæ¼ÚÇn èt“Þé-öÛÊUÛ„#œ3Àüj’¬ÅýSÆŒÝ!P{èÞÌ™õsˆ?EJ^Ý!ŒÙÿYîøàÞH}oòmF ï+úéÆDH`+±u~ïM:(ÜýR9í€z<°k™m× …£¾K±M°®‰¡¶ŸÙý¥ò|ÓVµ6´è¦Ñ€ ‹‰æÕFÌ™žÉ Ú#;W”v&õϱþ$¨?Ðù(0ÕíªÙB?çØYYÑlÀ3Ý´Óvð Më=ý×`N}纴7 8Œ &MHMÚ·›íÈô®Ѧ?_È&1R\ÜXÇêMè¿×A¬{½>¦MÑœËßÞG@¤Ç”¾7_´î/ªñµÝV) .ʯ÷Dt85­}Ë*?o~ðèU_ºTõËÒÎ5Ž¦Ý¥mHh QÕÅ×¼Ú4XˆCïM:¯³! Ë/ƒ§e-œa#×jÊcÕäÈ lbÙhsznEZ;ª‡RB<ªô¹:é¹pá /›ª®¢Ê¼b²±c&†‡Dã†rœ[™A MzÖöðæÃè žª2[ºuJ/„ 7 ÚìòÍËY Gâñž¢„uµ(kü—ìtï+‰sQê_ïy¶ðI«57ìt/“¨ÛKÝ}Rv1f\Áø¨­ói'³P'tçïà(\^ÁXuéÆ%àY¯Sè<º³ó,˜ËûsâUVr¨DªÒÜlÓŸO›}‘寻@›æ˜š¼3Æ{µ‚¶±ê;þlTèBÙ»ÝpÐ7´êÌ-ª`Ã;­­[²uk£Én fà+>X]û:J“]Ö×)>|Y¡ðlCËd`ÎLJ®âއ®OÍWm»ù§þ7ÔÈЛ$ñœ£›6oÚ¾4»÷Q+,¨Ä슠7lÞÓF©ô-º×u_‹RÓ2Ê5;£tT³Ûù´ÎíTfÀW ë=£Ï'ôxøø‡ÝT§Ö¨÷ ©h=áJÁ.ú°9»–îÕéѤ߽¸iðâ^ ¢.Öe Ñþƶh¼Qû®¶×£ö”Åi{ÉH+°Áñ$¢gØJô‹‘$vm”~ˆSŸõ„·ú9@;ý³¶U­ûغ“þRWzhSíO‡r0½tßåÍòm¡¿¶ xF,t¯§m¥`©NH]xq§:mÎý¯@ ð0¼Ðîœm™:&ë¦ Æ\ŒTR/Á˜Ãª³ñœÎméo>ÂÿˆAôÞÉÕ%ù4Ì;m ¢¿í`&ˆßPEƒ rŒàñ}Ü™kzv®’ÑW6wÀsÈŽ‰$sðÜ”—zm}µ(ã7cráì?öf+>ü¼þð  Ä endstream endobj 121 0 obj << /Length 2823 /Filter /FlateDecode >> stream xÚµZK“Û¸¾ûWÌQÚ!x¼¤ÊqÅ[N¥6®¹ÅIEqFŒ%R!){g}hð ”Ækç"‘`hôãëù—Ç7zŸê»”¤šë»Ç§»„ß%F#’»ÇÝÝ?WEÞ•uµÞpEW’àÿéÈËì€7Ç¢Û×»vý¯Ç¿ÁZt²–ÔŒðäŽâJÉ@‘4¡ÌRldbWúnÃIY@¨øBa,¡"Ibî‘B!Ñ$ÓýlGÍÝfJÖ>tYµËšÝÃ)Ë‹Ÿ›ú|úDõ¼è`¶"Tì>Ä6 „§¼§€uXäÔB("”è©>Z8¨¦$a˜K Ÿåû"ÿÜ¢˧O–èKÁn Qjà¨ôkeø×Ú#ãå³=¸ßÈ+³õ‚Á»§º9’˜†4¾%ð c=ßæj¨×ÏÛ§§²*Þ5/mwUK ÝÔ¤7µÄni‰IàaÜû+ZjŠîÜT¡hóºúÏùy­VYç%\ÇôgRBá ¯Õß×}™ï½–ÚWiën“j¢LkÂe/ú' “r•ÙÉR †C½!À¥ÛÂRy¢âXnvåšÁóÇNM½;ã´'ÄyŸxªËÊN–ýZvûa×dU{È<ؽÎ[7ã>fóJ“\—™Le`ó°G›•;\¼«qdëܾusÙF \þxúc!h`à6qE7ßoÞ\“þrÿݾX€ËT6¢â«AêB- tÆIªm¬^4‘€<BNåD®7ŠNPb® “9áÜOÿ`­Ïp:c ýÔmQu½iÂÃí þgçç#<)vHz̺¦Ì‹öÞ?}Zs§¼*p$·È•õs“ÙCá4'´ÖÏiÏ*|’m‹CÙßT€M¸ üŸX±£ãé‘•Ûå7‚÷¿#ÿ pp(Z+u;`iް™cl* ²¨OEãôéÄî?ØŠQƒ­¸'áìcÆCÜ—•Ó)ô’±W~&üÔv&s³®+ާ³ÃsÝ Ûpµ»áÚn.á˜øåÒî Þ‚öÛ"Â60³cöyͨS +X/ê›ñÕ¹õãNðŠ·„NöYÞU0eJÃGš¶øï¹¨òÙûúX£·ÇNñ”:ñnOÁsA¯›?G „kÂF€xŒãªCPˆ.é›qñ6r¾b‘qN›râŽÃ`NIʇSÝ£Ð¾î €HÔ|²™‚åR"y¢½Ú¥t|&Æ]‹¹ƒ?.¦,©„D\\Cs5åôÞ§EÕ.¦WFŒ23ik¢’óX­O,ú¨ãS&(‘,LuÞ¬gkº½öXa/ž‹ žxª5ï}®F×±w ƒEfx¯£x¯Y°~»¯Ï‡^µë×Íg¿Ú¡­ñÊ¥w/yÖ/!^Eüü”5]™ŸY³–ÔÉp¤sfå.‡mázëǪÿ!ÚÙ0Ö‹‰'þ„ðhåˆ'SJlTöjšgê±Èk XÑP¸Üâ½…š~¿ Â=JΧ­ÅÇÙéaM«Õ=Z‡$[ŠPFûÚªëë4’¬•r|P9რ„xÀ¶{|6Ü?5õ¯0k€u³-» ÌÚ–‡òwÞ–Ðj8;–6äÚûÜ%ß@>Q= ×UOàr­‹uý¶h´˜}X®OÓËÌŸä—º+îcF@o-­íRÏ <Û ó‹‹ãî€ àDP1‚Àåb’è1‹±¨Y^,%ɰր$!êÚ*g ùu’·})Þb‡âr]F¡’¹t¾Æ-VÅlŒ4K&³pEŒ`p¢dnd»Û“¡²9à5åDÏñ:¯8ש®veõì1Úż$­ WýÐw&?kLe°‚ôÈ"›­m/‘­b¿Ö,qšv&¡máéÊÚ{_¤úÎS£Ãê‹ýÀêëòß Å– ÐW3†Y¨‹?D޶+³-p£oTleˆáiX›}ˆFhðRq£Ü¢iXë« H½dõÿ¨~-Ÿ÷]̳¸M¥’i µG²¡pɹT„yž•Ö'Îè†áôŸpòÃäNODjNÆçgÄNM±#±½(õ¥¦Âs¥DÓ!ÐÏm‡ oýÁ°¡¢çN#C gŸ ÿ:?;§Ö‰Ÿ»t,í Q¸h¬œ ^Gu®I.Lu¦ôQN)_D:£Óeÿ½xŠªÜµGÍTåÓ,ª\=&îNìŽþ'ü{î&9 ‚x~«7PUÜP8Ø1Õj¦pXw[ Äÿ©ÂQ±)€Ó¼ó6`m1¼šuU âW£!¿Š†òuhØ“µCÅöþtµE!~Óäõ…ÐR ÌŸз>øAħªÇ:9o³JŠr)èy,1ÝŸÁ#Jç\ >Í>ÚJâçÛT2RìÍÊ™ Ìc_1Â[áC§„ÉÁ˼°cu_´ gûk0ù ‹†í£øÀI_}Ò ¹­_¬YgÛCq÷]£õ5þ dµb¿ìs¦?VT•þ|vÚØô`ãý J‘˜yBt<ž!Ëë“•i»î¶ù¶Ÿø¤¾Ïþx#êz6fQºxOa¼‘:s 38¡‹$‰;Ç ™pð’¬4‘×c“ ½(Æ`Ì‹J„R¯ñ" õ7y’Yò$IúêÓ”^Ü7])!ã«Å÷Ñîg«Î=ɸ÷AhÔ$fÈeáé̽BJg>CÆv/ŸáH´GÄÁ중×ÏCiøŽËü¢Øs슪õû|¹¤Ò>F.°2%1c›(]L?8#7 Q =.8ªI®¾‘ÚøWÝ6Îm_l•±BÏxå9ojËê—rW´øl¨WíÍP.[Z[Grg ~*E¨´Mï‘P<Ì=Ò)ôc~Zê"èdjÑf$„´0%”?ôõä`x=Ÿ‹–—ºïB¾×ò„€£Œàp-¤¹wÉÑÂÝÈ«‰[§™í•Ë£c +êS‹‰ãE÷K}9†_{ã^†1†_;àÂoì½/ÔIc»y$E£ûD£(h%Å•/†QÈ5Ò‘ð”ÇÎñqÒÌ ¸ýÐQµ7»¢ËÊC/ˆm}Žõ¡~‚D]†ÞÒ³ý˜(!4³×_}AÕO…O]~1-¶vu~>N# õ‘dB3`¾}˜bZü£émuâ”êÿS§}›S~ÇWK†L²¾+uÚ²OÊ‹fyS2~ËdS•„ßôIN M¿¥+ yÞ䤴$¹Ç­jתIDÿ e8pƒ FÙô+žÛÈ ¦²¾Ç=Æä<ñ]…D8¯]³X,[5pqÚÛ+û ŽËÖb.lªnI;LºáBöm¡/fó®`¸Ÿ%×1DŒ¿C¸’}ª.2?¹ðm•"ŒÝ+pÅÙ‡'þ«(ø¿ÈB•†þŒ’q^éHÒg¡òJÊIb’Y(¿™„Š[_ÙŒ©„K>½®mŽ1Suµ€cTýV2ßÝ+ºÈHßüõñÍÿŽÍ endstream endobj 136 0 obj << /Length 1480 /Filter /FlateDecode >> stream xÚÍWQoÛ6~ï¯ð[eÀæDJ¥ÐÛ!C‡$om™¶5Ø’&ÉKòï{äQ%ËIº¦E_LŠ<¿ûîxwþõæÍO¿'þ,!IÄ¢ÙÍz&ØLĉ1»YÍ>zñüöæO‰™À÷ ã|æ£ÈùV–ªæKÆ}߯ç4ö>ù>Ë®¤ÕcÝÈÝ®˜SßÛTsÊ=Yn³wa!ä^q(k¼03ÊHÂi¨o\¶W.Y@Š÷2ÂçKîûÞ_ò!ÛË(±Wî@ó]}ÐÁc •\gy ƒ(ñdŽâ+Ä$ã­©ï×ë,WçÚ’?*¸`B,Hí­¬Qy–.²Fíqe÷Ý—µA ~{ÇÊU%w ø~·Úl-þ´Ø—‡F6YawŠõP7€-)‹€É&èåÓ¹%ÂË=ÆÞþP7¸r§pe}¨à¾ ëR¥™6K­p÷ܹŽÎ#èª=Y)\_©:«ÔŠàò•J!Z¡%0ž77ŒQí¤Â©Ä¡Gß6øBl0Alz±Á¬,²¼Á©sâèÞ¯)wy‘vÇ×§²âë}ï‚ÓÖŽ¼ 2[îõ|¬1± |˜”U¶W˲˜3îÝ·é*ËWJ¿Â‡~߃“U{B¿0="R˜ŒÜ¨“b5BY{ÌŽuc‘ë'ï*\’¼‡ZICœÖaO¤‹KAáS“iD’X{Ö‚-¦(ÈÙ 6EkAN„ˆg”„¥åbâ]mÌAY/fÓèµ%ø\»åJ•õ'ŸûU€ð$íC¹ž¸„?¢­ÀbJ‡OÂ^RI Mu¨'”éÌÏ{QN'Þ.ƒÒÅ“¸•ú€O"ä ñMÊKk™«Ts¨ZHëßÌä;í³µõo‘ÿsØÌ¡T¥6Y›UM N+UVª†è†ª#ë?-¦ê¡–>€uX8ÉБ±x\~üˆp&ž©?.¥qD¨ˆF^INze2ÒBÁ‡‘Æ^1ÒÎ «2}41¦êQäŒ8! 1a_q¯p!¦¢ïp¯UŒCk%’oUе…!a42©‹…mŒè$(" ÍäN=5)['?Á¡ÅÈS]ìêE'‡Yé–rs€ÜÙLy6²“Ó¾ú ¢1êžUßÈÔxUÛÈÀ´g°¹,D¶^º“9ÆÅüZVñ¸âAó¡ïÁ¡RiQ­ "D–AhKá^>¶õO7Ø–Fål]èn\—Ã,ß´á·/‹®ßh¦œˆ^ïä¦&¦®PŠÞýŒãÇ’â„ËêvÂZ¨ q4êUújù’ø.OôÖÄjdôÆIÓ¹Ó´]‚}Ÿ•ê Ñž`cÙÁ×Ѻœ —™¦:¨ç˜àc&Žûާ¸ùrìÜÅî¶c_|ÐÛ½&nHΜ'9?Æ™D$ ºÿe2ŸÒdÄ¢“9¢câ¿‚N‹Ýûw ,È = ï®h¶¸tg»+ù 7O€  îʠù$alTÅz ëˆxh‹ ôcm‡ÿ„]öîr‡Á @‹}ÖX@qƒ|Æ;åñl=Upb"b6ó‰A&tØÓá2Éòüä%äѧÈ[RøÅŨÛÞÈò| ×÷q]ÊT™Úyq£›—`ÁÓ-ÃÙÔß”^úC~•m¶shñ–½m{ñ¹þúËáõOvîp#”~q2s ~‹S£›= Z™^õ¥½ïÒñÃEþ·ùè(è²™ÿ#îö(vBÇÉíë“2¡´%¡é쪞JŠ‹‹M>`ó»³=ÁâÓeñ‡æ1øfä¿Ëgº‡ÿCƒÊ7ÍVßpyòùñï‘‹é±}÷¡Ãô›ßnÞ|¶Áä² endstream endobj 141 0 obj << /Length 2037 /Filter /FlateDecode >> stream xÚíÙrã6ò}¾BR•„@ öHÕd+;å­©ÌÔÆO9h™²¹+“^’ÊÄùú4Ð lÉkÍìäx®f£ÑÝè úòòÕŸþaõÌ2«¥ž]nfFÎL–°,1³ËëÙwóoŠuWÖÕb%Ÿk†í7÷ùºÀîM³HÕ¼ÞÝ·8þPv·ØË  ü± Ïïë²êö>[üpùO HHµ`ÒÌ8`"33!™U"u +‚YÉ„Y€’éÅJñ:“¹m$ÔÁ˜¨ƒ^NDtuãÏzê ³† ¿µÐÌfz²µ@8%g°f’ÌÁ)fL6,MRº@ d|T§ààÀ<õoGó—ïM~ð®úWysÛ}Ï'¢ÆRڰĈÀ³÷ñ­ÑsðˆëeÆÇxÞEεJ gRïgBËSglòq§Ïú³-c88• UÝÜE°H ÇX”f,3öü,J,Œ'â(šP7Wí÷œ'ùBÀàK 3YvŒå\±LOµ˜¬,ãÊó,“ )؇ۢ)"Th³Lïñg²IÆt¢@é­™žçÕB¨ùƒ( ŽËªì \jwW7N08ª7‘M­ei–œoÞ"ˆ3K2ú1?&\°Æº§ìÌh]1©zæü…ô1T–ö{|{H„f:=¦õŽ=ˆÝŸ¹)º]SµÈœç¶eÛõAn·Ñ§¡çžqÄbwè|Luƒ`èkô¼»%à†ô^à085¸B{¦ÆÌ‹Éýð^8ï’€\¨–—£pÍ‹š›yWc»®«ïnpôuP˜-ù<›g€û°É«v›“;…‰ ?ÐõÜ‚ö«Ýz[^9añ¸^2oA2¨Ôn”ÚÁ€ZþwW.¤šÿè~ò-éœïªë €áRâ5sHÐb¸Uº9®;¶Ä ã`Ã…a8±AÙ ‘2‘¦$|´l‰êAÊ{ìK\îê› iÑÓóáXpý [åqßUÑäÎ+9ÜÞì¸i4;njB¬DuT$ÍZù´’¦úˆ’ &’ó(©>¢¤/ÔQy‚Žª=Fk+’®³÷?ÓòJëXZû½M#»™h'íÔ^¹C%$>MQhýžùú{Á°Ãbð0Û=ÜÓ¤P`¦¾êòõÕM_"ô>0ÑÝ–ÎÞº¹‰ýŒ¸J£˜Ræ©ÈmÊ"9_âd{ÝÎh{ÝäU GA ¼7›|ÛÑ|„evDS<„æiduÍ.Ї3;ø£å”‡°wM®.˜=WGÞÅÁZ¯c>4cF>ŸKÁtzyÛÁ‘gcc1æ€6sÀ¬9Œ%©Ãgs¸©IÌ°Óæ íŒuå’ß]‡¨B°¥ý¢õjÂ3D yþºÞn‹uç#BÀVcô«ì¨f@öÛu)êã†ÜWF¥ˆ¡Î0Xr7Ú4õ]L»­Y…!¹±'7,"è•„˜^—±fCÒq“ß±X)¸Ôï±ùóß°õQ’³rßáxÚ¬Ä;›–“e¾ `´…z®=TÔ8#è )ý0ÊûuÐ#‹øT4è6ë¦}·é‰K_÷ó¢zó¶úvX!ñb2zQÎ}¦ [ž•,wnªL£)ú3zÿTË'7Úk0“{ &'Ô^öõà)éÿõ.ïšò'áu]´]®—ÒZ¯Œ_,_òé@ˆžOLÈÇàørÿ"þÌ×ÿ;ó?2©ë#•çØ±åqåüÿÈkBÖù4èÐæì?¤‚ié‹–Z†—‹ò|p ÉÂsJÈYéŠ<ú„p´X« QLí'xB8ÿŸY#?Su[hßÓÕmîPq5ø¾fD¨¸Âf‘|ˆÓÅíó>w“ÂÛ‰ÖI9Ö!­ð#Ê(ù¤Ûo:ZïŸÑÄ£UÙD%L?]l˜H‚!æ×-¢Åt‡[®ó–Žj)@bË{}ôê*›I y¾Ä¼1µŠP)ÎŒÊ&…3/7ØR-ÆÌ¯êzëKºnp$ \3•ˆÓÓpŬÐãw ·IŸ³ú£9+èWfÔs“V‡¯ª 1Uí’¾íº¤ržNå°¢RÆù^’øˆº]¤²P7ðyr"³~#9¼]ßï(±6ïÀód·êëÐ2F†Ú¼û`’'÷Øió†ÀÇÅA^Rý>ïA¨H$ÝóÀvs.ñtØÝbÊ`ñád¸Æþµ|x`Ë}¦ÜæwEü )ÄrYWÒ4Éc™ì‰föw?‘é±îPì³ Å’'C1uZ(¦Ž¼ä¿-6?äK&Òsü‘C뫟î/;ÛiØ)ãGÃT0Üþ>tÚŸ8Îç¶ö¤8÷ƒÛ¨nþCÿÚ¢@ÏWçþÈå rªGßµ­bjЂ§³äXh§4³bR®Ïèág]Üw¡àžwû$Žÿ|þxfçCHa‰zúÕ”‚þ—ÖPÈ$•d©9™B0¯¾º|õ Ó‹· endstream endobj 7 0 obj << /Type /ObjStm /N 100 /First 820 /Length 1823 /Filter /FlateDecode >> stream xÚµXßo7 ~÷_ÁÇôE%Q?€¢X³.Ý€µ(šÝäÁq®QרÎÚì¯ßÇ»$vsr‰3 ˆdERäGŠ”#KL%R!NLìÈYK®cüò\$$ƒPÌB)[ ‰Š“gb+žû9%ìÆ.ë±ÛØ8ìKB$±r8ƒ“‡2½³º\ò€!Ü«øäÅRÀºê ¬‚ý è"Ö…±U‰nI™ Š·/<{ˆwñ¼ÏL: P6b›p"Œ’)Œ… 6ðJ&ð‰‹“O”0MI |2ögK¾@XÆï«dÈ+D‚-‰2Tfõ„›s†)a„\Ô¤°Žæ™ l‰û L<>|‹P¸#c] <¢Žà—à¶j#Â_È>À€à”“~Á–7±¯: v³ºÃY˜ÌëXt!Á’^'0!g¥…­¼Âðˆ¸ä @ˆW~pÀH„ãJPvÐCð ¨+`, àC¢:Àt‚Ý)àV%;`˜[²Jd–)Š$up‰J OY¨ÄÀE´p.Ã&ÑE&€`ÇÕÕ ŸEÏ0xF¯HÀ¦Ð|›“²®@wL&pãGŒ)¦¬ w‡Â¼cN …Ò±° ž? ?\žW4|7úR †¿Ö³e5[.È#˜Þ†ï«E}1W DV³ð¦:Œöëtd± EŒKˆ¢À&—ã¸Ì±rCüâEÃÿ<éùs(‚ô ¦\MaòØLA?|7¯Ç‡Õ’Ž Ñ«~¨~,é¸eEÃC¾®?Ô4|E{ã+UŸé¾½kÅŸÝq$»y&—~¨áËÙ¬·#M)ª5·Gâö8ÜØj†Ü¥œmn×-×rq-×rq-—ãkK¶Çj /N–Íï?'³¯ƒá~=?­æí 챞r +"Æ£³Æ)š}6½3œ@ñ’6M:™-çõéÅx9©gYw’kqˆõ¹Œó¹Sðèóçɬ¢ñür±M§õ—ùèül2¦/óúâ|±³*ˆ ãW@o¥S j±œ?‘ $Fƒ”¹œ²ñÉu >¯aýöÀ»Ë Ù$€¹Ñ¤äN¹Ëùh¶˜Žô¼„a9W»Ë÷ֈʽ–œÁ Õ)q^'£)}«–gõéøš‰¸Ù.$éNÙßF?&ß {qqòDH %˜ˆ”{#ÝFo9ùh\]Aœ¾O–g4¢/“ª=%BŠ&É* CÎ&Ùî0ü~9þZþ ù‹‰â ì!ÙäB²&¥Ø)|VÏá‹É¿Õü ÄkrÎ+¹âL~KÄOëùSeF¦È*ÕLáír«Sjs_“úžJ +ƺ5«s4%mMùÕ|Ö„?a9:™V»+às26¯b失¡;ážLN¦“6á_î.8ƒ}%8³A·åä§Õu‰¯èȵõð¯¿?Ø%°Ã1fÓéñÝÕ JkÞ¬lVÎܺ{÷þX_Ù^ÖHÞ,k$îRÖH[¥H{i«i«i,²k]‚bÀ¢Êåbz'b<‚èà¸îp™,”þòûè¬ÈnHA;d•éh{ŒhA}¿ôõlWéMm”Œ+ÚAè夵Q„"r·èýý·?¥¼ãÑ"U浚X ßGƒß^¿-i7ù¬¹I;Åq1dí´„¦«3Þåÿ÷fÎã.”á!xÜÖwʾº›ü´‘,$=2Y¬ZŸ¢ÝáÕíI´H=jç½—wÓ î­‚µ¿Z­lOF)l&£äÝ8ÂÆÉßkã *A{“ôÕ¥†Åø0DJ7m)¤ÝrÍð QJÞCžLùÞÛ,õöÞ­-l·s–M;g¿‹sècçuªk;§P\¸^´1¢:‚ê½h}êC+¨i#®¨^´1c/Ú€þ­Ÿ¶Á¢Ðð¡-Rѧ­>´cÉ|-+ú> §ÉÖ ´Ží5ȯ ÃÏFÛÚɽ¶ã›-o¼”]®‹=þÙµaÑ.™è‚mrFŸøz1Ž^Lì@M'± ˆæÀýÔDZ ÷¨Ñt˨x\O B£ožýˆ­ôS×G”ƒœz#‚3‡~ÄN¥žô#f¶’·FP÷E±~•tÞ?_ «^áa‘ÕõP²w¸±8è÷ı÷æÖò±ènÅ"󃂑¯ž^×Ìï:ÌŸ¶å|u£³NûGôÞÊÝÄZ‡ûhì}t7m5ÂArº‡a ZcZTúÜÖ+f»’S±ÃÅìzëK@á^ÛÜ ü‡‚ºï Þ‡ôûx Æ>ìc/½n•u²k_ÄìM±©'qˆ&…Ç'¦u·õ/U·Y2ÜN~ׄúÝÏ¡ë~ÞR‚vkÃëºòF±óÐ"­ùè?"ðqó endstream endobj 152 0 obj << /Length 2026 /Filter /FlateDecode >> stream xÚíZÝÛ6 ï_‘·9@¢Z’eÙû®ûB‡-vÜÃÖ_¢$^svf;½eýHQþJ•K†~aÃ^‰¢I‘"©u}vóäéi8IY‹xr³šh1щd‰Ô“›åä×€‡Ó×7?S<`’aÈ„R“x¾Ûd»ÆTÓ¹Pa ý^­¦< ~ CQ¢,ªCÝdÛm9åa°®¦\Ùn“/h‘ Êý®v Éf©9*œK®™ˆød.$K9©ˆQ‰I Œ2AFÅ´N&œERÓsb’C9g"L&óÛõ.[˜Ÿ*PsØ™úÙáU™%¼,^˜Uó[¨|žàà«0­'^ùµÁî[Ã;{&G,NZ¦—Ëæ‘§Ç¶2*/0O§ò£›³0鬛ùd„,ŠyËQVw5…ÌlxäIÍt’œs—à,î…Z‡TÊB•‚å)Ò™þ€ŠÊêM a&ã Ù`4JÔÙ½!’åÈDÎjÏžRÉ"Ñ…û£Îü%_oÏŽ¹ÖT¢w”Um0 þ\˜]CÚ›MÖïµm]Ùô }.š¼X}U•÷í÷Žu gJNÂAaØp–ª˜Ôg•ËÉÊ4ûª0KæK:Ñ—Äð 4éN=štÑeI;räÄS±(C¦átß7Õ¤5K~ø\ûXV]–a-CQV÷!"ƒÄ¹´J‹Rþ\Ãÿ ®á,”ü“—°H°HËKJØ.M_Yp½„Þ¹V$%™JEo•ï á¬9?§á…+6Ç ¢„É>æòf3»U)P ÆQV!ZXïïMÑÔ3¢-ÍÎË99FJÁ¤L\s·6U@(ceA¿Tÿ`ðv* Fn÷nZ®<ÆiˆjÕ÷¢kÐ÷f•í·ÍTXë± ü.Òî|½¥SðÎO¹ÚéÎ1þ°üXNg{4Ìv¸ÅE` eŒ//#Å”NÞ$p*Qr.ýc~î9Utx=×4Í!I5€¼q`½1Hñã€ÙL…á\òWyv·5>«šúPy±Ä’ˆ_ ‚[ç"a.äÓÓ¹ Ãàv*Âà°Àß ð+W+ذN‚]Y稴öh A”`B8aWTo§Z‚¨7Ü®ÐÞ-´¢hV:jæê-aIZ,é ~-ÞåϵgC˜áQË×NShþØç¸WMÑê[l³ºoj‡áãh¹ûþ‡ýb›/M+ÎnØ^2Ød踷öØíZ“ÝåÛü/S9ÐKnÚëÄÅWp?F1µ(‹ß÷ë)l°ÁˆqPïï:p Óöºy&…‚—>ꥇ÷áaE]í²ª¡¡ƒé0Ê:­µ±‹Ê:iÐÃìÁvÓ0]æø5œçŒæÎF‚M–nË­3-e™ÀþžÄš)ˆr—¯×­pëÁ)ȉ3òXšBrÈ£$þDúƒú Ãl¬Îk»˜•Ž'+¼Oö’;uÕ8oÆ‚ëÒ6r¨Âî©{rÀ5ð°yj|Iˆ;ÕWÞHÜŒ$>oÍPCY1ô‡I_Q¦s ‰^û "hU¶¸ñKýû® De^o}e‹³$RĵžÙ™EŽ®2K"Ü\¦’£*\ïmÔAmÍÚ¾qW™jrÖä}Œ9–ñ1¥=†ó]¦»þùDJ·àQ¨´¯Ú{9@zó¾U¸>†ûæèTw©à@„…Õ XO½w}tym!u:Ðjýa ýµ1âïDµOöuÍ_î—Ƚ\PÕÞõ €]¸ ôÑ®³Ý·píÁn¯éçËoÜ´ƒÏoð,ÄŒGè̯¬«ÂqàõÌÉôß̾à_´‡Ð}+¿+÷ÃõIí¿ÒG_¾¥IëûY;…òKCrµr·ÚTYQo3*‘Ãí8¡ã éç5•b€)DÒhGwY|$ƒƒÁkš~ë3dö‰ áO¥ãOåȘð_e‡èìà'ìˆ?«â½뢳žª“2çNÌèç£(?‹½ŸŽG¬WPÕÇ:_{*)Ü­L 彫“(æ2Š‚€nÃÝj/Õ¼Ü×H‘î¡8»ßm¿e g´Œ',Jºki“ÕNë¦2†T¼É‹¥£âM‚$ ²-MZ„‰ X6›ûйéy»Ýû]sÀ²:#ú欷9¸ï¡õ%.öª°KÐÃ]sô Ô7ÀÙÁ_)4Ý„’7Î]¬!Åű÷qÓ³’úNa[9кëepˆŽèõm³;³¥ÞZíDáÄ¡‹iE”ÞÈýóÂôbÝvtç_ oèÏÇ}Öºq­Ul‘ªA‚µ)L…ú†øábX&>",{v¸îÎñÔ㎊YÀ|m„Uοí.õm°Z|öA'ÖLõÓþjc*_"4KùxÎÆá¨Õ–ŠbYuBJ˸'îiÒ÷-@gõÑK Á®@d$®í‹I¥ Zåþ6…ƒ6Ÿ†{Pø”Ôo4v€Gô½rÝÄP>¾ìà|iSÝC8[Ëb{ oP'|7çG½"K·YrÑÕ!X9]‡€ï¨ü{F £Zd—û\ï\ÃÖ%°8~qÀŦ¤ò%:W¿{|܃&ïÄùAnDƒWK'¾l·Oñ)S¦´c˜þí_ééYÁ¸Ê‘¾þÄ×NÃݦõ™=â,H†Í¯m%±Î> stream xÚÍXKoÛ8¾÷WøV°Y>DJÚGv±-º—Ò›ŽÕ&’!É»Hý9Ô3”ínSlO¤Hj8œùæã _¯ž½x“¨YBÅÕlµE|Å‚Ä"š­6³«àB¯ë¬ÈçK.il/ç ÖsNƒ/sFƒb;gq°ÅÉ}Qeæ—j~½ú ¤ÓžôP*ÂãdFQ8c¸Fô×,ÃÆÔlÉI®¼M÷/çKÉePn°óËïØ¾-‹Ãþ•ô ¿‡ ]`»dØ^/ÓK澩›6 –ýjt—Œ‘DJÔçGoêÛ³³Á»êâpsÛ¨€cŠ,¯ßÇ.°1#ëMž¬.z0®Æ»_>¬¿Ûí‡ÆÏ¯.êô&»Ë¾ê²·÷Ù;:«ü6Ž –Í'œ»öôØmÎV—i^Ý¥×>BF^¡­SŒ2œ’„ó¡F7i•U^WÃ-[š—V°$\ Å^·‘$¢Ì¢]FD0 ¢¸C»À…’Ï,±Y(IÅ3FB᤽óÄìÆi Âz˪‘¿¬‹P‘~à' ‘j"³¸ùìz+Ѭip:ŠqáËUܬúh± %œFöœ\œ[ïôúK…´ñÏN×;]z4S!aQòH³Á¦ ¬Í[Í2'3méJ]5TQñÑ2"PÝ(ÜÁ›¢|uw×ÁýrÑ„æÈÜg†Û‚&“!,£°σ…[æ´|m>ˆH€dcÓKŸÜp©Ná!bDF-Þwx î€¼QªÔõ¡Ì‡Îs±hº…sà;¥Þ—ºÒy AoÜú÷œÉÀÍ¥ÖÑŸ(å¹&ªöéZO;‰‰€Í‘‰§‡SòÖB^œñ$†5ÂO°mç(½ ¯§¥´zбNa…ɧ‡Þª£ë 2ZÎøn†”°DýWº[ççE`ÄãŒÙ×M8ÌQ\Ÿw¿óÂa½ç¢Ï1ŸzÂ ÑæÂ8¢Ë—N]ˆ“à‹N‚O’Ÿð€¯EE1.ééƒçŸ]¶ÞùbGpƒEàl#;òz’;“ ˆ´PžÒÈôG쎺ßÞç³Û]ýneþç .ž³çûŸÀSôð4Ì*<‰0A<™NÕ* ßIƒFÿ[ë2[[ì %Á ÿÈòÑS,hæ†,(,hæmïEž8΂¡D†üXÐnµÚe•³$­RÅCÀõ-e ? ‘ÊÕ`l>·ž`™Í5ÏUáôÈ7Íž‡FµÜƒ+ T [*xµÝf¹þ£|¨°\ôl ¢âãW†`œ(6™Ó (˜œLf¾±Þ~Tâùëî£Ëèh;¯JW«ô±©ou'ïÌô$Büô´ö¾¼Éêÿ¿@pÛèZ—÷`SÃD¦ä·¤ÁUP5qÌJ7'§Ù þ±¾W`ä>>/d‰$i£ô•7Jo |¤ˆš`¶Þ3‡ÿÖˆ££3åvkãC¾±ÄÞß·aÛöÙij Ô1IËŸ>N ¢K'¼,.|ÊÑ£ÇDæ¡d܃½/6‡»8L…¤˜uf©>z:¦üa‡W;7?J²UÏ,¨pÄÜWVÖÎ28ô\¬€²Ùi§Ýº5x"¤'e­78 `S§hV9!–ü¡õgM0Ñ>Šâ£ÓÒY``)Låàbbö¦1-ÞàzCðs…w$›@Lt¯('ÇOnz¨³éÙƒ›ÎçÑ`“¡,]ê¼n4è‚§ëu¿Pp'ñ·ÝÁöLYé¡È$ãî­©_{/C(ƒÂ8R±¹½X’Ž÷jŸÞ„Xû މ`½+*ƒÓ¯ÖwЫwiÝôìBnØÖFftŸ–é½®ËìkkRµdÿd%v'yËn‡ w•®B €uŸî÷Ú¥ ‚z:5Û1ûðf»Ž>ÎIdöºLÛBàÙŸ«gÿ]8] endstream endobj 172 0 obj << /Length 3167 /Filter /FlateDecode >> stream xÚÕËŽãÆñ£h:$›Ï81°^ØÆøØI6Áz”DIS¤@RË_Ÿzu‹¤ZãÍ&@àS¿ª««ªëÕE~ýüž-‚‡Bi”><ï²è!˵Êuöð¼}ø°£åÇçï(é PQ’< óöPž†ª[>FI°ˆ·ovË0_üQSñ̦»ôCY×í2 ûn&‹òt0^…‰8Y´çSÏê1UQžª  £Uò±ûòôÕò1‰`W·æÎÿÌíûËæ§v·û¡[›áÇ döCü‘{0~‰ç a¨ `†p~àõ?MÐðàÔöf0m³²CÓ ÜÝw@6w#Yº²éëá§”ÉÀ eWDL¨"Ц­ËÞô^Ò<Ú3CA6i¾ò±¹ú¿²i‰I?‘Ãð÷Ê`ò2Ýç/Q‘žbýHóQªÂd¦3WËxW‘þƒüT>ý_ªü‰‘¿ËT‘!y–$S: °Pi$ž¥`@k €:GÀDeYþªX ¶'Ÿ‚Ó¢ dW0èwø:rE·î4Ó*Šœ7}ïÿM-Äá~[í&|ã;GÞ: U´Ëî<Ì=Æxô4ʦѧp˜ú39|çà çƒcÿ\•ÄzÂ!ð”*H ºÚH ±[ÓŸêòê…ñb8TÜ1ÍÆl«fCC½è*VdkwÜ–ÜôÕÀ`vþý2Ó 6˜BeÁàÙwð ^–i²P<û|0=ãÛ› ÛÑÔÛS£`ñ3b-M]®k!¹m m;7[ˆ¾,–d$–XCÐÌœØÿñÝ›¿z„e*Ín)‘]ªU–†SûyBÂÒT¤Œî]?ð`×vÇ•çîÓŒAÏ´»˜éTše‚Ø|%7µ±´¡õKœ´W<~Y¸{<[,ëªn›½0ÒÎêË£íÊtÉ×)î߈ ¯6m³}]:Á¨fÚ?‘Èì*›ºAD‘  ±A—(ú’û¦áv`-ÊõbSöÕÊNÊŽ‘fá‹ùtªMµØv¶gÓOu5ÈHîztpŽÿ`¬õ ï‘I çÅkBIT†W½$\OÂÁºÂ½_YI‘òê"Uà~'ºëîI‡‹²ÃÔt>VÍ໯,çî }Gg5„ çSWŒ˜ä - 7`¨48=A”Üt@U'T½˜A€ÚJ¯¬y7^CÛ©¾Ä8‚🂿:3€{ðØ8' ŽÚ[D1øs»þb¶@Š Xrân¤qzüx:ö&‡ÊìƒÏc‡JçÑL|ý©Ú˜ÝÅ€y²Ç]$Ùô"Y=áÁ@¼®¸ÏS·¤[†ŽœM}RYÜc7‹'æA¨* ØB¹²›=ö¼ºæÞZ%®T[år¬TE±ýMÉŽ(?Ïžª«‚öžcÇf-/ ÝI0×U§®êéöi\rsÇ^mOñðïË0 ñ<³©zF^v• ê cÛ“ù§âG =´ùµmR?#S{ÔlÞyGÓð¦p±¾\)÷¤–[&Ö£Û¹5²8VEì ¨÷è$fÓI”‘†"ÉHÇwb.BX ðˆÔáec²èͯ•‡ž0Ñ*ôoÎé1x1ˆž¶kSîn™PhÇÕoñ–ÛŽ)Â’L—q€Š?b*a'ë¡-e¡.cGàíJNæáGŸ™Eð’Ç‘•6Z]åýå æƒ”/ÍÍ äEÇÖ„Ý5ø,|îcŸä­ƒs–…²,Åýg aM!ž /Îz j‹jÈCÒ`D:ˆ œÝ /EçÁ›Û’«2ÚC<+&˜Ý3°l¤^8Â|÷Ô™cÙ]xbÓ0~3Q~p„lj#°8"‡åºEQ°<(µåiÎ'²+1¤²Ôkwó¥ec5ÏÑÄáÎG•ï}jö{ºÏ4«1ohT<ÿ¼ÌÁ ’tp¢¸c9¾\DH— °©6] €ó}ázÝög L*§¸ÕºÅ#^,™msÅ:”ÆæÀϧ§Èóâl”ÔnÂÑ+*NòLT;ÉGá~vŽ£D¶8ÉÜÄì\:i‘pú›-šö³]Ù&:µ®†—ªj,O‡)iâŠç À¤¡|ÉE@ ïŒ ôï& $5É¿X4çãš…_ðåXIäÙ’®ôç5¥­‚U.‡¯¼ šqŸC:¹Ô»*UŒ]<ÑTŒHðótÉ ’ó iïÖǺ‹¯ðÞÃXÑ1IgüD:süð:£¶Æ¬e4ç¿6N4 ]„ÀM ·C Я™9þ‘|>é Tzˆ+=oj¦ôIÃ2§¶ÂÅ–WÍÀ³´¦PczžBwÃ.+FRÏ2ÍDÔ înª)𲑱=Aè‹S.6õèqVµl&Ýœ»µ‘ž;:y…ìjŒF4Ø#›-Z&¡kšY2h)žæŠ›2ÉC¹«MÜU8X“›7cµb„®ÿÞi¿Õ-O*ñy ½¦"íyà>Ç]k¡ËxiSÏmÓ 0 Å_R9…ÀÃââÑSÃí©ÄX®K—òÀd_]™ï,1ãÛ#âøh©”¹µÐ¶íJÜü"ÓvËО3ž«•,•CŸë‚@Ýr+Þzƶ=·Âz Hú‹Ë¦¾ª¸órh§›ÆQ×Ù“2ä‘•À}nA¤z^íäÀc{îerÅ ó0P‚1w—•Zaa±Ãïólê8t9?û•Ñ•Ø$V¿§Ú ö@æ{7Ðh³X4»`hŽ-…qñÀ \ÁÂ$¡›JùK;T¯P#÷¤·¿b¿% %|g0SWRFckÃ)Ã/ê›`HÉ9³FuõÐ0`VèÁWA¨©{y€žo¿s¿=×ÃÕ~o+saš©üú¸¹S™Ó 3÷–>–Ím‹rõ°ÈT‘'S ÿµ2K8UÜÔfó§Ã0GömÉÍTh(Ú,µk§ö„ž»®ž¹'Š =Ó`ÉEêücÔ¬‰Yr'ngã¸DûvvÇïäö*‘`ð{e×+= ¾+c’¨Ü”ò>·Ž&${Î%ìÈ’¯ ²t<©j¿»æÃ·”窸öV|ˆœ;ÍöÝá£õ;õ³tüÙe´B³ç²W6Áæ) éX%¡žòò(ϼ¨P©ž=óøS©Oc§î剱þØnÏ5x€i―q½×@6n#Œ‹&“D¸ÂosôéüÁçl *yx/ZÒöiº‰AEÒ³ùɦoÁpáYzì¥BÈ\MŸ~—“8~Ûwdg*Ë¢ÿJMÈ{qaÂF[˜yÛ6ÿ:ï— òäòò¶.ûþ T›áˆ*]\á%[À5NÖn Qª8qŸ“)@ù¤ª!gx´*S‘N>Ÿsï·…t”DIöš¢$§ IÏ;vÊ™#\ÝÌ6óúQ0§U°¥®ŽRTK2…:Ê¥ãä5Ùå*½VUË}ÏcçˆYñªÛÂr´Ðqžd¶ÌŠ¿@€0‹Y5ÔäJÒ„€?UaËu)èXNW¡ËŽJÛÏÍ0#j4¢Æ-­ËS¯"ÕÔqÊï 8YÌLÌÎ ‡WSN¯ÕZywOG"N]ÕúŸËS’³ÁoØ;LShÄÓò ?OƈûÚÜ?Õf˜q2&€–,ÆcIyQe«ì>;ùÙ¸¯lEÀ_rùÜÇâèAúã“xL¹TaKŸŒê“ Ûq cD›7Û!/÷W3ojðÅÍ$Q¹*ãâ½NˆÔk¢Î‡Àó ÖÕÑ6W}õþ^· ý¸j1®P¸gŠ(šÊ2E6¾d&®QA¢?»´kc*[®‘#Z›¯¹_|óüÅ¿±ÉœÝ endstream endobj 178 0 obj << /Length 3486 /Filter /FlateDecode >> stream xÚíZßoÛ8~ï_á{³„'þ¦î¡ ¶ÝÝñÓÝ^Å‘ÝÚRN’·Íýõ7䢤ÐvÒëã"@LQ9$g¾ofÈwë7}Ÿ«ENrÅÔb½]h¶Ð†Ãõb}¿øçò¶ÜôUS¯®™Ì–9Áß›fß´Xܵ+!—Íñ±[ýkýwè,u&¤"Ìä‹ û¢Û½ Œä’ Ûè:´ºfœä›2bV×2Ë–ŸšöPì«ÿ®®i¶,Û•ËÔH|Íc ?ÛƒtJ,Û²+ëþÊ>Éå¡é|}³Åßþ¡ÄWÛcíæÙa}U‡÷U‡ ºa º-ÿs¬Ú2´)zlc{CÑäH4&%ЇEøðösB~˜ºÒ"´y,6¿»Tg\¦ihwSÀ‚dË¢ÿX÷e»]q(oÊD÷J.Mø¬fÙõÅ~_Þ£ø¿e2+ê{|·i×¶£Å5×9ÑJ-®)…=“^ >ƒ¨ÓµüæÞ~­ºò ŸíRÀV=áSáÖÊV,[þ±brYTûânïªA}ê½o¹E½RËîÑÎÄw­S/|ß6‡8‚+lÚ'7f×ÕæùG›Þ7»c­õàV¯.p¾Ùt¢vÓ‹=êúze`AêŸí‚½€Oßü´~c·&[Е9°Qšr¢a7‡7ð‚Àk¢ínhw^Z¾sV9Þ¿ywÞF(}6®V$Ïäl\ø›Œé]sÖ•·<(˜&¹Î¨3bÊ(1¹ëœäœ{ƒÇ–’- +Ím)‰ÖfA‰à}ÄF|26%,3ÐYl€ l?7Uݰûû±þðKý» ^¤1’Q¡ˆAç?§GáT‡vj ÓáÈ’³Ðê-…€ É$`Í "¶el-„p®Q»8WËz_Xì 2±Œ01 皘!‹’z6Éð 5b@ jÉœL…;ÂwǺ:4÷Ç}á¥îÛ¢î¶v*&ãW*ô¨—û¢ï«®k·`Ô‰©mÝÑsmN¬ˉRƒðÞF÷êk¡)Ñq-Þ%׈䧇·ÎÞn·U]ÞX˜9µFÃBÜ&F7Ä06=¡¯Œdq¾©ÝT$3à 'ð1Ù•Åx±4–lWN?4ì[,P´÷XÛ–žDÝÆ_aäE÷Q¿.%n9â `û“=/º”ÒƒÎËý¢¥;˾–@~±åûêpeaW¶5×+|ùN0ÕŒ¨l˜-|CsµlaÙG½¬VtÙûbJB Àé÷KøÅ¾|÷åš:!q¿¤•¦ŒœâG +:]Í5îÏeÐ=áÜ€×ÓÜM=á›Cñ»uJß¶²+±ˆ´k¿¨’Z¤“v^—=‚n ìÓ3¸­q@C°ü©é}­sœÃßs Ö¢¥ŽÖ«³>x÷e(÷åT× öµê° êü“‚r¾„FmUvÞãÉás°²øÜ‹äþÊûÞ‰ÈÀÉè|)¹˜ØZŸ]KMd\ìÐ}?ƒ7”áZž¦áLí˜sDÃì, ˗ѰovcWêu< ¢*óó0ËþÔyæsÜ“$+o.„F)¹@Ñ".]âbÍøy¥•™špñXºÀÅP„B.†Â„‹¡ís.}å{ä#.†Of\,`G¸×o5"czÊ-a`éR¾‚Œ©äçɘ 5!ãÓCƒFçô5d¬€éÅyØŒ=OÆ òÒ¼ŠŒai2†ðïâ8…¾œ†Ð ÃÓs6¦S=|ŒJ@=Cɤ‰8T€Î‚»‘ÿ ÖÄð)Ó)ÓeÕûßô›±a ¿C¾Wñ/.ðù“ÿäß¿üòïÚbÿÞYÿÌ MEàWçf6égžw×S!0Ïäö>DF4e'¨— ê÷ 㘉 Óoãa}¡¸;êTA´ËÅù‚ ±=Z:µ£÷q GC,»Ì!üŽ2‡®§ðqHb}ågZQÓ]. *œi#ÙjN²|¦Ì˜æbƒ‘Ú"f¬®ðà CË]Y—z©=„íQâd¸šJ—ãP?²—aýà%™.“fØ¿^0ÂÌÐÙúSŠ$xiü<ãfDêó»Ë#‡Š'mÓV^Î"ÖUõ±9 ©û¹s>‘“é9óll Ãnkÿàè jFRãWq|MåKÓ2³'<&© çõ§¿ØùzÜmb§¸$¹1³¹ÝVõÆGõ®ÎÌaðæaõ°ªî)Ô¢6Cá·,cuÕ—.Ý Ï¨Ô`5Wþƒ~øE㳄d¦‡}±&äüÊèµÃY¥í¶Æ_Ü|È€MDÁÇ»§”¥ pÕÌ—ð“¦í~Ý~ð´ÂáVL?3iφd”_ÀaI"ŸóJ>·ÍcÙbJÝrWYü^Õ»«aN­*&(¢XD`)iÁŒgú0=Lž6$³W&.×MÒÿà1é›]i]É•”Ë$'³\“ë)'‹ÈɈ¸é8„F‚ú~6¶ÇeÑ ^ÄÆœù³.n^¶+çþ‚)–øj’¢f>,f2|"_’‰Óüœè°³YG9Npìný"©‹©È0ÖÛ÷iMÓ1ìò@0_Љ ¤V¢Bì÷,•i]W1@žó¯9@å¡‚H={׫v¾o*ÝöK‡™$½»Ôä²ÜÑÆˆÊŽåÓðü·A$¥c®å&Ù7¡ÑýÇ¿˜°“bÌN~xïÛ·Šˆ€ÑÖ¥‡(Xª)OØ@š)Hã(8CPx,ZWÊ‘>¥ Ød$wuE?íí ¼'øøscUíkiÿc´Ò®Àµó£øx<5ؘáÝ„½¥™³7 “8_ \nñ¶ž‡4ÍᱩmÚê¹â§d1«ööý«)>Ÿ0É3Ì”ŒdNá-fúSuùó3?Öö$ýb“¼õJÛ½(˜‚Ï ¾\¥}ÌQà V’’u²°§’‘à žÒ%1ØO´á?SÚáSÖy<ö¾ k‚RAÍIŒ2æB«£cïOóõr_áÍåo>è"º¡:±–Ïé‹ýÊOU£Xp4Éã]ÅûÀP9…~û¦rzöi¹ÁêÇÐÊM°¥Kgàq“><ñL FV5-áøœÈòñ5ŽS6M‹Øîîü0÷U·5)OYû±mqšöm(ûk7·þe?uЯRaàwª¼-ª}ú扠lž÷ˆˆé $¬-øB­§á2Lã«Õò&.éÒG¦ñŒë6™6dãìûK|Å[v±›f;wj]†÷¼ÜáxÆ* ýõËáJ²“®º/1ñ˜Ê ðZèTÕÕ›¦þ÷qg#’[»ÎÂé,9DS$cK/Ô°ü|æ‡Ñœ_¼d!ˆŽÂœÃÓQ† ¸ÚåaôܦáÍ¡èÛê[ Ô$á1¾=$£ ¥"G¸ð\˜Q¶t2=nÀ©‹øå€Éå¿áOR!…†0–QS˜sæk§cÚû´&Tm±¿ºÁ•‰ð+âÊ.ùú €Øå› YEJâ% =øÌ™™¶ˆ®ÐñŠ•Ýˆ¶ ãöŽmÔ;s™Ÿ£º‡6L¤;ëŠ 6‡Cî¦Ý‰ŽÑüùí8ª ‘qóN^µ“ñ(ÿìU;Êòï¹jÇ¢F„Y¯Úͱźyñ:]ê†$ËÃüÂÂݯïG†«˜ÚºÀ6ý~"ã7¿ nùá×êt\'-òÓóѸÈåüna1îÕ¿>4¿2\Óp“ÒISÞϯ`†+šÍ~¿¢KôÝŒ¡Öéfñ´RÒ媔(Ÿâ'ü‡C¿"`÷t5BÜ ÅògÙ.ß \îþ %ñÃ%ÌØ°ñÉõ¯µ%ˆìæ ’EΞòŽTž í ÐÆ€+?§C»Qæ \‚ aPÕ÷ˆi]Pñ¥NaDtYLº' .ËÔi3º§š>&–PkÔS»•·Óµš¸jQÌ\JHÛlÑk²À èO#¥“鎯¸’àÊÏ]Ók‘Å;k³ã5–…cÞ<ó²,è°­¬¶X倯üyãèU¼¦ë¶¾;wöœî¿­v}ª+{|ŸÎ>öNl¶‰ê’ÙÏ·áUÉx+Û:H¾/îÊýÞY½[‚-Vû _/—Á€Ì` Ç h©øìÌ =:ÇðྤXÑ7)‹ÌÆw>.ÚËvåtz¾‡X¡=øì5ÔÛö·À×Öl¿9eðïGSµÎ¼¿b+üÖÙ¢Ûºnh—Ø; šÿœ v”'ólW½0¦ñ)Fƒó˃ÛìÖE½ùô•ï¬ë=}À ¨K`kö^²a)ÏÁméÁ'º³fuì“ B®ôTn¬ô¿Øù%Ö„ÃN!Çjy>ÐKî³FyqUîN9¦¢Ü‡ÎÐlͦ ±{lêû+úfÖÓcÓUÞõÔG!†¾ð4$z¶ö7DŒrvš`÷Òyi| nR¤÷N^\xo§:¥–VÙ= y×OÌàζ Ez…‚ß*ƒžK>L^ã[9¾8ó~©¨Yd„gùKÙ nt««ÃÁнõJ¼kâWkÏγÅÜœ†Ñ‚Úëüÿ¶Ë!j endstream endobj 188 0 obj << /Length 2020 /Filter /FlateDecode >> stream xÚÅYmoÛ6þÞ_á`sâ›HmØ€.è’Zlé§¶›¶…Ú’!ÉMòïw|Ó[hÙM< B‰¤ŽwÏϿ߽ùé$š$(‰I<¹[M™I‘¤br·œ|žbvõõîO˜w&Ñ(B„óIdç\oÒ}­Ê«9áÑ” Û¾]]a9ýE$W¶gQ>UuºÝW8š®Ë+̧é~“-ì(t0>-ûÊ-ØÕjîWœŠl—­7ÊN¥Ý©˜#Â’Fµb[”×E¥ê¿²ªH1"I3½X¬ÅQÁ‰!1’q3ì§QbWÖL3f™î0xc»7鉦ß5ʦ¶Ù§¥Êk;)Ë7ªÌj;gNæB‹ÏòµX•ÅÎOIÝ—VÊÌvgùb{XºùÒC7™ã(ABÆð€Qø ¶é½ÚnÍdíÅ´ú#ëH½våý\Ùö!«7n>L,½Sµå³ÎgÝ~ûì`h–Ë Ûzô3<6:dNFqEøô!ïNFƨ¬¯2gÍßÙz£Å:ݶu¶ßf‹´Î ý%aÓû';–ÚFì£qÉÒŽ«­Úi=qÁ˜x¿¯CÑ…H$ƃ+BœŒW‚¢&>³|yX¨ª£1›îU¹;ÔÖ¢çòe‚bÙÈ߉x´†8°–HÚÑÖ¬b½ëX¯ÛN;Èü meC›ˆ¡(–§vïì"-ën“Uv©¥²\RÙÀe˜Â®¤ýÀÕˆ1ÍÓúP¦[ý»¬ØÁ_ DSíìðQý8£ãŽˆ‰h=QVœÅVªžv;U—†Ð ßÄx³¢™±T:²Ö¥R! ŠkÊ0”HÜEdßùå³]ºVÝõ´j½ vDLÀÈ&Ö…<¨0Dƒ ìamøí#ÄÞ±3û ÌO¿HÎ&VG#i¾ðÑÀ8=ä8$sü‘9®iŒuŸŽ!÷ÏÛ®ü@\`@'¾ ¡¨™ P""lO@ØÉvòC'¥ît¶39‰ RÏØ…œ€NÔyê}ÈL Ì$AX;͘jœ©I"`DLh•¼ H>Lhë® ,n"ø6¤AR43Ž0b-Uýá(!”ç8AÄ#´(òª.‹ZGä©m ™™H0/{’<Ù·#ôÆ20>1ÞÈr‡"n?x¬÷ëΞé±uŒpk×m„%x"—PÁ›â°u6õ“ Ýcè3«Ýœ$†ŒýkÈhÊÁ]ñÙFko!+ïº5·9ë νñå<9 –,÷;ÔïÛíŸôi Åãf¬:/A0/ï´®c_TUv¿U}ìñ™ð^vRëßk¼õàÓÔ6Ël¥•Y©ö£ïº#ÝT0i¹ñ)£6Ð¥Œð¸Óè‡{eÛ&Ž©q¢NòÔÌ¿Ù4­³Åa›B‚ù]ÙÛsξÖÍoW«,W×:YwZº8¶QÄïˆqyQ~sû ¤5HlbrÜs’ 2çûê$w JãN ˜¥#>8T£–ƒ?ŽßF-¾yd6ÊääNg·'ÓM8ë‘Z~äáŒ>ˆ~!Éd}zésëÇ©Çà–á€?–·Ø[?‡'}øK9h^…nNŽTü)àïX¡C–cçóo8øA”ð>þlvþ,tÅ>âI!ŒN;€tÅŸ‰ÿà’»ÐTcÎ… ¯tF xsâœAìL~ig|X½³—Ö;ã9}G+på;éQÈ1(OåÎu©/T¤îÌ÷W÷§Âê$Á¯t*Äý _šàš›Öÿ¾ÁžœôÞH†·B3FžcñC 5ÈòÙ.,• ×îBÌȺÕÁN–vâýSH!‘ ÌÇOBÑ0ÒEí¸ Ì­\§‰lK%ÐiƒR¶ƒm昄¡™SBá²!û9ÏËb“Øó½›âÒ±Ù½ Ï$ATįO&àöòØ– úÅS< >äZ?;7jkUˆ å¢WV-žôòŰká±AZ+/èÛ9‡¼"ÌèÑ‚ÞÑS¤{ˆ‘Ý»ÆQÞˆãFÖ‡‘À€d¸ ÕßHŒbŽÇ €Xð^*L‰I…¡ñÇ<Ðfö¹Bx±Qè'6‚—‘r–ñ¶õ)¨SBé©ÚSŒOÚÕ@·V¹*ÓÚkäJNÅ8à¸dò# Yywƒ†á9¨7¤¬Ý'm÷þ°—uv1@Ý­h¯• 3e>K±ñ‰ÒLή[Ï:œâî^îÄæ,ÝßWÂõhIä˜ù Yçç5s?©% •r1ÑõÜO@×éþ·«9'HÎ4?ÿê^›í?ÇðßÔ›ðŒÌ¨Þ…3;G÷AÏŒ™é»ð/MU£p#ïsûíò¾úMßÈãCÅo*þlc:ò3t<[Ÿë¾>ƒú€ÕqÖSýe ½ ´ç7ç®î­(gÄmЧuyPg,Ó¿ × îì5¿ß™Ïõ§GœÔJŸéaýÐAìBRa¸Á™D(!¤oƒžãÜò_,N`p~g ÷Ë®¹¡õ´¹Øº¬]׫ÐÌ=ºzý8ئUí€y´Í¼9ýÛ¬í÷8ª}©*‚¤ÿ»Òãý~‚œÉÞ-ĵԵ¬kÒÑðþÔßêýäÄ}ûìë‹öÿPÊ`Ó¿yw÷æ_L;W\ endstream endobj 205 0 obj << /Length 1524 /Filter /FlateDecode >> stream xÚíXIsÛ6¾çWèqFBà7™q|Ã˾a±ùVð–˜Ìï¸Z zœ+=áß\&ñØ‹C„8D8 S”$‰9a©$òmèˆH&ü½)öÇ&ˆÿ\€P„ Bˆ!:Ëìž~2¦(¦6K.DRC†Ø y ‚$ј©Ÿx¼´Â=M­0EÔ›cçY–·I Â:Ø$¢A+ÈýBÆA–$(ð[i‰ä û( ã}Ù &e¾äSþçŽFå`)XYÃT"^® ž/ׯÑêÌ}.×ãá(Fa2_„’¨µÃÄP“k^Æ0rÖ%Ð3†ñ ¦¾Tyù¬ùhˆâ´åS¹< •5N{: -‰%³yY•5däBñhfnx³¢½oëõÌî—k&í:«ù¤å£4ö±V/­HÚÁ\Øm6RKcˆ¥Šãd„Q„6‚Æ?bݶÎR]f_ôr×…)òiksÓÓfvŠSDâ‚Ë(k£"XÂ|lw3Ôiíó|-îsek'—ëqêVÃçÉ‹N§ƒQjY_Vâ6/™xô":¶bïʲVCG “¼œ6^&û•zn~Þ¾³Ÿ[¶äZÑÙ¢s±õû/ÔÛîøçRCŽ¡B&ØŸ¼Æ¯_FÊÍPœŸÙC¾aES[.IjÀ„ºmnE|ÙMnE¾áõÔ¹>6~Ø0)r Y¦¸é¡®BzÚ5^rÁd%ê÷“cŽ£J•0ÂCy¾E>NO]DOGëEWš?0(F{xüîù]óãž±B禫nÒ›võO›­¡ß]½c4›+Ü Š³³CýæKÅì°rFüÃíè)r“ÿHޫV]³Ôëk^âï=hˆ*(J‘-Çy¹ÒÕ,U•QO3K0è·1¢˜4õ¯VeÄl^ uÛè o¿ªÒµ]ÅÜÕw ¨k;˜à¾ GÜ–]èDr%þúÇ €ZDE(êz«’­£´ú;:1¿ß Z&WÏS”`ÜÞš´ü}·òè˜IË1/÷D`™§=ªT³TVŠhþ¦°†CO[.SäG­˜b/= ÷Aa>ò²–¬\6pk‘º€’c±-köióƒèwêŸ1¿]¹åŠâÔ¸,…SrŠacLïÐÜE)~Ò¡5ýXu#hc‘ÙÔè¦ÓЃ¬*ŠÊÓõ»\5Ë-ë„ohžSB‡MZW4êÝÍÿˆùÝ3:Œ˜à«Ä’ì8Kå%\Årù89øyÔeûI \æ…äк$¬‡>ƒÜz˜•_ Àôïßõ¾ã-eòÏÂ@åº&ßši¨èá09Õ×Çs{.²özŒï¡Ö)m܇åºs’¹ÍÏtݼÓõ²­{O³½ ’#’™‹ø¿T …?0·M'èa:|~p ìàˆÃn{ía¡N U£ ¿ÍiŒ€ßæOç_dIˆº— è3þ`+©€¢ˆv/Lèž@ÎJÈ¬Ì `¼t5F KØ>DÈÊH{c­¤±°(ô]]}÷#e¯d¯[7×Á .}Ý m3[ï¶ÛJÈoª²yÈ*áÂË †Î‚<÷$äòD wúÎfê!ÚÂeË1Õfá–ŠhZ­Û®óeï’Z7°^­ô•õÕÇÅ«¿ªÚÖ endstream endobj 209 0 obj << /Length 2092 /Filter /FlateDecode >> stream xÚíYK㸾ϯ0öÒ2àæò©°LÐÁìú–ÍA-Ó–·äHrfûß§ŠE=-·»'3“9äb•JÅb±‹ôOÛwß¿Oø*aI(ÃÕv¿Šä*Š‹U´ÚîVÿD¸þçöï Ž„çL³â$ósžžZ[¯ï¥ádôüq¿qðç²´ÄÉêç¦MÇj-xp¨×Âé)/2ú m‚ê|jhÂ8Z É#4ÎxßMy/KÍ+™ë{ÃyðPÂüeÚU™A_Ûũôç:Z¯s²Rº$“R’²÷hO‹P’mn‰87¶¾[4ôžUåZóàß(lË–™Ýà¤~dúxôc?m>S'"zžŽiiiÜ¡vkvì´ÜÍHʼnhNiæyÃ~dQfÇóÎîº7¿^3Z¯ŠI•ôAÃ¥òB²àp²Ñ²e¤u›ÛÆ¢ðê^«E±XÝ !2$ÖÛÅÁµ%âP¬¥éüE¬Â=e`‘ùgšµkŸ‰G ¡&}ê(Û¶EyðŠÿà†̲ ½fyUdÖ«öô|L›¢³ÃyWuq(J-ü‡flŒ&ž¥²|*A1büàË.IìÃTJÌ¢jŒ‘L¢à˜Â²0¤N¢ö˜QÛ}ս쇬¢ì%IQY•÷§ºx*Ú‘0ÉxG¸É»â;ÔPt¶nfC¢ï¼âбÍiptJ(¯úE‡´h¨‰¶N!\·•æó²w3åî=…)|¯g,%|ÿˆN BüÒg/žÒciÍÀîÖ d÷ĵ±ÞòI­ç5B…W.ã€ryOÊ Ô/^Ä!dÿÆ :+zÙ{´ik([?nHax£Ú@b-J@8-Ž˜_˜^¡ÆB#SÕ4áÉu-0Ò®ôáÍƒŽ·~!E³<­¡æ0\Ý«qÝkÅ×]Ý߉»l†…€À^f³ Å0)Â^‰ü4%’éAàîñÓ•ô:²ÏaH¾¨$fZD bÎ¥Án5è©oƒeéàaOT%‚$r*·£Ëgq]¶ó"«6þ{;•ëófÁV贌ߒÞØ¾¢œy®¢í ™¾ðÝ6¢Â˜Å‰žÂIKÕ¯ { ¢hZÌy¹=اªp•ŸîÀÌ‹CŽ=r›ç§'ÛÖÏô¥ÍÓ²£, Ðn@LWíÀóõ2~H¦½ì XÆ ã£ÂHýCém:gÞÒ,m¬CŽaEÝyAÔ…° õÂBSúάðŽÖ02äÑ –E) ð[8SÌÝ6©p_.<…~&jäexë‚$ RÞËŒ˜Û^C¿XG_[¬škn¬¶¯nˆ^I*‹ÞdKÄÎîÝþq>¶“I½aÃfŽF»9—÷ô°w ¸†Üçwø˜Ò‡sYüëܱþtÕÜ sYóqÊûv*Þwpã¶P•E=Ì<.ø#b&évEm3ìcH9vN×ÝFÐV'oÁ[ê¥ÐX¨÷KcÁÖX÷¶d‹Ær’±gF™·;Ë4pKucÕ1S<U”Z× kÍb1+­IÊI£G)‡˜à·¼zz¬r»«ÝiÅ į3Ò¾=C欄o…¦$‘ûvúà@ð¥o…Ì B01B–üÕÑÇù±–qŽ™AõÅ"ɪ4±86S¯Ý0R2ÅoÙ@¯]&ÉÍ]ÄrôqO;‹/âÛ©‚rЏpG×D@¶†°Tà)åÕ$hä*A(×6E°>Á´òþxXÚ“jsö7Ìšß}‡ø°EW.%8ˆ‡£¢{ZšBÃ.£f-ÑT g:ìÝ\ÖËJÔкl¹ô²â†%²Ï»÷¾¢BÎ"!a X½ÃjÛžërzhÚVÛª¦;q -®{wÎ,‚›ß$Ž~ ¶“Q}™úŒŸšNz@•ç§G»„†*‚<¿tY2 ­‰ÂqI¹V<Ù²Ad¼T žŠ‡4íÙ\çb†ê(dJÇÓ•/¦¨~]ŠêyŠ~(ƒ¢½ž¡މ‡}þZõ Èíe±y±ø z[Ü(¾ÈݓʹžQÛSm[¶©o}€ÈEgºOzó˜$Œè‡ùGh$ëWRãíëá Ö·ÒÕw,"I €É¼ci º›P°»)ýÍJ‚6+ðboUçžÙ>Mws/»í”BÚMZ”¯Üdée_Õ|Ú.϶ˆuЗ&ñl7V_d7þPþj÷/U´vg²ÏQÑŸè` êþKݷᄹð«Á\”y[Ÿçßþ¾H_>H¾sÐNÅÉË0'Ç—st¢_†9ÃÌ€W`.f<Òs­þºE_Àò:˜Cšxfp„aD>Ì•y”s:¦(׉9ïJqáòÿ(×£œþ" ÝÕJŽ“Ò|+ðçÍ(Œ¾<¼ýÏÝñ5qM®H…okߨKi韃‰¨Çš…îx {8@Z܇¶ª¯„L,©¥½hAk1nz¥Ýy²ûÛMú?(e¢&(„÷ºøugO¶ÜQëëãÆ£éäy> stream xÚUKoâ0¾ó+rt¤Æõ#Ž“ci¡Ý®Äa‹m‡‰b”‡ºüû?B¥Ú‡±=ão†ï›qÆóÑõ4–8Ž„ðæk3‚)M<r,YäÍWÞ —KŸT•jÓ¤»Âgíý·ùãõ4!^‚“H®½€E މô‡`Íå—ñx¶x–ñ›BÐöÇhÜ(Ÿ ôQ_Ùýá\{”QÓØ#˜ óÊ1®€à˜3mW_Y(?È¡=:´YÞ/Í-aÂÅâµyã‡dÀ*^ø1Aª^5i×fEþîÜi½:{NÛ6¯‹´o±#)9"‰J‰9…Jl®ÛfßviUYfËÌBÜ7ªßµv­ÖÖN}*êÍ~`+g‰À‰ðJÁ¸âïÊm^·¥ªÓ î ‚žvi–_P ê P™«ÛàGUÔvµÐ ”U®³îfá|–[®Íæ—O¡/Tóîœ4‘1¶µAa&€Wá'®&÷³DºN˜j>!/gÝ›K+ü ‘xŽDJ‹ê ’F¤MÊìÝžaôbá' 9÷L»¡æ¼r™oÕv×we½±Ûmú»ÜjêtpÛ/7N‰À½i€‹µ Þ©¶ì€w¬ÖÖ¶†~a±.5E@%ŽByªäMÖ¥–VÓ$vysAI!0‰Ø ¤àNŒ0’¯Œlh÷¯DP\‚¥N¤„cÚXb§ÑCZ$Âi4÷eh¨ãÁ¹VÎ#”¯ÊN5¾èb‹9çCAßê.oê´s=©¡æZútYå­Å[˜qœŽƒÿÙz:ê§OY‚TÕos}se­iñÀÐk#ŸöÛmÞ5Ÿ—% »Âú&+#Ó9ôŸäG#a8 ™Äñù”}¯úÏGȽSͪɳ¢;L̦€UœÍ{K<›·#‰þzc̱Ð6jÕg¦pØ)kÛã¿®CÛ£¿î@¿ÕDb1ˆ$å‘ì¥c‰4®‘H;¾”H;‰\ݦ[G“ùˆBâQh ©?5žˆ#ÅÜ˶#p`pãÈk6‡¸` Ž"Çúsu¢Ø9ÜIŸ§)Œ =K ¿“´.èiÏ LZ'ü.ÝÊ`))Õ(¹í]Ì!GÕá endstream endobj 259 0 obj << /Length 1666 /Filter /FlateDecode >> stream xÚÍYmoÛ6þÞ_á³â«Ä©×vÞú4lÝE–mµ¶”IrÓì×)É¢O²²&À –àã=Çã½Y®'Œq„=9ñCO–«ÉÓEºŠ/0Ÿ~¿øsùËË7Ò›H$Z~F}Z-˜q<ÉÍŠå6).fTŠiÒ¬­^£L¿|Óÿâ¼ñ§Yº{0ߖͲ}˜Â2/Wæã.ÜÄæ)=ìoã¼°V‰#«%HJ<ñŒ9Iî’¨Ì'¢¯åòxm­R¶dæ34FÞo³E/â¨L²Ô¼Üo“hk-±+Õ†‰Þ#ñ¦Y¯ŽÕùÓòO•<žÆÚšÉŒŒˆ²}†1’ܺ¯ušö“Ò@$‡Û/ ™·_5F%ôpR¾*Ì7aë2-²¼¬ß'åÖÏŠ¸|—o‡!ä$(™i>öËSUsU‚WkÝŒ?{9>Éâ &ºÙ áÞš¡…NûžEchýöËSmG4–ûˆ´© Ÿ«•9Uþs¶Wù¢t{¨ HbÑc±ý²+‘Vš¤›ÂÊ&UM³L‹O«Úæ¶êŠØí²†á#2AÃ}\¿ÞÅ{¥øq!ãú¨7€4[ê;Ò§Ð_×z@½P…Aª1ê­¨£>ýrØ„ÑÃ|E\¼¿'ªæ6¥‡úÇ´ŠqnÎJ?€´j†9G ÿGÖá†Wv•k ;uÉì®TÔô¶wK`]2‰Ò[ŠÒ¢ÌÕ朦%MCáÐÄeE:j£ŽÚÊŒl=ÀW}$Áå« S†O±yç"­ÍÊQ¨IyÝî´8Ÿ“‹TMi¸ëk`L c#ÄVŸöY¸3ÒË‹@yìvƒ1Ðl¡)³l@V¦ ôŒ¤EôA<iY<iq°ÎÒÁì{‚ _ŒªbXE<¥r˜šø±Ú›õæîQçÒNƒÈk»ñàÀ6n¿M+æ^ ¡2ùÑ´öáPÀªPR7ê^GýÔ“£ÿh’ñd}äÈ'þÿÒƒM€î p°îXIHù*Oÿ€ïb´=ò6pS†é*ÌW#NSŽd GM VÔ ælpGÎÝÕà‰[QwO{sÑ0PuuŒ²¢ÐoÑ×l½¾ÎФº!KÃ18T6¬ü¨k¿?ßµjXÆO1̧N:“O¤IXŸ}SÄ}ú„Ñ!…Ý}ØÉ¢&º=4µE=€8œéì{F\?jªI¤ì+[ÅØ“·ÛÇ2PÃ:ï¦Ç>.·Ùjœ=‚!ŸùOTEÝ» ÕÁ%6‰YñÐéÄaÚÞJ1oÚL‘vG#<00Foµu¼R+(Û[ŒÞõ³Ž‚!³†¹»¢Dü¨s{®i¸b;؉üö>oÌ¥X…t ï‰~ø‚©ñV¸×NTX¡Nqº>Õ†:àcÅK|°ŸX‘SÕb-¢þ±Q&ûH‹ùˆìýÓ©-œ"*88êÉŽIä9œïîÄe#B–¢àñ?Œ»Èç>ânëC{À(€ (^ï[—ˆûNžWAΡô™ª Õ&Ý€¿9ßoâ²5á§xvåUÔÃà\fçU ÖЛÅrôô6š¶Úͨ b€ÓŒýpŒQ͸0Ä ±¥i¶9ä^LžtÕ½ÙÔ¿ÿÚ†Ò“wR£¼x½|ñ/b™ú« endstream endobj 146 0 obj << /Type /ObjStm /N 100 /First 868 /Length 1486 /Filter /FlateDecode >> stream xÚ­X[OÛH~÷¯˜ÇîËdæÌ]BÕ]º•J… Ò^!5#´°¿~¿c‡âÄvâ4H ÏùæÌ¹Ïq´IB mƒÐÆá™„Fh§…Nü4‚ÖÆ*?ùÕ KüôÂzlqJ8m3í¢ðä…öJŠxjXœ'5¿=¿[‘¿;‘DJü޽*B­S¦ÑÆ 5±†ÚRTµš&‚XomA`£%¨S©¬fI¼‰Í"@ªrycÔ ÿÐ[G¼$Å+À%a!žì„à)Ü ˆuÕ1 "—xƒ £xƒa!8ˆd+÷‘5Œ± *éNc·$t¬áÙ1 ’ƒ | öº‚ä-IA`$ÊÇP´ð<Ç#…݉u‚ÖFààSSá"E#®µ0‘&|.Œ7ÖhÈ ØFøÐ¸È»¼0žp¶N ³€ ˆãMÄnÑ$dibƒ@[¥ð$<­ËFY×a…ãOp¿Õ,Ûlåb¬AÌ@`6 ¯`'¼m+p¸%V×IeÄih ž]k ž`­5HAªœã*wƒˆÌJL°»!™“„à[Ø^¹É2 `ëTÚ:Çš2QGySED`Ø_\iƒcàPàX«3¡r‚‡²ÑI1_ˆƒ1:«ÄW¦Q7Kq´K:„¸¤¡Š©¦QL~IÔÕ ¹†”à—÷ï³ÑYYLÎ󅸣³'bt‘?-ÄUŸ~.F‹‹BŒ>ˆwÿ>O¾··â¾x˜.¦ÅüáðîÖreÀÅó}‘ã»<Ø|¾x@•œ¾æÅc9ɪ^P-æ7ÓñQñ$.yÁ%' êÃC2¦+è9.!%\Ã+ý2¨uɽ§²ìÏ¿þÎh©Ph!`:œÍ®¶‚µ’űH8¥Û†{j“’ˆî ,ÒW¿ndÀkÔ›ÉÐöFf ƒ¸4(Ô½K퀅}W]àÑQ<û¦µýÛþr)Ɉ’ægÒÃÀÖ“D[6É@w? L1Ê”RoŒ»«¼××xïV·ó¢üg<›þ——ËŠýÒXØúЮհo­†Žì÷¤dpnÇìïöÌ.)¿ê¥I1+JqW÷K77W6ù)¶ýäwòSt5üp>/ ñ²šHØ„µâ¬øÙèüñzQ½žÎ¿g££¢¼ÉËúuÅzLœ„IâêAs#©xÆ ^&ܸÞvÕé‡bÝS˜TÎÇÜÅÇ3±_ÏòÚ͆•žˆá¶´K  ûÑgU“Á °'BoÃ’„}xB°¶‚6æ‘ÖVbØ †ÏpÑKžÁvkm½ÿÀ8iô^­?¶ó:þT^7<;ܶ™·u=Yé0Žm/[ Ò8vJ²ƒÔpÚ ª† ÆÜ‡„³Áäe0Û$.K|ò˜˜ðôoÒ9¢[æ7b|{;ç“òùaÑj`VìcfüÑGöœwŸV85§?_I¹õ|å"Û+_ùªY¹ÞkÉŸ=ëÑYÁ½D£Ô)îqã÷Ìø¯¥ý©Ôv[Ø×mqÈ%±ûQà|It”a'ØŒ4«’ôÖ[Ë1 ;VVO‹~‹‚»ž^ϦÅ]9¾ÿö\—ÇQseC|Iµâ«ã~ã Þï;žp˜=œÑÏy<Á¡ Ÿ@3µ ±s<™LU7øõ÷ñ·äÖþíaHέÁ|òø:0ÛqÇ?¸lÅÁ£ÈÃâ×S÷5Áš™ÔÈ5þIÿDöLç7ùÓKWe²…øœ_,~+kH÷°föñ—Í¿ÿi©Aÿ´æŸöñ¿,?_úøg5ÿ¬^óÏ7UKû{—ܾÝÐ ë†k0y¤33×q~“ö[qN)i;&‹uaä5Ö Îh-5nWŒbÒx; l­’Þùa`ã ¾ ‚)IÑìXM3ÑæÂúö]S› endstream endobj 271 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚ¥VËŽÓ0ÝÏWd™HS;ñkIŒ3b"ͱpÛ¤µh“*É@Ë×ãÄNÛ„›`U·>>ç>ޝ;On^½“Ì“H2¼$ó8ñ¸ˆˆ¸—¬¼/þ}¾Jú‡àkòÞ`à lL"Bz¡…bi1Ñ%fÖf$B[äÓ^-Ó»²xÙWóãc¡óºýH`""E'qÌ }BJv†1’”^•zÈ?¤Y RŒØPLÌ!§©}Öë ,ÇšªL’k‘#rOi]ë|]Ý'H#òaY5„n×2³ f‹[·éØõ]oìJ¹Mê0õÓÜþ´oÒ¾8zë"b½´Š#ÚE4’°ÅŒdœ÷éÄ–rbÄÓ<ä°ÓEG;˹¹Ejm#c72éR«­îÒzS¬*¨x> stream xÚwTÓ}Û?‚Ô i¦7ÍFww Œ’ÜÆ€ÛØF‡ ]Jw)©"Ý" ¤€(©")!¡¢t¼C½Ÿç¹Ÿÿÿœ÷=;gû^}]ßëóùý¸¯ß2RqDÚh^, ’ªè€A@HLpsCxwÄßz·9‹C¢Q²ÿᡆE@ñ:Op4@£€º^î@°,) –’€¢ Ìߎh¬,PêtuÑ(À­†Æøa‘Î.xB¿@^8,##%ø+¨âÀ"áPЊwAx*¡î@S4‰Àûý#¯¼ ‘ñññ†zà„ÑXgE>A ï4AàXo„#ð|d !Ôñg4a7â‚Äý6˜¢ð>P,HP¸#áŽâ…rD`„ê@S} úí¬ÿÛAøçr€`að¿Òý‰>O„Dý †Âáh å‡D9î ‘¦¾0Þ/„¢Ï¡î84!ê EºCa‡_­Cš*Æ@(aÂ?óáàX$Æ!ÝÏg9OC¸f ”£ÚÃÂãçý©#±8áÞýDþ,× …öAü-9!QŽNçc8zaDÌPHO/„Žú‚ ðo3”IK‰IKž@„/ÜEä¼ÄƒøeŸ« 3`Рa DÒ Aøà Þ ë… øOÃ?% tDÂñ@‰ü;;Apú-öEú­Aø óÏ¿N¶„9¢Qî~ÿvÿµb•[ª–ÚzFþ—QUí  ‰J€€`¸4PŠpúgž[PäŸ>þ#V儞';ï—pQ÷ìý¼Âüg2C4º ï¿‘n’Á _àÿ3Þ…üÿ`~žåEúw¤éåîþËÎûÛáÿ±C=î~<ÐõÂh`€&õß®ˆßÜ5@8"½<þÛªƒ‡è ‚r&@Z,. ÿ­Gâ4‘¾Ç[H<Üå7l~ëÍÎ çŽD!n¡qÈóG ! ú/ep7ÂcGÀæoG þ×"ÏeTÿìCG;ž³OTBÅb¡~Âò ’0L ©#Â÷º"Â(4ž$ÌtBcç‹–Š(ì=Wþ‘î…Åjÿ¡îßò/–#¾8àÃ$.îZÞvP­Âê#´<,Oº™y`)*4\lGïѵ_H6ÍËÒ{¬ù¡¬içÚa¨êy?ûn;`©Ž³ÞO|OˆSsÕ™–8y¶wa<%`ŸíÆ$M3Ñ‹tUÙ2lÑ-ö8ÚNJ%GçSnšÀ¿j»Þ§øð0”kJéF´¶wV—çê3²É˜ùd‚oõC–%v˜þ*øäq?l1Þ&&Ã0û†ž|û! Ù§Šv¾o š®›ýE\¨®÷Ýåï\‘x: ¹~6uqò*ó釗”yodÓÀ´®(o8ö<™ãK?¨5ÜrYÚÚ°½Î›Ú)åâêþâÈN‡™fPÍÄ­Ä:~Ìâ$iêSLÙÇ™we!µ_Î>ýÄç75Þ52ÿÓK/CÇúMo8¯ A²ÂiÅÒ— îç ÞN‘Ä­U§Ó-i0æò­9…=ìårÏ›Þã·µ–Îtiƒ(–NË„·†XÒ‰‰Q{#3+Í.‹4|î#/±Ú ð?}¸ÝÞ®Ê3åY‡J ÷Ÿ¯›Ì.~p´ yUϪ‰Wó÷ñXØ ¬ò]°Õïó@—=õoóø:ÿŽî^î>o ŒLÑ] ùbÑP+:€Açªç>‰!i÷Upz§]wdÍi ÑØ{ášmÒ,"pLµ´Ä¸ÌΤq—^ò·œNÆÔîääi_7ߟul¼Þ"ç(þ°RBóABVpñÈ›á&\ï>ÿô¤œ€ÿ›«ä–ñUôþÔnÀkÅÆcs>=ŠPÏ^˜ä28Aç¨eX–'B ñvb?I!zÝ©¥Qþ»«ÞÏ{c\nÍî{³Üö;\¶´Y2‹BÝa…Ë×Ü úƒwX¦3!onÞ†^aa@ÆÜ›Èל €Ažµ9‘E~úZø4 Ftƒ'º³0`™'³8P:´ÿ­aNQ)ôÊÔR=¤ð}?ú›‰OöØ‚, Š#Ѳ Ù¢Œi]eg{ÁÄèwüµùrPxa~eÊòaXë ©-O|ø¼ÓQP'ýÊH*_u¤ôES“1Ë4¿kôò¹¸zQ×4#»¶…°VZîÎK÷ÍòZ#æÇD +ª©y ç–AÃÜA0¯9~paWŒ¥%·óQ/ý®Œ0Þq¼ÜM²E:ZØÍ+w4(Q`.!ÅäØjCU{ZTØÇÇ};»—HFn<Õƒ¯­Ø;Š?_ý„ GŠùÙ®4¿<ò+ùps…Œ+Ël˜ ZR’'a,z[L–)¯‰µ_ÞJk$|p7×a®&‘äµÇÜ8ˆÁG8†„„Í<6܈µ…#¡ {âÛg ›ì¯±Yϼý>V¹Øñ¿ÐÖûPh³óÞ*ÆçJ‹ÁF‘˜ Cw¬·Dðã™ÒkÕ7$¡mõt—VkÙA‰$’DƒôÂ@ßìÍ«‡ŸÅ“)“ì Œm¹©&G÷žºSôIžµ\—ÿ¤m•PÝ{Ñ×›þù• %M!®œ90†ë¼ þnêÆ&0¼\]ßå5×âæî<7ª%Cæ=ñ§cdâ‡Y;suÓg®*ü9ΣQÆkj)yK?Ë †VS›q†«a`«¯•åºÔˆdk<šÖ¼q€‡?#K•†™°D±_3ÛZíw*#ÈéFŒ(,fß/–”{‚fö“ÜD’+yª$v/½-?l˜xOZ#4§oe~û1싸e¾õÈkÈ•QQcÜ­6¤öºeO§~b{ãÁƒ¾$³Œê½œE A”ûD›­5zê—Ó0ëí=û‰‹P¹8‹Žã´åVÙf-­°ú·„ÎVò¤±¤jM˜•"…EdˆåúFt.¬¿ÑôOå*m1{/¢GLâþÎIÒ×s¾ÒPëTsW[[¤ŽŸûè#,Í-¥ê§UÚ÷m£kå· ß¢ZÓç™$6~ |¨kJ­ùæ«wu™9É8ûYÝ …ÖŒþÓCN™5!ôïœtøg¬˜ˆ èÅÆø¸Û~<ª¤Mñ|\ÙhÄKÚa#tûz<3Gþ†n@› k¼—ØÀn,±WtÂÓQ–p£ÿ´¯`ìóÐèTŠQâgôMVÙ´w‚Íìõo)%5ô \3T«\15Ø›@nNPO)¦]¦ë}³½|iù‡ÿ;×›]yêëÒ«q\[c[ù×›4cç†b›OYÖ¦ôSäìïÓuu¸[Ó»¬úyß31z˜x®^Ù/ÒµfJvš¤%‘L"Y÷éš=ø¨h,ØHõl㛩 ©ø¾RÕö¤ÊxÏœŸ;ïÝEý -oðÏ 9I6Íé¿}Y¥ìd~â¡<ÊÏxœaIü¨ÑB\baä,4•>ù"ž¦Z{ ³ÂtªMÆqƒÂÆ¿øä%­ÈèG¸†«9i@8f<©I3×?•ð³Ð ôÝ^Ìø8Õˆ'/vUu\‹0W¨ôÿ 6Õ ™Ô n[±®mo8s8ñ.<Å °af— Ì-çì ¾b%„_ÍÊ\«~Z+êŸ7ñ#)¼„( o*‰7¸wÏ8<ƒe¯Ä´él0ްÛóåÝÎÚ·GÐj\6ÅS—˜Á%¾¼V[PŽ»‹î‘ íóÕWÝ¡’Ûxç¤Ç°”ý­ P?îk®S¯ïЍ:oúÝ!TaíÔdîGätÂã7#âqÔ]ÚÂ> cg)ªI8¶5¬ ‘Tœ4}Ù½¼Vêÿ<}ù>¶’”f}~”«Dõ1•>±HlâgÙfUÆ]àäì;ž-ÖüÑa°—$Èç HÞI ÌnMá­a/˜+ã]û®Z{"DçÖö¬%¿7Ý­daçø™G¥GÜŒò¬}±Ê_+ï:o·ŽuÒSr™ (=ÆÕ­Iž&t&`‚¿W~¡"³œNQ9‘öPñÿ°û9÷¢c»¡Ü¥¬`&²‘äòvÌ\Û^ÆÕff5­ÒË!)†o ªïuÏÊõÈ¿IÒvªÌí÷98,µ»ÊŠP_#º]w?äìÔ¬”›ÿH’Õæýv£êÊBÊT’üÀúò­x. ‰ëÓÎÞ5Ÿ.|„²|YY¬ûx<¿éç8ð¹YIÏàwܪUkžkDÐC€ÍK¼¶Ú:ùæÀ!G–@}aøl€2‰è^¼”ER!ÿ Šµ}ýÍIàKဠxu”ûè^Q4oãÔ5ŠLo¯ÙšÙ>Ün>Åpy~ÐBËhê¹4'kj'xñÍ]›-#­ÀÏ™,#sܹ@ܾn×OÔ²dCdÖ>Û = r ÖQþüµâ%õ –B·Ý—÷ë|nU9-HJiØXÒ2ÎîÚ¯Ö™pR$Í“Ñ~döí¸o®U‹š é¶·Ô‚\ÐÍ0“ÕG8§Ôú¢â÷6!p70ºF`åEÔÐÊÜÅëQ°Í8AµJÏí.žÈË+:E9½ã™±Ïm>6¾¼ûêìÓ± íà¼ÐŠu¼†Qúòf¼²*×iBmø*Yꣃ Ò=Läø¶Ùðá~•BNZÞ¶KÌïèh(iö¦íBŸŽL¥Õ¸Ï¼yë§À¶Snç/¡ÊìÏuzwþu4èf‹¹ÿ\å;±KGñ<ÚT÷uÊ©[\[Ë–†Ë8ϪÒÕ°`Ñ•ùJV‡´¼Ee™¸ë™heý($ÃÖOõ…Æ¿£ê/þûfr‘B#,Ë)ègا™‰¥ª¦ŽŸÏESÛŸ|Ñóõë*™e/cš³–ø6pÄâw4¨hHaE#I¹ª5UxSÔn[W"[ÀË®­XXº54S7.Wµÿ¾ï݃ð ‹Ü5¡  *Ãþ8,(1?þÃI®Y™Á>×&Bœ‘¿¨ÝNc”¬ñòI†û·¸Y-Ø…=(‡tqvïìV¿™Ø•*ÏìúñÝÍÅm5ÒOμ;âšw]O鈔2 ަUØÇšV$„Ëq²í¶}¬rÚ¢•Ïk•Ü;êká ôK§D·Jöw®#(Š>® áÁ÷Þ‹°ˆô%Áä#ÓR¦OÜŽE–æÈÖFRÑ9Ã…WÂï¿î%YüR"­ÅMƒn{µÑÛdðCv,íuò’ n²Á*qýqr~+(-öÓ”rÄõôÆà%uʱ›Òr—î<ت?ÛÆ]d/°[¯VpVûþ0©>tFépuã?¹\‚½mJ6˜ðº§R#‚ÿIÕµ½*©öHJËù^Kæá+VYšCU®]ò}L\9üM’I»Gý.XšÝëa”œˆ ¹ÕÁË!£=ÂåŽÁûZ§ Ì…aJ¢âYeðRcI‚/²:Öü±ç¥¤¡æª'©Oi'1Ÿ‹ /øøÙÎMÚäNãD==¾*å ¿/Ñk<Ú“ ØÝ…´ˆß¥ì,xy¿Ìðáæ8íY™=¨ð #mà'v(Äí«P=M1“îíëA'òcp—Ø©5JöÜÝÊ`Ê(cí!9“¤xT~rŒ¨ß›È*ÆðAÏVõÖÞë™CÂn>‘fYˆÏOÃhȶû äå0jÀé©R º*ºtv×bÊtû¾¿Jµä3ñÝœM^K$éö¥”žr)¿IѪ®Í¼^ðÔO o~Ѩ[ri1²y3´DÖó"co¿‹ŸÞLý©¦œ¼ÕYÁÛˆŸÁ][Ošæ(Çé®ì@D°'¥œU›*ݰõ¶¾¢úã%÷ nwÿP64÷9Eý–š¡¸žMãÌÖŠ’ÆÍ&¨Ñý´ë n7g v’•M u©øÎv´m.²’1 ¦Žz›)©Ëó… ¦oÚçœK{ö=¹âÓìšÖÛ>º)¤DMÙ®Uƒ½¿8¢liFqöÀꦎ› ’,½¤Ä¤Ixê+ÃÒnȇ«dò°Ã´Ü‚– €Å¦h9꜋ZïÜñ—¦•2Åbx"k¹bÜv—^+/R4”fÆA B¢_¦_c¸9P‹<ÎÜU}âÈ¢º„×’©e D¾[o7âà›ó|»L«™†§L7* .Rð­-ií!›¢~_j¿Ò£p–B{"Q5j$³©4ÄôÀ†jÁÏŽFPÁ×>þÅ3Òg÷;çHQD¹ªN-J+E(…^V'}–@”Äf}oÇO=õC¹‡E©ýÍdXô,=ЇNÇažæi „öâž ëæA07ÄúU”yVü”Ÿeü4vW„Œ,‚¸3-²w?ÂBåK•¶½+0ÄÈ/Õ¸©ýÆþÀX~‡ ì3 i ƒ\¨ûè6!‘áh‰;J×¾Wæèf‘Zöô3•ïãXð¥RØÊõ޾øSë CPµUË7xÖøNÕ!>$ñóÉ9Þ ýìôE ç¸GN±Ã "54<`MH†í6±se¦Ül<Í~ EVjÅ©”°ÃÅæÒJŸ«zE€ýç@¶§I¹”E’KìîØ(y2ñÓƒ{[HtVð_™ÞUìÇJÆ~×ùˆ·ùÅ ©w^Pe UÃõi/†ïÔC.Ò|óî§£#Î=cÕ?b‰”/yª%p»s°@5¾f.¶c]¡™‚Ÿg("õD:øNTâÍÌÑùÞ÷´—ÒœW9k{ž7»è7•¾(d{Èëšp[ægTÄdz ÂGS@ô= ÷¦Íêú×8yóV¢Š>ðhêþN~ÎûšÌa[Bå]ëéîø£%ÂúK¦ŸÔ9VÐjÜI9àéb¸ûž¬·¬øàŽ~‹°¨~FhbqÊÔAíÑ])O$»˜±LVB…Áàk›fG«ñ #‡H¶ÑïâÂF¾\¾É¾Ÿé~Ü;°lf.¬t–ÖÓb°ÿª»:‰Þñ/µû>4ˆ”í#³hغ˜¡W×ÖñsrÑçó#œg¤¢Ýå®$vj}K?…GÖÂ*¶»-+ ¸èü¸¸AßQ1>&ŠX<‡ZùXlÂæ›©¡¬ôƒ"Æ¿œ/®•ÎQ˜)Íò-›À¸GާÐñM!™«Š±’Ô‹Ý}Á|™”FÉ€'ú,}$^‹Ü\tË*çE0s‰0Íê>i×¢jžOáèÛ}‘Ï2ØEßtÁŒ@Ö¸»·–/™ò*–ðQŽ–é•ˆvi[Ýl Ô–ðzá`|«hò.ŸÃGÆÆ}k¼?É÷ÅS$˜ÒêìÊÂfÃï2ÌU¡£Ù)$´ø”^›h”SÏw…œN 9/Þ[Çt:MÍ£HN‰Ú%zÁ4ŽÅ-I_õº7è­õ~Íž”õª\]Ê1GH®]·Ø˜ 'i\mìÕiÙ”<<Ö¼àŠJ8öËùõ-å‚v:Ù²rfwÉ·erçù8÷@³kF¶å%­Qñ×ÍþXŠëê²åDqtDÜ|Ää P¦Åß”“þ¾öúGJl/éùd£&A›¢¶R¾¼_ZÅ1T•·¤ÛøÙ„/zK°çãaò»÷êlõ#A›üz_ÓÞ 4)+"„…¦ÐÇª1W2Ó\LÐâ>@»Ù;bÌl"p•Ë» ®^’5å9Gqêz¸^¸ 匾ôYÝ…]åßÚ«ô/¬t9ûp`ÊSÚÃÕy¶2þÓS¸2nà€½cæmIÔµîá’>÷Ts_±]HÞãK{Üú02˜©ÿX½•‚ô-r¯Æ†‚ÜQebñ1ô.kEwù:ÃàÂC* `™¢Ì ²R?ßknxXþiL3säöêž;s¯~õŒq’(×¢¼€îIÈѹ®U'ùĺH§×ª1¦UbãËû8õäã꜒–ؽÔsºv•aDër|ÉÉ÷û2çFÉ.xê–¦N{¸¾LÞ…2ÞŽ»µÛezÚ,_•¤öûðÚŸcÞ&X«ß/»§Œ) #w‘ääVßá|vÚJj·ûšþ&9spØN°4ÊG¼>èUçíÆ¥kÕæÿßv_S endstream endobj 288 0 obj << /Length1 1411 /Length2 6173 /Length3 0 /Length 7132 /Filter /FlateDecode >> stream xÚtT“ÛÒ6ˆ E@:(å©RCoÒ ½w©DC!tz@AQ¤HUAºÒ‹Ò{¥*¤·/–{î=÷ÿ×ú¾•µÞìýÌ3³gö<³¹Ø M•‘ŽP0 ‰ÈªzÆ @DDLHDD””‹Ë††CÿÀ¤\æP” ‰ý‚* Aã05ÇÓC"mo8@’² )Y@TDDæ_D$JPƒøÀœ=!@‰€z‘r©"=üQ0W74î˜-^'>$##%ðËPv‡¢`N A»AÝq':Aà€ Ò Eûÿ#¯¼í!+,ìëë+q÷B¢\ø_Ú 0†zAQ>PgàgÁ€>Äú»2!R.ÀÔ æõ7Aº }!((€à0'( çáp†¢Üဉ–.`àEü&ëþ&î þ÷Çûg â—3ÄÉ éîAøÃ®€  ÀºBh?´A8ÿ$Bà^Hœ?ăCq„_™C°²Áø§ú¶Þ¼Uåw­,$Ì‚¦JKAgžAæa÷ªñ?jseyzKSæÐú¶hø½kÅLvE,-•HêbãÍÚ„½âÊvÌfä B ²ߢÞò£ÚÛ¤~Ù{Á¦ý˜Ÿ4x-^,?ðΜ裣á€é7¦¢^ LœLwYö¨»ú¹UVR´F ò§ÚÆüªåóÙ^’ <›¼&´"šV3ŽCT6—út-d="xn´Ñ,$—VÒÚ£8 èJjíãhÐ¥b÷ ,+\T¦ëöÍ]î>cžxw ‘[¹­†V5ž”{Nw~j<ˆzVsØYùi¾1Øâµb«"³«/è–º›uìÔ¤lË3B ºûRƒT‹öšÀ„ÏSéSBH¤|àƒm•ãë ¯y""w¤ ›ñ»˜7$²‚¶c+¶ô?Ì QÂ}©mÃ/Â%õ/?>ÛÚÊcrSwHâÍNSoü+{&ÇH® Z1ŽÞšÃÒ ©ú³é&}•ÛnçÌ×Òh^-yà÷H&WhÃkV›(‘kľ°'ؽRÖ¡Ù"³ï¼òu¿¨HÅŽîÒüh ë£Òùè‹©TDö_ŒC_6x¤j(Ç]zu0?ÜLâxsÝTŇݽ2ÒÂôöñ|wëS_Œ–Oþ¸^«Î7ùè qÛ1µüf¦·¡JôíU†Š–Õòâ]M¿6ýˆ+}i’à¦}}g¥ùöùu•&¦‡97æðšGºçÙ?÷Ïs±6¯Å[ª9‰‡©ðÇÜì£ó¡/vgoó>Œ=w‰­š1óU.Ÿ`.MjƒÎ®ut]V¹y¥^L„V¡gMÈ+äIŸÑÍç§½Iμû5 Cé˜-¡êv±—MÙ íž|dÑm›+|ÎY5ųï$}K§’O_øid!Ú‹n¼ˆeZ€•p<Édí'ÕÅc(µÎ|Aõc>?„ý¡K¤åb§ª8b¼yùaÚŽ²„”mcC1õlöAÙR*ª¹ó>e mÊ!Âñ–2Uí’³ŒOFl›K¨—ž/8Ęn<É0°ÒšÒaüÞÉ×(À ñI'£zGE#³ž”•Å’—"V‡'ªYÔ@dÐüY±¤–!''üäÛñ›*Ád†9ëÆÕ!hwgÜaûub&®QnQ.×'Ž%ÑÚ]L©ÞÈûzoD[f¼“R³¢‡$o½¨½õ쵉¼¨ÿBæcOÁ¬bK®Îz'>ÆÏ½_l¶\_¢±ÜŠ…óz[~œ ˆLW}ë“—ê8³œõmT«Òòz& öGz•ò-DýØV¤=ÙuŠço Wï/€Ì…v¨ÜV*ýq¼Î.’Ôh• 8â\?ê;håjÁ~ìï¤óý2óEÔ‰ižŠíϵÜ>Sz¯d«¸o€‰d+@Äc)ÎÄ…þ’&f0yA£.BÂdÇ—»PpuðmI¦FÀaÌwÆÛÄéiHÉpjéÂι“•Ç\o|AÀ%ýñ£µIÀ;ò:$‹«†Ýy”•?ùD%‡Ì Às¸—+­GËyÆ{ð,&úùrDÂt€s&ºÂ0Øø€7‰cæõ&URéö–eÍüá—bø¤þB;ÖY~Õ_§Ñ eo,&㪇r¯µx®É˜¨£ï~']˜·¡½ÎèÆ¬ÖU6MÖÊ‘ÊÎz¡HŽ_ÊÃ&Ï׉Úê«©Ý´„zq÷ÔJ25óKû©êŠƒ/[ßByY•¯Â+iú7@SÒÞB»ÞüóãÇ» r[!åý\¤ÈÚ’Ù,?‚‘ç^¨F:˜¨-@`¿Þ¡•g³€ë¹ûãø ?sÿ½Š ªþ Û›÷Ÿ½öðÙi$Ï`‰zœº?ÖZ „R‘ù‹“Qe¥ŠU· 1ÎJ7 ¤ñúîéGÅé¼ÅÏ”Ëmø>” ó‘=Ôß}…/7÷%ßùüMÓÉ:~öÚéì­ºXù¶WÙOç[i"h0^ ¯dä+4ÈUÕ"Í¿å¸ÍÕw¶pÑ%÷€ó‘†õ-_û©ÂC81‰õýbbu†2£2kwâ½d¢ñy汬äk¨ ‹#Yý'ùk^ƒ{íO*Ù”ˆ\¯¦Û±XLGr‹ŠûRÂÈ–8‡D-6iÊ|§#ÛÖ d/r9 ^½¤ùÔmÑ| Lm;-üÊÁóШ”$¦ó‰ÑÓ¦à[˜)˜)ývüŠ>°ïlŸ«çžeÂeúN¿FG*¡„˜ß8udÍ•ŸvÚaµ×J³nå ®+c¾šw0fmxüƒ´Œo¦ž³¶{þpkP'¼a˜Ró!OY…þ#¥J­ñ94WîÂEJzƒuŸT ÷‡Ó,·DÆÕR¦oV„¯EÏ¡Q˜B…]æqÑóê¿2Äfiav|º_QYeÕRoG:4Êu·»]óÃfœæqg÷#6û£÷qr+Ñe=;!¿jWùdS”…ÙNÝ$å¿‚¡œäQuS “H•0a<¡íîBÔ<Ý&óMjµ]ãpÿS6F©dúœ«V{#ªï°­îß*ìÞ—hxKØk¤]9¬½:¡D ?";Ÿ‹ïúºE:'þW)‹ˆ±?QSö â_rÁ¸Ê¸q²´âÛ*mê9ŒÙ TkèìËIåù¶¯Ö^^ÐByn*ˆ¹(?˜µ¢‚y¿ mš^hÞ©ïß\ ¶B]ûÆ¢¶·/›?áÌzÅ8Ÿ`HVFS]]Ä$ Ðò}­`ò:kܾöÊX½ö¾ 6Yf”ÑIbŠ j1Õ)„Xr.øºv&¿7·þzÉ/î†g{x®ÿe-Þ”‹º»×$t_c´œ*‚ƒÜX8¨}¥1ëmJô­µŠç¯?{sG¶gs¹¥7¯5ôq§2m¸ÑŽïà}¨tézÐå7klt#S1+å/Úì&$olgú÷Ÿ8@¶²©_uÇZ—ôÄ^søÐ¥ž™Ûä{½‘p ÂzãjvÀlGÁ@|÷ÓÛåN¥“ÜØÅàÖ?Ê¥M‹÷„WRÑ^ž‹ nQR”ÀïìÆ=ýD§Pµ,½Îæ!¨ÛÏÝ‘{B°©ã 8”p59¤älLìôÂ(Öø|®m³³9ýëVÝșѧ/úŽ.‘ü“uf"2‘$ñã¯ÍHêúw]¿»vC%z—ƒ³úSå›i,ý§«0oú.ߪ»Ôáº!®h)jÛ”(^ ù¢;'mtç…]cŸ§.Y–þÜl}÷þÕƒü¤¤>)…5¾¶¼ÝTMDb楚¬²Ç·@µ(cyaQô™^kû#¯ÅW¡'÷d´,$¹ä¦÷|½è=;á§e©¾ö:åZ‡Ð÷/ì }Í·´'M¤(&¬XKˆ™W7ïN’³pŒ+¯h_å/ZŠùX]KL=A}{/E?{‘SÒ§Ì亩Õ_7'‹uŸ]ˆ÷¼ÞXVLÃëåÙ_;h> 38›kèŽð/Ó{ѽÑ8Ï›³®*ô,o¾Ü¹ïö°•òÍÑÑÖ7j…h¥«bPêi/WôÆ”îòÉ[¸9,èÕÅ(\Œæt^Üÿ[7WÓzVScIÜÿZÛÁÐfڡܱBæÂxvéynÒÃ`9ÂXŽÁ:ýÁ›=M³*)ÀÇ6Ë×Ï솒 X®É¥’4}7ÔlZkzI^µžõ=çÉ0ëp”ó»YõˆMl—ͤKsבj}’« ­ýøŠ°Â§lƒ‹t”ùLX“ŸíÛj¢:¾¯›/+lCáGÈ׬—³ûÀr×ô¹ xh`…±6¥úFZ;šCÝ?úØMeוÆÀ› ËúdWL,§EJåßðÕºÍYŒ…Õ‹»TƒÕ*Ý&…ÆÞ™^â³3!ìdDøŸ ÅÜѯR§ëSÅÿQr@fEoL­hÚß«°!}?†^??·ú"áÀ¾oŸæ×N`–Çc™TÑ¡¡Di6rMR‹Ì†-5byj_áT¶ÓÜþäR§Âð+™[Z"Áôƒ6ctÄ›bfmÛÞ àt‚®ñ¼È=ÃÙ‚O|ê‰1Ò”NÍòÓ}ùŠ·\ib?ÓyÉÎ9ß½™_]2Eãvų,?½Î I.X­”DªC !•0Ï 2ꋾ´„9^îìxE>ÎmÑ.7¡‰Í— uÁ »×½nRÛLÙ2!m¹ÍôxÄúsåXò©vºÍÔ;zV,ó½ÓÚcèéeÑgô‡» þ¶4åeÔy,]qCñ9S—¶O“€[>ÉNydïSó™ÄÄtÒç§iFåÖS3òf–²Ì—LL*:ñïsÍ•’¬ë×N©˜HÈD†7¾ÃÇdr4´¤¿s]1ýV7½`çXhÑJL4É[v‹xèKôæp….öaò|¤­>; Ûl/ŸÅÍ€z&§ì¬¥zÃA8&,˜Tð.€/`ó¾CÙu›®#~ýVw˜Ž Óè´E¾É¢a\w±2Fƒ'¼…¾eê˜á]ß@—ú¦èXŸ¦¡T#C ëºÕ‚E§`¸ kW­R'é;çÞšs@™­Î÷þhy[C"¢f…ˆ¼xàáŒóuc²®§óçš;5!Î/òÍÖ#PrrE1:ï‰$ÂFG®ƒËÛ4m>Q ×ÌËÎF–j>gÆqÂÍÚÕ´MnÑúâ["§ÁnØ /ý<÷ãm0hËä¦Ô4}j 6ä{tºše;|utØ·ã—z“EÑ+ÙLéƒ]Múüãzmp“c¹T^I¶MŽÏ—®Î,¤FrCî‡öGèÁm"ºìR¨¸ªNÙò`^ëšïK³¬ÂÄ[7 Ü)¢ÆÛ®ÉÐÇ;“Í´$TŒC¡Z‘GéC¶#G^õϨØ'9<7X†Úvóºv\õ¡(¥=4¶ä[Ò¤ë€òÞ&ÌXL$Ìq°ý‹œ¡§6²T ›¼Z8u2½áƆ½|ÏÍüÂQË#+·Mïd‹Ò4v/÷uQûN¢æ#‚·3­t8 `ãm6ß{÷Jú¾ÞÿÆÚý endstream endobj 290 0 obj << /Length1 1387 /Length2 5972 /Length3 0 /Length 6922 /Filter /FlateDecode >> stream xÚxT”ÝÚ6Ò"’HçÒÒ-Ý Ã 3È Ò)Ò  4Ò­¤€´´‚tIH« ßèë{ÎyÏÿ¯õ}kÖšyö}_wí}]{f »¡‰2åÕ@!1B¢Â@Y€ªž‰•(Š b$\\¦p ú·„Ëꎆ£²ÿPu‡‚0X›ƒê¡€{€¨8@TRVTJˆ2Qî²5'ÐÜC!¡h.U”›;ÜÑ ƒ­ó÷#€Ì•‘‘üPv…ºÃÁ $@„q‚ºb+‚A€ ‡b|þ‘‚÷®ã&+"âåå% rE £Üø^pŒÀІº{B!€_#ôA®Ð?£ “pLàè¿&(Æ ä` 8ŠDcC<¨;[`¢­ 0pƒ"ÿëþüÙ€¨°è¿Òý‰þ•Žü ƒQ®n ¤é€ÁP€†®0Æ#!!¿€ …y‚àð»u@CÙÂNøg>4Øî†A £áˆ_3ŠüJƒÝfu$Dåê EbÐ$¿úSƒ»CÁØ}÷ùs¸.H”Òïï Ž„À~ñp1CÂz@µÕþ`°&’Û¡€PFRRB}€zƒD~0õqƒþvþ6cgðsC¹`Ø1 pûAâ‡yBwh€ß:þ¹"@à` ÀêG’ü;;Ö …ýµÆž¿;Ü` ÄÒOüõúד –aáóoøï#±P½gj¡-ðgä9UTPÞ?!1€Œ$ *** ’’ü3!þ§ÿˆÕFÂP™¿ÚÅîÓß-{þáïðþ™K…e.Àûo¢?JÁØ7Ñÿ3݇üÿXþ+ËÿJôÿîHÃøíçý ðÿøA®p„Ï–¹¬ ôPX- ÿjýKºzPÜÃõ¿½ÚV ÊHG,£…Dïïüe‡£5àÞPˆ!vú‹5ÙÍ~é GB Qhø¯þ—+2° öAc©ùÛÅjèŸuÕ‘`ä—ØÄ$$ ww ö¬±+ €Ÿ(V•¨÷o2D„‘( 6€1C¹“ü:XìM&†»ƒPð¯3Ãüò’ü£ØÃÝ+·ßTÀ–ÿ{ý[ÛP¨7L27Ë…9¿ k»¨VföZ&\ZîˆN°ê’ÀpÏ<ósÒ%ÊÔœx¨byysè©áliÄø´?3ÿþň÷ƒ7ÙÁ‹iZyõÞU•C¡ü¯Ço¡l“ã¨ÔÓèUªƒD#V {k|kžd‹éËp©.ñÍÊWèÍû2»W@Ñ%{3æ‰rnÇ.îc+vÎeÌ ÕÊ8jwëtSm³Ñ+ÜÇð¸s•¶XƯ>«Öqƒ?¾Íîë}*~T Ó]%ù2‚†‘Ö÷{îPR?#]bö½F4·ŠÄ™jijc¡k÷"ž½Ôâ÷É‚¾ÖÄ~qzG}ÕàÞ5xÔ¢$¦ås»XìÖ²L¿ŠÝlJŠv¬~Ê©ÂUÁ9L?¨GäuãÓ³k;~êM¢ŠKέtqçb‰…ŠÛnŒÝ¼°’™(*f“*îÿô\EÒÁæ6³˜¿¼›  aâ¢1ÔÆÓgw^öº-(|ú¼^ny+y²Õô¶m°+òŹÏJ7œ`Ùž¹Û³“ب-qöžÊœ_]S£3ƒê´ã‹ÏŸ 4ÎËÅ7líД»¯$3;Æo.N‘oJ5cª»‰“®ÝJ6\9h’’œÆe¿”µr¾BòÝ3ù&ùTé ࣅ±ÃkjFŸã)kVou}%°Mpp?#¶ÕÉë¸ïd_¬Ïss'Þ°›p¹¥b5|(5½˜§òÃ,ÐŽ¦äу<Ø“ïq§›'õy–ʵQ÷Ñ)«vÏß±¶ßï‹cI=ö¹»'uÓ[«þÛþ!à¦l?GX!¢¼!^¢Eõc]´™uH·í¤‰Ø½ë¬áä+©¨õ¹Üµ`7Û­zý·ïeUÔÔ<³á2â«/õ‚¸eüðI£ÌÕÈN¥©É@cõ!bÓHa'XÉBQgž¾`ךóqS Uí7M·Ã³n–4-5,"÷ú}Áçx…!Òß= Å?|±4|료ê¬Ù´»icñY-D¯™0ÊêÎRñqDUUüÔ»KCõCÝ+±U;±æ/›KQZ©~$¢ ÞŒ´;´è™8%ØÇYÇádV¬§xR»«¸œìÆ?&åI>à ¿`(ŠXÕ¤HVz¡Ÿ$a{(žmº^+ k‰0ùE†6ð…Õ‘U¥&7&¸Èï‡i’¾ø–dìûœæø¶í9fK¥æôáäîZ_FÆŠJêÐÎtÀ·×}s¹h1ê±ÏâJµ]åd¥’ ˜M:¹É$õ'”qãšNÔåy†½åJÓf€¤’Á†(õÇ‹ .¸ï3øÉ¥ˆâYϳ~>ÿÖ82»5ùÕb;ÃÙÈ»~|dC%H_kD7s‡…½IXY±åËd7]ï ‘ã.WìÏÕ.Ó·›päËÅo¥^zØâ˜D“(KeHªÈS-x"2LW‰_fÄ׌¶q„Ÿ—ÒØˆ øE÷ (åM¦ 94þÉñóž·¨%¼ÈcëIQ¯ǽ5‡—¤×·;#òòŒ•~3Žw©ÍŒ˜3T­ÛöÔßßäД -úL¶O”—kS/š¯Ìð:6EÀ³šw­Ù|êËRŒfIB*DÆlAë»èžg·'ÿ]“çìÎP„¥ ˆ·ófwjMÄ£¯È‡Ú†9ß ÝîûaþÍÑjרúîQ|]ªï¹5Ä0Ý7ùÖt¬Ü¿YAUûv™q¶Iy-¥ùM;ÑQ3¢u•ocìÑ+` 7Œæ¯{…–ÆÁŠ:p¼\æ#o²]h‰òI—ÄÃ9žŒu„pYgוw›+Â;©©£}7¥ûzý;  ?}L3Ÿw×›»öo<]f|XüÎQu1ñ8ñ`öuKæ5_‚ÖuÓ(ÕÅ@‘Ì£–ÄÞô‚b+ÿÞS™Ø>÷Ñ)íÇù(ç*³=3oçüá낄âÕÓ¯¾vkg!ÔtŒî㉟7 !Q'mGíëc$"B'áJø[†Æã±L Wò}Ù`)0ÍßÃ):ƒˆê且—¿‹qþX^@ÌŒú2”iV².ßzÝ¿ *µ0Úæò ›¼yïUó¬å ¦‚.qŒ¶°§ã¹0þäíè^ëäÛ/XCÕn«¿Irs«Òà//9­YL÷½ ŠÀ“‚ŸVisÈz¦'„„ñSÜ%ü¶q¬ý‰<—`%Š•›—Üþw—Fz_<=ï`gÚ«¦þ¹3W&&Ôp7ÿ‘ëgôÝ ³í`7v»Üb£¶ùÓ5ž"ý,ͺƒe‚trÜÞ’á×Î6uÔÈcqK…{ù¾Šsj{Aòúá×Úd¬Oü28Xñ*pÌIóo=îv)ñ¿@­Ä\à|Gk­v‘Å«y­4_ؼ"mgN Û…<óSO¢,ì~ì<ǸœA%ÌIg¾¼éÄ„É>óuátqá´¹³[E‡†5å«¢lUÅ·HS::þ.žsöÔí¨êY²ÑFF4¾Ãr ˆÛñµúãg,¦É;4Æ¥ñí~L)S%u"wiŒÞý,pÕ‰óãö•»;Õ™Kìz´j —z7J_·›ýü ?ýÕCË ÓkÈ#Ì]æ©X—#bÅR1WF¾Ü¡QØIsÕ^êòJÁ…ÏmÞÕ*{®y¿2fÊbö6#¶l 7zÉ»ù¶©R.P1åþø@}éÀ3>ïh ÃòÄè9ç7ÎWò´LŸBf²w Jâ`>Jñ2¦4ò)–).~½-–n¦ŒíÂ\9UÈóåt‚w·vÆjQZç«< *&ÊÎ(p8š“º§És¾¢ú ­Åÿ%ßál»[™T|5S¼Íß² ëoèéµÔ׆‘=ìóän¨ÊyYšoöøiƩم!G«ÎHD„@yÛ„UTŠFXΛzF ‡03gêÖÉ9ºɼ¡æµÒJˆEØWžîËÙOÑmn(kÉÖU>[¶ÒbuM®_iÕê÷kò í7¶µÏd$$yÆ©Qò>MKmîÈœIÑíˆÈgüi3­á"—†|kHWŸJ$áÙÜY¾¦Î¬¡Sí#ý:ë&|íA»¨ UâCSzßÅ ØõÍëw'ÓRb/ƒ¯ÙßÁ~+«‹Nßãi»ZþÈi`|"„h>ðAIÕŠ¾˜ ¬tŒò¸'%žH¹Swä¹¼Óy¨³`á—­7¹(®8ÿ¤TïÈæ«¬£-•ç­„pÊtË9‚0•[I×£‹-iâ… —µåóØM_D„o4¢é?ã™Ù¬U†&É[Æü¸q•$Q÷:&È=H£à#_Á¿ì Š×ñÈ–¬Óˬì^“ài¸è-J½<¾öàä|6o€E7w74ß0™[ ƒ¡À=óÐô•Óq¼3<þ„M®Ñƒc»VîÛ“Ô´.Ïö¡ÃËSÕGµŠ÷B[E’48$Í„« ›„¸'tŒ&ÀŒƒ“åãò»Á_ÐÛ‹{¡Þ¨{6Ë3eìï¼.% > <Î ÂìJP˜¯ •Ö TP6V¼|}É*Sk†ɬœ.íóÙ\ìI&2Í‹U•¸Ôtw\1#ì¡”xÇù4–Û¿:¾¾3†øQêGͲµYéܧ;dùU„zžëK¼Î ˜âÐÕ%Ù—Ñä—½,››^#Üw7à f™¢\É…cŸÇ½<¼nlÝÁ0–ŽÒ¿ë|{ƒøOÈfO›èKšYò×r·(Ãè性yeg¡ñ5Šgá«4÷3î°éD9Fâ—ön½è*ݤ QŠÍ6­HLñ€Î8¸útüít>¼]=òP‹ÈNŽ&8æºê‘–¾š.nÝt`òT ªw (’HEq#dN,› ÆŽ'×µ56e»0)³ „&f#à>rg1UWëÂOåR Á.ß\ JÛq‡,«xB_í³ÑgSÐuÝ5+~5£¿ ­‹‚8/ gÈÅ)#H3n33}IÇðX¦BèdÔ¥jõ׉3 ±Ò~½6G±®Í9"‘Œ7ú¾Pæ¶ÎÄÑB˜<[áFZ¥ý¸å…r£9ÙÎ`ÏPï1Ì‘ÒPDÝíq6¤Y9zÉ‘õÆ1Y%&'v¤wÎp?îDNÅÖ(Þ 4Yük'¿Ê ñÚPd+gã’vùÎÏ<;Bèû÷$·Ò9_/Ù‡ÉЉô®ëÕBƒrgßôìLT×_c£üì´†gSäpØyýj»u§ÜnGìîøÅpZŸ>åg KWYµõhvMã½ü¥J/¸ôµC·É0Eõ³ž„¡S˜šEVÇ»ôÌ5è?G\´×Å,d`i¥Ê±‹ž†qLdCùÏ–|粈¢nŽâº“ý„i’¼þkºIݧ<Ü8+jºZ¾Y”„” ÝÒäÛ\DZIp+¼GüOÐUhï½B­Ü»:T«k‘³Ã{NÅ7šïKŽÝ Çq\w2²¸OOŽ7rï&Ocõù |ÉÚ/ýõœZ¢L6šóÂ@bÉp-Ì«Ûn,Zî³(=6Äa»>þÕñá` L½WÎCþÇ <#œå¢‰Þ›RÚ ^¹nðõË®=õ q±[Rº_ÓR‰¶$ƒjšÎ•*žˆWuŽ+-Qù‡A“÷œ•FßÙÆUuO Ž›è½Ó½®ê(b ×hZÌ"à&{ͦž¬0áß gOÑKêùëâÖ|•©õxšÐæ ŠáùÔŒÉùÉR9a˜OÌ!ÆÓ{JÖb”HïqßÇŽö•)„#¹ì¹ƒÀ惛YD•÷'I¯£UIËWª”j:lDŒo"aY¼ŽJ^6°"óŒ¡.ëÀG»±¢_·Ùl)”Å=+®÷¯dyNT±4ˆ]ó$%ñý¶nÚ´øm8÷‘ÖáöYÖ5ë,_ŸÑ¤)N|¨hł˔ÄSˆ±òg{ÞÞp%¿y …Îè5…o‰U›>J½?›Í–¿ÿþK¡[K®ì—vx×GÅAªÁÎíßrH Tùþ •X’¿Ðî±¶ó§kwƒ#=ðœÇcПŽ]aAü;°î CwÛsÛ©Ê”›|SB~ñÍÕÓßÄ(Kºê(¼ßníߊ2ê%>ñRqK\i»2¹jÍÍâ˜)Cd9žùÊ5פkûL=PŸ!x3´íæ^â¢GÚ¨D¨Ôå~ýL<5Ñ=19ßèáb ÞãÛq3î¿Xœ{]ÆqS¬Þƒ$]š$q!Ð3W.¾ÄÃDL[Ó\|šþiÓ!ÊèÓÉaµ ‚:Ϲ÷ ÀÈäKäɈC¹´òˆK˜FÇ÷>m~LØæåê9½ú‘à*Ô\l‚J^EÃG+|Üoþé…ì“ÙœØx“€hÔÌÛdŠN#‹–g¡W§ã‰wø |¿·ƒ›ŽÁ)åVÜ—KfgGiâ?ïÈïJQ§XÝ̨;»x{¸#¨,Ô^ÒˆIÉV¼|“±LfB ×éóo¾2m©ŒË$ünP”7e›`úıåº`«p¼ö̽ìÈòQßÓ³Æë$¨¶˜“EÛeWÒµåI2ìó……f9Ý^`{ÎB…‘ *¯diàÎÅy[®œ£ÝmïBUsq‚ôñòÎbÜím“èìyR4)ô~AƒWí“ó#ýé… 5ãý¯ÛIóýDcîéMèF5õQÎÙ¤¸|Ùº‹dÜ¢H—³%žÚÕÞð×>ØiT`Í&Â;S-V<»RDÇINÆ~i¹¨Z70l¼Ú÷TÊQŠÇ™ ¢ ¦5Ï rS†)w¸{EžZ•[¾çÖú:žwÕ“Å£HÒuÑ9TY!¿>ÿ8÷ù"AMðæ;èURJ´qbå«ð¸„’`Ë~a±§[($t_Y¡á\x¨†ŒÎÓö > stream xÚŒöt|þ Gí4šØ¶mÛÎĶ­ÆjìÆhl7hŒÆ¶“6I£†wºûì¶ûßsî=9g2Ÿ¯ý e5sGS ¤£ƒ #3/@LA]…ÀÌÌÆÈÌÌ OA¡nífüžBèâjíèÀû—„˜ ÐÄ D7q *8:dÝí,lN^.^ff+33Ï]xâ&ÖæF€¬£ÐžBÌÑÉÛÅÚÒÊ äç?_Ôf4.ú©Dì.Öf&7+ =È£™‰@ÍÑÌèæý?&¨ù­ÜÜœx™˜<==Mì]],ièžÖnVU +ÐÅhø2@ÑÄøOjŒðu+k×3Ô-Üwšó:ôRë®’øîŽ Sü1£8«…‹b4鶃]®–§Ó N¿ŸFooURcÑùêð•ý¢pB7ƒ[îÉÇÓ“ ÙÛ.uºT†Ã½•ØÆ,éB«93š>…+¿xq´R®ž÷LXvÍü³ðl§ä9ø¤BäÑ}¿Qeá“9™%]Ãã™@ë±àY4Ô¼nn¤I`[kºA´â-f´4‡Óê¿nÃpñqqaäP 86¾Äd‰ÞøeAœ Âöã…û;¤Ø}è4\+'[‹Ö(E½š lÑçѱëZÉ/B–ª™r&ùÕæ”CÚúÞPªKn+wõ&RV êÈ2&tçúu—½Ç¼Fjc"ë¿kQŠë%Í€eS¢7t,ð‘òt†+ûÿòïIÚê˜5¹]´a4z™Š+X—&nÞp8Œ3<}öLSh£õ²o[À>ÔùœŽ9!x¾ŽÄèr€QèdáË,ÞçÇ)\u”’ËgpÊTÛcå7=ÃøP¦*µ9Z'7iŸcwg¸N©µ„³ñÕ—¨µèòÅ^rðýÆ*Âܦô^üÕ…ÌQ¶DI¹ìˆ.alu.‘u…'%eähF¾øÄXé1:ëíú<>ÿ†ä‡<ÌC›!í[‰%÷*â®O_;ÖEeºJw £ÕØÏ\N*ÝqìÌfàÒ™ó ì—îzçHž:ÝiYy¹¬]zn3ßFÇÒV?Å6åYÝdF·™æì¼Ò®BÁ›—G“”Ãó?𣒆\UÐÄWøiÌþ®8‹µÀþU…!Þ\ìö€:ožþ¥¬@ :;‡cògW ~Kñw®~Š3ká·tì]Œ4<ðÙ¨qu&°ç¨÷ë3’'õ÷‰í,©nÓ!ßZ7Š„‘f‹‚pXð>5Hª ¥1ä~̽þRêŒc˜Cò AËbéyÄÚWÈÎTZ߯Ö+\µ«_Çå³fâs:ËBpBó¡•q;óògpŒ„WˆUÇHåý)G”¤Y €ƒMën÷ô¢æq¢' bÜóÃÄ1[i¾ŒAdNt¿w[oüÄ>’ÅbaÅúiLÊÁéUéS¹…å9E¯Sá¿õ±5•oEÂBÃ8²gÕ«Ú¡0›Š[üíj|·‘uzªïПè^²&Ht¡Üq.®#éÃ*´?ý»ni>4ÂÙÊÕÇÄšdp%ßYÉŒ&;ÙZ#ÁOÓ|9ÅÊö"ó#tšKc>cŸ’³Í°‰#qÙ Õ‘áó•=à)ß×ÕíõŸV'Ü«ªfWŠ•ˆAÖr¼ð݈\ìÐ }=#?ZÿJs*œÜÀ[F­EuH ö*:$U‰ˆÇà’<¡^ñq[Ç: %L”Þ6²üˆ5pªJ‚4ÛýªsEgû±Âø‡ Ú¬¡1XõÇš9*hûÌGB9*¹Ý9$*Á|´‰meEz^…cßh56)VUdaNýüm!†ËClí8ª µãÛ@IlFg«Œw÷:øù×Ov!&•åž+ŠŸ5œ&ËŒkjnv³xê¡÷0e-¿™z’ì¦#Nt¹©K«ïƒ4 åÕr&1´.ôìL1~;.®€‚‰¥:øb¼meýQ]=A¦ÊAúÐn¿¥­{2ù:þ~ À}ãnq/8#èni@UNäµ…L-U¥ÃÒ~xWõ¡@£w¶ºœé\éñ:<…1å9o5®Ü/£Ø¹õ¤OQ¯—ô†Ç®Äó<»—QÔABÁJÇstÖ ýM^™ù®•é¸é†3}šô#@)¥î˜{hNQÑá^wPêúŒ³û$Që×úE…Tˆž›~˧“ys&HFÇ‹ÚÁî4ôŽ”±^ ¦ÓÃx3<Ë÷G” 9°sê´¾"ïg\ö…hˆyÍãþx¨~è×9è`èå†ßV˨ŸVYz=òÀµŸ—ElI4¡~†ÚrœSfëž[­xþŒ÷Ã)ÇÍð«QúìIBÕoÆK†îÊÂ(‘ôU½ú ~ø$ÁHÃýI$Ç͘.}Êñtå4ös RP¨¦ñ!‰ßk` íçIó# „D(F7+礥×("ZfÈçïAõAµ‚GaŠX_5à†Ø†‰G¶¹Pƒx”ÜZôØüâ.9\˜!¶; /¿>-sÃl}ÔÊ p—êîŠ÷]¿0nÀL1÷LÅ÷[ C’’}óajÍ9–¦êÑ%û°–¹¬0UÌW¼Ÿ0¬‹:^ Ëϵå[+ï´‰6p¯IC¾sl;¶Îvž©îXü,æàÏ.تûæ2RçÛé‚Ó¯¡ûÆ#Q™¿8/õyÇ=‰gUpÛØϹg’)¤x'àÙk7-A-Ü/Ç‚‡x©Z¨OûŠÑ}DÔËBÊTâ™ÑS‹ï)<Ó‘¾§DTÞÖV®Ù†ÇÖÒò™Üîĝв ?è.²Âˆ í§yò»„½dë-‚ç\çf'“-0U`T­˜‘mŠ(3™S,±YG¥Z›ÃU¯0å+ošëˆŠîÐt nÕ !Þèùµ-lò è•v€o*”x$H:…õümF§/üÇ÷œEœ'꥖¢MvP+q</’§²µB¤èzN_Vß9MYÅ.÷Lõ%—_Eh@pM/¤ømöÈG5=B¤à<óÉÅð}¾},Ôz£˜ÐN »…"_ŽäÅ1åqÚk’44Ï"Z”U¥çÔcP§½`'ɉ›õÖ3¦Rh~¡†D¨­½SÀ¨R!¶H R'µ ˆ%…Þ§¿j—Q&«ö J|=C0(g•:ã„B¼²¢á¦œÀb5Aµ½KK!Áé`Žj¾tCmUàŠÔf÷éfÙ"ç$Çjõ Öâßb±9°ÞåâþØ!IŸJ:"”›|·g*š?=5ò¼Äí·¾&5·¹ñCŸ¯CÞaxÚŒ5j«Ö‹X{ ³€…Dˆwk­=íÛŒh`[ˆ¢}öþ£eX´Z/PÏ'+8 îÛ²¢I?G„´ax ‡ «Ûz]fÛXšæI§˜Ã2RóÂ÷ïþ¨Ê!`ŒH§(vrĬ4<ññ¢_õ5Lž43pÉÞåtüÜÑÜ~[8²Yí&¢¾.ö2½ø¨Ä7ã¼lÀý‹Ó»­U4ÊQÞ)ÈWÀ¢¯¥šœ ù0äO{Jñ‹6ý±òÑÍܵ;[ \ÑǬ¥3«ì)„C*`2pùK[pÊC8o^E€½g`êêCÕ;Â{0m¢%ÒT™)ÈŽKÿQÊá¾% K¤~ýX“"…Î]®³ÓŠíІ13íû\ÏŒÒõð›çööÍ_ùù<Õm«¨LÖ«ñ#÷ÒÈœ*ÁÚ#Ž¾ï˜±ûÆ›V>qsÙ ÅI;[TÂs8×ý‡EYâæÓטéëÌ—ÉÛê„Æw×=J6½éÝï?o­Ò5Áhß/̸V(,h¦ÇÐT>d¤ýì߆©”½ÒѼÏæn:ïcé6'“•gÁÂPh Ê6-›PéG&øÑÓnaÖ:3—ïÒÔ]‹Àoi÷#=‰C§VnZ XíàÊàÌ^8ª8ȆcAÚu;äévkø”éz·#fÂV“`ÃýÐr?0õ¥0fñ;ª?»ÝÇ™Ôá_µ½FJ2[í\xÙÓL¾‰†P>Þ æ.“¸^Hø…ÝÄè\²[³‹WaKs}÷Mj¹{Tùïñ}|ñÚÏL›KæÌl•Ma†ƒÁ–á™ ë¿ <”NúàïÉÌÕ„!©‡¶Å¨V’ÏÑ—…”Ÿ3‹‚ŸïSJd@s÷7f~}V€óÔ¸Ï9gO_^¤ÏÙ¶.Ô1Þj§.èÐÅ9ß($Ó¶ætà÷ù¬wðozkŠÍG¤ë|ŠÀÏ7èß²wϘâ|òW:Á“`T7mÖE[hÈB3b‹Ö,júŽW݄ϮzBš@ˆ]Ü0Ó|z¹ƒŒŒTá!›¯ÕOÙ‹Õî§¥Ký+ìtFZnTø0rŠË\iàÓáX˜³VL„IÒ5^íz N¯+Œ-©ÿ4Q†÷ÉÒ® ¢Œþ»ŒaŽ8«… ý”è_ûòD¦óXýôµ–JTÜX£Ï#•5ŸIpÞKÌGPñ¾†³`"÷"rÆ©ð~šèìŽÊçªï¸~‘N™©N#UÁOõtš²ÉÆJY°Òf¹o䣺-Ÿy×dXêŒÂ?Mýãgàc?‡TBÕ(ÑdÊŸØÎ<ήJÔ—Èš³ÎÈÃESi »(<Ñ:í(?¤Ò*tË’)Ó«³°NqöbxNƒUèÚRì;¦Jp&™¼¿Ž Œœ^ȯ¡(úž¹{‘ŒªÊÄ0ʶÖü÷Zêà)ʼnHÛgÆQnSJQÉÊÃYv wê¾´úÌê“D#¢«Šˆ Bï˜SÓðÞ.^å/›Rµ›ê‘V7‰§š(Bš£»t±/¥,ãý2ï©LïO=ò¨åÀl„8íÈáb Š[¨Òµš ([C¼¹V­i'q¾fÍÏØÛÇe­ñIÔÔÊŸäHûÕ¨¥|©«lÝŽôÂô–]>Œ6•Õõu£TÚ!ß6àÿÊ܌ܗ_‡©q"cÿŠ>¼ïï%a‚ÕQ·DÍ€‚^…®÷ÇV/T7É˜Š ‰Ê¯š†°ÀÊž·Ì/휽Ô.5¢sKe)d¥YDöÝ*ø±gºTWTUî£L«2^‘®¶¤z`NK|d§x³œ`Ša3Y áÙín4T‰KÀ¼…ËVbÔk? Ét¼¨ruÓènq³[E%§UÔ¹+4ŠálSy•I?–5×@—×R(‚þu–pÆ¥h·³‚“Rz&UŒgÑÞåß—KúO©_¼‘ײ.¯-ü›ÔU–R†_›j½”O  ƒäv7çñpú·uuÂÅÇSHÚRÉ1…,Z¹ˆÒW³¶üÑÚ“µÇ÷£ŽØžs¨véÔÃ~\·ù^<’=É‹Ðc)€˜îð?2R­÷`­ÀàyÝÐð“ÃyB:Ý­Í]'÷eƒ<áÍtýZú1ß‘‹èÍYG//C¾‘Þƒ=5l÷ ó½góIò‘ÜÑa¿Ó‚YV#ËÝ)Ë;¡ xäÈ)3ÕëES¸âÃÊWõŒÜjÿ*QÃñIˆ4OëÀ/ˆoá³ ç÷8ˆTm*}óèc¹_7®þ¬±x¾*"4žïeOÝ`´·ã±¬ÙÜcUÑÙ Ô³9’LýˆÎ“ùOXŸú¸ðLEüÃó3ß—ÈkÏ+q=1¡RAóOÏ_uC4õ6%•u€c]q[ÆÊ€“ßJÑ|›P0öö—:-ÍÁ¢1K^·ù3-ëkG„[t¬;Þ|”qÂñ–h»yÁ=Ê^®5LMh’Y—¿’°ëZÁ0ÏQbgñG*¿v”¹ PÉ0àëvk rÏ6¿½T»Gœ·%3`Y)ËIé…~ pªZ¦QÍmTTF½5vaÞã}xÜ\H §ÚiëaGîWc}ÎììtÙ ¯â6ëâ¸'ý¨Õ˜éásu”=z ŒZ¹bO0.ÿ:¬0½ÏèªÒ¤ª5ñºÄ"BüB»3‰ ÷µ¼3 Fá@Lì¦èÃçÔ[æo¤.Yø®ÙSjbŸ!¾|óC|Ò›š7ä'a(e!¯ãOÝT@C“a|Å^H•ùÆiN–ƒ.Ëó2S&2œ¬0=d¿ÕbFÛ)ŠNW^ƒµ.©å`¡à?­ªãžiª ÙRã‘ud&dd©`Ë¡ë8踹OPžßúÍ¢ 2gëBê‹àüóróÙd}>jAuÆž¥í¨„7F«dFþ²±I”"“±tÊÑÔî +«5dù£Û85“Þ ðžŸX阉 çÞ‚ö-R˜V=D—XL4˜öÝ•ó:ÆåGƲF¢µÛDVeóÎW'܈$|£Œ×Ó_ñ{i{åî«¿þ8Ê6íM-UÃK7ñ5u”Ë–9t˜ÕslÃ÷\°$¼fKî_ˆóKRíq&B»¬¢z¬@9W{\t”YÔÔ„Y3°^T·‰‰Ó3ÚÒm6:·‰ øüé5•£¸¶œJ‘ÛE!ІN‚×#>zŒ4 ²m®òGEàNŠI©6ß´b¼q£=â}ýÔ00îúÇ RS×mkgAúÁ÷ºc„åÙl‡_b3Ô%õ–ÃËŽO¥X]òsÕ_­oùͯëÕïjó© weyÍl*ÙJC,Xá“›yÙÄÄù”PÇ×úîWñóg{œß¯·maOø,ÞDò?"L‚]¥Ì|Úã™pÞÄm&Í1 qkÉË ÷>™©\,Ô<h¥á~Yü6/øic2í6X¹X4¹U‹–PWlt8;Z)ïT-8ñ$hÁ$§#dj±¯ú@-¬žcêã=ƒ?ׇØùaì†þlZœ6±Ï ¾,#í"Ñ[ºCû0Ÿñ\”’¨¥`Þ;d sîcv%ñXïql™¢‰¿(Þ7QyÊAB? Go°!ýx¦åÑè­0ejá‘Ý^ü‹€’~!BæsD(êlK—”^ˆEøÅ eJ…rŸW[¥ :nVæÛYq‚µ5ÊxzÁ±oˆž? ‹üôQpjÖ ©ðHÆÎã³·òÍʳyìœdˆZ‡Ï¬ç>߬˜Y OZí‰6¢÷9ºonòB®Nµ,»-–kû%¹ ]¶[ÖKä!MÍ–=eŒ¼Ö„Ê<ÒžÁË«»PcZ*zߥ:­`j[¢”üd9žlh+®¼ˆÅ¾+ðŠà Žx|Që2&Héý¤>—‘‡ÏŠØ!,Xé@=a%r¯.¤ù5³cI€"‰¾ÈÈæÆ5áï§‚¤!83áÌ`lS£h½teJùøÜû)§ýbþú¯4Äy±®ú:§Ü{]ÕŽá¥û·|Båb÷!£_žV·ßkº§<¤Ê±Ø-Ó”jLò7Êu@&U›¡SªÛÏ¥ÙUòpïGKDÕ ³šç˜TÊ.áÉ_¿½Šò&«¯C*Ú(íÚß]xÄ,ûáFÐ| ý‰… >žíÛ•?{ÝòAì{~‡•êÙÖH£­ ÔûÏÚéGÎ}`íéÒ§¯‹DfÌœ_ç(éf€[wFµ³˜?À•Êí¸y ²&X8 µ­7Ðî<`•_Ž6Ÿ¦{%]ÞMÏÊiÚC³»!ßê6›dè¾/#¤¾@cxټٖ@î3BÜYêì5pXX :n©ã»%Hç\|]Y-º®õ×°™­S|„)í~0É”Ý_2™ö@¶ì߯/²‰¤{mPRR-`k&ÕÔÔ¡W/¦Žî8̬„$©€†Y n•ã7GôßH “H‡Œ+¥ +é3:ÞãÝøÐÛÏáÅ@l<°á ã¶QÍ@„'r½ôaPY]›-Ã%+­Î¼M8Þûë%Rz¼Ñ¼¢É錑‰½˜²å­ØFV[ À¡q£—mû×ãÑœX¬Ø³¼üžÐCšqß² ©àœø)e[P½ÀÊíbÞN®êê·ú]È‚"tO•Ókæ~]æo(³±&äbb_•(’Ž 0 ôÓ™Xœ«“Ò´ö³%øÐÿíƒQAu¨.fý#ÿJz‡ÊÎOj8™®Tø E¡”¤d¿<¿•´ci#òŠÝ7'?Néw™•,¾R½Z³}õ]Çlz:oûÕ½ Sº)0ônôÎÃû›=,8p©¨8\Ñ=ŸVr[xã ã&ì´!‡õûðOÊØz©¬ë˜,òý)Ôç_néaŽ7µ¯[k`9È¢‹´¯ rT–ÁS‚T¼š ?Lfw+ôèW~Œo<÷Î-çymº#Ä£6ÆÌ( ôµÇ€ÝÈ‘×ÇdVÑ…c/¶¨)¼úÊ`½ 但¿\›bw@¢MÎCûšºË%»´Ú´“ºÖælßlNiJÆ8ˆYd~¾¿9èH°wd9fû Ïþ©±•6ÊB[ÙßY·ªdÉšãΙ± H|¥šŸsƒ(=+ï)ήom[×äê³@:äúl*éÁ¡Ôo“H”ñ,@kÙT©H¬íT¬`vJyª¤KánJ|)Œßtº UAÊ·Ò\›úã«zï3|“6Û+?›*µ3^tãÉüs;Zm±ƒîfm§oš@¼<Æ—Kqrª£®žœšYŒÂu–çÌ]_næ FÁ€iìò“fãe1»þٵÒ¦D.áôGÕɶêÖŒ†2Ó€¤ˆ“gb׿t29Wg”-½½Lë(’Hí+BÝpú¸GïƒîrqTý6o’HÖ:·a}Š4µþŒo[|ú3iIZDàÓåë‹ïC +æšÞ‹çr¿Œ7ýÜbý¬É a6³Ù%·KçöÊnÿ^,§M~.__|;?ÒªÇÞž¹l‘³ÿy-Å*³L‘󽓲f!ÚdqfohÀQîôvõ–­:wÿNEé;} ‚¢ZHåÙ@ZšÜ§pͩȺ sÚ}]H§ËëÅ—^ëº§Ô z’se‚Þâo²üe5‘ïe óX?xËÕzéhÄz‡@üÄJÄUñoŒ§Ylbí/;w\½ƒi+¼ õN¦5sI¯àÓü2?—08>Ü£|¥ô&®¡Ò!„!÷ó¡8|[™ ÂBеÊ=WsŸ¿¾à§ŽÀŽÏñT[ˆmÎc¾0FÁzcŠsÌ~!쫵l¬1œ¬<8g@Šò áò¿è±žŒÄ¤áÛ°1yG¢–…?¡Kˆ «ØJƒ‡²C(oÎøÙHK/e——M®Je·ÞÒ ÖáÈþÓ»o1ׇžGç:Ä.¿:¹”sÀ W bólÑõ]á×;&è»}%%]ß&÷Ö]¶žöbg9ùó*åš}š‡iúc›‚¶‚غËs£–o(ªp¤!–`ïèý=ðÈlïü9òF™r›Ï,-ù¨ ­9{‡ÚÑ’b?RŽz{`";”ÂéÀ¥ö'G5ÆyúlÿRf™æ#Ö¨N3žùna;ÒEÏÙ1ÍÂjk;\?¥’C¨áÒ·æ¹ìkâö»¤9ã˜5£ÄËk wì¶e“D`—aÚÏ‹n¾˜àhtI"&f›ùÔÚ‹âöŸÙ®ëÅò íejÏs(ȤʧÁ‹«\Aòù‰Yª¸MKs›c+?­:K^ðJÖ”*¢Øýíqµ ™òJQÂ7µ>x,eUÃmëÆõ{ݽGÒà q‚Ý?ÙIn¾¾ äÝ„9õ}yÝØÿ±ãW9íœwU6z!ØŸ))YsöUXkמÒuæ¹JæÍ"$FnÍ£ª2•!7Ÿ¸Ú=Çî‹{+Ç,GZÑÒ7㹇ãl.»D ×HyÊ“L¦ÁTV¤Nns )=êçªæz³ùŸìîbÎ.´œ@çïQ ß-À+þ ¹é3bz[*êž(ûã5«ý#Ë'ˇP´¯gñ“ï4Œ§háߥ(U¥«4QÄ«˜·åšpþtp®ël½²K°rÐŒÁ /¯·Û„Lï~ —$+Ab†,ƒæ ¶Í]…¬$b/fÅmò¹ð°#"×j‡À?u©0MìPoÒàó^38è =,;½wEÃÄ Â¥dédOav`÷Ô,MÑ2÷X®JTFœÚ¹ìs÷ªìNj¾ýÔ­âÁº‹L%Óe é0!ú~Nôh¡§š,1ærö¸ž^¤Ü›ä [sü;[sb´Oqõ»ÜÝî¡‘»+s¡XÅB¼'û×qã«1•àzðI`Ös}š³`÷d‡zv3Ÿ) ¸kî#œîN·ÏØR·'÷Õƒf›ì6xhæÆ9Å@$z”E¡¥È†Nƒ¦IPI¦%ûipÁ½=+N$öT/pG¢²NbœÛˆòJò’XÁ§îýR~è}dCÎ UZ¤óÅ(F¬„ÄTUD?-Ê£•ç—Ž@Οæ9S?‚¾g,­r¦aÖnZVr%/ù Q‘Ô!Ñ’•*йŠÄ±•âìË¿hà|O´ÀÉÂ7ÛGþ̽CEú²ëK0%˪¹@ëÚ7<ü)iWJæÔ]ÒÒð0[8ߺÚxF:bz\ôÄáP±þ´~/‚èËT]Hª“Ûr‡‰Ö[$¡ò[à®Ãý·¢+VÎQ%¦ú6[)úe£e\Ùcµ§¶$c‡úç“îšbĢЕ™d©iƒd¬½_ôZš§ÊVÝ3:èÅ¢ NŸã…RxxLœ¥QÃíÇñ?˜HSm!|©´EI¦ Å=Þkgšx~qNjÞ›(˜•»7=@}M½zw›³¡ÚÕM}cClãPjT 9"òÍER{"\âÓz“¸£Daµe»>µþØV`µ3Ôi©™ãÀÞbà×^B=û77pJR^Å[h]7qym]\O”Ø8ÃíFÊÕÌýÛÚGÃ0#õùXFöD#:¸¨ƒ|¹±­g~X¿&,sûñš64qZÞëÝ÷죊þЉ½E#¹É6ÚôÝŽ©ÉyKö¬­~¬ãª{* ÕÐCñâ`Rþ.Ìsanû¢<~ÿœ[·çÐ:ª¶Ë9f[ÁÅó¡L¾ ï󰸈Óó¸ËM ¬—C½M"¹ÂHî}Y?ø7«$(ÅXôb`|Z– &œ9Ðê¹a±×$s}ç½múõÏg˜Ï`ñˆÈ'ñËCÒµb«A—ÔÉX+®³y3‘50œ×Ïn0"ÑËš%Þl°äö_Ë‚ÏNOKryí ­Ž]bÏÎ"ŒÉÆq ìQ®u"¦\¢Ö~`'írPâMëRqýR»E·€ ¥v{x¿p&aÉ,ýP%‰„ÅŠí—°óCnš/HOP´vz( ¨V !Vf·nH%óŠponÛO…ý@‚‘“’2ÌèðÖÓ4ZQ‰³›æçºNê| ¹¬3B)ˆÝå,½›k±ÝËçEÄñ“ÊL¸Z:ÊøË¡yp«]›†&ÝÖØÎ™6^I¨Ö;Ѿ°–•ê“ɰü\â:08e´H ò΀ìÊùù ô†K4ɳ>- ²A.™Š6Ÿ £ž‹½ß–«ß) ”ÕK{+ì;ôŒÔ—*¡ >T‰Ü R§Û¬µ¸u´žF 8*ê¾ÓàÓP‚ݼAï`÷kjLUš˜& ë†nYÄ·FôEhÌëV0åßÈ2•ÿÄÆ{öóqz²7ƒf¨Ed´­æ,¾™©bŸ¥™Ð,Çß”;±ñÎ<¿$Á%Qw’u½~çF¬ŸH¬šæç iýDHxWS–dV*ñ\c>»©>UÀäœà\Lž½–œ)½5 «Ç}TlÏ% ºƒ¶–Y£iùÉ™ÆO01Õ@‡A¾–NÜBKÄh½7:¿BhqÚÒ‡2ôñ~Xwƿܠt0–Š„7”¿ZÔ—Ql[V`ÈîåéÙˆ÷¬é»ä{ÒÒ›e¤ýN)ΰLsH7ãC+Hr(ÉYQÂó ö¹û¡ì£S.,©˜Ø;£»6 5ÝÂê ˜jpÈ“C/¼¯BÚPàRp· ÛèªòD•.-ßY1K=àn:Ó+,Coqá'‰ô¨e-ÿw›wããðœðhh®ö§š¼h`k.ꢾ®ëj&r¶cã }ªåÇÓFªÝÆj}S$b'3=ñ©º„5f,0!Ë‹ôUå¥lÄZ¬#UI_“è=~íŠ_ßFÔ³ÝHè -Ö™Y¬Çše€H3WavÉí¾6/S£=„,«å H™ý>íîÇ+ÁïÄm·ü?Û0Ý`n® ±‚¤Âg‰êF:qÅ«š X=¯~O­wl°"Y–‚»?ØiJÂí-ŠRÊ¢ãiÅÌ 8?KÖÇ~Ø{È{ìC]à‡ùœ¨ZþkoèåãÁ”y|q¡òÛU¢2ò¢üد ¾g¢}rHX«–èxëØè‡'Ù=3ÒIàp™bVŒdÄJõv\;Î;ö§Ðô ï¹É픬cãš]¸7!JÚŽ(_ß¹}™$ öÕ{ÄÈmÐ`£»Äµ¥é’oOf…Ç1¼ ·¸ðâh$å5ü]DäÎc,_Çj‰Qwëñ0¨¼¤)Æœ¿JwžùqÄE|½ 'ÿ:u9Öæ]ajT"öôV”ÇØ±9‡ºåú²ì‰KŠ#7Ü A)Ï<þI}¢àgß&1 òV’åd•AHÕ)¥ 6ª³áùàÔçJØüü‰~·ÁÔª‰ïÍLþ–lˆ{Eæ]~Ô%O™˜ïàfæˆÁ…’æÀí¼q=eý¥rÑð#!™ ã³°ë¾Ù${?'¥î†Y¬Ë´©ù-ÄÉá6{S9Šû<›Œ²&xæÃ̦ÖN¶9–¯¥KÝEú®ÐLPª*9ËÛîuI„•FE•Í0ºµ “¿‘V,ŽÓN qwêp›fÖ¼o‡ÌNØ Øù*ÛqËÆW­=µ:û¸1,zªK#hÚ°¦$¨ÓC.Å­üI—ߤ@Íê‹®¢ç°mJÄÅi\¿M1]NXóZ–Ï ‰Æ"²°¸J±šêHa4ç‚öº8e³üâ@Døäk'ÓX³ÜËÈú…äÏÒîNvóš)§€ ÕÏá™0K ¡ b‚["1ö mEYÀïAgšS/PjRâ:%‰$êÖ^ž>Ș±Òa{ÜÖ~L;ž7a,!œ?C®VøìË9=Uiv²ÓLBt0”j‰C‘›ʇÎÀzDÍО­/Ï€–V»®fV 1râé¾ÒN½3Ò÷¨öx]*…M ÀÛQüüY–­ªÇ²¼‰Îùœ¨þ‡_¸byߨ¼|S‡[Ù»ÐôÍÂÍCˆ‘ïz*mΩ`ÃÑâæü™¬_ò?GSô¡”än+i¸Z…èJð{ù‹M1Cs¸ º+ëuÆ*)¼·ŠÁ´½§|~¯ ]‹³a„E.TÆ o–Q#ëG7_O|8¾?È{R>¼0,L›w×ááf®g†[5y"ðÉÑãªoEŽm±Ÿ7Ú7YE®ÏTÔ7êˆò€#cÆÉùÚŽv”ö>Ø ˆÊ¾ì 5’¸¹£ÅÏíiÖIþÍ{N¿`•ã]8Ùjfdmhå'÷£(¼76gÅò†áö®H7U+]¨uÚ =ËñYirJòè³zZ9EÜ.W)zfų6¤eK0Õ,¤nâÙ`CŒs—>+¢¨~ÂAúOK`®ø‹è-ïw¯åTw8à8>õ·Œs€u‰“UUŒ{glN«è#©6ŽŸ¹ëŽÀãÙ~ä5PIÙåÃA½É2k3ñïþâ¸íèàR¸lîä¦Ýø G½ û„%?Á¶s€u`«|gÀ©œw þ,ŒO‚èÈO…nX C]Z•¹G$J'à=ÚóJÅÆ­³3DŒÜ<œs¯Çoŧ{èÆùãÕš‘µˆ¥rcK‘¬ ЃÈ1£ýó…3õŽsÜ Zä¡«üPWv¥ò5¦ÄÐíöwÚù}RðŒÌ¥2çqOÜFCy"ç¹Õô ¯böý°pr3[ÿ±Qýu9ær·‚­o’" P¬!™c!‘ƒ¼î‘í,$yñ0N0ÎÚX¥‚³¤D«Šn¯ãƒqµø¯Ðì¼lp©`¸Rô͹ƒÐ§?$·ŠsX[àRLà{Ï$Ãñ3~Ñ/ÌŒ×}3.œÆÎ^• —q#rèh¦¾dym3ƒáÀ0½pLRj¨Á-^xŸ=Þ›u†•M}JÆ"L*¼Qvë=5Æì©¬¨L®§‚ºõ=Ã0âODÌÝ’WرV‚›1óèd:N"8ÅŒùfe˜›ü™ið§£”¼F;EFë;者ëñù~=*õµU½cªÏƒ¶|lí:`®Þ-¨¥ëY!÷CgX¢™póÜc5®Npñ‘Šì›f>ÚW ßßí6Sw6ðËíK3« š>Ëc‹¿\ª³‡ãÙw/‡>S·´KFÕJ"¯S›Ù6~àÔœÂ{—Ë,Ú›$MðMƒŽdeÉ)÷#©ÜJÃN‹³´ÕéÞ.mcV6£é¶½z®ç¼/ðiáØ0gP‰ÃQYŸÿá;åâmÔöøâT›–XyBvÒÑ£[¯J¹vÜôM­Ð¶6jÔÌ#Ä‹’;yð³7ƒ}{2ª |«‡€%=Õqk„=ém N™p¼~U,J)µ4÷yhôØÑ5[Zt¦GmêÏÍ„WH©døÓ¿Ê8É ±f¬+¾Ä'êïŸåÍïDQoãÌðlXŒïÔdÛbÒ"eŠHÒ#+;‚S6z+wzOwêÔ¤|J²ÚúT Îô䓊ߧér¦ÅaI0ŒÇ˜…öGÔæy~Ê~WŽù¯ÌcYÖÛcÊöã¹Æ-ŋܢ׎k«¹žþVê¨óvV&m±ƒbB3þ³‡"t!<¶ÚÅÏçG¤Ä^á.ð!%ùfo~h¸ýÌýVÚ’¬‚Û9 gʺZ²œòÜ{Ûõj'r¹­¢ñÉ»oK¯’’Bvý))1åšR‚X{Èp¸+³Â\V×raÛ (³\+”ñ"·™e*ÛÍèüµZïá¬2? ìR§ ‘Q!½á•YWùÁµ7lÏm /®iÉ”ååhY4!jÞÏGÑ>†ò–jQ»­vã5z”q,‡ëcúJŽéÈ*ÂâJÐÆ:Íçž±#K`-¡8,  P¹µx‹‹LЏ@²OOf—”]“)ÿ€¶ÖsþiÖÝû° ÌÔê$ŠnvìAê´×Fò>*ÚtŸÍA&"•Åó“%áÈÔvÙíªŒs’•–Q*|³jðŠdmå”n^7±Ÿ¿”£|¤hb6˜ŽïHu:5|58P”dšéȧDT°\µj¡j-UÎbL—t¸~ÂWéy ¬,5ÆÞyâÖ•4®Žú>†}Fú‹žò3–õ‹w¯ÜA‘]w?8†ÖãÍ¥®s°Åf,þw•3dE³ŸÔa¿²Â¦øé/?ª#  ødi%$uev\ËÄ>Ÿržuت@¥ó6´§¾@S̘èZ=yàÁF'CL)„O{£µ‘p꼇_J©~*3{-•ÖWouÝT=#s2/À5hžhH;¥Qènˆdyá¤@IG'~ç;ÙÞ‚»>?æö•¸ñÆ" Fª.0¿kgoÎù)Ch%íÖ÷¶ÈôR†§:®eÅ›jR;ç%^Ö†e—v"š°ŸÌ£>“e=%|2AZ¸‰þì»dì6áÞ þëF{óX¢ˆ1¿1¢,ƒ¶i}1©j]-BÏ¥!Ã$e9Ý„äXwÒ]‚úyøŽ‘æóEóÍ龄¥UajB+—¨NÆA¾ êÜÔ“”mš4•ÛwÔ-•ù³©Ô³Šn¬Éä}³µ¿Tºb"OùUÉ'„V¤L9Ä bdG¼.r£Ì´Ÿ‚òދ֙ºªÆ`{Õ4{4gûŸ¾"TX~‘®rÚߤ=m:À¬hü¤CrkÝÍh™`»¿½ÐL!¾80ÁáÍy<µã¹Ugcb³Rã_Å~1ó%¹‹¦Í‚10žî…êœa¡w 3÷»3 ¥ê^%øAlŽ·Æ8=Ç틹50 ²Ár$0 Ü¡¼…Šæ)º=ýáP„Úr‹v;Oø¼Ì<é ë*ö‘nsi«ó|Š] bM’QÐ)ƒEG|ÕÌ“Z½iLÓïèìÈ3¬ùܯd]2Öʬ“»MøˆªÊNÞO:pMùQÖ–uÍŒªßÔëlUŒ4ô#§÷}ä]²@Fôó²#Céòv“œÆa‘‘WY¹SÇé±ÅÊw/&+žÊFú>0o‹­ï¡¼ì1>¬ø0Ïè37Kà Ä ›áÏ·Bú¸_É ûgšé©‹gÎ×¾Ïm‹1<ÿžRûÀ¶2‡UÝà¥ßÌΊ)|áÚ¾lž,¯#c4_û½²É@ÉžµfvÍ÷<>M¶¦ÅgíLäø=£à]½ôaTз–ôïº9×g#þé™ß·j ‘7Ç{‚e²ÑýD›¯d~†æG4º|§¤©/Τ„"1…µ‡H%Þ=ßá.2T>–P•ØöÖÂù4ŠwŒ“ók&í²PAéÀ/»±×k˜”áÃëé/µQCl'¡¼œéåEæ“*R˜4$kWK´âk[ƒ^Oòä.ÿntð@î² ~=)yûí[G]Eý§5Èg®Uh“ÒÔYîñn‘—·o¯×$ ©ÎR®iþ¯€8 ý„„l+ddê%Õªe\MêP XÇ„öׄ£ø¦Kµe0£QÆ rßWHä!/‘ïÊ ¦a¥Ÿ®7¤6?OûNÕù1ÜØ›éIË$“A5¸að7Vð‡¼ì>Ã(lUNNa¯-MY#—““s­äADáÆd±ë/ádz¹eà[iJrr z–écHFiT†•Á?®ÍâæºoåÑ^º‰œhd‹#e")»›">\O3+Gú Œ½ÓyI|Oܧ™GLÉáÙP¢ô ­[T‘·±±…U2á-F¸b‹|+ÉæNÂxÿ«¿;þë±Ì¼ä‡¦±Ak>rj¨¾§Ì ï›xÑsËÆ8Ú““œiêuRò2­¢­J? /oZñY\óÑæIÉfî|ÊŸaæöÃ6C3ç“.J¿hÎLI'{ËKìVDÐȵŽê&u×eç ºVœè²%hÞzÝ DI!ÀmŸ9_ LÂS¡xšd>çžË,ö”¾ÀQ‡9(,+o°Üë¡ÅíÚ¿'ææMdá`ü16Ò‹ÃëƒìôCÎÓÍ?D™ùÛ÷ÂqŒí蟫ò}\jÏ„=Ì›6#ó,•ênÙï\Y™FÃ+{ÔØ>Ufs#ÅhÛv• 3òðèw?‹sÄ©®{$$d¾5¾x‰Ù'jêW£ž{‰\aÏ´veªIñ©§¼ô?ÄVqM³:;Ê bæ ÃNñþú؆ÿa$~UX%º šŒÃ Îu ý ¶¤Dy’w­ éú8Í ÊÆ˜%ºÊ\Îg÷[¦Tâ› ›ñ·ªH5×£U•óDüâ~_?EË÷ ô9‰¥.s?jµ«é˜‘­…X±„<æHíÞ\ØwïQëlÙ'áÅí$§é·_ÅhÔ´¾ÒZ×ðaTK}ãÇáFAË@Jܤ$·®ìUzL¬#6Å5¼Â[Íw%’"±yÊ7>•²ÞéV¢†µCÃ5í!ª_›™; hô²ª8Óºš|îE–EiãDÙkzNv*B†µ–î‡k& æ Ô> ¸ÙW°J¨Úæ4EãÅw³AÖœ`]£Í!³½WBè}n‚ J)TËLDqW)[Gã‘ÌqhEÖ7À¤À'ï'hr>A;º[ŽúoUN IGÒÏGD~GTp±k¥Ã¼ŸüÂë¤KB}Ƀµ›Ýø[¨¡ÂŸç¶.‘AÙÂÓªˆ*°l3«25l¯ñcQöZ‰ý×1b›‹ò’ ù“I9x%uzåòš\ÉRæ{¨Ý’Àsm°>Ž×ÙôýYÚt SŠ„ŽÊó‘ýÅræa_›ÄØ‘1þŸ8 Çö7Yã€Úø˜qÓ9Áô`68†©ä¢÷}o¦cŽß{ú¿W?c e8ƒž{ßvž¡=ï?(«V&÷û2åľ¥Ç.ÆÛÃ>O×®ÑÞŽÿöìN_œ¿T`܇~sä“¥mé!ß=Šê3œÛoYÀ‰áÎ\’´ ]™G=Réù$Âî±Ã‘èÚáfˆâô©!¯ ãa)—]y7É÷œÑ«'iìþaÞËKNîTTI‚ÎøþËT‰R#UðöÍ‹ú nOïiÂ#cªƒ• 7›f—äôɨ]e´ØL‹|!ÀÞg0ÜXzïjq“ÃIØCrqg‰d2¥ÆØ;ÝÒQJµ#h|^. aÚ/+}ž"Ú¬à¶馹ŸŸÃæØÉ=e„>ê> ¿€·ç¬½j&Ký™³Áhâ,²:°s\ƒ}_×.Þ¨¿DÉñ…<*N•ÙËcƒQRÐ%²Í*‘·`sRôM[i¢±: àáæØèª)Ö½¦Žjòˆ \yiRàß™ŸºÞchUÞÐØÄ¶a[®”?ä¨^ƒ<ÃÆP)£ ï á½æÚÈFTâùßµ÷ßm”>íÝ&kÊ7ìöü"›¨r¹?å@Ö&Ø0kÓ©ïCͶ©¦ôÊë“C^'ü¯C :BêgVw–$æ?ÙØ˜»W2Þs©»d¾ÆÑ{‡¸ê÷ûú2Éô Ž9ÁT?¤É 2t¨²AžûŠËz¤™¿)g( (éM•Iê4°ëÛçÐî!¼qo[Çf»Ëp#n>ºw©LÇŠ8 ÂdŒ=N#·³V¯¯„¸8U{†¥I¬¨3þo{2‹ký° Ó˜ç†7Å1ß,Ê0}Š >á2]T ;„~ucêsÖ²ÈuêÞ©i?šx ›–­I„ê«UŸ‘»·Aä5ƒ­áÕÏ nÑ“ÿýÖXï¼X…ˆ®u®ê8à©U2}6HêÔ.z°‘ƒç2{_îjS(Ï™Ù×lΚÞà b k.QG*âݳ‘:®D8(îòT9tZxÌPjš‰¹* ¶Z²Qeoرm×7;ⳞÒ†Yw13À¡U)¶s±ûÖ%ðÓí¿¿¯XT0ù}–òcwÆÁ‡t³5Ib2-.uÐâÞ„’‹;{®˜µoö.f£â=DJýJ-³ç°{Ì#tƒ©¶?.·ç-¯pÉÄ:v>Šé$Gq)£9K(~»¹  Ë’›÷<Ö™ªô²ËØ€‹þ¡Á TÝîùbB³£·J„=M¹ûðû•·òU¢i@Õª_,eP Úò;ËG cÇB\]¤yÝ“ç¯Ðx¤Æ4²êEÉÓ—|ŽãùéýŠ»žàùkÿÓÁ£§ðs¦à6*×õ(81ØÓg†[–ªb§’Û–Ù®c—ZÔ&^â©r4S½N:`•öÏ#%@  ÍMR]»Ã-+zŸDàS9&?b†:}r€?ŽÒLG:ù}쿵€ûãš¼ÕâÛ!Wm"`?­4^ÞQ¹tS-Gõ‡P!5|v¹ÎAËe郖=M1‘},ÖQ•WYýÀà;Lðþùý<±À(Œ§" iHpÈœ!¼qœ ΉT爽8 À»íÒ“ ´0zûZ$ÎÕÖCkj7O’礈…P‡<”îÊã†$úçQ:EWð÷bù#ûô¼J;¯¡çÙ¼šj4S᪨âü¶;â)A÷³'ˆö¼AÜ}¦iåBð{e)ýÝ…Q2ªÍÚ¡ü’¥›í_ÀªŸ}ƒ;7€·o60¢9r!Ä|7ˆüµNi•lŽÇrvU<½·)iY, ÄVûè0~ø¾ãxÜiÅÞl’a볕 òσf´Ô=÷BÔ:ÚìJçŸÒ¼´Ýs .“ž:ë™=Ód<ÔUãâÿ§òua~£.^åäÙw;?ÈZ³MÈ| Ê3/Ð JÒÎqbÍœÉJ±…k7†5ëdFƒîÔ®ÔaÔõG…°Cl c ER÷¦­õÔ9OC+y W…kÞO ?ÜIŠ1;=žÓT²Áгòž28͵XÕ0¸òM­•ÅK×EH²2ϧð§;èöL1zÌY!£9µU KØDÐÍhI“’‘]Jì3œD„#µá(¢*`½v Ía?d™ZÅJh¤ß¹)“ľOk=uLî"w/øÑE@jH…ýG±Û}KB“÷uQݽô3¸å‹d Ì›(âSƒ&?jÂØÆû™:B d3 ÈGôW‡sgHj¨  óý ãH|Dº¼:ç²J¿~I è³æ½a/y¸d&÷”Zô2}¥ì¾ÕÃLpüµbÝ¥+Ê ¿ +ŒoL2ŒÔ°´ì>d lžhÎÌÞ“屉ٚ¶úØÒ[<Ý3èB²|„“ÌÊêÛ Ú!)3-Šªtwy£-^zVÉEF¸fg½n9—Õ_6?wñß’…߇Šc ;Ï¢´dÕ“ÛÇ—6 àUi¼@sñÁ¯QeDÏÔÿ?ÿvw­Œy@!…]@ sbù?£}-î ¤ÿÄìÍ¥™ž6[‘')®4óبož5’É0–dÁ …Ñ’n{h Åš+j…*V\Õǹzac3 Ïí*‰+6~C/ãæ›¯w˜ðå¢F²½òJO‹úåC}ßð­Šoß3&W¼ ”žË":â–Ût=Ê¡DAíÖ´™$õ€vÐ"¨]eýÒñ”nì_–²V5±aä¸Í8 9ïËM;¶¼#’{^üüȃœÙ“»Qžv¹ÜC±{‚ljký©B‰òÒRQðæZŵ:7Ô¹}ì‡S§>Ò¶ËçÓúiöበ…¿¦Úñ¡øTÆ‚;ǹ–8e¾7Þ½Ú@Í»ÅâïVR4ÿÅJÖt~¦[m)ÓÔŸ"mªÑÔµŸ}”›"ŠâÒlp¼MQ:!‘ˆ*ÆjD^aFAâ–š›J endstream endobj 294 0 obj << /Length1 1313 /Length2 6528 /Length3 0 /Length 7434 /Filter /FlateDecode >> stream xÚwTT{÷6%¤„ÔÐÝÒ-ÝÂÀ 00ÌÀ0t7"Ò¡ Š€€t7Ò *H#Hw—Äõ¾÷þïû}k}ß:ksöÞÏÞ¿Ï>k]yܬ‡!yxù%ZòZb~~!^~~A\C þKËb F¸Aà0ÉÿPD€È;ù ‡4Ü¡!€€¨¤€˜$??@Ÿ_â?@8B ô€€Z¼ 8 ì†Ë¢wñF@ì’€¿_ì¶ 1îßîyg0b „´€H°ó݉¶@(Àn #½ÿ‚]Ú‰t‘äãóôôä:»ñÂö2ÜOÒ v#<À À¯‚Ú@gðŸÊxqY†·?z¸ÒˆîPˆ-ævçျÃêš0ìXó€ðWo¼‡ûËûW ì·3ÐÖîì„yC`ö; ÐQÑäEz!¹@èuƒßù=€(Ðæð;s @E^¼+ð¯òÜl¤¯ú«D¾_a )ÂÁ0¤î¯ü” °í]Û½ùþLÖ ÷„ùþ%ØA` »_E€Ü]øŒ`Ww°ºÒ_;î?:{0 Â/$È/ »À^¶|¿Âz»€~©ï*ð÷u»ìîŠûCìÀw\_7 €D¸ƒý}ÿ·áß®€±ElÀöî?ÑïÔ`»?òÝð/€9ÿ÷ü¿®¿ß,ïè‚àÞÿÀÏ—OQW^WÅëOÅÛà^_A ˆˆ @@X‚ À/ðÿw] ä¯4øÿñU‡ÙÁb²½kÓ2öø‹ì-àß±´áw¬Øÿ!¹¿¿íÝMàÿ›ê¿]þo ÿåÿEòÿNHÅ ýmfÿmÿ?Ì@gÔû@Ù Fü7ÀügUµÀ ˆ»ó[Õ‘À;úËÃì¡7â¦ñƒt!H[‡?ù­ßÿß¾Ê0[8è׆Šˆ€Ð÷n>w’ÀWàn•@`¯ßðñÂàÈ;€‹;Ò`Gàþˆ˜€ïŽ)À_gÿî´ô û¯Sl݈»=ù=Æ»þ#ÿ^J0Ø l‹;5·• s¬k:/“§öäY~ô…eÅ$ƒÇw Ñì~y+™£ôUÈâT>¹ïÑìeö¹iúkß­ú*¬È†D½ÆŸ~WV/õÇVq'GÉ»Gr·ä+»hqhx åVý®]ýŒƒÐëQ[5XÞ¸º‹ß×}KzîÙ©êUÙU831±¢·Z*úïªð3Ï £‹àü¯,96¯Ç)1‘<´Øœ$û^„_ON¿dÜÒk¼äÂõß~!ôÞ×ì»`ìŸÏ\±¡ [3•%-ú É૯ÂzŠÅ7ß‚÷³Ý“^unŽMøSå€wSé×CÓûR=lžGƒ“Íüb÷b–ÐÖªGCQ dCª¨nE;½çÚ,à ÙWs—ÉïßÍ‹œc­Òà]R-ÇNA¾ñ gñ§Ä¾ 6Žf‰ôx£«=5°ô¬Áß¶²×…G¦ Ánpœ^Î ”57ÒqŒœR£^¼>‹†b«_•ðdýY<—2)õU 8yôk§†ì½º'ßßÉ|ï>Åo”ÿùÎây@ÉSŸÄ ¾=±ÑLBÜ* @d×zç; uæ‡yo2$(r¿]II…º¦ìï_å¦\з¢yg'¡º§²[§9 Kóª¦Qø°qåÂf%—ƒ cߣ5èiºzkrQåe’aÕða¼¼mØ:µZ|Á³²ÏkûÙ=JÑÞ™ŒÆÒL UÔ¬†¹!—D¡fŒö¾h¥PÈÃÒj”FS2©agè0yô“Q^ÐùGåó>4ß-ˆ»H™º•}ÃÚšÖ±‚ú#‚ Œ¾|ýà9–"Ë#ê7^펳ëO«+ðÞ ØF¤¥ —=ê¨oðÑõÃV"¼–:.ÚÝ^dd;|s×;*¢Cr|óæò³¶Y Ϋj `Þ¤Îw ‚ÒùO.éÔªJœì–ZOx—ã¼ô­‘uÂ0|ü±ï»—d˜µÑë³1-U4&1Átxý±Gû °\Ìó=ú[‘‡G_†Ýux“i ß³ÂW¤¢ûE„õT«æ²s>x/ãK;7Ççú p8 P_Í%â¹að¥Y_Âoƒj³| ’ Hœ%{"~%]­t ´‘Î.¼V‘°”¢*Lecw22fõ¦˜ ˜'{Jø†c“¶æôs§ïk  !¨E3 ߇éÅýåô°YÔÝTäf¡¿“*ú”äMç«ë“>ɉ›QcoZ5}høÕ¦ó¶NñCÛΫ|ÔÅœ r´o‚ׯ½ÀV[¼·bOø™ÛÅif³óÓ½:ÑÊha“uÝ»\€\åÔáÏœimyŠï[£C'ù þý &rpáw™kã¹0~eÎAoÓn‡*žOfKõ}Ç2+0LÐxƒ˜÷IÈ#‰®8+²rPÚŸ¿ mcŸõ¶Š×ú`^è¿FÞ»9j8þ•Ÿ>Øóyµ-Z3ô aDaç(î:CÓÊ)¬Sb3Ü4Ó=h c´ìß‚¹pFg˜î^%홨÷¾œàÎe,Â$¨ Ì™šüðq¦“ÍLáÅÅØÁ䞆•µ¬1ò¥ Æ~Óõ‡Sð§ùär÷¹w?¡&Še< šaJ±$½¹´ë©LÜ„;ÍïDا¤Gà¥+É[‚Ò¾Iǘͽ7¦9s÷yìS!Å9éB“VïV’}–àHE¢æ.šrè_EE|Ž¥üÈ7F|! }´)1<&(nA0](2MßMj¶:ŸLæ¤lê‚#ijÿµ.IÕÑÑOÖ?׿VøÀ€…ó,H5nŸ¯ü3lgÿ<à”{’ôyÕ!oÞm¡. Óaðæ¿ÆaÄ ë+¬ºCõF¶ŸÉi¯~&t8¥îpôQ)hÛµ©Õ|,1ŸM]]îPÇÃèíü˜ë‚IÞ¿I¨jVqá?íôFx¢Ç–',É”tê‡^Ý¢Uÿ­¥ÁîÃ,|ʼ¡övtæ”yIìò©¼÷CúÕ¢Íe+”©·²^;Kš(øáÛ©›KΦŒDNדSnÓ÷hò¹›-½N«jŒ:…ÉÕ ’Ùh£êd["fék¿FϾ涱jCÕ~I’”8l® ×ö}y9\fŒÛ7?ëîq37WŒ»?ÝɵØñýüzúÐê­VµimÕì{d¢!fÌlåüPZkùL/Í·PÓ½òÁÀÚà´eüs_Ö,ºÆé×ø“ÚóÑëy¨ö,¢*(ooóöz½Õóžù¡KøúL^nôød?pÖh!ý˜¯ÜB8˜ª4ŸŒ—W²Msáqd#’éY*'ÛAŸ—?Òiîù|ôˆŽÆ?AÓͲ ýÃÚ¨Q¹ÓÞ|ÁK³Ña%¥™«{Jã}<-g—…Mz¹×ìK2ÞØm?iÆÎqŸQ™Ä¿}rìN¢/LjôQÄ·€ˆ´XöS“Gj/]®j^x%‡ãè}AGJ¥ËõfEŸ”ï„%a¶”*#.1G®Lúhdì·7køï¾!á&‚_y~¨uàÀk9)ZÛ™¾W×°…Ô‡—§Kx‰õ؇ㇱyB]=×f+½3¶¨ 5qÊ#I‡h°ºÑ_âŒnt‘³ ^óòLÈpwé̾:hÈÒW\à‰°0%ŽäN«1 2€©žQf¡0ï,ЏvÀŽ\ £Oäë'8'/FùZ6ë+UŕЮ°3 :¡$ëÌ®´raÏŽêö£íƒ1õIî¸rå EèãÍÁEuÈšrRôè'‰ë¾ÁÒqg5zÀ9ö.ÔJeC^™¬OÕ?5V!¾Ã–SŒŠÇ+÷íç·ó˜‚PGͧ9urdéãsœÕbÕ}Œ«Ý]­Å4™wZ0o{IN²lÕ‰.]VcO¯ö^Å"|#YóÉÌ 6^|Ѐ°3°9—Ý€:OŽ8‚“ó(k(}LJ°Gíl”µçF§H5ò:ùheºòš‹<ØF@ÛJ =wŸx§ð!Ë}±‡-ý÷°J|mŒ2:´m‰cÐ *ðÛÄI/ñ™5Å@Æ)®6Njé¤=N0QÌ„I]Bä¡JÍŠÁgÌ®Á›W”ζi÷3hòk¾ðdw[,ïw®{¦.žð¥„ƒÆ”» }²2*l¦`;ãŒÐ½3åb&†T‚÷°8µ&EÖ ƒ¦3íʈîåL‘psë‰÷¶ÊLFýºD$ô¥œÛŒ$æV#± £Ö¥sÓ1Ò7ãx ªä™½ü*¨#äeÛAZpÒñ¼ª0û3†&Pn–39}F&ØtÃ}—¬õG¦ûxßû“|7×8#M{ã÷fèÂK4 ~¾dX®½Ý3s…M0nɰÇXrü,2ó™4©ïÄ$8~v±$}Ù\Ä0£ÌÀËÅÁu€Ã#Õ¼mtÓh*Ú(Ýü ÿ>n~m lD—]óôuc‘jÉöP †;ìÂÈ‚º÷]»Û=©X³ Baâ刨U#‘è ðXëÂÀY9a?Φø±OÃ:Šÿlq 1±+‡½lʪF~ñO|ªiñŽ©@¦É]ž¡§eÛ¹þq+ñÁN­¦;݇ÇxÄcÂÙò¬"E«b DrºÏfT1qr)¹§wƸÃDClA¯HŒÓÄ­úîz®–9䯙77q‡u¸£®ðAc¯½ðgV_ê~“ñ»!ikyÜ¡åöœ|BS\?vOé^Ëâ¹ ~$Ó¹iìÊ  ›^ôΕÜMìúuª÷ŸWÃH˜¯%Ý΃ ‰C‹e»ÙóýG|[ÞÇzÓBO¦Dd6߬WpaIŸÜGÑÈ:gŠÑ…íýäE+(©à£S5í&k<ÐüCøœiÑÆå¨©ê½1PÞ/] ß OŒ¹º-VrXo_®ŒÝs²lFhˆì,ÿÄÔ~2p?º+Ûq¯ 7ë’ŵUy+³ŽÀ4Öm¼òîòÜ/Y/YmÛWQæYÚà#¨Y´Íj78d±§ß*â åO¨”ö”Uæøpìq†_Á~éH3I³¯4ešlö.: ª¿µż¼]³#ó¸ØÑ#)‘Bf‹ö®yFBOºÎó5×a­4¿÷¸v²M ÆÒAªGï4ˆÑ*äXw–OùZ—IÍ~hÆ“1¼3³0›FØ1²9ÊPÔ~Òh¨þuþÛ6ïçžBsT\”J ”І9LSÞ~/¢ ±¢øâþÐ9ŠÍí‚Oo0(lCi`;]4vS,Ÿ37]cd g«} [+нs|x»"˜ÃBÀ…Áÿ¹*ùÀ6t¬ºgª{É1C!´êCo>ãáf«$Ý I€³¼k¶ äbyn¿- (.øúL‘©D7¶‡—Ê9îIï¸M-iˆ/ ‹Å­†ò§9; åñù½å )ÜE(iè¸mMcX’еÇȈøTê’‰&w‰9úýzCñ} Êu½b/¦n§2Ê_>–+ZÉ©ȞÚÖ«ªT¬¯ÆÒ"áüÌU=AMŒ ZüKlÀaÊÄ!åÃTSäËOŒâäÒ&!C.e¸ç/q£i¬”1¬¶]¥]ÛeÊ^Pgd´jF~Ó1Ü6v 8]&²‰Ú¥í“v;1‚õSœe«ÁUðê…+ò€«X\_9ÖL VF´¨Ýay–ôصxÔ,â»úóÖ¦Wáð-‹åÍ»½0¥·ë’'³5µ¢d!/FÈõTÈ­pèô¤2d¶+¦\¡–oß0h`%ûdb…ô>RW<%~Fgý)h:ÃŒ>È)zù{(86^Js…L°Qq,Ø%ËSvØÓùzòþÕ[¿}ÖÖ~=\¸Åª†"ÎZæ¸é¡|ÔÖ9“‘u¡‡Ú¯ä®bPkïÏ— Xê11NcjÏRD\…⓺uÓFS +½Ò-ݬŽ8ÑÞ³E³ˆñ/WI>§«¹Qʈ0¢T<ù²xrº­¦;O,—Ü'z«FfwQ|DÉv-'¶»q–vUpè.öQÓUÖ×(9öí®ò]e ‡LÛU§DA´‡fEú§lν¯ßeêSÎ/Û%òwùè•Iy’véɈ½ïÔ„†b¿Ê½Aw ʉ{tãGÖúë§.^'9§<ÍäšòÉ©í½Ÿ/Vž&‹ÖU½RæRkÓ)lRë–Éh>.é/bÓ8ÆBÏÛ² {˜y¯·!OaÕâÙÝo×~ÙZ´mánîÙ\bÉûR`.l„™\⦆nÄ'r–+zžG±BÜ šÁÐÆü‰«£ŸûH/‡‡4Æ ­v÷>wÅìÑ‘s½.ªx|ª=3ûYúñtuf0i/Óð[ª-4Ä£èL ƒ‘ÑAýuò/¤½<Ôžûa¾0Qç¨@ úûg¼öfëAuaî|]3ζúô‰N´8SΫ œA½÷áÃ¥Ôay¦(D$ ×|ψ¬&ÒþTø"Åʤ˜;ýy¯ñÈú³Ú—ª†1+ò‚{)µþgǨ¥¾2ãÊrÙdWU pFÞ¸+{ÕÀk;@è¬,›M2NЊ¿ÔRÁ'ìËüØk©·ßy¹B¶›ÊËÊ„nöK4¾”©Ò *yn-SÎqSýx=z{eä7ÒÈ£÷5È4 »SõRÏŠ¡;<¹èïÈÞÛw$õñk¾Íx]³œ×Í4s¯î=óN}oqVùðÊ›¯—^LHÍF³Ÿ>ËÌ_ÿ°`ØfèxI\‘¼A~–"s=fez2\ Ó›¨KP,¿ø°‹,›·V¦†9Ý;_ˆº¥(º-mgº1z¾<´ ¯ë½ÖpÖv‚™à‡Q¢~h·®ßkåŒ[;»ãôhàuØ‚aÃĸÇdW‹õÖ,NŠÍ×#ð+nò„¾¤.E*¯É; 57¾Ó_˜˜æ!õÃû‘þÔÌuŒ¼>ÒÔfÐZYd#ÛØšìlÏ{ªŠ¹›’q;´#mÁ¾$Tê]3é’ä`âÜ&º­S²bÈGiìÊ”ÅÈ•þMLmÏ34¨iÙžaA”åÂÊfiöt“3ªÝBÃç2*Ú[¬Ö@ò7|N­QÍIdž„£5lc éì‚CcÈQ€Á°wÓOhâ4…iUžk¿Oìþ0ÒÈqS—º´M²0Žg[MoÕVÇÆi´,ïD*3_šÐBbKïa¾¨?gj_Ò÷…¦ZXnbÓÕŽÍaM$­$Ú=Ÿ{4iQ{…Hµ9½™Lîˆk¸¦<üèêB@/ñe¬JÎ<ÕD«†é©‰â± cKË~õ[eÎÐ+ ÚömòÕ¯gm€Ð ïSˆÛáXZ'*Éö‚äÖ‡Â>UozE ûPÃůVF°»-ã—‹FPljÉ?XßG}”øF-e{Ç -@ñm7·`×çE!{°ðÑ%VÈqÉ-‘_ +ÎÇÄ圗SœRm¯[×ÖMèÈ-j§k JóB•±ƒWÒ«G¯80•ÄçžéÿÈccUˆK ÎC–ômnŠ G²kÍËD¥øX¬d§mQdç==¬)‹7Èá³ @×›‡êED»Ž÷‚I¨‡RßS£³3DÜtg Vé*§ æ—b¬)°ã)ºagsï¢ñå`FĆmæš7n†LC»o!=¢¯ý‚qYSAX»Í ½ƒP¥¼òŒr2ë´üAN`ƒ| Söö¦®+“t5v’ÏÊnDÊ-æô8MŽÀÙ¿]ìF¬¶²Ÿ|ªq¡å,1sìçó•4¶¡Uý!ðãqè]‚öƒå wdÑþ­ÀOÈÉ"ÓZ :ܦ¢Ô:*8U±È¶d› dˆ™Ò>` óQ«Q»Æƒà85ÜÖßRdH½Ö§èŸúî2ó½§äˆ?"Îó16ךDû1¼9P;^ŒÊ£ërÑÆÒ&2ë±Y ‘Xt†@B\aM ëbÔÚ _>ÞUf@hñ™ ï¸Ä~¾UÄåÌíÖùTühøö›Ñ³—K2"OŠðÒXè_RUús˜:Ó¡3eÛ·™\{£Q)Åç¶K™§élVPYc:,?ÿÞó>~¢—BA£DÆO’S\3-[¢¼Åâè›®/#ÑsÚ¾!Ò~Âé­;õÃé±õîï¸e»%Îdg$×" ¼¯B?2í·H”Äæ§=æ®™þÂü0É)@yrÎJFñGï{¡| Y§¬ÙÐKÖTT†²8 @™AsBœSÝf8‚ÝÈù £÷Ú7VÅ줽GNÏÈòÆKéËä{mo\¨å’!ÌÇ­I3n¡Å ’Šo“Žó÷/»Òí9»®­*Û»oÊGU›j‰ä-ƒc yØÔ«™“„Ôi¹žé´Ø ¿U™! M'¿9˜,‰^ãë~ú1¡ieüMº‰æF8cÕþ¦æ‰ÌvSºkbK[Ê.³Ê®œœ»‚ÇÉ©Îl'¤| ·,£nŠ*ˆÍD1§AµáÑ x=íuÈFöóõ:¸Ðü¶—Ú·¶–ù5 T‰ŠGºyE Ø“šÒ™¾–澟oŸ¥/àù+—QËHî~.T—¾3w”Æ–Ô'áqMÒoüüŒŠï-vÔ²£ãöUöär¬Š“&–ÅtJ±ë·߬°È(e3'ªsætŠ£ùž—.¾„²|Hûú£,Òä=þiJý`Ä·yw¬A dùÀwãmcß`bߨ÷Åd3KœxñD¢Lþ§çÜìR:‹˜‡´8“˜-W+­ê/” )À˲PĆ5=éeÔÙ­;qˆG`È‚WŠÍ W3§c‘?OCúŽ}ûš2u¸÷˨ÞI³!¡´–ìñ±•Q¥dq¢J}-'¹ô áOmºïX¹óþKQê endstream endobj 296 0 obj << /Length1 1306 /Length2 1243 /Length3 0 /Length 2081 /Filter /FlateDecode >> stream xÚS TSga,LuÄZ”¢­”Å• KDÃvÄ"*SÉ y$y/ËKBŒ  rTÄePäô¸ EA, ‚ ¨Œ"*¥(XAD‹ è([E˜Â¼\p朙“s^þÿÞï»ÿ]¾kóMh˜#G€ÅÂ\ Åéšó ¦ÓƤÐh ’M8‚Kà÷v’ÍX¡D0Ôí„—†pÂæ áz †‚•Й€îìF_æF£æúˆ)Ü€7¤F ˜0V’l¼0™Vĉp7ðáìøö€î꺌l ŽV |Á.‚¥Ä‹|HÂ0>ãÚ)!ìØ"—¹Q©†I•LçaO¬„jXô%ƒH O–F!Ù€p¢œp„aB\)`@$F•E… ` ^aþA`• F'ÀA2˜l SèÂM²õÔ@†ø|L*ƒP-‚Æ!"Á*nOÀÉBz $QbRCˆŠ%†Ô!Àå¬Qád}J¾‘áJŠ‘èk¤êÃmöA^˜T £¸’¤ÏÏQÀ|¢ïZêäpÅ(¦AuïoBõeT2jŠÈU°¿÷$†0‘>Úâ`°hLº« Àr'ðETýáZlpÒõf¢†D “!Qœˆaâ¤SBjà œ¨ûÔ1õF¢Óáã ŽCPÒÇè„N܉ù+°žFÈhú߇S4¡0†J´á†S9þ^œÈÈ¥“%pzzb @çÈbG'¡S¦¸‡Ä©qB!d2O¸þ¨Ë&Ò%úô>eõ¤ì&ÄL‚Ê…ÝG¡o ±h|âCÿ¿ån ü7•ë£üO¡žW%‘üv€ÿðCRD¢@ø¨$°âs@$<±°Á°QI?÷úã±4Nò¡}ˆ’‹$À‚Pç‹&db°Ã„ú§r}P>&Я ƒå …Ò’h„ÄÀttbŸp‚A†€JA1œ ™ OBLAÒÄ•¨ëô&Ò”°|•BAl‡arÄ›ïï†U„á˜Ojùã»§Æ—¤V ÿıÒ8>«g8™×ôï4ìô™¯~¾:Å‹ýn€y<½™sµ©+ýÝoszùãeâµóhâ¿=Ù”î6¯å\ÅtalySÜå#½Ê £+ðÊ•u1LT7ïu9¯V3¸²Ñþ+²¼ïÙýÜn_öwåEoψ^›Ø^xI13ªÏH7±tqaš¥Vrr+‹<‹9MUþK”ý+ë_eZs»ße߸Ã`=­yxš< i϶êé1—æöxzQí¼ 0¦4ÚtVûXŽîµK¬HM¶‹UÖ…-÷ý§¼ôÊ‹´¨î4&Ë;b[òÆ,SN E˜Ÿ Y²|žSÞ(¶uj6i]»9>óôƒ{sëÎÕop2;õÈ7&Ký`÷f /,•"~àE/‹Í>\xX”¿¯”;þEyôÆRÓlJ:Ë4´˜ÂeûÔ-`´Äïlo¸5,´ÞÀõÍ>î‹¶GJᓱäÆÎÈÆ´ ×¬ÖüïŒIÕb¿–-ç´;ª*Oµ_ºÙrýVæÂb[nݼTÜþï]«’ü>ù=2ÆÇæ_Þÿƒ¤)«ŽHv<á\ÿò˜¼–žt¬y<…kÉË*h„Šw]¬]p$ûBk´°»Üô<%iÝ¢¡´gC›~ ¿íµ¥¦-ïÍBVG™§íѸQF׺âEÕϸ6ºå.Çzv²ræVãŸLÙ쬒a¿]¹ê# /ïfÊEØ V¥(k,º­ä‡óª{æË™¡¹Æî#Cg/ö?yùz|LÑλm1æ‰ý<îŽÕþóñ«˜¬Û9gùÏͨi]ãÃs€ŒwÍ¢zÛmö½m¯ª:~Zcþ(Øš·Ó×2cˆÝÕ3Ë\°×ïÀ@ÑÓ®¯/UñcIx‘íž¹ËÜ)™Æ©½¼›'_´JiFíuíý§ E3®~›³ÃoZß=†ÏôÅoy3«êûštSøË_B3×ñÓö.à;”Zï¨èÓLsŽ*ú>Ô1éÁ¦WZ²çµ6qfgùz#Þ ‹ýNâæ8»öÏÝ•œd­i“vçy§DÙ3“8øšC‡pᆨù‡ ˜Ñ+ê¤å/;ÝK”º¤®”íWÊÇ[ÞäXPF÷-ι^'¦&Üóiÿ2`ì_¿>Œ¨aDžöe–ì½P870¢·|Ú~ÏCE«¾¼þ¬öKqø/¤"+—c[“eÈ“ŸuR¤ ËA³4Í¹ßÆþÍáÖŸ[ š·h[O¢Çî•ß<8¤®ïá=£Ü–Œ%ž:¸í[yîÑ3.iŒmÏçì¸íÐZöF…5Ù•†—úvK6†hä}=‡³è‹¾½¶üƸ¶¯íx~Ð6iúÜwI®®(åºVY(Kf±'í õÈPi‹ .M¯ÆYƒãw¾Ûµ#:ÚÌv¦ØÈ!/¾&B¸¹§¿®\Ü×y½fne’{ÂöÆ”Á¦”ŸÝ•G½ç§¶¾ÈV¯¼X'+.®mÝxûÌ«· ç‡ó ²V¤Tôûä^\Ý]z–}®­uMÞíe!9…šW%¡Ö—†}aýWdóËY{š]Þ^:vè«Xläî°Ï,]j^oˆelu¥]!Iû£l…o†•IûÍ=ó£šOo´æ˜­Í_oÝÕë·ÅÏi9eºõXW$°Žaº‚¼ŽþG¤ô=d_òÈ*ÎÃÇUû8ü~|óÀõ;¥´}‹œBTŒ’µAÂQ“ŒlòÖãÿ’Ñ%å endstream endobj 298 0 obj << /Length1 1608 /Length2 10065 /Length3 0 /Length 10889 /Filter /FlateDecode >> stream xÚ­weTœÝ’5N€àîw—àî.‚6Ð@w#»‡‡ !x ¸‡àÜÝ%¸kÐ÷½sçκßüš™ÏZÏ©ª³kWí:g­Ã@£©Ã.e µÊC!0vn.€:léæªcQe—†:Z^Œüè 2.@  ‘µ€E@k€,Ð ÀÃàFgÈ@¼\@¶v0“ž¶3++Û¿,…,½þéyÙé ²…Þ¼ü¸¡N` öñ?Þ¨`v@€ ÈÑÐ4RRW0)¨ë€ ‹…#@ÓÍÒdPY!®@f€ ÔàøÀ ±ýUš+Ç –”+Ààê´½lzZþr±œ€.`«ëË?ä °u±€À^zƒ@+G7뿼Øm rr¾D€_|/`šPW˜«• È xɪ)+ÿž0; Ø_¹]A/nÔæ%ÒjåöWIû^`^¼0 ÄzÂþÊe Xƒ\-¼^r¿€9¹€þ¦áæ ‚Øþ‹Àhkábítu}yÁþ«;ÿªð_ª·prrôú{7ôï¨ÿ䂹m8йy^rZÁ^rÛ‚ èœ ŠÄ àæú‡ÝÚÍéŸ>w Ëß búkf˜_HXXC!Ž^k  :§:ö’Àô?S™ãÿNäÿ‰ÿOþ?‘÷'î¿kô_ñÿö<ÿ;´¼›££ºøeþqÁ^nW€*à¯;æÿ‹µƒ½þ›è4þƒá¢³xiƒÄöE .®A®ò O µ&fe°±p|éÑßv=ˆ5ОhùwìÜüüÿæÓµY9@þjº€ðß. Äúß™¿Èó7oN5CY%Ö¿MÿŽÒ|Q¦ëåôBì?êPƒZÿçâ/ ii¨'À‡[ÀÎË%ørظxÂ|Â~ÿM¾¿¸ÿµV³€¹€<Æ/Esqÿ]ú|ÿZ™þŒÄ jýלèÀ, Ö/£õŸ†¿ÜVn../Šþ}Ú_Jþçúï!=Vèó3P+ÑPû´Ïé°JâœÞ!YãÎvnÄÞ0§¢Ýü¯åж€´ˆ5áRó‡Š0ŽÚ‘§&¯é}§Ç-e–íþv"Gƶàq.…sÇWÜå7?Y·ƒ9ßa¦ÄøœL©®"½àÒß^ÒÒ~_ø€B9òƒ×åÕÉ s û×@úk',«ÔêxœZ8¼Ê¼ýƒ7‰»7׌ݿúz{ÚÎ;¶ÈY³ãÑD-ˆý“÷i’`^æ.—5Vìå"Y‰aÃ4Vý(*è1Úé‘¶¥È%)íŽMÓÞò®FYÕ/øOÉìí)óŒPV™º}¯ýù‹­ö`Ó¤ÞCGš´t$Ÿï¾Ø’³%X&ã&I¢ÖÖü¡–œE¡[,öF:ÒÚ~eÑÖ7$Öýy‚!;Éß¾›'—n÷ƒÂÍVϰ\ƒô¡ÙÇ$÷äü¤–}Ê55“À`ǖͲ6±y¶Ã[VY[ÇäÒU=w¶¬âZõSøž%Â(‡Ëººù4[Š)tú¦dQXÒF,%{µ§%«–Ñä>OÅ»»MPL¬Ë}™°}Í-PØ=¸³F´þÑUÙ‡yfüj@ߣVAÀ¨œ%ù8è5/ïÖiâ[hKú)_Ýé³))C ŠŽ$sFJ@sÎà köîRÑùx&,òvƒŒoaŠ|öø<AÄæçIä€Õ‡â-Ÿ‚÷ÐÈE£×ý8OÕ>vtQm·a;Øu”y]…Ä/àò2ãŸ`ŽU $ºœ*ñ…Pƒ‚jKÅ“üÉÛ”ÊQP ’1úCíÛ¸=Œ`l&.ßÞëgÎü/öQàƒ˜fÕÊqT#‰ÒŽþf\¥y iNy2éìɆ_HÄ<ð¶ó9wIÿ”váPÓµ^÷žöš„ó ” z½µVps²z–êyXÿжÿ?Üca.IÔ•Ä¡Ãñ¥gÌ‹¼ùÑój%Må M¤f6˜‹3Lî—9ùDw1)„0 žÞ‘;‚¬ u¦“”ûáO#…V+òDÙ–eiDúFBf0ÕrU\Zø œÈZëßИt”P·tñHËö‰ÊÁ͵úÑ@8h iB†ýˆV²G‘ \$3Qàê.î@Û¼¯pœp«}óc€ýõOé ÃSaêž„œßA?šˆú‘Þ‹ž¨Ù3ÎÌÞ'9EœE:ËDþb˜‹ 6' Î‘ÏŸš?QP÷Iê&¥|s¯h„h,·_P'™E·ÿœ,³%’»°a23ËF&»üœM™P¬úÞü¾#*àu)_U úah¬G]¦OX`ñffÍɆ¨È\$•çøDË}_°þJfáDïÐ’ë½Ä-®ó«ñ>™iL{Ýï "ñ]PÐUªïaʆ–tv—A_÷Ï…?¬êIfÔÖî±s½—LUÁ¼…C»œßÛ-;ZäƒÆ¹%QàF–ׇ]ž²‚”g~lv ¨Œ÷jdRã\†Íðk£ ¶¤F‡êw[ãËßì[n‚‰õ¬ÓÍXP…yôf»ä¯¾:xŠÜ%§p$ =ˆâÐåô·z¢]†H~˰X™X_±l<Ü\_ŠÞ ÊèÚû6!2¢S~#)Ð ï#_‘œão öÛ^„ˆêˆ:½QÉ>g´ _‰ýI‚¦â5åϽ¶ < *À+G«Á<øDÝeâü Üî°}½„vfeºû´r"!tÁÉË·WæÂÕ@dýÂ<ð6’o¤çüÕ$¬—¢[÷+„ªÔ¡ó¬x˜Ñë~Ú¹ÃêÆÍÐè÷Ùßv2ÖÅ#Îì¶ÚÂ[H7ºt~ùƒú*}ÕoŒ)ç¾Ô³;´Ë>aLì§ÉÅW“DGUUX íÄÛ3}³™LÂA±qÕ(£†sÈ;Ê„èk§§\˜5-g3 ¢SN¿‘:ßrsÓä …h÷TEªë„¦¦Û\¦< ž-zJBض ĘS ©ñ_"v²çùåûHã¾%8•G#Qpm™ÿاó EõÜãHòJ ²¬Ñ 7¾ÊÌ„òçP~„‘#®¢’_!ÌíNL)’Üþ|&ƒÛ¾üå‚T)Á°ty5öý9qøòðY›`‹ § ~Žò*Ò³àÝ«’ßzOÄΤœ èŽWF=„'a}0ßG‹“9u¦œ6 xå3Ižû3tE×[u²o<¤…¾UTÍñ¼ÈöÔfüð™B¸{,')Õ½?g ñ£ß¿Ÿ¬s_ÒùpCÄ/5ÖÝ$®í+±¸ÁOÂa—Ò£”éµ" ³h —p\‚r{X:Ú¯\˜äϲ€ñEjÚûB-u~µÇDilî¦i\ãLtL¿E t6·÷—©=:³ýÈ !lQ5¸ÇÇd-›Û<±A¸˜5lž¡Y-÷Õ!ò7§—«¬µ`Csl’bš‹‚ÈX:ËêöÅÇ$v‡©%8˜4ܹlx-›ùW‹s­ÉÈ;×öûåÉÚ…E4¢SƈõÑ›¿Ô›n$üÙÈuÍå­ŠoáqEYg¿ŸÏµImæ %ëŸÂ%ý^¹Ô¡&ÙA ýhÛ¿ýÇXíxà—ˆ z¥l—Y2áþÛÀ;È¢‡a0÷µ…F:“YõJŒõSlþB€ûcB>™I$ûd›ñs»NZÚaŽY€õ¡0¼R‰BcÚ]€l¨§¾$!ˆž¬Ý›S­©0ÖRLí4éÝô¡*ñç´(7ºR‹™Ykø? tÄHý3¿[#,î}ÍtXFÈ]«‘g²îAß{D‚S°·©—»|Y?\O{ÕÓ,Lao½ç³Ÿ±Øðœy*ÖÓ +¤{ÈÔ(·ÍÓõu:o½šÝbð\.õýæº"¹¼×ã!#AÁg±d!ô£¿QÐS_fܧ’W†SÜ21;DE±vöOîá”f0Ö©xS]yjb Ô.Åð›¤Ó¬…â¨m)£Úìß}âì|´äÆØqÔtHήJP™"ÿ‚L% †XE…9’ Χ|¾X E øÜµO]ã«“>ú!ì8WÇ?.…M%YÙw¤¹=RC]OîùÓW/¼kÌ5´ë£Y»°ä].VôÔ×`ýÏâìox‡"›òÞõP;AqÈi”/´…a‚‘ºKŸDõ‚)ĦaZBeH‚ýâñÅÑpce>8õþ-¶áÉ``¿%m—îý…Û¡açÞµ©—ÊH¯‘k˜¨ä3»´Ù÷¤F>TeiN‘“Ÿ•+¹ÂÓÂgò¦š=ã«Î}öo愪þß'ôå<=¢ê-$n^qŸ=úuÿnÿ’븦¸“DÖ+«ÝÜ@$iøƒdîz@Ýñ£ý{Ó·“Ö|Í ¯Qâ~y=ï417w‹G,g«{f͹J﬑b+§*“Já~ðO#Ë©]Ë‚%¸^c>—›JSìÚDÉ8IèÉïŸNÍü›ïµˆ=ÈS{òF¬Èã“¶Óûe-‰lýú\¬g¨r¥ìHi„Ë$‡£^Ëû£¯o¼Ýh ¼[Éà²ïâ=úpÙvœ±ÍpZÏQÅÀJoñPû| Ç­÷ÛEiƒ¹ý¾ÞU8w]‰CZù;ø™½¼Ë)VçïUûBœ¤ÖÁ€›ÌÉ¡ˆÊlþÞšŸ}ó:çnn‡)øÝ’ï?8/åCjçh”Fõ¾³BýÎ<Ýop„Œ4Ý:‚âí)ùÇ“ªÚH|ÿàr¢-e#¢ ø°˜&55&æÉü#ɘ~/©.ç¶Voaxõ™”t_„Ä»¬vF3?ØH垃/€v„ñSoSo ß$-@ëˆÃØ6†¬2ýj€Û"{yb ï"{jhmš7»T Ò®“*VŒ¼¸ÖÞyøÐÿ` 82rÿð…ñªáqõ‘zèê ]P0@[Ü£„ žŸ¹n¶,žµVz³_û;Еûž9«w·I©ÿô .Ó°Ìæâ=ãgÿTŸˆŸïçt7¬kê½h-yS6ƒH²ö¤Wânb¿¡›[–®"m׌Ɯ½‡“,Ë4 ©­HH 6×»Vñ¸¤DÑÕþü*û‘aEJUA0Ôp)g¾$ÛaÏ`d•(wÁ+¥5c2˜2ÁŽD`š—®è@dJù<ù Xìb4îçÔš°8H#b+¤¥ª\¥Þ$û‘IÆ65Än#ˆZ„ôð[àöéÊ3s8Êh×zöGœà6»?aī뱤ü·žòögËt+˜Ú}œççjûKÑSÿÊáä¾?šFí"¡=ùao@­'L¯O¿›å t8(±áh‡~ˆu„‰ ~jOrÿËÀûÇݵ$ (Ãþ d<ô-.Ê…¨+૟Ø7®bFÐ8[òæ{Å?»4j™K,C\ætÖ¡´ˆ#nî§¾_‰µ)6$°Ž¸ùí¸>·LÄ—W‚­—z|HRžcooÛ¦{:‰}“Û_Ø}e(ž­ NÎÉ…ÜýËÀl!¼Üμ—¿# 0§7ÉÑ ÞÐŒONJQÙ}my*î8ͧÚOc¬ܲí)p䛾¿\²p‹&+Di‚5¦~d˜æ›­­|¾FtCÆáˆ^äÛí­YYæ¢ÚR Mø³hÉÆIÊ;Ýçî1—®¶º¥X¸‰nȵIñn˜ó¼® g 71k>E ÝT²”«ÂÁ«K¸]ËiIÔ묥ï?Qн"Æ¡M#Ù¸–|C÷™qIÆ>aé7×Ì£„–9ËjV¿>–‚–q4«%žü™D‘sJfêÅ…‹óR8ü§õ7AM_Þ.½ T©9ß• 䤞æ›vjM1)f0,I‡°!M¥Ö%ö1úš”y… ÕƒÞ«a€¼)SØ»ž™×Òlîk¬.ú’·$ð-š§LK¥»ÌÜp„^ï ÈѬïÞ¸LûÐV\¹hôp~±Îö0Õ0Ý%¦¦lÎß3]àwqÄKM'7…«„ëÞÞ[¢çËa¶PíâÍjSUSKf”äp§Œ4²×žišw±  ÈñþF­q40½JÍ›kèÄñwpÂ}û~§ÊD‘c4ãhàz¹YI¬#ˆê䤫¹Fý`®_5ezûã–Wì’j"”¼ ÿ°6´Îþ@òc:ÖiDk9 Q¾Îü–x¨òÖ-žÎîî¡%¬o¾ç*Õ`L¯¾ª&ôî}Ò-A5ܹ(Õ€©è> õÞòйúà£Î1=«jŸA;^”¶_#UÇW¸C¿-|Þ¾ƒb‚èW,‘ eÊ=ÝrŸ(›”{Ðä7M8Л§ò‡hQ9ˆýÒóŒÅã±Õ) ™N¹äJì=!Îü9ùŽSKSʼúÆošgâ k ޝ6År=°F1ãnÅ¥F0p¤þPÍÛ ­×ýVÁJÛ Kà¦,”Lì[§ª¬<Ö>©êMàQæño¯I5ƒ¿­Æ'üàÙi³³NúµSïCÛN d í–ö( fF «Âé‰iå`Ù;_”C Ž5ˆ3Žl»¿±d¹íâKfÅ$`îì7ªæC|®wÊŒeëèðéN„A|¾ávª{'ïN3ßìî“ܬÖ}ìµÙÑwà aþý ì°%g4„`Ü*o‹4u…L𙢅¬ƒ‘×ÄÉ™8Ô¨ 2‡’}K u® ƒoXÂBÊ»(Ä´fýÅŒË øÑ¯‰pù°>øãúL®-:Å &8 2ÁìÄÿù@@I«ûÆö3¸/Œer* ŠGïà­%©õ»Óµ§R™†øV•Ë´ÏÏi,o…f Ñc6µ³2o,1äPË?þA°¶šÄ—.ºù¼æ1'"¨£¨ˆ$ݳ©ˆÙç:ÊÝ9|jød©>§§èƒÅ vñYm»ùÎ8%xLù¸SYpÃ9ZÖñÕh¡bÀSîAø©B©‚B](Þ!²¨;³‰%L bqýPfÙ=µb °yy!!óÛFÔà9³? ³X­äÂûæ^|™!…KÖð&kV9–[p¢ÊÍõ—d,‘»Ýi]gé*Äzꮊ­¤mîáðt9‡9ÃÜSÂ~:Z®Ÿ Õ,€×̹cóÃßåOϹ/QÉÝÕU±Û¥P{4¿}^Å쎶#ž8ÑkõÒéq,j5} Gk¦SÒ™1é,yo5 6™Ü¦;Ć2£‹Þ fCÇó½)»íU~œZz˲FÉŒ… ˆÙÙEÅŠ16²*ê•LÝ…€W.·‘|ëXÎy{L˜¡ä¦êú`˜—ø)ñÁ¬Ðž§ro›r AÇ“ܯåQÛ\^'8ͳٹ-ýsV¸2 šÕ—GÓ¦ù ÜöÎÄê í±mf» Qç«z38 pgŠddH‚¢¹þ‘®=í{¸©…äè×–cb÷;ŸøÆ)gjôO˜¥Ÿ_µì52KÛö5ŒþTn’]*ß9LÁ9Í» ×ÃóúІ[•›“z³ë«ÔæÞ®záLbìzZDWfi±m»À©´£"ï¥,fo¿Cy§Zò.¨mF÷èØ«]m$* \Å}µe¢K»wOUñLæÝ•ÎROíëmÄýúðÑqÍRÇ::ÌNz×0o<°«’qÖŠ Ñ#—?øx–ü+‹Ã5Z+ bx`f}®Aúce¿Ä™ëÈÌZü¢ìHF£nžï戽èûjñÈ;¶7Ͻþ½É£˜*ÆÇŽ7vóŽÁ~&­«¬ˆE£÷RšË&©UßodMn…ÌÞœeàæ+RSšß$ßVx²åÎY ½–ëØ¥¾OÂ|ÖŠ+}…wPéOa\e'PòÆ/ò±¬ òãËøa¹] ðzŠ›)ÓŠúw‘sq›Û¤‰×¸ËçK»Úq<Â`Gé?¦¾G’‰´ã£ŸY3̲¼Im bNJÐ}Ë0½Rs.k{åÙÃ7°”B³žvNþm )R„C;ÏTm£b”ñ˜VaÌ¢¶WrÖ"RêÚ*8*D[ö1íîÜumIÙo¿.&gú5è)ª±è°1W6ä˜ÃŒæ›ÂgcÅ[Ÿ6ËT&W–fÐDùjéj²ô[4ø¯ûס©géÄ}àgç…/jD‹ùEˆ•1ý DïpßœÁM¼f´¯vÂy~Ê´§/ÎyîçvÆÔ­H>ÆM%ù3:#„‘_Þ)VEì‹›À3ï! ž™‚¡Ÿ­÷‰°²ºpìëá~5ô_Uò>Á¹úô¦·º+»Œö ãuná©.˜È Š| —úc”¼ÚÝ‚=߇7VÃ]î·_ƒ…XVûµem Ùº¿ÆÇ¡Å8x#Uù¶­ “žCXíˆÝbti1”t×¥oý>¦œrŽG%œè­CtCF†ÇÀ¼xŸýj@×%:ƒÏ—O4ÌÖÓwòv–²ºï|?®R_àXQGo,2¿@Š]æð½¹¶h»0+2†ðZÄàÖf;Bó…¾f­ö>Ò=Fþ0ííª†¦òUÒ_g ”êõK(h}ƒ'ÅÌ~®½Ï…E©^«‰]~pð¯÷ ë|â»{H Ñç{¯×Ý™÷爰¸jIÀØ2-¨ÝyŸ)àOèÏ¿‰Õh¿óyöµÊã&â•ßóþàð)ÈÓPõ©k¨†´L1‡$2‰ÂÐ M¡.?wÓǽk:Ù)ø$yÇ{JA†ç=¶—¡ã²û¦æ9D鵇½Þ9}—8#Œ‚hkEÅòºhs'™*°Þ†¹Y©çë'Ûòű~B»±ÑÉ I““õ£U\%DÂáë¾fþH‰çŸš¿ñƒ;'ãÔÀ{U‚U¦Í>­†ƒ6qÙgíQ1OßÜøv£p>qÉ=–ŽKš5Ð0v]ÁymXïn<«®­²äX׉YÕºvUêô|—®œ¾¹”ÊB/?Úm*jš&„5"§@7-­ñò¤‡®¢XòvóõÓý ßÕÆ±c»?^xQ5Úӳƨ՗mr¶…r&ÃÝ/ÏÖêqÀ^Vn\ß[÷ÇQÓ§Z×»ûi„f9nÛ•dvuú"áW­tKWþ¦9Å9êsž™Qï!%0,¼·žÁ¿µý°<•O»ìÊFìÅôG½§wFNŠßâü”Ã+8¬l@k.­W®´DFaXƒ?õ‘X¶ßNöuÛÑ…EÂòÚ¢³ƒ< ¼¢¿çóqû‘4ž±¤r/Ñ᯿_E®GvØbyìå¨$VM|E¢‰cy+F÷á{FPhz˜O#@Àîî[ %‘“MTWä6䨝qš`í¸¦"¯(ëó–¥­y¦(̦Ôõ!fÑ wÏŠ„JvîgýOïs%˜Im9öÌe]ã.Ñ/\Ór%Rõ°Â²98a쾩Ðx( jѪWt„ƲöY/ÎË}©FUYÜ”‚Ë I©¨q µÂeUòbâ—0ì4[×aþ¶Ï,N¯”²zwÙ§<4ãÚt? :²:co¼×$Èk†ÄÆÉù‰ªÑ†JEä3ÇÚû¤wœfÑèúÙFЕëHß­JÔJŠdäEûíÎ…‚/L?®æ•UWDÕ¾ñ[ÌþINt HH'‚ªËÊ—ÐëânKŸˆ¶MÂÄ…×yÍLû‹ÄV¥åľ”ݘ–#—¿òeÄÅ–ãTô æußÒÝôM5r˜Æç³Sï3¿x~L •x›m«’]áhÙ¡í iî9‚Ïg´8óAàö3lr´ªõy×ò+þ-^58¾ª!4÷#±w†ýMšZ)¿íé Cåõظl©ÊjDýé¡ù²ÂÒpˆI4HåFK­]éû¶¢ú¥lV·êjkÖ´I Od­ » ŽôXÅ?‰3jâHJŠÓCB´ÃGh# ŸZM¢G•úµ8È5„ÏÞœÑÔ¦ùÓF”à·"XE7‘—ßò„¢ž_ ï9,"ØC¶ˆKc»õŒ}êá‹ï+ñ@è‰÷k×™ª¦?Ý糂¶•A^«¥Ç±5'¦HvÞøV‹\HmQ|û'²ÁÄTÚæ"ñ ¢³báÌb%åDfak³ËÜþ•åĤf)¼Î :}P}a*ßÏVÌ{È‚Eý <5ö/FÝ ÇöˆæR–LÅâêwè¢;ötÎõŽ£à'üa†‰Ëaoóxï·n\#iìI„°õR¯¤ÂDd³ÅîtlàÇÖe4§ä?’˜XÁÊá_áÊ `æú¼¼ÚNQ™† rÃuã%£r’eù×ÍǨî jÌÞÜŽª#|#”iê›Bw,­ÇjEa¦ãõo­C½âµb•¬Þ~õŸÑ#+×–Fzt¯O9›²Ð¦c!„§˜‰ÝÈS5‘ª¼Ây߬+.ÚêžÊ6y¾_ ¯°peóf qpøñ (­4ð“Àðdÿ8‹U«X?‡íÚRlÐÄÎÀž"g%@ÏŒr/´»sá73kÂÇu]-¹´Ó/c€w“¢1àìÅoôaÜÈÔ(|ý¡½QÏEJïíÎʶm8±N{+A O–GHL}úý—º•åJ\Ïe "p=ÁïÀsVü8(¸¦ùç Ó½yHë,*h–d†0t~!=þæî+?ß”ØrÂ.3Yo+Þç.þï®U^a®ÔvEŠJ—Ѩpt—s¼¯Î¦ªæ\œ§AªÃK$²Í-#-lßvŠÃÔ6SqÖ‚X ãÆ›lð.ÚÝÀ%"9ƒpÆ2âdÉÀC °;œ¢øÇžë“I@ºÓEvë~;«±™|'µœð«*±=µX,W¤ Ü}© Ù<ÏÔüñþû­Ö«VƒŸ<¥qÊŠ»©ìc.Š•¯Ê¯Ã‡ÇͶpmÄñdÙ “Á>1šáõŠ ßõ‚3Të¾piÝ·D”ß þ²«•óuL%2lüCÞ®Ù endstream endobj 300 0 obj << /Length1 1144 /Length2 3680 /Length3 0 /Length 4427 /Filter /FlateDecode >> stream xÚuVy8”mß&YBe+"Œ²/cÆ2ödɾ/ÙÃŒ1ŒfÁ ­(cM”5Y’5{ö¥Èš¬ )ƒ²UòNõ>OßÓó~ÇýÇ}]çù»Îßr÷qÜ"BÖ2Z0Œ\ƒÆË€ U€ÒÇ€³†¢Md¬à€ *B™EDlxü_4•ÐÁ¡x$­ ÅSyOÀŠÈ`*HYUL]ƒäÿ Ä`UX¤&`Çñ($šJébÜ >p4Þšàë‹BÂaVp†€u‡ãTÔÊþ ƒñ%b‘O<@ÜÖÊNBJJú7VQQ¸ÿbºpˆRþpÆ÷G&ª„> ÇR‹†ýˆµð€^€!ñ?Úˆ{âñ¾ª²²¾P8â<€h8^V‚Zè4LãóCÇücfºH,ÜÚQöϹy£1èàÁH4ìgK0‚¯¬-éG€êþ7˜ 1ÿÆp<@$RÉà~x »§ì”6D_øOü†¢aW‚}1¾( ¿‚ô€S_ÌÁ8¨?€ÇàW‚ÿ/ñÏ3 €!Ýñ78‚z ¿Õ©0Üã×ÞŠÇ"N €~<¯œ© àQÄßáfP8@ÖLK×Fë¢ÔŸ½ÿ¥­¡JÊ€•2rÊŠT§PUåÿT´€"ÿ[è÷aC´ ò«pêÄþ*ÞŽÅQ]ÿiX À?•Ì0x¤; þÛ$—@Š ª?¨/ðÿ4Ï?øÿi¡?sèP¨Ÿý‹ÿj@í0üèÅþ+êƒDÿÇ?íà¿|þÿèâ¡(¤»ú{LHœ2³@âÝ=ãn‹†ýüâàòÇ7 +‚ÿàl<‘îÞh8GußO ކý‘òÚC¢k<ÕP,ìoàíNÀb©ãùyAÔ³í=Ôáð@¸;óã®éUÙ´[¡Å óvP¾b»}@T`¾…¢]ê0ãñ.æSÈÝRNÍÔµèóÉö³|Ÿë•ceàINäŸa=ÆÃ3®hâ£6áÎÄ—ñ2¯«ù…x/«ò¸ŒÚuÕ­<àLìë â¬œ³<Fý¹ù©Ýú~¹¾WÍãO监ϸšê»ö2.’}¸gFœûÞùët´¿Yè§©¼$@cy:Sž|Í_Sû>ÄÐÚ¥ý~:DŸÔ¨à¥¢•¯N©våD†¶”%d&1 ¾Ïâ_²¦\Þ¼,J/mQ²ÝüŠwá[)Dc’ßôZ<÷À@ÿ•š\ýÈyc²M[FÐ4N€Ø€rëÏ"€—¬÷(ÍÊbáUÛQÌèm§Ó„Î"ѵ—°Õz÷¬Š"EaRg^œ~ͤ­!pÐв:ž³ƒÝ¸•O7•c ¿òr>n÷ë ë××kBm _Î a97¯Ó±æ‰™Ñä—'ó(,}/;× A•Ø¥ˆ®w±D„ñi|”¼÷L³2ã„ñ–?G…¼«Ñç "·;fýftÅ*“ög[w|ÎÅøJϰvY‡£ÏJ"¶™ªÚù=BPš¢Û<&}.ÕÇGf†nG¥s%6p»†!4ŽÅ¾Zåè‘-;v,ž‘èx9œ­/É hÚ´TµJåd+NéÆ3«›Üd.p]z_½¦2+£cR°‘¤˜yâqCåk:bPu@ÊZ’—%ÕP§±ÌŠ©I[Š\þn6]¡ØD<>êe€U=ºØ tðä£bˆÄU:WLÜÀ ôΫ§Fúj¹}ú´]ÄúbQâÑŽd™0©Þ—òb~ƒÔfwQõ†šp³FG «e½©Ø©°Å!"Ò¡’åru?×Y—øÉ!{› ÕÒ óóÞ§}R7,‹“"n.ÑŽ•˪‰sÄ;3È‹>µ3}óá3ý‹§©X¸Ë€ MÙì`fQò¨¥_ß²…ê= VX²Ã&í ó.3OÑþW2M< ±7­¡‘â6iÎ8ôIà=M&·Ç&Á©ñ°ïþþH^áYr¸x¥|Óê¥çp­ 5gÖNº:ó‡<¯ŠÎ¤™‚ò¾kµž&ù¨Íx Ìdî5&é<¿šV/²t.œ_IËH’¡{Z‚}ïÒÇ5¼^1õPAätlJÉÓ2F9ðÇ‚A‹ÓgkòwðO@IóWD9_9ò Ál—:.×Ó#Ž¿Ïäã¯>òqÿë³³¨1¼zcq–CœLÞÉ•öTÿ¯ÁÕÒ,¦12?‰ƒð¬“ìGVº6ªN_ˆ“¿ Vsud7¥ùf²ÃG¸úÜ&€†ä³c›:u¦dâ/nf€k=út.IR½äñ·£fá«Zš&Úãú¬[Cú[‡L-Å‚Ä.~§þœ=Á/½è•kÎù(·Û›×ÞCyõEý¯œ!môwR³žÒ¤Þ€gbò4Yf}"=°™ŽZkÉh<ªxj7AŸ±`w*q­q~ZôÀä úc}?…!e+H.Ä@av"”æÊ]ã8•ÎÀf Ó5ÊñãyÒþf,Þwtï03e­&†ÅlÖÑqé.Ã\iœà•É ýóYúq޹° E~üygŠJŽÀ=u…š¦˜ã•!þN—E¹³Íª^–·tkÒ•X~Ytzâßó±Ã)õÑÿÆçᱭª÷!ªiÚ»Ý#å²»q‹G­3É>jG8•`õ£ô|Kúí *A{$Ñ2ïO–îûŒìV×äð¶ø;<½Kg꘻3¹™ä?Ò9£Á6©MŒrY'¤¯ç8I\Ÿ„.zPKN4”8ì,…S‚[ZËù†,Ee9l€ûEiçS¹<‘‚SþïÇŽ¦Ý™Sk~}j5õ+í½aHÈð7,Â$þÔ7Ìš½’¿`¨ÎJb½Pß>Gz¬å™¬×¹¤h«óËÄÊý”Œ€‚€„„òãߪ±`‡ä}ƒi›ž4Ôª§8lÊÌ/T30ÕbêkzÓfñ’ZÎYßÔãí *Ž”å±Žä æÃ¼Ñ§8QX#§t(®UæåН‹OÝæã„û±]”ç €§X=27ª„7ítW Ÿm-½Þ4…GI®_éù7rÛ?+6“bÇAb;øŠ»­u $=”´œ~ÐSÒ3 d}·ò•HD)lj2& “—gß¼Ès”y6\µô\䢑èH†g­½Øôx.@;± @Vn‘}yú©¦Zªí0Ë5·–…o@Í7¢S{ä­š™™B-ÜI ìÙñg†oad£wžŸL»™l¿>¿Ui¿J±óÑ\çÚ¹Ç=CO>’ø8å4˜!n;ÄÑ“ÁŽ¡®ß6Nšk—žÓaFÁ·´DmSì£GˆG¯ú)d¢·$-ü’DVÒÇÙAÙ “æo¯u³ J‚0ó@ûÑ{Ö±#ùƒ"kBÔtÊ&ÿ.mx𢧠×C¦Îäù L*erŒ¬Çaý }®ºß¹ ë=R¤åÞTy*Ò;ç¤=wXÎ Zš6Èú…”ÕÜÿØln1myp9G…Î3üâ17õÏ´mzô¶ŒÇöqeÕ73fñj,¬…í›Í«WûùúÒ8ÕDqËöi™·”3åä#÷…À˜§BŽŒŒÉæ~†|û¦"±¤oâ CnsË_äü÷5,ïúïãΩžzÜÌM¦Hwï…¿ßd" KªÉ!óLÐäš‘$ûtl¢<$¼Î ×Ï6)¡=?¥TÏ­ÈañŠJS’Šœåi¯Rg‹áH#­¬u0íÑ–ðSnBR%ÄzLVS§ãX4݃]±á^Ëm&Í—¶¹aBM£·8¼Mfí¬„u¯ [ÅÅu‘¨Ø«a†Ë†L!MÕ~)vQ£ËѼ 1=/ºÒÁá)ÕaÈ´Ñ{¯ˆ°.þû®yOÇfv]¦·6½£¦ SíÂ̸¥ɶª+§Gy Z³ü°·ÉÎ[2b5iË"ܹq•Žolz# ôb2ß9úªŒ›*gc1æoä^8ÇsÒ{’(/wê*C<}‰{ÁLëÔÊ›s[CåÎîk»­¦ŠöÃe“é–·"Šs…Qä\\ÕÐ*²Ýºj†3*]3×A÷m¨öÊZÎûųàŽÃ¼&Ëå2ñvòM('y7^y™Qò ;&½.;̾›3Š<­–ùV|r9“£3'æû¨t“™õ£ f{µTÓÔ­×S€Í¿øxAÖ%϶I©bª¸*çd‚Þ‡'g—D£†»õ×mkhj„}¥R¶'øH¦k¯ñN'Ùy#ØŸDN 7 ßgX_ašv:€Ç$ó‡Lðv9'ƒ|húI1ã ïDõ&Œš …ô(#´¤ÙÆ÷N¹O:C*nïÂíÅW¤BŸZB|ýº”8@ó½5<«ª°ýQíqÖøÞéY’ÚÛÇú c»:ˆˆ&’$ßózÛ7‹ç‹Èo{Ó¡|‰Œ¶ó‘ªo¯õàR]Þí\Æ® æMhxÂÙÑ ¹t·À2†‡ÚLÔfi‚MÐÂû…ýc…ùÒ!9«M¥Ÿ è“8õç{­H˜g•üzŠ#âΛ-AŽ[_Dsd&ÛßÂeÒ6!ãtt¦‡K·äGí Ê I³ÌK±îüpLVV½+I¢$‚ÂÌŸç™W¹Ù6ý5{^ŽóH转îp§®lnuáòÑÜN`Àåþ\2[Ь•o½è#ýdßGïIE”Ìå³VØ."9öüÆü ¶žÊ°ž&ÕžÙVõf'ìÇJñ*ù¾«Xc˜mb«J+D“5®î×á^eëæ¾¨ Bõ7ôM/³çÃH ëxÕ¡ò»l/`jYDP¼;|&ïrÇÔÝçêÖ(EÌ”¬¦Dȹº”ºìõîIò)ècïpDá£ÒW ߘΗÉ å‹<,¨k$×ׇÀ’/£âü@—Qê›<—pƽ Az‰Âä0])襬ƒ—`¤0­|ÆŠÌN·ÚœU‚ÅxŽØtëÑ c¯É%ˆ7ÙÓ`]¤“>ŸëŒÔZä`ÛGšÑ^³U¼‹?:¿ÔÓ858 âïãó\Ñ}2ý Î}¼=ãh<ÿÙN´fä.C½h`ÎQHÏËy‚ÿݺ䓾w1âl“âëɃˆ‘—S’¢Õ`þ]ñ2ö^Ÿ¾‡N¸‰ŽˆÁ®ê9ö°s‚;Ú—ÊêéƒÜ½'ÞÞqÍ¿•¹ÖîÇ«ú‰F#*³Í$ÔÏÀJ¨vàÁBÄ  ÷À|³È;é6èVÏ•5NzHxUìEìùRߊŠendstream endobj 302 0 obj << /Length1 1626 /Length2 10293 /Length3 0 /Length 11128 /Filter /FlateDecode >> stream xÚ­xUTœí’.®ÁÝw'Á‚»»»4ЧñàÜ%ÁÝÝ]‚»» î=üÿž™=kŸ97söE¯õ•?UO½uÑÔäÊjÌ"æö¦@I{;03; @dkêâ¬jo«hÏ+Ϭ4Þõ‘¨©Åœ€&`½¸ ÈКÄf;///5@ÌÞÁà diÐi¨jÑ322ýSó— ÀÔã?-ï‘Î K;Íû‡+ÐÆÞÁh~Oñ¿T`+ Àdˆ))ëÈ(Jè¤5R@; “‰ @ÙÅÔd™íœô {'€Í?€™½9è¯ÖœYÞs‰8LÎ@3Ð{ÐÝ èð—‰ àt²9;¿@ÎK';ðû Àö™‹ù_Þõörp²÷°}·½'S¶w;›9À€÷ªÊâ’ÿÀ ¶2ÿUÛônØ[¼{šÛ›¹üÕÒß¶÷4ïV° Èκƒÿªe ˜ƒœlL<Þk¿'spý ÃÅdgùOL' ¥‰“¹ ÐÙù=Í{óÏ>ÿ­{¿£íÿöú/ °3ÐÆ‚‰ã½¦ø½¶%ȉõ¯]‘±³°°³ýCoîâðŸ6W ÓߢûkgèßA˜˜ÛÛÙxÌH¬Šöà÷’ºÿË,ÿ>’ÿ ÿ[þ·ÐûÿGî¿rôßñÿï{þ×Ô’.66Š&¶ï ðx?2&v€÷;üuh\lÿ¯[Çÿ+è_½µ€ÿ@+jocþ¯6°ÉûHDì,ßiacaû‡ä, rš+ƒÀfV ›÷yý­×°3:Ù€ì€ï¼þ=R3;Û¿ØÔ­@f_ìþ"àã?L@;ó…ÿNÕßàYE%de4dÿ‡ãú·£òû€Õ=Þ±ýG+ öæÿ%ü•FTÔÞàÅÌþ‰ÀÌÉÅþþöÞñ~bóþJþˆýŸ²‚ Ø äÐ{ï›ýïîÿã÷OÉà_ÒHؙٛÿµ6j`;ó÷Mû/Å_f3'§w‚ÿ~üï]ÿ§ü÷Îî@3¤å{3þ ëÔiàj¼¬1q½Þnvè`‡¢:õü\¿Jû.ßÔ°-Þ2ãçª`–ú ¾×ùß/»² {Cݸ6´]ÉÀ³boJúž\Œuš6nƽVÃ"”´c­H¯ó9ùMÝOlš{Ûc*ª†…Ïp$mœNç÷ô~”®¹~ØTw¨>f)µ18íèõ˜Õy¿iïïhôw]Âöì1fÆ Ró›àù$ý&O{;ÝÔ™½Â>ºr;@h »8èÊ.‹±Ä™7´~W°¨XgðýÁÚÇX¡Í²=_Uywm«¤`)j{W(®âRu8S#åÓôóç< D]ìwòØGØîû¨0LèðþÒ7ÛGÖjXYÎòêfºo–ÝXߎ ˜É`Šåܹb‡=8>&Mæûטú|T|4ý¾ì¸é9‚ä á=…Ñùî¹tá?„f ·R ]úá’,J¢¾mÑœÖ745“O>›wÅ“îbcÈt0:Nø†?.ž~X;ºbË”o¨àŽ"ïy#‹¹rêpÅÑ o´²€¶·‘¬}cYμþ&@ô¶HÀ2ú’x®`Zžñ”ìUM XÆ`tËö$!@Rj¢â0ÊÀk¹ú Çƒ€™`è(×7ÅÛÐƒ×·Ž› ¹ ¢ÉLIÍ>MI="céÁ‘ªe?)p)0“²VÕ<ü]~t÷+…ƒ‰Š§f6ꕜHÒÃOö¿°´ó 7ýä+L}S_nåç‚ÕáЕþMý”…X{zB7ŽQxFUØ $ÍixŠh¸›j3õ6m íÑô³:?ÖzöNÒ\œ?Š¥LSÆÈXÆQ#éîñ®'p•…'›áü»Íâb¯]טàòœÝáÓæ„Á«nôM\Ã×ôتM n)d¿Ñ­2Vñü~¡ÚG—V ÁF¯]C¬)å#¶ß oênU.×Ï8˜ÕïGZi쟸Ì*¾Í‘¯Ù֡»1ºñje÷âMá´º£Åe.õ›ÄÒ“$ŸsºÅ[ 1T;ݯR 7w‰ª­°9g:ùv’ߊñzqÞA¨!øm!¦@ÚÛ­§èH—ëq¾è=ÖB/$¼¼ýêÅï2ÄÝÌ7÷Žc6¾žøl ™Âý–b–(Ú³G.ì†_ò»p‡íŒ8¼ -6]&VÞ­ih«r—š€h‰Tࣴ´ldÄa걪k‰…8€œ¡f:ûípô®VPr85e1Ã_ö›¾Ã÷Åøâ,§Z÷ ¿‹áòº´ø‰"üÙ%=¢DÔ¼µ&²Za¡Mù'©^Nö9dT;Á .Î]Ȩǎ€ž‡uoFºŠc¶}=¶ß¬6è²ûŽ('áJÛj¢K¡¼D]«óC§œZ*îÅ£õwõriugPüu2fØ¥ªa1I2¼\©y„MØÛUJ7"s¾³éS§àTåó¾ª|—&×a®R^«îÛÐ6ñGè+`•N(ZrfcsèK0>‰úåµu€âݳ@³”q1¦kÃì·ˆJñ•"ÞÕda±ý»C™sËõËãØu"—²™ùêzMáèx³…` Îë²yè‰Ò "ùâÙ.£?,€ëSÃsUTŠ#–_ûZsôË\!˜ÏL—RZñGî·‚9Åæ8N–7_¸äÜs‚CŒnñËgˆwàÉC‚qÒdbN%ÚzûÉã­j£Ê°ºâý>…Ô¦wØäÒç¾î|•õ+‡ÿ.»*ÒÁñˆŒ€›=8Pÿkh2uº™uªK«Ý,*ÈñÜO,¦š¹€>eŽo=ÉbxBÀÈ®¦QUS?¤PÈó*adc:Ô(Ð ¿+Ô2=ÏŒ>ôEýæcýqè+bÀ•‹}·Ê°Û[å*UÑdüxtœF¶þ6Uþ!§±9úKUrçÒ*!Ž]•)³/©ÞKÇE@äÒ¹¼kRÜ%»} OÕQby©`†\0Íö€c)öý¶©š wÓà¤,ú…‡°";eè@këô”}ÀÖ¾%äîÁKF¦®a{Ü'œ¬ãG@D´Á†k$¾É«ž‰’—ÌÛ†2ƒ¾Ý¦çD¸¢—Ü«® UtèLè ýçÙúh×5µ{Ü"S?[U¿ ­þÚqrD9I¦7NôÎkìR_ xûAUeø~uç)¸~àåzdþñŠ>^ô…Pòî¶Þ@Š•»ÞÿV[ »OZG†¹¿æ&î¹þwULšè4ýk𛛬Eå¢ïÂ[—µ+jÛžâ§üi‚%¶„ˆff>›pOeË¢~ó.ŠûæPèP(\Ê!½ƒÙSƒÍцè±~}Ãù¼\õ„^}Øí}aË…¼‚2ŽÚ—šä ²oFß½Ù_ç±~¡¯>Ö!â„j.J›êU}ÁÖ®p ¸Ì…ÇDb¹]ÏŒEÐÛØ­´ï‰ÕÃ]µËÀ ÈYöç“oÝï ˆ(ŒÓ†.l?s\›œrÅ—{{PÚwyŽmæ2ò;ßï£Ìèâä&V˜vèôZ®¬Ç/a¥g_JuûõQ4(8UÕgxç2,dz ˜¡°Pc ‹ê¼?ëPÕ²Ø ¬øqKÉc˜¥†8¬D¼èßO×™\ìÄ‹ è:Qûh¨4ÙzÕ)òÝ-@Â4ûÐŽà)JÆÜZž¿Ç› ©µÖ©£`øæâž·XXÝl!û;vô­þüHª"/ØÍ’º’¨iOG` ¦Í¼òqž§Q<‘ñKÊ;ÊÎU9#E”rØ_©æ€èÔmË‘hîÒݵvÁYg¡Zòà‹ˆÁÉ™˜ NR¦ —†üèu‡4b+ªæú$Ræ‚b\<+.5Ù ò!ŽÓbNÀÅÆYCòf¨Q=¶Š“±·±¥Ïœ'¬$Af‘ÅŸAÏ?°©I»qê°Éð7u¯kÁy…hÕC…=â«åd}-­ÒÖ\;·ý:§1¾îû³eðÉ.¹:©‹‚€èÆ#÷î©uÈ'­Ø4ü)Ÿ"³\b!™O•[»ˆl]„aÉhò0„ Y|ßמ¯ãè¦û4õíz—R7õLîelØp²;ٷܧ²1¨ƒ0[Ü:&\/—º¦õh ŸåB$0´ÃÖ¥m3îx‡j¿oÂ`åë¸û í&Ô{°}?rnK‹h{•—¶^Ê,Cù@Mï€E¨Ñäó¹zåX‹u®4@1Êh&ZRe9KÒÃТ0ød.*íTg攊²{éŸÑ[ÿ@½x¥,:kÖV° {yÝ ,ä-\‰;ñæqÏ|Ò ïÀÊrèù2!ÉP0DW:cägDçMÏñrÔ·ÍGÌØ%}Î1­Os&¤¼œ!ÜÏ MË·XCñ˜Á,½îOŒò4´i¯ãбö*$EŸyà6ß‘úõ*•ÝÈ8Nè¿ÎÒ“Ú[IH Ò=P™wnD0Úâì/Õˬ;áµ0 3¼8@·$¦îôj;ÝŸ&XP{qˆ)ÏÇ .@0ÍÙ†‰jiDÔü’3ÎFft¶‰ÒrzÆ­[€§ÛºïÂr]&j 'Z³°¾m>BÀº1/6zìßìêV¢õ1¾ž:*í%npT4›Vu%3'¶`xñÞ¥½¸CÐÎR…ââïùò™‰VoP¬Öp òî‰O‰ø eŸØì“9&ð=˜§ EýBЀ“Mw–¶n&Í<Æ“"Ù-•ºTsž™)›nñe&\°kE Û}š#I-mïßò43-Íl”íE¹“í|bÇS—›_®.øº%ç±ZÖæy­1XXš+˜£Z0€QÀ°Í ©uÉÎþg5ˆ[³¦»«Pâûiã`‰•Ô¹E d\?¶@Xô×Öýxm³¦9ÆÜý}·ýð„ jÉ¡ü‰0ÿ¨Žfh”è0v#MC¤ò‚~D¸¥ŸMx Ò¸™.©Ä_.϶„fB9Fµ®Ž44nŽþxã{ûºçT&Y1Ôu¸²ÔÌÜSHùÌR '4)<#~®Ì(44Èfñô B–æÜƼÉëÝ®«Œ L¨DÍ ¯b§Bç7ŒŽmž=C†R¹¢“wC BV’<õE à<²[¥«¸LTK9ÙšØ'‹F¼?ó™C·Y d.™”¸Âg¥¢À0·pŠŠ_6ð}]B—MÐB¼,mcÈYµ.£N/7!W;lööÝ%!’aíÜâ­} Í# †ÜÜ+Gõ ¯ëܹ")L0J°l:CUæ;PÖÊ™>oïsà÷ZóêÀt·>Õ×­´a*Ev¡WÏðÈßTïµ®ÚiÞ/¿øý qoW8=Õ×QóÙM¥ƒB2‹OXØù­E{øÑsCí×Z¢,¨ª$ÁÌŒ!ȳ5è¡3'‡½³ÿËÆ&uòÌmÁp¡ >D(H_sd_¿á:õ‚ÒævTSy€ÁÇÂStL¹rîCز¿Aæ+µ£a™þoèÊar8=®¯ËŠûÆ_sôSQ¿'0~<*<ÖÞÇþ‰.° tpð#öY¹¿NB”q“Š`á¾J˜kÎë¼É¼kÈöõó.ºZwG½Ù„Ò¾)J@[Q@vGÌwlq:>œ å7»€òôsØãr!lµuYd&LdÝHFG|»Fü¡òë0ÿz×™„µÊ˜JäªËòe¡ìnÛ}.tc`VÛaŠ7]ð£\ŸmäüZÚÞygÞC¨ïzKe>Ào¾™ðs«ºߺ6'ðKÃè>å|!&ßôÜ9WÖG#þ±~ þšûÇ!‰ácÑÇý\#µ24êç))¶ ›”ð ¨á×7«M`MÔí¾gÙ/›ÞîA€ÜƒÁ\ƒKÛ€¿þ©ò³oHÿ¯Þ‡;BPúO‰~F¤X.bkò‰ì)Ùi®d+í×ÊõV2]îÜC ¿P««â·4j½Q'Vl¤8æ ÏêK·ÄM0Ú“¿ )ñ¹ÂɟéTÚåV¨Þ:},i_äS£5î˜ô&ôXÉÞŒ4z»òHí´nß,O7+œÂnpS‚É?Âk¡IñÊ¿Ø.ÙÛ”²3Æ××é™Õž?4æ°ì®›Œ¨ƒ*ò–lL—éSŽÝÔG;nZA‘.ü)¢ùZÔçrp3—ò<›'–²)¡ö͹ %¾únj{Þ.Wî„V ‘6¡ ï‘vþÏáã-fÔÇô3L F?@Äÿ ž`Ž3¸Õõت‡xšòALîÈq™øËÒ@Z®I¸ÝC£æì+¨’¯ŸÄùpÙ&¾žÓ®Öþg¬¸ ØVÜEŸÝ»2e¯ÈfDh¦ôЫ?Åhqú3ÄHR{Íd Zc”Lîˆ{Õ»þ ¹J@˜«™õá(¿n¶X¸±ƒi!yá:ÝÉ7ÕÜ*oßmF"ãç§3âxáîòL8å}òau iqê.¶†Ïy;•|T<mâˆoIòa~"i`±’¢T‚–?ü›ùÊ.Žî]íÁ0ªtÆçvQáB…jJá¹ã‰VX_¸0Ý{S ð±l‹²jÑp˜%F¦z«'.*Ëd8ï¼QèZÂý nýÜ„‰R¥EY•|=‘ÏÉØŽ<š3[#‹l¦éÅlñ"E~"f#Z*ð:ßdBI¥?·\߈‡xÉý:-Óbô·š …øˆuô˧øí¡fô¡[7B SöA³!;JV# óz.ïý™'Wç-p”¢¬½õðU‹ Sùô"™tj±+L{H{¼›¿ˆîî¾3+¥ÅÏm¯üi`¼]yé Âsmä¬õðµù/Z5~ìÆ·*ò5ÁùéöÉÿÕÛ+±·¥Y…äã8Ê8>T4A‚Áé°l϶/›’°z5KŒ¢R¦–ò¾x]”x-y\%¾ñdêçªve’ŠxÈòj—¨È0!˜D‰ ¸iØWŽý1Œß—=q?ä5=5%6EW+™Ð¤ÄRü<¤0(Æ’¼Uìæ.íW>Tß³:GÞ}Ê œQ‹çB\ù`ê°>§ÿüe(ˈ1Éê~KØXŒ,ý½U~á=Õ!3jÄj_l€4lG nOhÊT φÔm ÆÕ¸ù¹ËTW÷rçÖWDñÄßë÷ åZò"×ÊmLI­0ƒõJƒ=l.û¡9.•7ÏŠâ6üy…¶ð•¦ /^|ü´R]hR®8›Š:o›ôOkpAc„…:z´ƒe²·FTàŠ{Öc¸‡’%=–½º»%ƼåÙ©è«ØúhéWEuûÍOüþ9Èq}©?dqïyÔØK½¿ý0¬{{–4°ç?ºéÔ™S,u'-Û´Ž;Xî×Lâm·^0#²þæîû²Páë(¹ó k*é7Ÿéù¨quk$‚^eɤj8Æ"ø8gs_ìÆO9¯èÏòá*kye¦F®55fb•_¸Q„ù¡³¬Ìh—Š»”ÚÈ$ÒâR§)ŒšA°l,ƒ'em¬½ä®ö›sšLjÑÒŠ¿_Ähæ"„„à³\Ox9${;ðÇU—[ö ~æÜÉÍ8 ~Lª/©ª’û‚wt,×°Òï5saþŸ:&Ó„Ê›Øÿ¸?~H³ê)‘n“Á*À8Ž{íh§žXØvõZI)–'=¼Ú&­3| „Ž vÈ*c0Õ…O®&êÉ+áµ;D¢ŽyäE‰}×BèZæáà\‰[ }ºEþ2^\ÐZ¼|æâ_m?ÍcÂlßþx#>yXÎÊz#§Ø$Ü3Ëž¿¦¸ESŽ8G-FYV9a*л޽ú‹ ëÉtåãðCT6É©ïEWn=?màõlVäEk@ãÛ¸gåuÖD?t¹®PF2³?'®£ücO®&À;g ‹32/,/ÇwÊÉ#xzúbÚtŠšë¾C¢êu7÷ï·rýç_˜!z€Áåêò‚g¸³fuÌœš¤G¨¨ º3é§ï*dÃýWù‰ámH “€ÞUDîÄïš â¡Ç°ôÎñ9œ W÷„¨áTR6Ç|w™¡»÷±ü q9ÖΰÂ:½° 8BJhþ¦2Ý–ý;áf°î—óaòúo¶0ûDqü6"®×óR‡§OÿøkFíFôôƒ:‰³„1ªÿ탊Ӿ&Aê“)<¼Xa\:œ†”Üwìç•ÍîÊHýÞ}zBâó>Ézƒ¡$íWÍÚÕ ®ÌC&ã¸>_Qr ›ä¦Å?Çfe/2k6…·gÚw‡e:Âþ¼+ÖÆgyþ‡í|ÛZÊr³&4;UÊ­KRÅ,~¤èÆm^~ò‡{ôé[( ÿ‰ºv‰L`< ”˨4³Ü"gm3Îú`Ü®01Ììeù¾á â*Ê]Z,üH–þIÙfƒjŸ€ê·™´–ïÙòFµÌ]â±1Fyœ[þ²?‰{,²7—ƒä[:CFQåö §­A»+ùà†Æ ?£~ŸÀÞôJ[°O)é” ñpÕ³±iyôo^¿ôFεI Çèlªý|“à…b…¯D ±ç„µšÈÚ(|¦UUáä—¤s‡+§”:(ßò“rh’þÅ_p=Pm”3æ'Ubá‘ü]Ô¾ë \«"NËY‡¾Ag¦Äo+KµOSž}õ÷â[y2X§òÅ´2ÔþHŸt3¢É—_È"¦·‘T¯À2œJ$‚Ñž$hE¨%£uQ¶¥Öùë©IÒŒG¥É½©xUp74ŸÓg›6‰†KÀ¯'çáë5™2òN§R$ Œq—¦Þ\:^ô"Ì€Á T"ÏSæ‘,B¯“/<|dá Ö)n-¹¥ø ÙY>Tê¸Ãä„mqåå-„ñ)sMÝÄä¦ ››Gª¿ÎÜ+҂νA^9ãC™8¢Á½½¸±TçÛ”©N­æ8!ƒ§ì–â•RÀ%†l7þ#bXU·cÁI‹/u;Í)uõÖ‡¸Xs­Ú+;R\Âà¤F<XÔ,ã@?awö¨ZvìúÕÖiD}ë”ïÏÄäì]ý¨º\´·ú¤üx±øKbÀ-¡8÷À½–ª‹lW³Ã?G¨Ë¯zÙ¬ÛBÜ×;x6äézºÐÝs;T3yýrÌ_äPf–i)ÖîÃ^-Veˆžó"³¢ãõ›&†L}…]®â¯42=f˜^IØUöoʼnØfðë|>ªô ª—i¸£¶ˆ™,ç >kÐØv(ŸŠ²‘Nҿ϶4n¢ Ù¹®ÄjбônêGK… óBýöšÛ¤amFÜs=18%†{Lr#u9Ø[ÎýŒwá‹);ë_ÚãdÎ9‹|ŸšÐ)xàoEB2ùŽÆ¼ŒC‡¯vÄHéúèÙYc²aZyÕkÃÆã9B8K8‘…÷°&‘ã yiøJ.øÉ{nôC{Çjuy?µq<÷l>.ÝŽáAŸÁqAJMê²KÉ}qµ©^¤»6ä~ÇþŸ…ÃÅ+¯Ý*…?“ ñ³czhJ=H].”L™ØšºÃÔ`÷à(4ŠvSa¼¸hŸ™‡9'o8ü–†EX>EÒ ƒ'ÄŽ4B˜’G¶†U¬€uÚr¢BB¡1sLZ XxÚÓfLì±Mùx,YAØÀºÃØ|’Cîö³n–µ³R Zb™&g¼œã/bLçT1ièK~•B}j“6ÜXï§§Âeƒ”ðlÃ(QÂé„¢¥¯ÂʸÂÉ€1Y¼ÄÏí—öõ«/@)(ÓÜ~T/ÊR«¥íòÿ´D»‡‡–€~\Úü1{ù9g»[KOa$¦Û j`©ÅèÂú@Ü>WNš°»$KB-†¦›=_gÜš‚Ÿê{gÓ𓌠NñÑqŽÆ9r©&Ý×ë“êçůxQ!…haíW¤,µt,À?mFIrvâDP} «(ÑÆ'BB·¤vp#WÝà7‡GÚƒ£•oB|PÈ6’”ÐW6ŽD­?PŒ ŠŽ=&a‰[]Ç®xG•ZÔƒ}¾X§ zY±v …‡MÀ›®ähRŲÙÐä¤wÍŒ¹ÈDø”¥AEGËÆ*]Nd§­ð¤A‹©–ˆ‹7›ƒ,ŒBí¶ÞdG›Î?7~àjg¶¿Ö\oßXÓØ'«‰“¤õÊñë‘âñaêýôMdñêùQO¥ãþq’EžUy{AUž*&|`nÅ7Æ„~€óâh§WÔ ýêêÛªw–“ wP¹íÂs%£b@9L‚uù OâUé[R —YUnQ#up¥—€ñ&µ]ïlE®z@bEœMoµ¤ƒ¦â‘Ô²À¨É§¶S GÅ¾ÍøËQ]8h¤g¦ñ…Ž7Ú%ë¼ êJÌ–|qløíÔþj&øO¤ƒ¯ýšÍ(›gÓÂÁÅÆ)mã)i´ºî—l/×Oj-YÉf›q77g-.w\Æ]ƒd_Ýu- oõž~å&Kp ÐÄaUH¬ÈÓ»{ÂÊD«úšŒ'ðÜþÖ;zŒx3Ö©«#SŸ6æU|j¶È+•n2n &Í)™ì Œ?Ó{¢»÷ "î Í´ÝyDBOSуæD›Áû "ìb›8ÉÒ¼u*.ªAùyÇê+—šŒ¸ñA&?7žt«ÀØW–ž=³%„/<\X÷ƒÈ‹ ÊêyTÁ†bqhe Ÿ¾®CÃ6 ·j‚ò̓€ è+­Ší!…ýUu¼ ¡Ôù²2Dµò¦‹ËE®F”bŽõVοºd̶ýÇfaV¾«ñóÁŒá“CVSÒ>_यL•‚Ö~âdºÉO½1nŸT¯‚L&š(0ê³k7aG ä¤ÊT wR)ôá]€¨öÄ3ãw¾yÖÛPupŨÇ=Fç;gþíá¾yÒÑVæÅ§ʵí°¯-ôÀ=‹ÁÒoð?>­íÃ9÷¦´Âyʲj@ê|ëH‘„ðÛû+,b¾‚4)À¬Ø« &K¿1ØÅžÇ\Õö¥øÆf¼(²ý0™´³§• ßP†,/¸û›/öÙR˜8:äàFˆGýi¼LvÙ6lêZ¾ {¤‘R^®³Ž´hÒ,£“Ï¡†¬³u†/©Xž{Rþæ©Èòm4~–9n«ª«2¥µ„uyÌ2óXË:š RÈX–»ñ¢JÐËK2"Ó–'i‚†Ò§çÃäýú¯w4x~üã5§ÒDÂ+­®4Eâ$úëCݬ¿~ž£ ­®NAPå"‘y¯¡îT\³@úd6ˆG%!órqĪ?ó}m W¸Ó÷2"ã=¡Å.9E\b¿gÄò‘¡”Dé_ØFhÑˆŠ´Q8ŠMHt _¹çÏŠa¼óFÌ㥎¦Ÿœ8ÌHðÈUFŠñ˜xµ¡ßãÆjzç] t¢Hm§n·zÃ`(mgðÕW!AÝÒLKÌ#X“÷}‚Ež,4A­@„@†áú?ýÃ³ìЄ¦B _„F5Æa4ðªpl p{ë¬á,;[(Åý5l³Vu²ì,õ™”6Iƒ'"yåQlŸ›~ É4_Y‚8ÒëÑȦÉoÑ¥2Ï÷+r«rÑß9¼´b’3KgNæñ™‚.Ó1m5™#7†‡kD¾¼šÏàwéãâ·Ét}í’ê1°âŽÒÄz`ÙpÉ^ ¯–Q¡kaËWËir.Œ¦a}aÑ/Ær¤–òÁ­¢EócVgNüyÈ›d¾ˆŸèÜþ ÏљтÛ°g7;¹÷8ûÂÔz´ÁèùÃj(Wݽ؂JRc/韽"Ü*b]&Æî8Z8l8åÏyÎÇgƒ«n¿ %³Ù?6{šÀ}€=¼r³Í +ïS7Óz%Áfz<àœ€¬ ¼±] µI«3ÇXÚ•@PÓU)yB1’gî›êCóûrAøæjb }¬Â܈ßRÄË7ÿ,väâqyY—#Úðcìz"ÿËê·FÊf§ÍrϲkUÄvóf¸ˆ'‘F&n… /è{,‰õUê|Â?Ëààx‰¢á“Ÿò û³ôóÚÒêîï ž„3´÷œÅœôêókjé÷ |+tY>çý2Œ·õµuW=OùBŒoKÔË´íá㺶½ño…0­ÞêžC„BßH̆WÍ{ ę߄urÓ2%ÂLüÄ…­ª k7ïüZJ"âÕkí. $…Ò4Àg¹ŒŽ{"¢ìy¯Øß¶Š2ûÊÄ'íáRP®*JƘ;òw»ä–(HÝÉüjNÅM%1“PæÇ6:*ǬPn¸•%NßUƒ–¦‘qXÍ‘µyh Šø½ÀmœÏÁòäº=®žSŸ3G>-þŽAO|ð‘#…SXòÄR¯h–ÞŽþÌ’¢Ëô-ß©˜˜¥_ÿqdûNmPEäýö!9?8bRõÌjX\² I²ˆqÞÞO‡"(. JNbŒúà(;Gòþ•ÀÓŽeô…ôf§L­ÙúŽ %—ˆm†Z±ú™½sf““hý{+=õG ñ×½‹ÏUÁëÜS¯‡SÍáàƒ°Ã*ÕO¶ÔÑu™?Fw}7ñ9fPôšèôò4Ù S‡åïy€FééªÑ¿då•L.³¸M1Ç_¥úâò?O ³8•Åk§uȆš?‘M™o=æÝ»4ù"îQ1¢F]ÖÞ«_H#ŸË&cd7™¦Eó·‘#&ú Æ3(SÏèYä|ÀQ—º2Åö"v/FÁïåç*ðüR‹kRË'Mm¡ÖœÔ¹”ÿ”ÎCï é§Å°´.e{qèäY€~JÚÆâü±Õ5ÑÄ•?ÁsŨê×ZO;SG­ïº†Ç¤p?*!­S¿B¥L^,É Ø1býþ:a–™ó'\~È- _-`ø@W7âi8’ª™ú´êä![ã·8+Mö¸MsNõÌ´Ô€#°‰)ÕN> stream xÚ¬·c”eݶ%¶íØaÛ¶•¶mÛff†mÛ¶mÛ¶ýò;§î½Õî«úSU?vkkô>Ö˜{‘ýøI'dlgh"ngëLÇDÏÈ ·°1tqR²³‘·ã’¥S21sü•³Á‘‰8š8[ØÙŠ8›pÔLŒ¢&Fff @ÄÎÞÃÑÂÌÜ@©¢¤FECCû_’L†ÿ¡ùëédaf ÿûàjbmgocbëüâÿØñ§‰ ÀÙÜ`jamQø¡!%/ ”WH˜Øš8X~¸Z[d-ŒLlL¨¦vŽëFv¶Æÿ”æDÿKÈ `p²71²øëfândbÿŠ`oâhcáäô÷`á0s4°uþÛg;€…­‘µ‹ñ? ü•›Úý+!{G»¿6uÁ~Ø99;9ZØ;þFý!*þï<Í œÿ‰ídñW °3ýkilgäòOIÿÒý…ù«u6°°u8›¸;ÿËÐ`ládomàñ7ö_0{G‹¥áâdakö_ÐMÌ ­MœœþÂüÅþ§;ÿU'àªÞÀÞÞÚã_Þvÿ²úÏ,œL¬Méa˜˜ÿÆ4rþÛ̆áŸY‘²5µ01þ[nìbÿ:WÇ5ˆòŸ™¡ú›„±­µÀØÄ†AÞÎùoHåÿËôÿïHþ@ñÿ‚ÿŸÐûGîçèz‰ÿoßçÿ-îbm-o`ówþ½c—Œ-àïžÈþY4ÖŽÿ? kÿ×·V3ùwºÿ0)gƒ¿m²5ûK #=ã¿…Nâî&Æ?,œÌ¦Ö{ö/¹Š­±‰£µ…­É_nÿÕV#ãÓ)›[YÙþCÛ¿U&¶Æÿ½‚¿tý+E%)1IšÿÅ‚ý—ῃà¬ìaÿ7·ÿQœñþ¶sxÑ1±sè˜9™þ¾âbfõù_„üÓå œ-ÜZëfdúWõÿã÷_'ÿ#fkdgüÏèüt6°5þ;mÿ)øGmäâèø—ä-€¿UÿÇù_sobânb³ºdgÄl™’žê\ƒ™=4!ªÕ×Ã:b_\¯\ç_e×í—¾ÃU®ÿQBß0ÅýÕê±xfÿy M}8ÒƒaMÑdr•‹çCBÕ›‡¼IÞÎAsÈ [ Ÿz®íu½ » ¦ÉΨz¸;¡¨¤[ô?ÕÎâuýLåOâšçFúdàk”\‡ÞÔ„R“vNòüD10:<4Ø} Þ{€K“MÆc€é›xF”àì¡ïøPoôþæÊáT±˜Ñ¬V…¯âæ‰û¾äBHú»ƒÊ”zÉB`ö-¼Ï(¸d'ãv Ë\ð‡Ÿ–pLdZYZ·¶cIê|…}í¢ŽŸ;Å*}…+Öö¨!jI"…¤€më Y•RPr`!]3ô·±¤*#'Rª¢†jß4k-Ž™?B”`ÿhY®`aŒn»³_P¥rJmæùº!> Pº¦#·È^FAA ËPêóè'È7¥RÖX=^¤Í á²IËŠ¹¡UpH”ÆØNäj7™«}2–7ì0dÉM›Bîh©l²{ïûDÝæn­Î®1¶@øyýéã¾™¢](ú! É®K hþXù_ÖDÍóO„ÃêÁ†Z­¨írÜŒ6á¤ôîHö½ütÀÓ5+ƹ«€JnÒ|¨{¤Â|ì` Šô(𣃣õ©t•:t€§]3 KË´î%7RÌ$Îpe×OöcrRäDÕ$¡Üm#§Õ>ŠœÌ~ÚÛÕ5}ñWNv%:É~'Áâg°KO£W"0¦Æl¡¶}}ªýÆ´+DÆzÒ/óC«£*|µ$0`TåIþNÅFiÜR÷lWwe«­'Ù Åq;Y2µhošîJ c’rõA?ɺBÙLÑJ6$›€Ð½÷Z'U¤'W÷ {4¦Ç¼,B@?M\êH¢ˆ÷B—j/•Ĩà‘,ÀÆJXzÁY{Š‚ Æ9òk¾`-Õ—Oèr*_E®XmYœôlÝ-0Xw£…<îâÖÍø{-i ù/ ¿wzsÅlù+ÁqGåu²NeC´ïq[EÂîöJ³WB5ä[©DæÓzRt¥µ9é1Êèlûy¸ìN™H7Ôý¶ çWÌN¯·¤ú‚6E?Yjd Î&/êçŸ{2U5Q*?bºÂ‰JA±~¨¥ƒL}hÇzû:=rÒ«Wa‰n}K ÑüÚ!G,{,õtT®ùMå9EUa¹]ácÇ6Y_ɬÂÄÁΓw³Ñö)ø÷æ&qžÞˆ? L…ÛãĂδ¾qæS'› 2a‰G;ƒ³Å2SÃFÃfŸâ»jÀ˜¦Ù¯5*Èg‡}ÀËFÞ#Sªq8“[¢ò'ÿäëÁ"1(±†Ñƒqá ¡žß)ugL•Ed:ózCê´qßCš7{—­Šÿ\ïQ¶åMáF22˜¥ôXŽjåÅò;å’ $œÕ™ ÇÎøYmõòK¹.Wq\Šš2_®<ïÈ¡—W½9Ÿ#§ø‡÷XÀW6…®¹•;4Å~âxª~$ÚF¯Oô®+ûé7×"«ž‰‰ xä ³¢/Ùüçè›íeˆh¼9€í0á»Ô<"6Õ“Ô£®¢1ºíú“~'<Ä•MH„6ƒ¥ˆáJÆC€òx­°{–> ÿžúÛ•hc‰ä„¿7ßqVøy 4Û=X—è¬è˜‡èÚÆ ò¾æ( ­o?ô½¡ÁwŒ„SÌÖÐ…?y ÎtWrw0œ;+WCyÈxcêÙ?yJÕÿ‚lµ{M¤>Õ|®QÅ„zaWNÌ4•F,ø˜—èn\Œ2 ÍutøNóüÝ{üœ_?eO ìçJÝ0Èo̹ì›ü¤‚‚r™º©þ•¡PüˆUy ?¥½U]©¸‚iüñ”é°\nîdp)ðÂ(÷±™ø©¶ÝÛAJ*¨1&½ÄÜ"±eçw6¨B®ì:Ö8VÝB›lÒW‰Öwj)³…óvè9¶ŽæM`$ƒÚku‡_w} ii²¬–Ñ çŠ§Pv^Ê© ™Ÿð)©¦c³zBÏe0—½èÕjEÌpq¬%Àiž½^¶ bP´¼+-`3‘KÌF•‡¸¯?Ð_ÒQ¡Š5q=7fâ€b –é öª]ï0êꋇ\wF±&©`Ó’ 8C3ú3S…ø­[ë+m‘d= ü¸ïjófú ŽÚëzÄ÷A_ŸXµt½?µV¹Ôä¯hÐu±KÈ¿#Àøó‡xQ`ÂW‘gÁoO'?‡%Ç-–NòƒºªþNÊWJÖ¾I AãM#lª`åÑ\[1ÿz8}¤Žú.#Þ³y~$ðÖíG¹ä‚MULÃë*§H£JJ¶ WÜŠWßWÔ´jPŒ‡ÍG½Boß»y¯RÜŠœé³7¢*k®O O¨®ãÑ;Œ{’(Áyâ ¬o„{^¥I"9ðêcwúñî¹àÝDØùãdX¥%¶› D}ÙñÀ|ÌÚå"“—dÞ¹½Ö®Uäsá÷±«…¶òŒ5ÚÇxîOO2~á• ÉÂëN”ESxf<ºLŸÇWÎÜoÊOg¨Ãíj¥^¦FᲡ(VëxR’ç½STŠ©oÅ{ËàãfóE  .½GúþÊ©¯à8˜ \¨Ùf&ö˜©½[ÆÂZáç9ZSŸí8’T[ $‚0µ2‡Ã&…0c7Nõj„ EÜiríD‰Â‹9 î9\i³lqò¨š‡kL2ë?dº¤$ÉVÁ—.9ŒF‡ÞÉÒˆ¥Ž™çnXivk â;_V+ì©qÃzåXã/”Qð%\Á*GåÕ¸»¸ q²®„t•ÝTC$üfq=£ ^Pín\d$Ê"Ò-ö9Ûà 5'=%vÓàóÒž[™g¤K3v(dF«ú]ºg æR("o_êÔf55,xø_È7øèÐï ýä„bŸ½™œ,íRrš#šF {œoî˜0Í|‰A4úR¶é‡ím³ÝFrd”2?ÛÝXç<ßrHZ½Ù½¯)¬µœžö¨Ã;“°Þ“½wWóá¯Ì•¥ÔŸÁ÷:­õÇógÂEœâ—ÀÞhQý¬Ê¼n'àåmãï ß%#{)å*ãíºf•„<ÈTÌÿú”j¤h¤MÞ¸s­»qi+OÖVßÿ$!¬ºôV<ˆ‡{uMj³àaú|9Ĩ¸ÍIX†êeÇ Á;Ð|wö^ÇC\Ž´Žˆâ‡Ëh¾¢³Ê3¸¯©ËÕ·¨LX’î²$–CYEõ°”|µ;XR¸Ù\þ(¼^E”êcqVX´î±JnÞ²ûÓ÷)A„&¦¦récÑ k_aªx]wYâßë9òÇËÏŒ:žˆœ-vˆZÙŒFþJõYo^=—Ó3= ?d™‹™Ë-Ž Ž^xa†-жê·&w\÷p¡éôD,¾F8WCtÉ6&#ð ÕYøYoìm5AJR§ä_6>G©ÕŸÜÆÃ9EÔ¶ŸRÕ±_ÖAüØ :§+|5ÆN5›\™A©1Ì0uú*‡6Òqõ¬‡ã²ÂÀÕˆµ¥bϦˆ‹•KeNía©7K.!š Œ[‚sårV0rä‹ì}ý…8shŸžåR­X?ß} N[¦fT˜‰×N­fÌß›bá™| 1¼%›ªøY <¸ðL;È“UMz|ïy}÷¿ßëÀ†Óµ—ü³ó¨áû‘éÝà RÅ€ ›9xÇœÇk,ÆŽ:ôÝMªY"^ë¤ñ‰J'­p L?Ô†kHz$(=ÃæU†´Á’ÁoûŒ“Ÿœïºão̽%”½4…¡øíUH²h~f2e®7«‰~¾Õ¸ E>>P|§Þ®½&h_²]Ũ¾ÏD°út;äY¼îõ¤¾Nݸÿqÿ†s²ƒË-®±øDC>5-½Síû^» !&]¿\¸ }(!WÇBœ-ä—$»»å<»½Î=%ÆHEØ|‚Ã]yYÞ¼­S"E öF3½„’ª'ÚÀÎÖä_Fùfþžh©(žÒ}6+K”‚ßð’!×<{¤ïzÖ½ÓÁù¼¢zN‚oˆ^häHÇF§ÖŽy †„–~£íRëÝœcÁv8lDj3œ¯Pf÷7ÆÂpå·&‚ÑöÂÓW$ÉNJº%x¤.oTæ„eÉÛÿÌÜÙ“´_âÎa{ðøõðºéËC}‘nÆu²^g¡¨Tc"ûkÛÚ#ô×QÒË >¶ö"¿¤æ„õj8_Ȳµtä[ñ8©Å²¨+÷=C¶Mö&KÅc€ùm0>ºbJ=Õ»8_$j‡Ø;–6š5™d~€žõØ¢ÁÚ£mçÍAÛï[sÚµg+vr<è²›lz6Bµ&“KbÍ”AÛ `›€â"›Ôt–7ÿ=-ÛY Gt17ôzH¹·DÏ»tÙjÚ#~'ýLçLó{eœ Üt‚ŠÒ@•¼–ÄN¡å”‘EPóC7#‹~I”jÖþ—T>tÌž¿[zÞ§‘éœ%páUà %¼vUÐÐOË•õV¬Pˆ¦x¬Íî·Æ˲mš0 zŽh… òªÍƒ'ë<Þ8ZÑ¢*óýýî?óÊXù»'ÍzØ«ÕHg,¬<¸r“ßÅÄ•)yö)Îy}HnQ¬¾çl×”Éãàˆ®/-Ä<˜†Y&Ç,QÂßŘ:÷¸áñX?1-Æe„k#scÅžâÈÉ\k‰ê™§¤‹vÌ?“àÌY[¦GJ$£Æ«9#О„Õžž­?/Õ%ÈýmÉDh•Ú4Íx[hÑ`aCÖ¹r±KÖ¹¨½yÞÌcŠúºk-bü×ÿìïSMìÕ£…8ËT¶ZêNüѵ-AÊR´[äoÕÑ wŠ’ÓŽß\ºÈxŸŽø(~xúáviœz¯©œð¸O#;•fTî‹{}H'˜"À“ ßø¼qzñ8¡ÒÍ® ŠnomByÞç(ZÃtë@ïõÒS¡}#/ÂHÕ=šèiKNÌ–¢J·(¶±ÝV´óéö^ÁîOè«E'Ne=Ÿ—ú,‹IÃ/ã0|+ìîA¦m'ЇåÝÛZu¤]åßDê Ó}GûFúɵÏl…Br)º]JTôú”B²~cg0¾†Û‹Æ?Q'jcìFï')˜<G®/'.CÛì^J˰±h}Èp±Âò†À¿°çaœèdŸ$AJˆ).#šO)¶ÂJÊï+pûªÀ&U~Mò Cã—N¨kÞ¬'…f£mNKv|i6;@Ȳž§)ÌNŽ>u,Õ<*¬|Ü•Û &ASÜOÓÀ¿¸oîø“ÏPpoºWXÐÿø¹3vZwÜ« Å Lá®G]´‰žoÉN2tåhÈÉZ_›ñX[øs'ÝÞhl\2mwu™3 mî9h™ÑÒ <]¨HW&e¢Ph ú„–i§E³þÈLâsMKôŽDž¢Ž 6év˜;¤RC½o=7¡tŸ[Þ¨Ô+³ÛŸ#ÐÆ¦|Àðû 8q™¹ù“©~(ˆ"‡4-Oßc°ZÐUÞ®wVu}qg™P5ô¶Yê²çh¼]sž#ñÏëãî@õ[$žºÐò.=0z£a j$þÆAÂÒÌÖ?`Gúà cRɈ2ð€RSö¶¯×ô05›’˜+ëŒ0IJ+ë& ‹ŇѨ¡Ÿb£;ºùÊ2¯Ñx·T·E÷ÑšÚGèÿRúN£A?jh#›ÐÁÖzwNV¤HÁèð›»’r¿ JBèkÉT»j0ÄzÃ÷¸¤žXÕiz)bQöAJ;ï$À¶é¯ó`}z±´ËÔPIaõ hîªÂ',Á[•ž·ÐX'á¾t•o®_ÔÆ  Q0ÐFu²;¥ëMº&wRz©].ä ÿA>ðmV£øä÷Q‡E‰×*|ï›l(ÏâAËFE]éÚ—²ÍGquIp§ÕöÌ:hXnœ4|ð2­ŽÕ¡›žtOM¿M;ðè+™…ªßŽÁXƒ)4H°D²æžñ+ ¶(ÇÁ«_ÜIïO®ÝDé¥Nz_ëk·Ä#ÇY v,—ç1Š÷´”Ô»Ôü‡ïî473÷Òp»º–±,”WW @D!‰G;å6“½¨‘'ÙˆÅCª ¥˜Þ0Xbø°D~Ä8Oþu.mà®ü4Mš4kv0s°{ýurŒht–“‘𔳏"¹§×Wà6>{íÒÌS‘»e\g ¹¬¾ããQ*aì‚Ûö‚Û[÷ê |6‚PZßnQ‚šØ[ui¾q½0´vŽƒÖa1¶®òeÇj? *ƒ{Íf]^‚b í–ì~ÁŠ14/¥±·WË‘©Uãw¬ í¼¨A©¢ÞžÒC³¼Dgÿ•zNv·»XU8ÏP¶ìÍKͤfωÌRbU¥“¸ç)õÍ–°˜u­”ÚH£¢¯¯ ZdÆJ3mVäIõ>Å+0«— 7_ÙÓkÿ®#¤RËêØˆÈÖz¶‡Þ¥ÄÕ:%ýl“sŒ<þ™ŽûCFŒ2þE6ÕX;ç^+ ,Ñ_;Sˆø ò±a§ð §‹0ëôW5Pov9 $2÷Žâ—X#cƒ•ˆ-Ó}qî ÌÞ”µ¸ý¢]8AÂå]$3…œÜaä]Î|ň®PËÕêÝb:D'úÙ$ËK˜‰NþÜX̹¥Žrœql‹U<¤¬pf+ð4? þ茂-Ïy{£rzÁ€Á"ÿ˜Ž,'Šºäî¤5‡#}  ýyÖϨXÕ²¦*«µ ׿*¶‡oîŽCU—@#eùý>•чw‹”6XÕÇé‘ß)”GöÑ ÒÍR¢1Ö]¬Ê8é jÍ0|vQ䉴~Ç ü“³\ñ;#Ò|êªO:2Æý¶u$ j<Äoy++JÒ‚–svØê¡aß¡ŒsïÞNó(+øZéB·vFÄ,÷®g77ª½C ¦¢»óy¬j=G@~ñéZ)"k@¾qæXB+*„FÆ)ºéäS'6,Üë>FpÜ ïû“êÚ ?qk7:È~Dðˆ^|Ʋø¡ùïµcb{Æ›ƒÚ»v`=S“÷}F,Z<ï‰îÔEßÅ4L¦/’øðÃ$fÏÃ]ô¦ßk«u¯æ¥[[6àù×¼ D€¥8â'ûÀîºUÌ5¸éžgaª—Ø£ÁÈÔavm ”VÖl ,¹ë¹‚_íÒ¹O>óv‘‡‰M‡°Ì6­ 䙂™š*pÔ »±§Ÿd‰aáˆé$\F¼K¿|;W´|ó‡S¢zÛ[ÁõèÖgc”x–Ú¹ßÜ¥¾$ îQÈ­Xî"ªÇD(Š?ýÖ—´ñ°ß&6ÿЖl Æò«651ïKê•ÝÈïä6½Ï9²BJD–Ø‹5Vž±ß½•¦b“Hµ W‚:ûÓÀ $ĸµC†EN.àB¸¼Ø á8ÈeÚNKyeóX^ãí³Å­›mªùRX\*®ûôhýn·†²™°ä<¿¤§úáÚ÷ˆËÈÇæ8„:1ÔÜOI犮„¼·9~¡ Âɰl Ïü¥I˜ø3{šÔ¦Ä0ûs4ÿ1¢-É^wðBú8¬ëCÍ*s#ÿó:Ï[ز]?ÜO%Søgm4ÑþÃ]~Ÿó²ÅdrÂò[RÁÑynI‚âPó ¤ŒSßAÔê±#BaÛ°üºx§ÕÈî‘n»‚õ@19ß]HBm²^!w:ßøJeêN¬º„*ä|•{›m¿éÑ® v WÓT!ÕÒipá*`%ìí9IÜÕÕð[‚ OÆ¥ûécã&®t¹ÕL…¢³j£û3…Â$îÚ^ª˜Û\‘Wɳ3¡•ýRÁ/>- M+»éNÂûŸ®çýθ[·81E<j*iîDÊ£XíûZQ^{:r:ÁôÔt„«µL%…‘ô«· ÃÝ4‚O)ÓCp­}–ñàyŠû·â=ÛäPo.³‘ã ¢¿Ñ1 WlH³sàú*"w`OÂ1@C~Eê§¶^QˆŠm<ÜæRîç·ŠH¾‚ôwzΓÝö~ˆÔ±2‹/7ˆrYñ"?¼mn›D¸Ä®ðj߀îÛé}:š¯ öØž¯F “rnuÕêB2Èù½¡ýé<̱] ’£ðÞO3dòW{‰/„Å=ùCÌã½÷½å%ZeT}˜Ò™«Ý.í›Nº…³›ߤË5"FQoÙ¨ïx“/ÒœÖ#LÃîw+6þk· µ¬%PŸÚ#æfÃMï+•™)æÊ0›ž£dÃ9û q5ƒDm¥oü®º¨0(DÕ¼ ß¶tuÒ`Ž÷93Õ-î«]óµ ÁÀÏ·Àÿ±ËÌ‘Ew›U‹äNè ©¥DUÄ&ªí˜£# ´yÕœ5ŸŽ_YÜuQÚT•?ö\®ß™«"®Õ¼¤ü”:Â#/ ¬BÊC£ýü9ŽœÕ{µŸ±/Aþ³KCªœ<ßCëYé÷µ­3‹nl)‡©Éç{‹AÒ„Lk*/̤“Z« ©Ç¤Ï!4¨üš8èÄãhÞ|mÞïÕMÞH5Ûj°Zf×YÚû݈8¾a^…w3Y1t¼‘´:î2|qÿ¶ö ae‡1‚AÁÂNÚJÑ"žm‰†Éï‡ÿÑ…Í|dšö$^Ù1âë‰LØX´Ñ®_…9É’èÅ/J’¤Úëz_ÚÿƬLX!¼¬ŒŠÓf¢€ú7^æ7’‡YGžŠé`©Œ{ùˆÂšç˜Œm¿‹<‚Së®îåÍßK!(’“š~ †#7{)siw²Ef±=jJs&ÜŽüв? =£{<³¾š:èñC­1,¥hÍ%”¡“IŸiî(M û=Iʃ…Ñ1•v d1n«Çuݢ˟P·÷±Øl'oýGÕd§Õq¯+„ ô´åƬà~%hh ¯è—´¹Íàˆîмn÷z½z¼s¼<ÆÀ^/ †.Õ›¸$ó ‚$«•Z@[È×aÂö2QGµœà«ÿ¥€Ûá/"ô?KWè0hÉ5Ãù°YX+¶©?üqjZ徭…½Š Ðï]ÏÁuÔ…ú!—ð—f~ÑëEå%‚ƒv²„§€™ÄéíoR¹¢ÄHÓ¢T6Ä'Ë"Þ,g Åçmâ.?±È¸fw «ú£9Å®û”¯W”󰕤Ÿ±¶TÅ`¾‡È¹xg$¥Þ<Ìå…í7؉û¾ šª=zÓH…•nUá¯5–·òzÍnä„• Ð,}èÔh›s _ ruáÏ<«©Â z›'Qÿè#ÉÊ•¤9±'ìZEë~ÊÞ¿Lx³õ‡WŸ?˜‹1Ì€ @ö ë‚ñ>öJ^‰ClWbò?jTWȽ‚s…éÁˆ\;Éuø{Ã@#Ë”÷Í™°tÕ"´¼SB$S;´Šm_ Y?ÆG;,6„.~Cƒ§¡ùÙ~…—v6ÊØãµË­`YºÍdHsHYZT¸€µß_  oŸÁ{HƒÑÚuC¢k5äÔRÉa3©EúM®&ˆ«ÔªSýrêL¿ã<Ì„ü6™Xí,ð Á–jfSE5&„_É7F lc™_¬&—û•îg R¶½¥´ õôÿØÿŽä"‰\¼+‘U aL- ;ã/Y$É\y øøæÞÏjÃyPu¡ÍW‰63r±×µ´Œ-àÅGÙ5Œ”À³G@DuR8àÝŒêuÅËBúV[ă››…€Ó ßE| ‚.â¿|tG›£ö1tr‰Î:¹¶ýý:0 Ôʃñ,ôÁ²ióžY¼òF´L#%3hŒ­gqÒ®^3T²ØdÌŒ“ÂSóD£ ó^]0J¨K,¬z©šo‘ÜcæmÓt}rb.{´Hˆ\©:R «IMÀ‚µmßÀ ñiG,îð°"ŠÀ&‰ læ:ï ý^¡Éï22ö)_:ëgníÔK„ôSÓ;—Ùñè~¥¿=øyíLq—=v Àß_Љ§à­>ßo&2`%Þž8ЮP÷ßRVÙ¯ÐÞDø¯}*¸•TÃôX–5Þ¾Ø]Ø#X÷„ä¼5_û”·‡Ð>ñ•bßr”šóê/%äsõc6túÆÀŠ„K­„z±Ž³Ý2Æí íéífJβ¹;âÅžéÞ½F­½ó¨dž•ÈÁµݲ:Zör—JÇÈ_xÈiê£YQ Z‘ÖŽJªáä2¥üºn‘ŸQ€¬n“݉ÓJ>ùDgU{¶Š‹NùÈ~pï_WXºð' [žø+¾dò]ÚÓ—Òr—~%Ê-{Á¶yúZQO ¦o.~§êœ«Àæü\"õñÄî ¶ø>8e:ÉÓ­½hv5½Z üSˆ¶®åu™ž&â‰ò°„8Ó€ ×ýØ&˜e B¢b—){âp8á[xy<Ù+u- Ã  þQÒ”›Îs<<¸rììÁŸ»ñÆÆ§‰‘°K6è·^ntE›0æ%iOÚN‰„s—]*Üa³þ¤týò2h‰†”5réAûàWÞKD€ªÐB›çL…8ɾ…ŠPu¥ÉÿÉ9Û/ì:<,$7;o-…{K¬„ŽÖÆÁW[UjFÀ¶‚ËŽä.#‰Þ2íÄ„%ñ{ü]O—…aGÿ¹jwd1ÓnN•òL¥>.uF8&e½`NróµÌ«ïgýdÂxX«&>T ¬~‚kÍÐ~»¢¤ß€`½iÍÕïù+eí“x˜v„µ ·ðÅĸšNÄ…Z©ÔRÀ‘†Ášvä©y]¿c Äùˆá2VuèÅ’þkeÆ@ý÷ç½Þõynz¹6éEž•¨ëÓ!Y=*JFL»RóÒ·N× iŸÆЃ5Ž5¿ò8 ï‡¬Ž´¸<Ó^µž†‡¢I<üªƒí0g-¾Ô7ú^ ãÎî>1Þp­n y  ø„š‘-Žòõç“Íêïþ þWµ;¦ÁŸÓÓ“€}ŒwâdÃÚ60|ᆤš¯¨)žl@¶§i›$…{FwDâÞLqYvËá—Ñ€;Â8ú—1WhòŸBõÞcª;Ò pƒ´8· ÐßðŸ Ì~)ŸSq°0ãAˆwGòÒ¥D˜?*Cü¹¿2Ä BÊûÖ[ÎòF`çæ„îG¼[ÿ=HÞm‡ì¡A{€G–"Û¨HØæräÿ­¯ï‹ònîÈžlyË€ZbW_i9¨ârôzÝ93kEñ+»(/åf§sÙK–·ùªAwÄÿöB¿Zû&/õ%æ%uÃS~m±ÉI÷œ‡€,z]±Õð!l%ˆPœý|xÖWt„q¾XÒ…ÿ®pcxEÞ™ùiÏluþ¹®ÆFÖ‡¶e¥¨äu<‚Ñ-xÓ:__Ð2ýî5ÎVhé3”‡§5 QẊÃ9t´¥ŠAÍ|ÿÈ@QÉ’AÑõÝã”—M^½¢Î #SJ"µQÒ'”S0¯¡ë抌‚%a%1"ÓÁÜ‘·+ ï<™^”Œ£‚«©… 4Þi†1…$1rÉòŸ7ÚYÚ ?Ê/Ÿu¤öjXWvGÖ´3ŒÝ?1×èˆü%—·þ¨O;)6ñ¢b\Ëk¢{ŸLÇÛª‰]sEp!Õ;GmMš!USÖXÁ˜g×Ä þÔ”ÈwÌÙç[›é«¦õ{Nxe¦ ׂÏÀYȉQùâ”ò êÌ.#b/Gç‡ ¢÷åÅV4ê¤qSú5d¥À±¨‹}jf6‚rëj¼yÌËxâêúÊú:!¢¿dÚ’X©kV÷v: K·™m™s1øtÛćقI‘)>»O‚Y4 5hzÿFFÏÃQÑÉ3úOÐ7JFˆ>H2cCmkÚO0Ôdh}m|¤(­¨£G ýq'YxÆý™7¹kGü޼§CÚ(u™_0ÛòÓ'’0ifÌÊZŽeÁ¹ý‰+G“¤Kæÿi5å’”(JŸ¦£.”²³ÆO=Æ5Ë0M¸©ß/½;c£øn¶*otê*Ìa(âæ€í˜„Ì0$ºõ£ y.”î7L¬ŒÝ—s¨Î’ëóh},?N9ô+N¸uK`rgõ•ÛØÜâ/B;ýd4!rÓ„?Ü]Xc2º@˜±¶ª]k¼‘ÆN=êc¯‹¦ñqzŸìÌ®R˜M}ÁF°w(±8A™Ä€§2mÝLsÿ/@zÅÝæg/0Û çßåü$Ñì³`0¹½WØ:ç 럖"¡&ò€ºV­zª‡¬‚wÁóÕÚUe»:‹b½sÞ(÷ È÷ÿ=AnŠaÞä*z¤Ã’õî‹LX‰ÁÙ×,`n®¤06º$mwÕšwkîoAG‚gŒkÌÀÍê°X|^…©cq“óÛà‘âENA&0d¾ËŒr=áfcäÔª›ªÅ~²˜ÒÅñÁ~mì9)eaeì§Còö‘#¦€›+qP't»”€¿“Ý\ ŸYb¸Ìë5oÎ Øþ`Ë[%»Ù ™oÞd?5ã>°Ó|Ðm¥š{Ý'bÏq((sJ¨a‘Ùí$Ù¦a-•>#v_?€}Þ^× Þ[«êôD“\eGFíq(¿‘~BO¸šØK<ísaÞµ1§R”jUƒ®jAQ´–¬Jóñ¢—2‚ˆ1pqá JDôû ²O~å=#í#rúæ ¤XZ1š‰TÇ8í¹šj݉/:­Ñf[ô}¡„&êžéçC: ˆÓ¾’`Ø%Ó-ìÞ£]=-¼¸áµ^N,@Þa}ù?¾òެç*+Ù¹ów_\áæubø$„f@ä³”wv‚`ðßk¡|­ÜßyWíöþÖy´å½1Íô¼ª5ñ=¶U’ú.„žO¢ú†ÒÙ€ÑVZOÖ;»;u­zæå \­Œúe‘ˆøµ¿Ë7'µ\y›êɽÐ^1xÌ"€¥.þF´Ö:å>¯² q·¤3¾ØŽ_-P@Œ8xTtÝÎÀ„gÖûÞײbÚzó3Ön,<'<ÇTQmͮҽJm'Oæ ;Mc`”l 4¤þ¥«ŒVRZGýwvñê1í†×gvt©çH9s¾›ƒã¼­Þõœ&OÙ>”'öÈkX¶hI9¥×Ö³" ‘æþ‹¯€wî?x#Ó[Mñ9q®Gê&Ç&8ôC ì|þª˜Á¼É±bôz;$÷®\õ:U3”^3ƒ~m·¿¹ôß`¥a½Œã(+3>PS›d)€èH0&¬`nbéøÊ £+h¼mbØfžn!GJÑêÛN—-ƒ¸,ÞÕ˜'@Õ÷/‰,R™£i(!}ß3Xº¶&_±öÈ/Ú»ÇOBq-ÍË’ÅÅÅœ 9úÑÓuNB$¤Ê½‘.r¬û|ȦÝTˆÇøNÎ9àöpMmw¯¾ÕÕ*–Ê].ðA®: IçôØÝ¦°eþVJ…[YWΙbx‰O¼Ý‚ùÕïaö' zXZš ´Û±Ø˜õœªqt,>é¿YÈHÅ]ˆ¶Ý6x~keG]»–t]—þõWsoý…šqéô+U@ª†Œóó / ¿$ÁÝÒQCé%ªå ¸¬&3½âÑ1‘ˆF$øI¢ Ãº7Èé’Gµ_‘òk r囉ɗʙìëNµû¥T¸¥ ¥Çµ¾$/!vk+ë-©—n‚Ƶ0ã3íÝíÙ P±G›„YG´ÄHâÓò1Ÿ“¥ö²a¥CØÙCù?ÊÒ/k|”~Ö:Jv޽<ªE‘¯ƒùœ#¯Ñ“çÌYgMŸ]?Ø={I¯‹ê,@iå)vE†«Zì¯ 6ªrcª¹A'xLèŽÞ LžDw‹T×ê²3˜ÇCºÕtï{ëô¼…)+QÚ ïä+W­Ó{+ÇÿúzÕ2¿†¿ÐàHŒË4Yò› ·ó"§¹ómÉ(äCAÏX»®2y7$[ÓË}Þšª—Â'Ê^Ên©®rí-°Ï;óÓÛl®ª4%@¾Œ"—±÷ϼ3©nåćØî73mfÖ(0<ºkFZ4‘ªÛÅ0e`ÔÝhyuë¥GýªÐà÷^™'½jvJo£wñ®FLE=4vö4o¬¸¯•«"ï•ÕÑ|„ž½ÊõŽ¿Œ„ÑmògÐñmœhëë™ úLÔ):_b¹ùè0XFDÕþåJ–h[)ÆÕy ~@D.­´e® q8휎;RqpŒ©z+„+|_ [¹Ù¸îIDßÞŸ%;H¨†¬KüF7úƶ¨at€arO2ê{÷ê¶wc6Ç¡µÇ$µ°–ß®Þ÷|´›`íÕ†(Ä…†O§Ž±ä=‚ñsØñˆ.EéÚÜ0ú> l²»ŒrÒXu„vÇÃWÉvëŲW⨠z7”ìNÖå]½Ì`†Ï‚¡"e1´¥Ø  ¤ù»ŒÀº£vÝ›Ul¿©Û5Þ3¿¿š³†XpÝ„uŸq ¢œÜ Z4{Ýkâ,x*3ôUý¨Z(f]^en=¢Ã ñ_DtðØ.„ '‹ìtÓQiî3ièNó¥ÇAÌr< ŠœsøYµh'ã‚èdÄþª~´ƒböuæ–Å@`9²ŠùÅdÕ‰#ゥ˜X½ÿ“ÕñÎZœ¦Chp—Ðçþh «è9ÍP¹Þ!’Œrƒá1ñqö“<‡HBN_– ¥þˣ܄ڌ –ÞmîEFÕÄ —¿+¾<ŒíqVµÜ(!\þ«#GØøîÉX—4£ûDဧ]­O|K|€yv&«0SR1Uý7#7»³®gIÌM­ƒ/mXž†hc]Ûã½®#ãª9]‘;Ef’ÖhÌvžº!¬¢žpú9Ó´â·¥÷àä¾È€#®ôUMk¦ƒ(ÁÛn¥œPEÿ/³ Â'‘·Ã>Ú§¬ÄÈ·ZüË…CÖ¼#°IòÜUù5ÃÜ»%Žª50&W¶ùG'ïL¿p"ß$ ˆ“Ÿ,—#xa×®=‘ÝŽÄàQÆx9ÄñJ_nZ¦ÞS…d±²—tpªàÆ” [{‰c9i­›WýõÆH÷Ý´¤¸FƒÇ¯:¼‡8vÚëz›&ßXùúT€ôÂÃÛ7_ðb3¶ÙL[mV–ïÛßùv€1ö9|M§Aqn„Ño(ŒCù8;P‰e€ãÄï2ê1OöÞ\)[µôs$õ[#(Ú®|ɤ™V¶_µ Ç@½³P÷·"lïÅ*‰à0s˜Àøk雎…]Š\¶£Œ‚l²: V?eªìÅá±Õ(Š®ñÛ9lÁÓ*Í1.aÁ*Sœ³*œ§y¥º8Á³p-|ã–‹™{|¡7£eB¹+x»¸\GŠ'0Œ·¹R3G߀mKQ‚´¼¢ [Ób L°_fÄI•Â]½ßd6ÅKgô&òÄÇKô ×XsqZ0¹ù»!cÒßýò©Õ¯i¹ÉÃ%üÒgoúûèR¤"rÕ@ÿrZ2{‰pó¼7júóiõã&íïÿkXÔl&êLÚÁ6Í{ƒCðê4ÿ¹ [Ê$k¤Píæ*/>nLo࣒ß+GoŒP¢ÓÙ‘TUæ.ë}§ªÉÎ ’k©S¨@%ûlÕ’Ò: ‡3ºûäÀ™›œØÑ£¢¬4Ô'â–MaÆÄåù¨”RÄâ~A%ó’ë¾ù„õÁùzb›5ò”r£·DìH‡…Y®vBÙ²PˆÛ’ét´_p?9—‹ l%ãê\ØÛ|á¢ìÒó"GŠÈð€0´HMŸ Žz˜ B»2>åê$9´Ø+‚.PètŽøt‚!I@í¸áþp ,¸N°4Å„Ct޶™Ã¡:Ož±žƒ 9žh4fbéA jLsîà÷.òŸ-X‰9lLý‚^äE X„½)œ·ìÌV·°¸]Ìã·Qp’¥·J•‡üÁpVG†±ì¢³Ú~¾, g¥5ä»mA–«ê²,B½±nœ:LùFM„øþ¾#…Éê b˜KŸ<ïkÎx/©ýó¿0$eR¹WB$·#EÒ)®¹µËKýcgšC@“uÎPÇÈW?Û2­pg`\‰Š5\ÆÄæà¡U±8®úÃð‰.’57«Ç Ê¢]i”³Äçˆeýró7ocÍ‚E/uXìs^ ÿ òo:;Üœäãr Ÿ@â]´R zAf½UsÛL„•È€/YR.+{¦¦2Ü$D:•*J@þÛÞˆ° 2ÁÚè*RÆÝÃÏ–JªÚ °a812ò|h!¥®~‡Z.’1s‚¡ŠGƘ:cû<í„4•°Tþ¡N“davŒÛzi†Pû¤/bµimËèK´í¬8b”ôÇ)¸‰(Á<–æß²³Éœ¢š@¹WšzË&!Ec¤‰æ­ Õ5¸Õ–,IåÌoùZ å?Ç6NQ:£›ƒ¸ÆL¡"DX…½”+F2¶2“}F¨ÿ:&Q ¥ê²&ŠÉZ™‰WTt²ÿ@ÉÙýUöëCØoÆâÆFF6Ròz^T¹6¶Ö`C~ WÕfIö! oqëØð8|®<R-©BÀø³g+£ü´ò"¡é‡z ÐH0¼È‡äsN²RzÆÌ~æ‚¿jä‚~«ë¡¶l5„I3޼h®k,[¹)”Ó‡×,÷3iP+ $åÈq+EÞÎKoz‰¼_p+—YÌylöÜêB?¥Au¡)àúPðMzp¼¿¼Ø¹jšUК ËuYƒUÏF%Ð[A¯q—x/*’qèÎÎy8û«"IÉ•#«ËthÁVÿd’²¡ºŸµtQ‘Mmz|'³HÂ7GN`ú~¶GÆ”’‹4XNøYžrwÁør¼ŒR ˆX4ˢоjts‹õü–ÙðÅ k²†oѲì¾fäZÜ”ÄÃ~÷Å1þŸ_ÿ_¡^ù…¹­³’“¤{êR–÷¡¸”o»£·h‹Œíž˜ûŽ"9ì."UŽ6”î´üú×€)£éšV¾žfŽ^lF?ZŸ‡½ŽqÔ†@ê[¹‘¦1ì}g\‰mÕC($ÚûXß7{Ña#VÐQÜ`)ÿ£”$Q;Á,Ë J¢s€îA+ö]î«–s`>ú#Ø_ò…³Ó¬ bé¦e¾z£‰1¯EËCO7¬ª5_P­ÊÎÜö;…ˆ•ü$7#[$Û ¼ŠûE= S÷½“¼cܶMJ¼€ö8Œó`âöM]hå^'¬Òf]Œ‰ï»I·ëÉ6$0’ Xnb¥0—"1výL-_÷žw}Þ¦½”íÖ5yZCE—¡ ”N37¹ˆDTzýùrǶ\[ãP‹KÊgÍké÷O÷aüÑ!B]WÀ¾ÛÒ œ¬çnÂV'ådwm†úNPÐîøÍÀ.žçƪÇ@…jfŒW~R¿rò<>‘Rçg VêÖobPQ=ôC¯QÔ»ù£öˆÍjXó^öÖöî%1ר¥ø7GŽ®¢–#ÆF“föE:³6 øòJ7‹0ØâF°vÌÒÀýˆ §_…œ‹ø=¿ 4¿£7¢‰¾®Kñ†ðö©¦!†>#ß;9 ¡8¿ÌL‡1Ó®:ÌŒh m—‘f\mæüߘ‡³ÕÕúðy²Èj5f¹ õ´Óë¤ìDx£õ•d-×Èл¥ÆÆQÒ!ö˜Ow)9mJì—×YKñÞ€vÙàFÑÙ`SxrÏDLº‚çÕmŠNÆýˆÒ*³¦¶ÇP¨Ÿgßô/?ïÞ˜C@ÚNK¶dÆIAG0“ÍN" 5Pß×/A3{àòѵ¨åzle¥1-³Ùan…»)=}¸`\©ò}á­nÄ8¾—ÂN«˜0å0(²Þ©Eè=¹p½â,jÀN|µýÔ~=1º,íæ\¥í@Aa%—¸PˆtŸ<¯ž‹î¨«ï úHåƒ\\n1‹é 0Ƴ}ñ=œ€Û·²¨š‡æ€Å¢¹: aQãiu_Xs,nÆgb/›lÔÄÓœþiô/X®šéèÒ_Än©F⪙• ÌÎC’óA·ú›Ìc'*z¦co].D˜!ŸpB‡vzòù55̨ÎEìnm¡x|Lœ¦*Æ2Ÿ[:—›`"´¤Ñ4nƒVVòøöjt@³+»RÒöƉ!c%¤@Ó*7¼¤°É_ò6v¨.Ò„=!?»cí;óÍ›À8ŠFc.ª¡­–j¹ÜÑ bb¤ZKÌ¥¾‡‡ÍfkËxˆ5y1è IÕ3~&q,$|@ëÌ䛺gž  0æ×óäéíb„M`Jô~ʬøV%6ž¶£‰IøW׌əáѧ”&—˜ûjÃ]‘Ìgø/’YVø¥ämþDÏ»›‰ÍœHb{7÷Ô^†ûÿ Ž]ȧ%J´&®¹Ù%gWG0˜$D[}Ähž/q„SŸ˜CGG×´&ÛY9ïsf9ž}Çž—ë›;©þ|ÕÕâyq· ‰S•…|Óº8‰uS¾Fö}~¯Ag©ŒK¢Õ¼Ò½3ŸD|e=Õ»Ú’kcš[þ¼ÿ9€ð¯Î,ÎáÌTf„Æ+÷¢ØÍWsTÌ5m©•°ßîY"é@Œ¯ •í…{FÌשׂq(q›r\E®j/ž/ÐŽ^²’²¸&3$^\! Ší<‘Ã×5„™-zÃÃÝe¹h'dc¹lÑ'Ey˜¢è6­ÃŠÂà–ÛÑ(þ70;ªU÷úÈ— ¾ ·_Àت,Pï–`÷­îáƒû÷þˆ qC‘¸Pj÷5HOt ›ÙÃà+Ÿz¾TúPÁ…0)Rÿô.B¿¹=æ$Iè&ÊvÛSjߘDš‘Þi çÜL#±j”@­–Æßzï‰Åv¡Nù±æ±ÉÙûFŒRÿÆÆã#)ü8Yó‚îxCù‡ÓL>L>+é°ˆ“4|›1vM3—e¼ NtÏó:{ÄoÄ{Ú×òCÒ¼*Øp¶9;+ú`oªx ÏŸùú‡)-Fr ¿õ;Š?Ü]¢“GÕïõ;h¨?>·Ôâ/I\ endstream endobj 306 0 obj << /Length1 1644 /Length2 11116 /Length3 0 /Length 11972 /Filter /FlateDecode >> stream xÚ­yeTܲ%îîNBp ®Á%Ü 4ÐH7îN€îww—àÜàÜeÈwç½7ëÎÌŸ™÷«ûÔ>µKvZ½VÓÓ|Rg•0ƒš€d 'VN6A€2ØÖÄÙQ j« PbUY8^íïÑèé%@@'0"t ´Af))€‹ À) €F„Ú¹;€-,o5Õ´™˜™YþËò÷ ÀÄý?WOG°ÀðúÅdµ³Aœ^)þŸÕA €“%`¶$U>éÊ+ËÞÊ*kdAÐðÉÙÄl P›‚ Ž &€9Ô`ó¯À 1ÿ-Í‘í•KÂ8ÚLÁ¯n 7SÝ_ˆ`r°;:¾~€@ˆÓkœ 0ÄÔÆÙìo¯vsè? Ù9@_oؾb¯dŸ ŽNަ`;'ÀkÔOR2ÿÊÓÉèô7¶#ø@Í_ošAMÿ–ôöJóŠ:ÁG€ÈÍéo,À ìhgtýJfçþ' gG0Äâ¿2`8€,€f6 GÇWšWî¿Ýù¯:ÿKõ@;;÷¼¡ÿÜúÏÀNŽ s64N®×˜¦N¯±-À4ö¿³"1‡89þe7s¶ûÌäðOƒÞþ¦×$€fPˆ;À dŽÆ® uz xûÿ¦2ÛŸÈÿ ÿ·üß"ïÿŸ¸ÿ®Ñÿòˆÿßó¿SË8ÛØ(m_à_;ðºd€Àëž(þ. Ãÿæ´Û¸ÿß¼þý¶6è_éþ_È䀯m‘€X¼JÃ*ÀÆÃÏ!ð/ì(v™};™ZÌ6¯}ûÇ® 19Ø€! W}ÿi-€•“ƒãß0 K°©5ä¯ïÿ fÿ^Å«dÿÔÀ®%£­%¡Èü¿/YVu›×aûÌÉË÷/—O¯cá¤ánüÏxÚ¡fÿyøKøáÔ àÉÊÉË`åâç|}¯© pñxÿ‚ÿCÄù_ç@'°@Ÿƒƒƒó•ôï'Çߨÿiþ4ÄjöwÔ€³×ÙûOÃ_ØÔÙÁáUòÖÁkýÿqþç€@n S´…Y¨©Ð«¤Ôd§Jâ̾)ýîNNø¾ »‚Ül¿rh‡oÒ×uãÇŠ ¶Ú1Áç&÷™»§ß ï¶:‰l;@'YÞtL]Ù¸+ -|ÌÛìF˜É‡Úឦ•Öôx9´¶7FTÕŒò‘(ÇZ¸PþÜ0ùѹdû¼¹¶Ãò1M¬Ž"lÅ©…Á«Ì98dˆÝ»¹fììïëí8CìúMΜ…J/$ö‰? ‰sr7v¸¬1}F¼wás,IkÐ.ÇÕtõ ˜u¦~s¹ŽÏ™|ÌMeñ"»Å!>k¥èzŒÉ•#ÊB=$ùKCÁ¨ªuVþpžwñ¨ZT0É:u^ Œ¾S6+›D—û~õWë­¸\Ïtª^ðw39-~œdU]­0‘_|^¡ìÓåæ'ñû¨{WÙÃÔ:ÊQX&òNGnBÎ¥åïj¥x¸ÁoV,ã¤dóaÜã•ï™ßÛÄ&ù,ù¿˜·ªÌúrsxÑ/)2qÿd™WýBšìçȺïUìâ7üÆv½¹>ä<Þ[›µ$T+†Lžàø+u÷ó“f¹Ò' ?Õ 0÷;å'w¹wt‹÷ýq§H+.? ¬X8¹/Å$¥?(Ê™D oh[#ÜŸY–JgIÑõ‰Çnž÷6V¬Üx:a”O,~§ðx¶­&ì—ñC~*ï÷–×Ä«~åLí¿ëá¹ý!h¶5eMeòu%nÜí¶‚K¸Y'•ô÷‡6Ï3PŒ éeaÖü$Ù™ð}3ÏGÝ;Œ—ïçGø’“°Z½¾C¢nùÜ…„ˆ°œr[ƒIwö1*†sdYÁãºyA©m™Xb&7‰l´PÒ”7½ÑË&ó„z½7 ËyìF›­¿ ‡¤eÂ;*F¨8Æ×šL#Ów>;Ga÷<¹c¬ð±àTäG¼UÿøùüV0’áGtÀýO‘Z3íájÀ2ö ÿò0HT½XØ·õ¦5 ¸€¡¶¨•Ý@}ö–Óbzj”ÏÀÝXô‚ÂA"@:®-Tšà]©´± Oæ“ÓPdÿ{!œ&u©ÁÇ)F‹’&Àú}¬ú•t\ƒÇðLÊ‘r’›Û×èKÕµç»j’“I£Ñ‡Óñ›È"˜Dû³—b>v ²!tÚKÜu…ßž1·Ãy".˜´Úe߃èÝ?î7‹±Œûó©­2oëË%°|Q*ihŸþ–=±§ž¤Þ_¨‹s»ÊK!“§_¾ï9_fY'U,ZÁàž4p°h¾¹rË<ÕEÙŸ&,ê‚náyðñ>__ºÊ9µÐ5»„²+ ²ع]šXUIh»*cÛ‡?ÛEv9pµ§“›SK¢)2€ÄÔÆ;»#U``k–]«ä)¿Qw– òN¯—ÄÕ]>?‰÷9™G9KtJŽ$ùóv’eIÜtWCqûåþc¤ð€¦àݘû<ž¼ âFÔÑΈÜr"HÔ¿&¯),v7ldN©ÊÙLDrÉüÀ©ã…ã°ÜÑâqnû·é­‘/š+´&LlÛæG/ãä`–逕Œ'XõÔUzJûðŒQZ?¼xèsÅtÍâ?Û©ž5T;U°ð}©¯«Égñµëê Ä}ŸÔ¼,i*âZ¦-+Úi3ñ£½¡€8ÝáxfRÐÌ™ GÏ™<‰‘çU A—„ª°l˜÷£‡N¡Ñúù:˜+:×½9}øFíÐï|BAø[´òE’,0Ê“ùpßâÓ[žq,Ø—%Qc“JËlžQû4Æ­ÒÄ—^ùJÝ7U—Lè•ÆÃÓ¾¢#;Þ«F#>L/‰Ð)¸ç^‹V„M¢¸¬ám~ð™aÿºñ#ž™ò–ÙH×3±þ¬Üû«ý¸&ÚüG#¨H] ½Ñ5….Z€ÝaôÆ“ ÷»o½‹ö4²Ä²FÅ™BLÛìÌ×CÕ}i †3¥F[Jßh¸;ß Ó™û|NtìÛ7 /2 ‹Ð-%§ÉhÑ—/ôÎuçVK¡žG ¢5ÝÁs?žA ÖºèÉ qªBrßöæ&†dÉhçÒ§Ä WaU/,’KîEð­ê4W׉¹wÖ7gˆz4ïhyƒs¯wâï]hç.ç)¢ȼOͼ$œ‹D|¨¹ 'ðýß—–^hÖ i墸ŒIÝe´ûò]™šV“ì$$úA°cÖ©Þ51Ö!tƒ¼™…¦köØø‰Æ2%ß2µ‰—H«ï^;¯SJ®s ?8R8“@o¿jša–B–ÓžI׿Z^Ñ—S%Å÷—£ì@ƒ‡ÇJïɽ1N©ŠÀ'pˆ2XYxŽh4Ö @˜qÁÌ÷¶æñ¼ˆp÷Û·iÙLL)jg“OªÐ &m3C ‹m¾Î6`³u.á>M2Ã’ŸûÍÈ2éðرU:ó~k?„çÇ‚ÿÇåßCê}‡¡Qò˜À”ìãP6‹™}Ò> ŒÕ©0«3ެ52¾ø¢º‡XeÙëÍ\‘°ÉפûÅ p/²?¡c½Â¤ôŠï.qF4‰vI¹ëƒ¯fxºÁ¨ã –¬ùÇæA®×öm¸1!Ë•-cëã¨Z©¶;î1­66Ã:ÐAÔVõ®¯ªÁ©®¥»ƒD]3ÒFb–Ó·Çw_Þá'ÂrK’Âí1›gŸ¢è§Ãëzü¬ Cl˜´o¿k$´‘Ñh8’éÂè¿ù®¶º î+hç§þPò˜¸îç¥ u vˆúÎ]"Øxá—•ùyyùÁҰ¼͡n §ì&¥ÝÑ+Û0ô2—4õ6dÜm÷&j‰°/cö#H÷£~G! )ˆù%q‹ãx®Hãir­Ñ—ö» ¤l®.©4{‚»“øOx/ü‹ ™áF¹›*›túYìòa—ðF1Ûej‰¢Z($·Lè¨N)KøVïÏx °˜ï$,«g³%X4Šßчç€qNo°Óº×Æjë4™ËÙ烒"4ÉLàG쾓cd"ó(#Ø—N™ô«[IÈz¿ú¦–ÊéYñ{·!ø³€–˜ÖB¸5¢z=·_‰%˜°©°0×(…©åW`Ü£¶©Rm¨t:9¦&˰šNçÔzl>²ß’MŽÇ·!N¢íº¢Ç4S Ý:#²¾x’sO8ªaø'£ßL½¹ß¯ç‹ð3®%4Z—(ˆ¹ íô=!&Õ¬ïÂßN‰!Fï=Eq ˆ†„¬b>Á$±üJ[s´´©‚"d¹u}´!=B[` ÐŒ\6Š,If9Éä+w:öï0f¯´úÞ|†pEQ´+] —Æot±^Ü4P!åÍ-ÌkË=…ù·[uN¸Ïãa§àx4ààîËp62éð ül>™Â=›Å‰ ï¦ žsÌ<ÑbÀÄôè,Çi€¢y><#ÀÂ:s™óIÇl5ŽjÄ[°×LïšÕ08zâuÏj{ºÞ’—%•˜C£M÷bÖ Sƒ×Ïçø¾ùóË‹L¦ ¡Öe0½H½Ø˜ety鉠٭ŸoÏP lŘã´Iú\H‰°ýðUßdÞ²´÷c^‚á­…žk:ÿ á?‡^¨Ýü’Õ²ø:=ÃɈ¼}^g}¡£©th‘I…⨬¼˜ì1 oMÃ?ÒRï+'"G ]ì¼ñ>ú¨<ç<›SâÒÏ–_ÌœÀg%È—:\:=6 <“aFÎÑS^MðÔøÀ¬ߌn-½ŽR‚æ™{nO~~aǰÈÛÔþÙX:?&¨(W2_MW°o‡:Dîµþ¦³¿ë~§ÃƒTŒaõ"Õò)¾(t´ÁÉ%æ‘Ä -ìíC÷nÒín@Tm…=ã­~ÔÕGmÄÃwAt{mÏi”.µeµLüXLÍ»ºzF9z3ø7 7ž,²õ+ÊA ¬Ï޼Ú_ÛÒƒàie%MCŠFŠ›†‘nïˆ;èQF¹,Ç!Ëi Ô­9Ú€eúhFj´~¶÷á«E¹;ãBïMÞ³šVbì(¯œJ¬¯‘ §Æ<,Ÿi¢®D¹›£>ñùbúrSùCì ~™,3'ÏZTmøa‘R¦<˜Ñ@c­1(ÉÃPÚ9 Ñ%¾–®göš ËÊU™AíÊŸ^ æn+äóƒÌŸGª7*þåÑäÉG©S.?Ë›÷h«m6èO„óóžgÛû¾yßV Ë~=E/Ͱ ~î|;J!:¯TVÌ€ÉøÒ`¢{ä¬%‚+ÿ ï^%]0-´DØxÐ|Q*^‚;AO›TÅýܸ« âyú5‚Ù[{Áú•óB€ÌóñF¡€Çª•xöi„ƒovùc»ÂkÅÉ-¤Þ!«_×׬Òönžü:ê|Ë­-P{”ÜZ'.,Çß{o[Åþ¾÷˨:µ‚Xšìƽ÷Ï?'Ø0-»ìžƒK·ïQUk[„£ÜɉÊ×¢•¼%ã;he¥Í.sün6¿À)ÊaI’?r•A_ì4­™¡×ï†Ù©výÔžÁŒ’€Ûå8Œ 3ýL‡mÿ45bU­ŠìüÈ%[Ù5bàI;ÍçrˆÆAùÝן~ÈêN§åäC$3‰˜fÕÌDŠ¥ßL3(r\êY¤©ºæäDî4Lõ ÛDK×"g&j_¨ˆ>ËD”t‰Ø¶ì_¤•c1>Du‘w5ŸM 0¬NÂe›…K j¨Ããòg‚žqÚ{Ì·ß"¤Å’»4RÌT¬¨îm|ìä%–lÊb"æÜ被j²B£0kTÖ(ëP>Ñ+e+æÛÝ„%¨tîÄõ9SUÝ]¯ È§x¤¾ãK¸ý²-ÄÚÿÀðl¥)õ ®.}Ž­ÍÿPA÷#`qJ"õºâ<¦ÚÐE7¦“Iï¶Vß"6Zæâ<]Â'|p¾|­tÉ…‹KŒÖÿ2ˆ•zÒ•2çå’=îµ–/ù5ç(ùB^cc à(™øøûDU¾û3m£ÔIWð×–'‚ ¶{ÆóÉ! ùÍ+¶Zì8|lIg»Ê³é´X'ÞÅâ'ßž:ÁØ&pG[]S r—‚ïríúHr)`™M[æ[’6&=˜«§ ?mÊ"ÕÊÍ@‰€±Ï€€X9˜<‚&§žRñs•EÖ‡4ˆN‰Ff{ùûw–¾Óo…XîàV‰™„Dˆå«mé‹,O ¼÷1ÞüŽb¹¹f¸ÝbèÜHµy2<µup¾ÆÿÀ[úÒÆùšÛË^õÚ|0ÔžzZÚf%òC)ôÆ/?ñëž# <ã($àøË¹´.r>\횘Z.€ÍÖâ}vXèaLÛy×:-‹K¡S÷iuìF¦ë,ñàìZªEÀƒÞùIR†rÌ)÷ð’ •皤:g+]ÚÇõ LQ±öe„;o߈i¢#Y ¢”\‹Ça}wéRqx:Sk’:6†† Û©Ì–Üø›ÁÛã=·Òßך¼8oÐó\EЕ·  n>1õžä öÇ%“§ 8Bí3'Ÿ ¬0GÅ©mÛß•gï‘ÕY a(` »Ó‰¯¤ä÷¹Â’ ûi¶Î0å%vûàÈ}úÜ”â§+ž•ÄF¾¾”_Â7ëa~W}¹ù»8Ïø¬a.´t©¤‡¬úMOžÜ7™>÷vêåljä—ïˆÕÀôDP˜{§Jôæ ÒˆTNx©ZdÁn ?‘N|â˜3JAßb@l(‡A7²eˆ¬œ Ó{}ä¢t‚ü^Ÿ˜VsXM‚ Okiû>¶:—7¿Šä«rÖ¯P¶ê}j`õ«Uì^°ërã{ùŒ¥¦(“Ì])‘ü´š¥@\‘Ãü댇©Ü6Ü X7áµü4Õ_ £¥/ÁøÀëQY£GÏ3Þ£=•aîTã#OŠÀ×ß®›Çþ[Ë[$¥CmÞF ϳ®ŠÀ†uŽæ²Å†³v+#Ä ¸ u´ÅŸÈ\êóÇëÑ£5É~ÅÜ÷µL{õp6Gìð¹ÔX™0fšú nh@.ª·›W‰6ˆ.è¤&_šJÖEoêU9œ‚\¼ÔM 7Ÿæjø¶~T*KÜWv *[G7ܦͩ¢‰‚êpè¶îÀl+0/‰îR§<53®WXWb …: ãUzû#CªŸÖÞ7#í¡å·' P6~¥¨ÔDq¡¦»Ê$É™(gv;×,º‹iWI–Rk¸[yÀ‡ðižGÇZTL>+9^¯Á¢ä½¯ußñµØÁgù­§ïf^Å!~È»?ཻAÃgª°c²n­Ð–I³è‹×T[² ß±ö´g1êoƒKUB,H¢Û/yXxw|«¥åPáa°6FR®»>µ.žÛNp‡À)áaý蕚+Uî–ψ£[G$s,Ö‹ è­èSZóÙ/»'r0KSã€üÉE6¥tßLûöG8TM£qL“w®Ûže• 0Ïž}I@(ÍßÑÞŒF4ç³pô}!qìCŠ@àx[¿ÂŽ·)¨˜$ 2HPIû`Ó~¾µ?F’I[aÇM>ŽT‡ýëNçÕ¹üÇì œá1}·šzÙT>@Ñ—µþ±4?™ÈmOëÛŽ^vÞ/Y㽺„øÒNŒ‹¨œ k4Á.i¨õÝÊf8î…ÜÁHåÚ¬Š á(ñãæ1*ʯ—=_å°n¶PÅßDOæ>,t‚/mAl¢ìÚìÜ™rçìm5ä\›^Á0³ñ› 3C!‚·M˜¨Ù‡ƒo . ØIÜQìñ72 )ÝŸd¥Ï²bû¶i¬`>]V3É ½¿&tÝO’aµR8›ÛW+ÖàÅ^éO~B–c0¿ô"žÏkžÝ%Ul±wU²å[ç‹öòô¡Ïjq ‰j¢&Nt!I8âjqhtݳ¿èG'3A—ÆTºŒÓj*Ã÷.ôƒ´eÔWk*l &*™?îO½¿(ÿŒ`šŸ5vz66— Ì\›cç¹âfÄê‹÷•\ò.¸^dæZÕ¬ç˜GË„MÛE5nŸEùª.áêc|Ö„à'OÞ<¥ËpWFÈÝ>.Gò ‰7Ö n¤Ò¬¡Â8´Qä;¶©>‘¦ºÌòÌ3¤—‘šÌdS\Í"kèíÅo÷ꃸ.üŸö°NNûæ+¶—už…Õ¢¼ì 7î¦àL6g/VÊ•ša¹Ôµ6ìgª€¢î§?øùŠ>Š;,]Uƒå¥ý¿±JNTV,'Û7†|XØ46Ý;Èv~ÒV_-ÃÅ›×Xîr†¥#7ù×À}ÿÔâZÚT¦Ö:>U dî]¿½j†"X x¡è’è éeªµTž[`ÁX¨‰7Ù{kzÝ «_3w-60k_?²t2®xჟ7• Tð‰‚͘@úN#\‰eÖi¥DÖd«¬}ÔÄe¾ÍÀ,E_UB¬·†öYJMÂë2ï÷.l·è‘ûTüY;)¥Žn÷x³?Í=ªW€«JàmáÛP'7†+ ëлžÓÊ’’,WÂÐåͱգ͡l/¨£°ÉÜ º‹&{êãï"¼‰ýÔQ'ò î*Ž!8¾ÀÏŒˆøUJm¤_ÏKéIÖQÞ§ÐN—(YÍk+ÒÓiö çͧ[ç[t°Bv?GÐYI†ÄM[N¢KÓA« Ì(F}è\±Œvúe€ Ñg­É»¥8G;ꪸèT³Iä´¨Äy‡26æÈËtçÒ’Ê^-¨ ‡Áåb´œñÃÐ÷fÑÉø}’fêNñ d^ ƒóÄÕFþãÃ.X²pÆ’XL¢—‚Í· qqw\2>©ÉÓ"ý­ƒ zßÇ“’¤Šm®1(µÊ×”Ú³~t8ÏÏ/GäG{FŠH,…µŒ‹ÜÙ2|ê%âY¾cL9LØå\J´ï¹öòû>gRÛß“ù™ùt,~ðÅÆ…UõdÍ11«Fw1±ðö*Éžq˜9þ#f™ o—¬AµÆt.C.Æ¡# ~Âìþ¡½J>웣€º¡­‚Dò ëA E9Ñ{àËÕV4kB`Y®û3JL:ËŸ ðÅó ÖE®U—–­bÐ6¶Oì µ—…3~Ȱê»|eB[$XÒ^áGî…75qï¥b*©jÁzÜÂEÈL1;FÆŸ †üéû]ü°é„5c§éF`BÛ ŠêØå2³·úÓ>Âe.)-|Éí =o«˜¥°r™C>ë%–ö§‚ÕfÒdªt̶E|„ÍÚ®(.Qߨl>T*ñÌÀMÍÂ{€ÃŽÀ†XôÊ¿%¿Œv8(­…êâ’à<-6ãõú“Zø¡±bÙVR"žvîòÝ'…÷ @ _ËBö/¨r7ÀÀBÙs¸97ÂcÑH7p<:}€†ÒôØ…çQwÃ⸬Ò1ÕT.FÈ»¯åXk~æh µ92¸ÞÛc[èPÎÀ9ºM¯VÕcÆtÒðé2çP?áNœ¼#ªhÖìT~F3BÈ;Êð3…%]l´#`â‚*nV¼]³ágDê u´Ÿ©È•/Í⃳µZ%—Ä×OÄ=æQÐ/ü¼õdM@¹F® ÅæòüüïC†ñ`¤ê~'"íUW“×F²ÝÁ©‹ICW E Î)j‹­š¤,v¡?Y§3yþ¸Uy¿/Ûá|2À¦H]9sòʾ³K˜_˜ÑC(ÝÙMdY‰%É–ÆGÖŒoÒÎ!£Ò+ÿ‰s¤Ð=ùc»2¸ÛGl1rdï¶!(nØPñtGÍw«¬¸{ˆºXÎÍ”JF²]š-Â,{ê"áäB?!] ¬Ï/¼]‰s í:ÝÏh´™o]à7þ '‚yVÙ®ðB¬(X:Î`ë"šˆÍiõ„ôÉ7ÅÆð=7ŒÄ뾘çJ _ƵõI=þóߪ§†üžÆåZòs¶†(=ÓJEÓÓ3:#—ƒÈ÷¢ k’"=J•²¹“áu²ßøËòœgNpSÌIÓÃ9ñq¿X¾£Ôðs9˜e¬ö y˜LbjÁã*t8V ,RT4PG‰½ý¦ñË"ï ûëLñS™7¾Ú:¬O¿¡§åÉ9¡Ü„Gïž“évXÚ™rË%yŒ€Vhž³5Àa‰@çãýß —޼G!R»¦Ö9ý9S¹kL=¨Hè AaáÀ;ÈÜ~{ex ‹”̹]<ñëèryÙñÁÞÓ㺚ïìoýïU9Ä~ »Ñoš†¥EB™²©ªà^ò— ØlÍ&’µ}îc¸åøD•]–è\H€~Å.'ÝTtìÊퟗòfµÃÞ>­42 Ösã±\%áP%ŠÍKŽê¼Ÿ×?D™PFF)RV]¸‚r ™’’ýîŒ?ú,ƒ‡¼óɶù¶åÇåë"b´Íæû=½­ÒÓú„ßRýº!ÄYï5ÓÐRœ·ÝüÆÕB>‚jÂ8½1£vÂêýAv‘ñ{Æßú£a4eëòT¯ÅJ-ŽhKLÎ-l> Û?$Ž9Å£ µ"õ‡Dxg Z‹ž,:…Ф¾>.ñ^²‚½eåØÍ!±]eéÈ“¬S¼Ù"•1¢˜](¿D’áW.Y·JÛ¶ÍbV;/´‹<.j¤¾T¬ØÜ´ÖZáÍ0Œ3V\nD¨‘€Ì-8è¼,ùŸýl&Œ¬,}ñ^‡KâºæSPÂç#×Û>Ð/%èýþ å,Ðæ` ¶F=lèÍ'Êê®™NÙ»#Ì·1£1º÷{´ÓY]¶¨•Öa©Ò6æ:àÙ´ä Ä+M”ÕÎIPÇ®ǰã–W1Þ÷2–sbÀQ~½ ònJŽp$îÁ·JxGšeÐãä.<%-\î0IßgÊ­ÍA K´Jð–ODÿ4Åwn;Þdbt~÷b|B»bŽ¥‰*¥ÛYz~©ý)£0D¬Uîñs¨E³Fe ÌcY¥8¡ GbÑ,>w÷’Â5^#ÆŒß]Û'áÔæwLÁ ¡ÛG̯VšÂ,çPÛSûäN?$AùÛ…¨]J+]›¼¤i á4™®P•›wgš-”ëR½9a¢TÃ4«Ïc`9µ,V"ÝŒQ†N¬þâçðû0…d/ú²ŒëíI¾(2f~¯”-·Ý´Ä¯EòðtW;D°»Ž4œx2%z=l÷ZâÑc^ÍÞ_hï Âåj?IçQ6äîŽGf뮣9¼LRŒ‚‘6Zpä½7ö÷ÚïÒ'~UÀÞu¿§!˜qs¸Ò7å˳k>µí==†³3ý”q’Iè½¶¨Ls!‹^hsR„ó:EDù] Û}‰".«.tDÛyqBkÆ/¾4ù ±Ü%ªý7‰ð}oÿ ™ˆØ éí]ТŒŒìaš™TGK‡»^eÛŽ·á*ú>¨ÖFé¹Îæ^g¯_ï¾w¿¼û¾R;:.µ²5à0än¶Ã!Ô§&rð{MÏù2œ­Fq+•bu}aþ=iwcXy@LN*€ž¨ÿ =(Anðö“>–ó#ð«ŸgºÝ üJ²äiaÚÇS I‘åBk¸W²—°?Цe Dƒ0Í(cø„Öp†çÛ$ÆåmJ¨*ÁÒ —ºÃ™.=Úº5Z ÷Š„>×}vw%ëÙë¶>®ê°z:÷þÉ…Ÿ‡ô}°/m-·Z,-,ޝ7ƒ˜×@¾ªª<)ÛîXDƺ ¿bO¼´Ì°Ð†¡ÿÞÄÄf1d‚Α)¬L*MUcÊŽP%—\¼“j·I;@1=ͱ?à\‰É,ò‘W°:<ÅJIâ 2Ã'x']MfñgfyS±­|Ý€m®;w 8ËQ†ÃŸ5ÃŒó©e$3 4¼¬È>ªÜ"1!7ZŽ8.# ½%}Ókú‘ÿBë>9æîfrÍVMªöùù:a3LŽÍ. Âæ›—9DøÂTÚ¦9`*Dd£m¨=<Œp¡·—£7½÷¥ßÒ­i+È(v¡ä»·¬n×ÒÁ±W[—f56ƒÂ1Ž’/?l~X$Ûò¸Ñ‹K\Ñu+)Î`é6gkuJºú¢$¿— #' ®r³Ý0ÃÈÄbbà*›/ÜÔ†ªjWÉ_wº°‘Šý]’Ò[«è¢Öé{’KÁÇéÝ¢N#Ö!Z­Ï3·Âí‰{¤"(0z~Åßœä#©ú¹þ³AÌ´ endstream endobj 308 0 obj << /Length1 1647 /Length2 14510 /Length3 0 /Length 15366 /Filter /FlateDecode >> stream xÚ­´cx¥]·%WlsǶm³bW´ƒŠ“«âTlÛ¶*¶*¶m;w=ïÛ§O_çûúO÷ù±÷u¯9Öc®IIª¢Æ(jfo”²·1²2±ð”¬lM\œUím•ìyU.² cÀ_Œž’RÜ h ²²·“0ùZ@3€ÐÀÆ`ååå…§ˆÛ;x8YYX‚4ªZ´ôô ÿiùç ÀÄã?¿žÎVvª¿®@{[ è/Åÿµ£YæV6@€¸²ŠŽ¬’4€FZI ´:ý-BÅÅÄÆÊ `e ´sÒÌí6ÿ>Líí̬þ)Í™é/—¨3Ààì4µúët7:ü1€N¶VÎοVÎ 'c;Ð߀ìVv¦6.fÿ$ð×nnÿ¯„œìÿÞ°ý‹ý%S±w9›:Y9€£ªHHý;O¥1èŸØÎVa€½ùß›fö¦.ÿ”ô/ì/Í_dleç ÝAÿÄ2̬œlŒ=þÆþKæàdõ¯4\œ­ì,þ3€ÐÂØÉÌèìü—æ/÷?ÝùÏ:ÿ[õÆ6ÿò¶ÿ×­ÿ•ƒÈhcÎÏÊö7¦)èol +;xææEÖÎÜÀÊòo»™‹Ã`®@§5ˆæŸ™¡ý›„±™½À hϬdú@ó§2ÓŸÈÿ ÿ·üß"ïÿ›¸ÿU£ÿíÿ¿¾çÿJ-åbc£dlûwþ½g±àï®(þY66ÆN€Ž•éÿÇÕØÖÊÆãÿäü_okÿõÿäü¯ð¿CˆÚYüUˆ‘•“‰óßf+g)+w ™ŠÈÔ`nló·yÿ²kØ™l¬ì€EþWÿ:±°üLÝÒÊÔÚî58ÿ íÌþk uûW̪Jòr:ôÿ‡mû¯Ë*§¤îáüÏHZŠöfÿë𕘘½;À‹‘•‹ÀÈÆÍò÷1þ}޼l>ÿ?aÿEÄúŸgEc“•;@…‰……ð÷ÿ?~ÿy2ø/4’v¦öfÿÌ‘ÈØÎìïèý/Ã?°©‹“Ó_Åÿµ þVþç= Ðh ¿²hoÊô=5# T‹“34.¡××à 9ìPÒ ^˜ÿ£Ú¾Û/5l›·Âè­&˜©q’ïã—Ç©Ãû¾ÝÁH¶ uw2ð2Їœ¶7mƒª›þ €Ù°)íL+Òëj^a J—‹Eó`gü«ªañ Ñd;»ìÕír×ü˜Ⱦ¦)õ1X¨`èµ§gT ÇOÔ£ÃCƒÝ7нûôÙ1p”üÆ8¾I§¤‰ #§ûÓèWn7$/Œ´wr;²T{ñ:ÏÙg¶4í%w“úb)Î +–,žWC÷–â‚ä€PÂà·tno©ZòhÓÛkÔý>þ¤Mz9ôNWí ËÉHÞRÌ4ìéç²î·Æ¹ZÆÚ–-üR«4ªkDjb._›ýð1ãó²–@ãCyÓÝQ$5õò½ Ev’Ôqǯñ0ù£[ØnÇ2ÅÞŠÃê°ìh6A”èžq9/'dçNbªÕjæÌB§ukù,ÅßW"o=ßê-¹e|'U1»0ò0f} d+Á½‡o˜ŸZX›«ó%LîºÄ7;q˲W¹¦ƒ«¸ .²èD^“¾Þœ@iEG]WïÀ¡.ôã¼$k§ïÊÓ„Šß˜pNÅ[…L*pp¦–gÕC`Ê ÍèSðb-~Eò5iCù5A6÷¿p3¢È[¯‹c ^Çk‚è9fQâ]ˆ.Ÿ ·ÛÔ×YVé,H@KoÝÜs' I!<»º4Œì2e¹í³“Y•‘¯ïN–:™7[€Ë°],ìDWoì~¡éXªó¾—<\½$bÒvXb ·ºÖçÞa‰IŠð‡ÇÍqº‡¢/>Ä<ÍÛX¹òÀ¤ÐÕz“Úò›ŽvD<%°"¿×£>kr²ˆRqI˜'â—œoá r.uÔi ýmUc­x·;I¾"E\wþtËôë\Ðo6ß+h]Çï€`GØNK-×C]"¹¢ŠáAöó âýóÛr’‚\û`¬`{yÀ`¬ü,é|ýï ;£X÷Bé%‹y0×cÝv„Àäí~6ïÏKÊ"¹+aJ©ðÜÈdרΟH¿_ú¸Òsêd:hìò ›övÚc‰-#wøñjCX¿Ogý^Úc£®¸›D´ÜœâRlÄóEí¬ô³²TЕ]X-–ÛHâù½èÎ œ‹%ƼÕâÁ»¶ÍžZuó‡­V•6røž]ÒdzfäÍ GgášYï^hꆚÙ(%ðZGÃ$mÆ)ZIªtª N-UZÚ൜¨\'kKsÄž-§’ èÅ4äZ^Qe•dÇ}z—K2'<+ùB%è)¹‡¡µ’]Ùß&hŽòœî[—Ð ŒŒ˜·ø‘ÖŠÇG|:° ÀUè ¹À”ÎÑàeO’÷>~;ÔP¶9°™Ädlj%f‘l0¥Ày¼œ‹ùôèüæ±_=w—TR&#? OóNMñÿÚÛ³E„ÎWiõ¹rŒïã%™ö’",œm¨>‡½ýÑx(á,©ÈÛ/oÆ3 ƒ†"sMGžÌh­Ö6{È")Á–ª+®üy€_ÝÛÃ+F¶–ó”ó°[rÒh™•áæWbùàÔyêc­LZ4¯bª3#ÉùNu»$‘c†Ìw*Œím—\eÓ†MÉúd84jµG¸ä‰‰¸»ŸÒ<ë^¸h4ðÉ1u-Äï—’UìÛ¨ö­Ò¦©6‘-ôxkɯp:­'}À_*Q Ï1ðÉw* ­sRœµ´]- áëȹni2)„ë5ÇZJÄéóèÚ®ÅîžØU—0?Áã¤þÆåðž9`ÅÙ>$_DÓöõz•Uü´£{`Ï^eÛ=FpyüFÄÙâ\ZÕV![ÞX°“4ðºè¸ÕLwjÅŒOH1«dëqAMýÖë g#gqÅ+Èû2z«„pwì ®`c .{Ü}Oj9™rÁs”ž׫ӱ,í«b®=I¤×‰è•f•*gÕ‡Ø+ꘙ;Öô2©OvÛ@@¡ùæF¶UÀ› á"‹Õ¿/T¨}¿Ÿ¾{;_Æu‰+MyšƒÈ® ¨õ¾Êq>b~ô•Í@ÆÈ¬<|Íœ wÚ̸$Ö*íªú^[Ùz6ý¢@¯°äÄ?¼ÆÃü<Ln`ó-Ÿt†Ãûó+Ú†:Z×¹“Í*è|)š6¢Å¦TªHRÖÏCK¶òÍ¿I¥€ÿœ(n…í£´$¶wÃ~ŠÓ˜U7»¾©ÆCR,û"Ôvñ­GÉ<¤`¨Òΰ®øI Y\Ó¿\"èã°Š9õɱ4–Ì‹]í͆15zWyîàbr7„Á¶ ~|2ZÖ–%ƒ‰ÚÊ R@úáé)Z*,–’â¬éd€´£DÆf÷IÝV’Í c3Š¾î£¼)T(æ~#âZ R|ÂýÄåpq~+·d) À•kÊRÿQ(oFõ`$Q|»âõ®ðEe––å}¶ÂT‘rFÃ…ãy`³EAE;yR !~º?&Cw7Ñ<Ã,yV™SµÕ‰[¨œÞvGS…ï˽’}Æ@îÄ’‡]‘c@A‹:$í¢g,)Li¹|oRgq9ÊuŸ¥Î‚OÔ…‚+RP–ÇÉ*kxêÈZ»d¼AÔù$–å{ìN2­wsç„g(mäò7ßltHïšý"ã/(¢)ÑÄ+×ö†8Ôkê1KåÉÒ–¾ilKÉTa$ÉœÂ9›ÿÚ ™Và¢YÅ¥eQ¥M¿’ †Ñ Ïî;r"~êÞQä3~—šÙ4™ñ7¸(ç~á ^ïê¶L\Íèí¦ý)Iå/væÕœ&Üi€¾ˆS¡.?³ËÎÔYÙ‡`9Ø·¿]¯NyŸŸXÙGB gâWŸc ²mìXý­žbÆƴ¦¥V´«³}«Î)E&yžåÉæ³ß“`+ë>šR°çÕüšpxçÌù ñŸ¼1¼OPSãt~-^Ã&LãõéëãöÁ¢)CP‹¤Çéªã­¾f’Õ`˜Sލ†ëý¦¨9’%ÖéͬÖNI…Š9¥Ó·‚„ŠÐëµßŒâ]RÅ‘\/°@1¾_·Su PõÑTbëq,”á·;.VîÑ+õ^ ..,5žsªš,¦yÅ-f6‡DèŸ5jâÍ3³²ÄƇPpK-ó©( K›æf{¦:„!ÏaäNÝ` _Lé¿fbSú†4´|ÎZE7ýñE*ÃÄ^‘óé¤@[Œê¦ŠIktÊSs«iÙ#êv«™ŒÆ2wTBĺµþ½j³€¿¦Y`;щ”hVÝ}òב4_ÖÏ •5°F‡Ç´ÞQ”t5ÏJf½Ú޾¸P]yȉÓÖžîd×ògþH*ÁÝÚiÉS rÉßPBò^À¹üÍö.Um,-…ãºR¹i]åÄ-&¾ZõXÉЋOCÿÁî/º)è<”q–¸a±Ùß%.¨BÍíÝ:Ž;º£ ƒ:®(ÖºçÂò8€,½™¨°{¦˜Ê¸@bÞó¹l|N{:œïîßÇPù8úÃ}÷Ì€éÖ`xØII!ß”Ÿ!Sò‹3­—• 1àwuÈÎÜšöð4NvÙxU©%¨~w°Íý„lIrÜÀ2:"&éO-Ζ‚×KpþA](ÇzHÔê?zš4ˆ·äý‡¡>Xÿi+Ù±oôz~†´:T6¦QeæÜ‡ËmßÍÂçbÆ-‹¥NœX™×ϨüþçÛüŠC“ËZ1B½Û–gàþ“¥˜ùÔ¬ÿ Ö`JÒk×ãìjYùPÌ@×kvg¯ë©c|+Sù1 «^ÙŠúV‡ë+8ý·¯ž%„¯%$)ž[¶µ2×oC‘¤“T,ˆ»à¨Uî ’+¨µcíü¼OèÚ@üÂÁ¤j–¾uêG‘ý˜jmYïŒÅÅV-fH:Y_G!¤àÔVxÁ/Œ¹áè¦È§?‚ì?œ{Ž„™5Ùùf9ÄŸ«(Aéïù‡ÍAô‹Š$‡®šZçx÷Ђ9\ŒQ”Ë>¿¶¥Ì»2.¢ˆQ%DøRgÖ@ÞMš‡¤IHàh¾Åþïñöî45Zš– •6åɇHögðꉧ„ÔeCÄ—¸=Á2w­«3+Vï£Ü©?ŸQX¢ª»÷s„HJÄ·È›L¶Ké6].•V̹Nºù6˜†ô[ŠzP¾TǪÆJH)™æ¹ŠÒ17ž3Ù ä`ƒ!·yç^l¦R¾›Ï²r +öÈ€ó¶ÅL‚¾»-àL¡…öcY±•uî=·RËöP;Oa#[ÂXÏs"ï$Bž;u¾$ãËÕ¥È|21hʶ%»‡`ê4ÑweÀPé×€À¡+¥ˆo‘ºßm&=å¿ú¹úÅâi¤gEÊ8[u2Ý'˜Ö¨m˜ ãq~Š^fà+^†Y@¡ÇArÆ!“è!JríÓ«LèˆTA¶ú|¦LpË¿ö}QÑHÈoîî‘Ð@DZ.mOUHO„ª¢æ"Ö§l­-MôZqù©Ù ú-놗ó_±ü#ë|bÁòZ©}KØøaz•›äl5´e­ ŹL;ÀZH©¬äÑ«†ÄºY ¿É½`ÔYçg_çÞ~„G.8_ü»/ÅØT9mV° Ä“CíÝg¾½×ª• €M0¨ã-䱇¯4˜)YqÀÖˤz¹eê‹+ìI1{eã©•—&A—I’H˜NFê1&AÝæ€MEó|j:ÝáÍêLù¨orLØ™Ô Ž.¹`5Úº•ˆ8:Mv¥^ê£ÙÁ¥yPÑvÿ¡_©÷¬­dב—Ȥ-×Å…ìîé~.ß2]ÝÆU¾s®BL<ê‰â¯‹ß8HÉEÅ›.…Q<9éÔÆÒ Mì–«0‚~ÇA¾-x;‰££*ü•ä$“j :øWœ&ür|ЬÛ_ïÍÔÒ5"¦SÖj¿Ø2˜låDÅ–í|4)‚ômbƒ (¹­­õ D]š»ë="êIˆZ8»ªÅaýûñ›ÒzìÌP^´9(Õ/8À ÿ¶_>Ê™Ãh‘¾`& •P00nÔ©`»4u¡ô²¦š“JÞ‚DÚ  Rkˆiò1œÖS'%›±QlZàù½c®“Yo„E°†,ˆÝà+qÆÒ<ëR_‚¸ÖR”:}[»Óx† û|!îO->k}þ¨Ð.UH¢óS’TAšCê Ôñ+™@þh­ŠÅ7Ùa ŸYÝ‹ŠòôÍ@ýu¼;ÍLóMœåú¶ó-( -T–JëN!·͓Äyc…·×7?%çÅîôœÙ$ð@ÓÑIŸ¸¯¼þ"®ú”û™Á¬²µæ]¸W5†¥ %yC"^ÏR~Ã@éjã{W`ÊM×±X‘.é­ªn$#næþM!®_é5–iûN®n”nšxЬRؽ6v‘"˜€/ŸLðØÐoøE†d¯ÒÀ§'îÄX´ƒUuB—칯I;Ü7å\u·&þÊùyÞ䨡-À)—I‚ Ð&jŸ5I£ £„Ô4Þ…CúÖBÏÝ0RÐÃiCðŽËP‚q‘g[Üz¯*2„áW~ÐÕl˪À {¨›t©&<Ê‘çnvª³^Ç\$9+þå~ìˆ:Êb¦<(_2àGl–^ж`WBÑÑ s» ÇÅSú‰'›ú]aíì|á­ˆÃCÝWå=j½J‰m%xâbÍ3X“Óo Ý0#5¼~Äï„iù­Ü#zðWDL¿~\œ§®~…„Hañ|…jsim†ããˆhA6œ—§óò¬†X™³âÇáòY¸ýp”FÞ“ë>³]ÛhT´I*èõ¨T"l[I?ØÃ°ma`gìÀWÇ×í3¡÷9R{?âãØâw¦ ]‘ͳr<^C+ûý©ÕdSïI“íŠrñJ4¨u¡ïoDö´|•hß ßŽNìq6Ù”4¬vä–0ž…|CJ|Ž‚@f—Ã׿âœÚÊfz!šŽè[äU Ò‰ A^£¿¬é6@T¤N¸™h>z½o%xÐ6`Ë÷I 1ùºÝÏ “ö=Ýö/¥õôY7tn:ħ¨ŸêºæEÁ†Ý ò'ŠœÈû{™<¿'›€ÛŠ[h-•y®Ðû5ÃD¼J_f·â ò”i„fµaO±ý¬‹áÊ_ÛZJDn‘zUÎ^tŒ¸,$Rø³"8Wy›‹ëÚOWJëöx„Fâ5Ûæ¼U·”Žˆ+y`ãb´…{(ÆhÐ:¯ÓBmdrqKV”×0L®ünõ¦øH³~ܯ’Ó/è';”3g?Dû×€>°?‘¯oD«„£E ®žJ/èaVµ|¢ªšH°ÀÍäCRg~½°Â¿òUÅ.ªC¬¢: Ü2%˜¡Þ’?'(V±üá=ÎZQÓÅoЬµñÑíh»3$aÓJ*u0bj:%X"ÇJ?©.&rÕ¾$“t(ÞjR!~+þCØu­ì3 o†À±m?òRNÔ]Ðq‘ìӤǦlÞ{6“±Ó3zeRÞígmTªz`žùèq‡Ÿ™œá¤ž™*auߣ{;¡yÕá-ÎaW­¸Ãljç‰ïò_=Œ…ümDÀ¡÷ˆðdpñ!Eôn+ÛAA kçáè1Uæ1Û ²&fcþ¾c†áü4Òà3"sTýyêÚJ±¢Iç¹™ˆåeáiGÁsdüB?¾ºz˜ÊÇò{Þª¸Ç$=.SNäYʆD±“©˜¬É–!|ly«ìœžÈDrˆÎ…¹9ÕA¦äÉZrt’¦Z›@3ûÓÊîÄðñ±Í¢øgDÏõ¾D€m^¢åb¤ˆ{/Ò¼fœÆj¬Û‡¦v}ÐOÎ@ã’›¼XîÆ…Øm¨¾¾ÖJNs² rÿ³@Ý2©¦¢ HSŸ‡Øah¨•a_Ø·ð9¡ØpÇ_òZ%ÄY'öžáðzU<ÜJ<o¯á²­$M­“KS~yCŸál!³jRý~©°Ú0ÖzêÖÚM?øQFZ‘ˆ­=mÍn¾‹|oMÁFúõêrýR •ÅÜîS&Ô%Æ›u±êeݯæŸÃNˆ=ÄÙ®ŽˆöÕÅS ûv 6ÚcFqbHäË¢V«+H˜?n#ºýÂ&l‡Ìê\FœÛ7,€©¢íÅÕ42oUgÿ{C÷zË×ÒŒ7Ø'eë_~ÊÊQJ}œÅǸß{ 9ãŸs~pQ\­¢,¨Sd0~ƒfçÑ.š­ðÏÕã½)HÚ³t™ùªðs¢`o•1ý{¹ìWÍJ7/$Ó©ž»tø§Iÿsß÷ríyëóO•uP ©†½Ç6Âаâ³ùF°‹ä,ß)’.¸ˆ'œYuö:AÛü=’2ï »Ã„µŸkõ‚¦mïp ž¤¾B/ºå˜màÕMXÕ´ÓâêÞ€i¹Ú3òcøÕV¥sã]üˆ e^»ÅØ‚µœ>Ð_»ñë'TýÏ9x=Z­°âšn›ü†@~.„ÌÏOXˆ«Ñ ¦ÀKùù¹>Ú:>V&å/‘}ä1‡ ½qâΡ¯4e™¬ŠsL#hºÐ>ë¶6É>id%~ÚLô¢¡èÖÚjéÞiö1+ó(%Û~ZÇäþTì có¥$„€›MôÜ}< yEY—%.¾Ýw‹Þ«‡?öˆ¶°Kä÷mf4΄„H¨K©bÚ,ˆUÜ´Éôˉõ¾ýXž›RmÖr×ΈI‘`ƒGin%ÍÙ]•i¤â5ºÛÖѹ5[H›’Ú‡?¾_a˜º@VäñgõR’”^¼Ýð£ƒüù¬Ë•½oǵJ^K5Ïß®[©IvŠM6]†^ÑØø¦|ñ`ù:nȸoT^ä$$Æ[Þµ¤ƒ÷¦'v8׿„pDlŒÂ7œ^Ö#aÈׯ÷‡ƒÔ±)qédê¬ÊS¤‹¸y„1ó˜2f5ÖYBEÏÀd3ŠL;l9h1eçv“Sá}-{¸Qî_H‰BÔJ~YëÑ‚ŸO_ñÙŒÕȤKµBÌZ¾âŠ6ä@˜Ó=(Aà”°·v§¯•RY„ê—}3ÌÝö(÷Î?¤#Ô^ÈõC#J̽3 cœé"5镼ùÒ6Å;Ù… Íj* {PlÚ*Wë¥{çæÃT/Z ç'ù,=KºÖ%ÕÃaÌÃi…€=aÔyÌPÒxgËÈ$ÌÓ‚C`çò&Yƒ?ÁÜTŒÈ§9íШ4Á&7i¤¥6KmÜ>ü¨;ÕàP9mM×ò}"^À+ßl/ª¨coÜÕmo§7âotÖä ¬†qZ0æ$Î)±û©å³d-ú"Ù±MÌו˜È áU*ÙNÛȱðØ^ù6jdº×¹cÏRÙO㬠íÌM!>$/øî£ªÖ±›í{-ÈÜ  ‹c]F^­(Í~éŒÉ;ÝvH«3 søÜ€¸-Áò+ò)²›©9<3\|uaëŽ{bï7Rÿ6ýŒb·˜JÈt®¥>…¨r-ºvhwì†âº£(IqïNãh³ÅI£üzrGþÆÙ¼4Û¯}¾Ó©ÁÜC‰¯ªÇ‹È­7`ê2 áËïÜ“P öw¦x»vÙêy“)%ן‹õužHßÖøI¥¬%ÔI¿y{¾”#÷ln¿;À¶óÂþø6dy£øs«–z°›ÄöÏ>¸Ûâr–¼cȾÉpÙK¥Í;€–Êß(•ª©éZæÝËʰÐ\bÿÍ1õjµå@ G\¹>N¢J².)»/‚›…:×ëѼDJ¨Æ@G®³ñráôª)EF7^E Ž‚ε@|jª`|ç½3©[J6 $dHu5Ž]1=ÉѦÌ[L“y­Ÿ¯¦¬Ï(ÌO7¯"§œ×*ÂT”–CçõÍØ/ÌçaS|‡ƒÅZîÊ÷s©owϦŽ%°5Ós‰¿7P=‰1:¬ã#Zãf/HÇ'û™o~ûýEon¶?©¡ß¥çõÁ1DÇdf÷6…3£>}./DaAoÅî~ÊÕU?X`}9Ÿ›Õ-K|êÜFW-HdàÛÆ\Yÿ½lÊ É¸lJ¼cì‡4±~î+•>sÛˆe”2TÍá(2¹b'`.¶R‚롺þŠŸP›ðjÑCZ9Gröþ7Œ°ñ9\fvx­µaæú k Xü$ºø û*«eiÑ¡™¿›ö­¶ ®`Ø>×~Ö€© x.Yµººªñ•’–šâÎßîpg€%ºQ® ÑPv‘•·Ç²«¥byr¬·ï ?]|¾”Üž*=:*EP¼|}œ„ö€høµVÜss.‘R`rtfº"÷C)”„à¶ëMö\sà÷º*·$Ç =*¾nðº²Tä™ Ï =ÅÔªk}¢eBŠÈÌÏ@:&)koǾ/2œ‹ ð%ñ@—ôݯë3\¾ô_†¨¡xº³Tlˆ×8é—>0­.,M-0c{ÓÓúbdùÎ †mØSªœù7ËdA%êÒ;Âa¨{_>:ö8ââŒÂ óÕT,|ˆ.ÿ,ñ¿3Û—•mJ$ú=)˜Ê¯çYzõëŠúÛMl¥¬·kàÈ ÕØŒ*²Ã{¿˜šŒY;Ì^¨K¦>ÏÆ¤’öBsb ‡h1„i¬œ¿­OKYìwY‹$!³5ØgŽ ¥%ï8ÐÌ]lSê¹ ³3Š-0ð°&8ç$¸LàE¿\o2ÂbÐâ{ÛÄ…SJ ÎPJðKM:{àá¤uá\—ÑT2Å41`ÊôÉrjÝP¡J¨ wü(h¼,‰–‡_á<9usl\Š ù—¾Æ’]~5õeœ*56^;¥– ,$:T>$…s Êžrcû]Ų ¾¶¬¢÷»¿:¾jà ”S}-]£³ßV}%x•[mØi÷†¸E3ß—a^<ÃSåì'fV+ûGû1üî<€{, Ç™ôùö†]g7“ÓÁÞ{øw#¼¦òHl_®{[_-6S˜e»,¢U¡à€ìnG.v|Ôb¥¢C‚xÉi,Œ79­±„4ch¢³cõaÕúz5år©òO,dôeÑ…-½:–c¥0ܳÚ]µ—Ì'Ø9¢62ýMs»Ô¹„ õçcÏKÉÞÇ+Òõ°Ú2Åá› Ž- çÛàA¤Œèï¾ÑÜKoÙ¶ï<Žè+ïºÐH¢«e»ìgò ˜~|±Af€3´;=\Ñ.~"²ÿzᇎãŠ}ÈAA­X>üb±i„;ÝkßâYw‘Ú.ºÎû“‚±×²Ú³òWQÕ9FwáèòøAw­ @xØ~£e=¯šÄ:ˆ¦öË}‹ÛëÝmÔ¤ô¨r­m¹(×lkp7È–Ö‡ž&À¶õ·Ëhæ”Ü*jž]n¿7IT•æU@«„)#3ªÉfEG—ÄïϸZ­Bº?í¿J¡ú’Ç‚IÑc7»=Ïг‘L ‰ð{+è À&æå5V×iAaFB™ÔFÞ'Háéýéþø’œ¡Íß̨·TÝ«wÆÑ{•˵ûXZû´=l–{ ?:­ƒ¨Úa¯Ë—°‘mæ¡â¸bv ”í®¨$Ä5£`ßR{>5›?‚ë(R7ȇ| £òµÖ¦EH/ <¢pò´ßk>”!)Z?Ÿà›WHuÜíâxš®øxGX\–|ÁÒž×{nŒÌ¿à Ì8áö²DòìJÈl‘xT1è©Ý™ä\´wå»ßrŠ•½­TÏ "ÀµÕE\ùùäšc‘­;Þ„cJkoÀ¢¶cysxêFœP|%üÇ%ðw:»g•«BŸëôsÕ·ÉèeŽæËq·™„Òr¨gÂ]9•&@028³¡@ŒPòp—Þݵª¬ˆ‹bòÑgèèÙ N|Žë7™ù¯»B¥÷Á挚‘³xl ö1TÔy[^†¼Ft_D5Å c¦ñ+ݘ|¼;jªíä½´–  |ŒÅ[÷ߺâ?”(vsØŸFXS[ÂÊ.`3CÍ æAÎ,´qè©IØ’ä,7íÈWÄ#GêB“Ä’‡‹i|Ë=˜ÐÓ9oQÌ?kÔ’W‡.^ÆÐˆ&oéß˵É>XùÂÆµ™ÙnxÉŸiˆ2¹y'5¥©|Œ Ãj”¦é<@×›éW´}u*1Ô7zÈÓ2ãuÔ0.—ç:²Ò«Ä=íÇ­ô nxu›ÊÄ•8Z¨Rì98ɹ°àt|¨³Ò†NÝ­¾‘oØIÜ1g7X“ ‘²Š$Ió3’F‹áO´n£Ú¸¡Ê cƒÖÛ¼ÀŽUš\GìXËpüŸexn1\—9lDòúÚ¥¿„ݾÆ`Bà;F NMi$0QC2;ÄåÚ© ÇlØÙ0@Óÿ,§ ¨Ó(]´žWÔn{ù1hÖâ¬ÍÖ ÄŸLÛ§Î?ǃëö]óêÑòhtÔDyÿ^K‹XÙGrÚ¬›E~F~ö;Ù¥R×<a[’ÿ;26Yj$öÌ÷Jc|ÌWyTðòŠ>œÏà´E£0.*ñ‚³}‘-ÀÏŠ½aã8ìà9×O+÷R®ŽúkŽÝ…­,­—”Eƒ`ö=ÂH~E£ú ›’Kè±)ëB¹(JdF¼)Ñ–Ö¤ÆaS‚6ÄÍýÔ8¶¼“`À®Ñæ×“·ëÈ!(ªÇ¯5£NÍ%èx´¿èÍ<úòë¢/¼è‹Ò”mV­ã)À1œ¾fú4QlH63Ó[;îÿÎ>Õz_%ªâóבrs¦ ÎgÏ»¸˜ÌåNfgé‚ËlØ©tž[þÊ^í¯gÂ[õèÉ {¸•ê~´zž§nb@Û( ñ'Ê=sG9Û Â?@¼TBCÇz¥…˜Ú0$l,åº+õ~€–Ô/™¸ÑO]#1/g"Z†-À/Ï•ïöåX^³äåµ³p’zm¯‚.ä'i:OÉL=ˆÅº©Ÿ,'Á;Óà¦Ø‘ðÉÕ®å_ ÿÂ27€]‹ë ¦Û¾PcEæ“rÁŸÎÆ„m]ËÌyd»Ë óEÐj²ÀÜë¦S´,ÑŧŸÔ,³?uoáµÑ0álWˆ OÐeäv¸Õ®ÜÍž,]oŽ‰Ñ²Tè‹°¬ÁPÔn¯î!F`®ÈÄ+½´ö°ZŽÂ¶Y!Áf1{ûñ¯¾;¤˜;{ë‰c)h=oû"í…{vK í+;5ÿúÀ°Ça)hÍ^Æ@Ûßl°ðe7N= ÚµëòB÷gé2O˜e”3JW×/ø;åMëXÖ(iÆ·ª½úL=$ü‰Ž= mI/C-ËëÆÛ‰ì¬×Ç…@ÖŠˆ\Cwø2[A™ÐŸAÙ{!g­ú4[ÇA8>wc$)œþèÎT‘—ú‡Án&oö«`qÚ:Iá)’Ò¨w7ÎÀnƒ˜´ÏÈO©qÇî¢!›¬EÊFaÅtŠ6Zw Ôç—\„yïÓÓ^í­³•˜&rîýŸYP̳Dœ¢ÒŠy׌öG²[‹ñ¡>YœK.ƒ•àÌŽkÉ¿-ÄÙl™DŸ]ç`ƒñPåa¤ùxY—j£9âb9‰6,„K{¢ŠÄ®®ëi©žM0à7õ—òHI’nC}k'²EÒ= Þ‘£=ubÜÚ™ã`eRÄÓáðbšÉàž­%XŒ’K|7Uÿ@ÈULmo6³¬PÞÜO䪽B‰kè”ËÆ©Ó]ć­˜úQKŽg_ù«bȨS<Óy&6\ë°^(I!L#ÑéÛ†»Îµ‡Âž—üÌ4Ö\ú·åN3rðZ”¦DmûÃv#;91gµÆûÞЄóB1ê„4uºi‚/Î=aŒå'í‰ô¬ÿ¤•øèÍz Éöø±wOŸtL¦J2u “Y¢ Q7VC_q’Þî{†pÙ4úzš[íüü½Æ}Pÿ½«Ø[ióÓD’§Zº;i5êÛ€OA$¶~¢E»9 —^ËÝ;t„ᛓ']hæ$¢56ø¯Á¼èöÖçÆC}39×ÝÊž+±:Èx1O˜QüÌoieuÎÈO¨˜ÕʧªåÇ7ÃÄÍ¢³G¸ ?Ó4²44ÈË‚oMÓMy+Ê‚_ÈEÿ&3à¹\7–÷ ¢QÄ¢[ãwÀ–éXÝÄ!_™½„øÚ»XᇹžXå°»Œ@:`4’“®¼ÄÍnª3ñÕÏ—Q¹ šN[ˆÜŨ"¾˜¡¤ˆ –’Ç\¨RÔ$e#õF¸EÃôÊ“ZŠŒ a¶d+6L*K†¦Sò˜á±§´³cÀýURÛÇë’•¹Œ$NÔ²èsôjq£ Ì¿ç1ÂD&4à©f”-Šò†“õŠtKg?5 käš­lÎCä™é[JŠfêÂÅÂô‹=ËN`7GÊFEX E"þË.£vkѧ¶íôn4à U6ÿˆ?)ÓùË.†íEVÂg›?Ã3ã]bg„éuâH`jÉP÷£aæoCaŠûÇOÕßÙ%_”±ÇýcŽ$ªM\%pCâ›Ð ÷~»6ã^dU&|#éÜ¡ÝÔÃ3AcHªÙ={TåJBÆ·sƶÊ:¥Ç¤ÕPÝå×^+Ž— GQÞ£ Ókh0ÑT%“Yœé+¸ð7D™3²óiúOABb›1úNz0B>«4¸P\J²„ŸÛ¶åNÄÈŒtŠÈD%.‚ФAz]y˜ÖóÆè¡Ídíì|)”˜WH5Ôxñ2`{w$çÐQS÷þDuÍ»c¤ãQ‹l2l×>v¯|Kk`鉲ÐKíyb Þ¬0ÚBç»û¶Û†,’PŠaF짺ºÊ'Ÿëo’x‚—çNÐ hô M_"oŸJ¯P3ºñéh«p }nN?"Gû‘®ü.P*¿à€zþõÁ¡¹"É먤’61Taéëw`õ:"xx|j|™è–‹*q›ÊD"ÏÌ0¦ø9TmTCF(Áwkýzñx`èOJe¬”tyœƒ$¡>%™ÀÕ‚H¤úïÁ*RŸžßö¹£'`’Õp‡Ë/ÜNLí÷½Zj¾Mi°XÓ›R?ÁxüÅ:2Ý ³5åX¹H†Ñ}ÚŒžâgn¨I’zQøÑôI£®ÍW4à”â×Y3Š^þAO‹R•æyaéÚ‡žÞ…‘gþ&ãé«Ä”Ú[ɽ•GÈ4öæÑß(¤p†Ð¶µn&§ŽK`õÿi‹—›Ã rÃ,ö “Ÿ÷QËHÂy´YLá¦XÃö‚©¶Þ-«÷2\ZHšˆ&Œ¯jžíýðã(âÒ ‘ÇûƒA… F(¼É7í9ÙÞï#3\z˜+_*Õi!®húQq¯,ÿGlK½á±ÓÑaÿt”–^õë¶ÏR_4e·QœòËlyÌÁFÑ‹isÛt}J¨&+õN|ÚÁ9àˆz{7öŠ.#–c±¿bª·'Y¹“úáZ¸ÂV‘`4‹:/rpÂcËMÛ•íC-„@>…ø¾¥¢Š­—ÕÆ×µç‰½¯W] DÍTÉÜì”Ñn´p¿_¤˜ÜEóì×%¢-Áq&I(:/´éFÔ¾° K²žZ¬ ¿Ö3= dÿ®‘6oðRò4äô}Àé[—¾ãºÞzÃJ·±N7åÈQƒ ããG·C°4N›ÇÛûÕ°à,Bù£Ûî-ÓˆçMN¡ïXìRf å¾»õîcªÔZE›a)oøi8Æõ’4ecÑÖ̓)±70ÿX‚¯,Øä3e+IEW1’dº0,—Žg ¶Øáò=Ð:Žúê±×GET!( —9-Ìg|ÞVªß+±ÕC§¾àvšNâZM>x³òðuaCy±ÆQKÎÔù’½€.%ít—nïnûD¬q†`ö;ìÙÐ ˜ºk]»y£´Ì+õ~NG-£zû«ÞŠòeZ|žÃnª¼©-§%fRëø‘šsób‰» l #§}èÄ_¾è-RyœüÓ›Ýñ‘.ºØânl”p|ûc-Ò/GKC«¦ÔÖZ4÷ñ ÊåÛÅ/³Ï&N’SïÄb¦ùÕh?Ð)Ì8j‰óh¼pÅ\ƒc-´e¯¸OŒa„\‹`Æ3üÇu$P/,½Ã ~µØJ’ln$xMéÔFƒzcU"$äj¬\ž­9¾J‘$ÝE dXl¸!Þë0øÕ/'ž¼Òhøp·O(DÓ¡f»ÁÙ*é°m¿^½5‘ÃÀUÚ¡*z9ê¿p‘ˆ£d*ΉPÄ—*îÆ+AF×tàÈÓß¿$ð„…;Kë2RCO7³‚úD)$H¾g0*2jéÿvšºƒ^ÌŒEÄ:ÏÆ”Ct{Ýä¸ùÉ®D÷ÀÑ ò übž´#3=Ÿ½á6¥Å׎=Tñ›ôO=´MåA"]ïDÙé=Ž´¼ã ^3i2/>)RE²wÌI‰ºõþÌH›Sa²²˜¢‚p:¯ o±y½oX†K1›¦¿»”ÇiÌœ$–;³µ!˜Êõ+àQ:=ž×Ы‹/ÉÇ0ÆÝù¤“ŠÎ/áåî'‡õTé)”ÇW ( P‹+[6À»ž9ûh­Ðüq Eo-kW)¸UÍ-e J’‡Êzϰ@‚ k-Ö´÷Ö²½°‡dÙØ8¾Î Õ…|ä•Âf#´5’5å~Cäî ¦Äà0§Ço+_ªEýpµ ±|4çîy|Š,…­B¼ÅŽ-N­.x{š\TŒïÑOR—uïg ¦þ¤t!CíW¤xi޹ׯ#)/÷$l'A߯ž&BÐZÑeëƒè¯*‡„¤ëý™½»=úeU«¯4Yýs{O³k¬§¥†ÓÊ{¡w}2Pµî%´Å#@^h{w%ÍM„Ÿs¦õ›q¹·òÕP;7íT³–(‹áÖl/ˆ†ÙíÖŠjì6ZDµn-üÐÞôM†ó6±lÕWhïŽa7n9­ÓÃãû—hYšS¡vaÒÄO–ÙÈÁ**‡o®¯"I‡‘{¹“¡gíæsÆúá® ZDÂm©…ba/d51¿[èüAï‹(p;0¤ëQŸ$LÂÁJ€†w!X½ùi[*£øê¸w=¾cBÉj9žÀnŸ#”#3{‘‚©I$­þ€3±,š#6åº=C»H[Ü7® *c/Õ¯¶9''×XgíBä'6Ö—«ê|ÔÄ®wS1ëYÖRiiØÚŒÍ<úÔ™T !9-àÄ9cfqwέËv~Ã1¤Ï„ _‰ÃÝÖ›üçgK+ endstream endobj 334 0 obj << /Producer (pdfTeX-1.40.25) /Subject (GAP Manual) /Author (The GAP Group) /Creator (TeX) /CreationDate (D:20250922182727+02'00') /ModDate (D:20250922182727+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 261 0 obj << /Type /ObjStm /N 99 /First 898 /Length 4513 /Filter /FlateDecode >> stream xÚí[YSÜÈ–~çWä<‰Hå¢%'nÜÀ¦mhÆ`ã¶Ã1WT ÐuU K*ú×Ï9¹H©­XÆ÷í†[-UæÉ³|gÉ£$ <’„'p ‰àpJ ó8 8q¢ÎpxV„‡ ¦%®ãD¡ØâqD¢Çc8ã8pk+0ž„ñ&FXãpNô” œ‡@›€<£ h‚p‹'11ê–("”ňd¬P‚Hܹ ‰L@i®bÀ•+EBd/€{É. d€º,‘["=㌴‚°*$–a@@ë8,À¢X¸ˆ$ŒEˆIÂ%‡9’°IA©$‘$‰x°*’ÄÀC0’(ª€e€âgD Ð,!*0™ˆŠ€)cU¬çD%p¦¥€¥`°FÚ<Š ‰ø ¸b˜†x…˜?XÀ‘…D:!€N"D»@8\%°BàŠ¸"’Áç¸"û8Ç1˜ÇÒ%à1 BI*! Äâày¸`jÅ0:˜ÄY.a "ˆ1t g…b[Œá t ‡B H%‹@;ˆ2¸œ4¯8hVIÊ â ÈS%ˆ- s&ÀmÈ“ žDmÁxp7Jå D¡@Ù"ž‚%¨“€ƒÁ«‚ƒPN…+!¸NpŽ+â cˆ5ÁAFÉ–-X(ô †Žˆ\h¸€ PW€ 0 sdD˜±ŽD•@l" h !ð*޶þö7BÏý½8/}I^¼ËÎëWåù6ùûß·^œoOÌ_˜ù œß¢ç÷·¡§éu¶EŠU­ê ¢‰Aj¿ß¢ï³ªX—³¬Ò¹«‡Ž³yžîwä ¦¨Â]LßD²ÝD}ÝN%°Ðñˆä ¥¼$_°&À¡ŸþüL`6É.IVëÅâë ¶ 1Ib!v8wˆA]‚6ªSE¯:T ”½#ËìAêKXLOËbv–Õä XþòÐóì®&šïIŒã=.|Ô´š2ÄRJÈ_Ö‚¹Q¬} ~ÃH_ãòD…›Kì5Ž×â5λ9üÝ5Žk½uÔ@y¡^úèðÚ?ãø@w{Øítô1Ñú™ë¯[_¢(Úá l"ï&pI² ¯ÿ¯WÙqÇ+Ö¬sÚãadFÚ±8‡Ò…ÁÄ?=Ï$q^”¼µ ß±Çß!€žëuÇy¸Ç¡kèÃóºï=ççYÔϧm"%Ú(Àè@:Aœ¥õˆï]ßë¾mÎënÜófkbîyÝé‹gE(Só õ9”Ìó„ÓãÙC }5ñßÇ¿üÐYÙÖ¦atY;ÏúQ¨i±Ãu–®Yg¯•7î¢IGÖÌf[¿ôacÁeys:ØÈÃsb+¸XjÖ j£tµµÖ’Po-.~UKÐ"[Â0l¢ú)SPúÅEü‹ òh,&"h`u£M~S\“Æ==wë-Ä㣠ñ™ú{4(Ýj‹u5±g¼Yc¯?z~wCxs]?¢:cî´Ösg„;:Î=Ö,i½#ƒäÁ­A·»ÿnžÓ˜-Bßú<ÜBÇŸÏÒ Ø¤G»}6ÛNè¥!ª$h" •@bsöÍjÌóä™›§¨q·3!bÇÖËŠ&,ô8³æ‡í!=Wô4Ë%°ˆ^A™Z¯aަùÛÜÂêo9?H‰K$‡ÊƒuQ$m`ŲÉp¨¾ ]šÙŒ5ÁÕ«òSG“Àè«‚ž£oùèîÖëž³»u«¢ììb.yÝÙáìïŠMUDÏ÷½ž¨Î:­¯íøqã-ýìÅÛ›¼q¬ô€«èú‡ÿ¯I¹Ð¬j2©“ƒÛ2ƒ¶l{*e©¿z÷“xkö2«fe~[¥¹U;I—0³wºÿéõÛߎX‹ôº"ÒPìëÛʸÓÝÁô˜KpW¹WÍð®2R@yÞ¾Îòëø™¸eÌÌÜÃÉ£:]ä³½Õõ"ƒ8«³åGðëýdWIÁ€ÉMZâà :+–ËtÛ(p˜Ã2žDþ­ëC½úøêð z?e œ=ø¸èùöΚHMZs‹·ß‹ìª6W%ÒÐÛźêZ˜<Å‹ƒ7çG`áÙŸS&rEv>‡]q¶&‚½Ïs™ ¦]–—³E6+nï˺c— žä¹“ÏŸÏþ»ÎÏ']žÃ¨PTä9ޱŽUø³± ÚØ§;nîÓú’¾¢‡ôwúšÑwô˜žÐ?è)}OÏè9ý@/ègšÒ´šå9B°^Ò´¦—ô2}«iuC/K¸Ìjí{m"`a¾(V&Øéœf4û¾N4»›-Ò%½¢WùŒ^ë’^Óë2K묤7ôæþö&[Ñœþ“~£ ºÈªŠ.銴Xeôv"Ú²2/æô;ý¾.êl~¹0f²¤­²enÔ©²À¾Êï¨Ñ¿¦õM™e´þYÐ5ýAÒ;zOÿ¢eeÑu4Š£N÷NÏ;>Û;ŽGýŒá†øOa Üót¢|O‡QÔz:˜p³œv3ø#EbFµ˜w­’O±jïè`ïâ¬Ú?ž _¸cÙÁG \HÏ$Z³dÔ«<êfù ߬Ï];žT@?½<ºøý·“|y¹®ÎÒÕ»ýb17ˆÅ‚ìàãw¨¥¸=)¯Ð`ÖµéŸmJ²xÂ(&YkU(ø0'MFél<Õ™ø21…Ä›A&Íó¬Ìª¼Â”Òž-çʘR¬º4Â$ÂüYå>M™|1™áòáñ™ð¤R~²÷ò|ï£õûìz=…5V¿çÐm…ÂÚu±f]¬ÅÖIèAÍEê ò)ýÐÎÍ+À 1©é½o°žTã÷_½9úðÆü¾XžêÝ>ž°9J ¾ðU¶A°£ù{uw#ß­ÍšŒ¯NÖ jþQI.€Lä´A³ð îw/Lú!r×êI5òÞ½zÝjCp PúuœŠK¨8évöF="8¤n6ìoèÛ‘ýóòO½G^>~+&ðj<¯³r™®`?«†;ã0©µ3j÷ÃÐüò½ROÚU>^|Ü{;;g‹tUÿ/ÜIþ‹#bG=*$Ú€8²EÙ$RÛâ\µYÔ¸kaû—NÙ­À^î²¾ZÍŠy¾º ó«+Hõ¾Íü嵮 "”Ÿq£9tSk¸5̪jÒ•Ñv¡ŽF[ „FEg­¶Æà¥apimÒâ¡BGÞ©uŸtµó\F”èx¨ØÛ^®ì†Òº£h¶”ÚÇ•0yîÆ7ÚJ¾ævEÓ4?jASWñÛ¯v~&Äïú²Ö?qw?­2ývw𸠓ƒ?ñÐ/¥ó²ª1ÜIÙò.õ~\äóú¦Òß–Œ¦ô&é½{û¾pÕŽ{}#\ OxòtáýÛîžtÅúÒ±ïj¤3Oz"žazïæ¸/]ô¥‹Žtì¾ñÁÓÅ÷nÙúÒþôØ—ûÈGOÞ¿³êKòýŽ?éáÓ¥OÞõÕ„÷=%ž,^®ê¬ØäÍCW1üpª§Xvbƒyš±_¡Ù¦.¿¯œØˆZG7þ+tÛÔX÷u 7鯹ŸÒòWèöPãÒ×osÄ‰È |õ+ô{\3Ú×ržRN¹8~ŒøuT…ŸG­±=k¾qÂ×>zõÛ|Ž-…þ¼ˆkÃI¨• †1ÞÂÎÏ_ŸÃqó%æë&¸¯4çÙsbÎæÓ­çÉ0{$af[%ÜÜ:ÀÙðæÌǬM2Ø$Jñƒ0刭Išjʘû¶¬Çâu½€¶ª²ŽÇ/µXt¼þRÿ2Âfi^ãC”ÈlÏtOǪ/ÝwlÜÖ‹Ó2û¡? ô£Ã®–íê`ÓêÐò>ÁÏÍœJ]^aÔð ÅF^¬ÃkL¯7¼¤ÚÄKÆ>¯0á%[„äF„¤èðbc¼Z¼$ÛÄK(Ÿ—ÃK /oäÕÁ^Žá%ZìÅFìE{«eW‹=߈=ï`/ưç-ö|{»z mÞ¢Íygµp)b4aþîÓ*6–?;Ðu¥°;&7H‰:æò17-tA7Üb͉õž|êÅÌ5E{poXì ¿Ñ#ŽÙÞ YÅb«ŽIãZµõ?xžfå²Ì°Šå+Ù(7èа«5Ì9°l+Ö1PŽÈZÙ&™»Ó±Çª…m€]u”b#ö©F'µA¥„uøŒ@ž4ñ˜lÇ8ðø¨uÜ'Õ{$R£lôÊd$ÛèéO7µ:ÁÓËf§If× »df]ymˆõ"¬+ùÈXœg£Wvã ¨ÁÆo?U߯?éÐ{¾؃Û Ø‘‘þÈѶþ<Å9†Éý‘‰LAßå˼ö…6D_ÇÕ:ÝÖŸÿxüÎp¤£Åù¶þóoäb[ÿ!ŒIçóºLWÕ"­óbu™Vyµ,ag¯® “!³ò¾‚>|Q\—éíM>#×e±¾B“¸CÍA¯‡Ö,2ôš\“lÅ}-Ú™âê¶ÈWŽŠÙÞpH¦ m“DMÍë§F@ùðß÷uþ#]à ¬/©Ì<»pT«¢\¦‹ü¯¬Ä)Þ‡ahÌpÝj'µš2OÓÎ@ÓE¿¸Ì/¹qÄý61íyÏsK£S‹+Ü‚,Vmë ÕM6û6*,Ø>bÆÄò³¼ÖÓÿ½¿rñ9N¶Idhf^ý~¢âmÉÞøëôF…0ÎzãÅJÛ`ÂGœeÀÒU­{ˆ15péPµþª¡58ŸÍI,<Á.’]¤êÁ›b ÿJÈ™j‰ …Þ\q•-²%ø '|N·Y¹tÜ”ô&\$ã8˜6­goõˆ‰«®¯ÓÙýl‘VUV-Ó»¼Iœÿ¸´ÓùGŸ÷nã_/9 5¸i®nÓYÖ¦\cÁªªËõ ᇢӎê?Â`FòÕ<»l#÷³ÎÊUºhªZ24üùÚ÷رӨsº uz¹ÈÐï²Ñ­,æI6 ó± §æš À¦)\HI'àÔ yǵZ5‘zu«i pämAA»-tŠ~"Lx®Ž†?ë ¯.ï;àºê WŒ™k«&élIf®÷𳺆x­ŒFAŸMË }ø¨•൮‘%) 6Ù,‡_fà™9–›™Šwn·¡£±Û¥1e7¯$pªóY2†“ÍŽOã2m΋‡ûT¢{'À<] jfóeZ—ùÛËmlزJ\]ÅJt¦œ®µÃºw‡f¶Ë§(/Ñ½Ì ûæNèÙ]8°®WõQ°+±™ºÄ»»ËÜÙF²Î®â:y7ç¯sݼóÔÆÉAî[ÙØežá »- [h„yÆB„yB¡ÿðÞœãÉûñ‰nØ H,Sà„}S‚ŸoÎV.~i#º©êYÍìŽ.l5¶<~\áxº¶é¶‰"˜Dq·—YÄ¢÷Y¿X9HëtQ\o™—4íû÷ÂÅ{ž£YØÇz„~xD^ÜÔõmõ_”þüùs÷:½Ý©Ãl¹ ]í¶yïs\ÌAʇ*;)VŠþ?|v• endstream endobj 335 0 obj << /Type /XRef /Index [0 336] /Size 336 /W [1 3 1] /Root 333 0 R /Info 334 0 R /ID [<4433E4EE34D30CA304E1E3AA5EFB7A1F> <4433E4EE34D30CA304E1E3AA5EFB7A1F>] /Length 773 /Filter /FlateDecode >> stream xÚ%Ô7SQÆñs–°‰"A¢I‚ ‚0 " " 9hi£¥…ŽÎhÁ±sF ¾••RØ8Ž–ZØ;ŽãÐ÷ÿØüæÜ»»g÷¾÷¹¯™ÙßÄ,u07+±Ä<§º Åm´Es=Ü’@ÃëTY¹BäCÂ>(‚b(R(ƒrØ Û-ÙÓ+;6Âa8Ãpf`62_µÐ ýp¸9–¸¯’¦TUPÇÒ:¨‡h‚j·Üv}K´Òê\†Q¸úðCÜrŠ/H[ŽSñXÚmn%_Ô¯šAµqµ:^¥ê–v»Uß7*íB/…cpú€E§'à$œ‚úQ ‚:¹5ö¨ß³pÎkKY[ÊzSÖ›^µ§©†ZïCÝ¢X,À¤[Ç=½c ¦áÜ„Y¸s0O-ë6•^¹k°äÖÿ^­V`•_\Ãu·Áïª6yL)Ù‚;n/p!œ Ú#²3²ÜÆwu5pÝ »A&£Àmæ§n!ÀA€ƒ8Êi¯à MQ n Ô Š[Âjh·»;ºJê‚Ô© ÒD/ 69Øóhu{°­'ˆJ°Ô /A®‚“ä%º“½4`/C]Ž1dƒ¼‰>·‡{jJh‚0Ä)·'…šBCÀÉ‹º•jOâœÛ³§J¶^>FE®‚ÀÇ –™Ó;Mpc…9u&91 «Ìé•$'HN¬1§o!CÁÙuæô‘D*ˆTl0§cO¸‚p…²ÁYˆy ±Åœ~ƒÛpÝ^k æÉãwªrà(H äB?dA ™?­WMzB¿säA>@!ìƒ"(†(…2Pšö»½îQ«L†ÞþÿM¸}ý¦ªÒí÷šª*÷áϪªÝgUÕ¸oþTuÐýù/UµîovUÕ¹ÜQUïIùU ždâKÕÇ¡&a ¦áÌÀM˜…[0:¿  ó»K =×&kWµÚ7m”vfË“GO2¿øö'ûý( endstream endobj startxref 168399 %%EOF cryst/doc/introduction.tex0000644001325400021140000000507313563603571015414 0ustar gaehleruser%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Chapter{Introduction} \index{cryst} The {\Cryst} package, previously known as \package{CrystGAP}, provides functions for the computation with affine crystallographic groups, in particular space groups. For the definition of the standard crystallographic notions we refer to the International Tables \cite{Hah95}, in particular the chapter by Wondratschek \cite{Won95}, and to the introductory chapter in \cite{BBNWZ78}. The principal algorithms used in this package are described in \cite{EGN97}. The present version for {\GAP}~4 has been considerably reworked from an earlier version for {\GAP}~3.4.4. Most of the porting to {\GAP}~4 has been done by Franz G{\accent127 a}hler. Besides affine crystallographic groups acting from the right, also affine crystallographic groups acting from the left are now fully supported. Many algorithms have been added, extended, or improved in other ways. Our warmest thanks go the Max Neunh{\accent127 o}ffer, whose extensive testing of the {\GAP} 4 version of {\Cryst} in connection with {\XGAP} uncovered several bugs and led to many performance improvements. {\Cryst} is implemented in the {\GAP}~4 language, and runs on any system supporting {\GAP}~4. However, certain commands may require that other GAP packages such as {\CaratInterface} or {\XGAP} are installed. In particular, the routines in Section~"Normalizers" are likely to require {\CaratInterface}, and the function WyckoffGraph (see~"WyckoffGraph") requires {\XGAP}. Both {\CaratInterface} and {\XGAP} may be available only under Unix. The {\Cryst} package is loaded with the command \beginexample gap> LoadPackage( "cryst" ); true \endexample {\Cryst} has been developed by \beginitems Bettina Eick & Fachbereich Mathematik und Informatik\hfil\break Technische Universit\accent127at Braunschweig\hfil\break Pockelsstr. 14, D-38106 Braunschweig, Germany\hfil\break e-mail: \Mailto{b.eick@tu-bs.de} Franz G{\accent127 a}hler & Fakult\accent127at f\accent127ur Mathematik, Universit\accent127at Bielefeld\hfil\break Postfach 10 01 31, D-33501 Bielefeld, Germany\hfil\break e-mail: \Mailto{gaehler@math.uni-bielefeld.de} Werner Nickel & Fachbereich Mathematik, AG2, Technische Universit{\accent127 a}t Darmstadt, \hfill\break Schlossgartenstra{\ss}e 7, D-64289 Darmstadt, Germany \hfil\break e-mail: \Mailto{nickel@mathematik.tu-darmstadt.de} \enditems For bug reports, suggestions and comments please please use the issue tracker on GitHub: \beginitems & \URL{https://github.com/gap-packages/Cryst/issues/} \enditems cryst/doc/manual.six0000644001325400021140000000672715064274357014166 0ustar gaehleruserC introduction.tex 1. Introduction I 1.0. cryst C cryst.tex 2. Affine crystallographic groups F 2.0. SetCrystGroupDefaultAction S 2.1. Construction I 2.1. construction!of an AffineCrystGroup F 2.1. AffineCrystGroupOnRight F 2.1. AffineCrystGroupOnRight F 2.1. AffineCrystGroupOnRight F 2.1. AsAffineCrystGroupOnRight F 2.1. IsAffineCrystGroupOnRight F 2.1. AffineCrystGroupOnLeft F 2.1. AffineCrystGroupOnLeft F 2.1. AffineCrystGroupOnLeft F 2.1. AsAffineCrystGroupOnLeft F 2.1. IsAffineCrystGroupOnLeft F 2.1. AffineCrystGroup F 2.1. AffineCrystGroup F 2.1. AffineCrystGroup F 2.1. AsAffineCrystGroup F 2.1. IsAffineCrystGroup F 2.1. TransposedMatrixGroup S 2.2. Point group I 2.2. point group!of an AffineCrystGroup F 2.2. PointGroup F 2.2. IsPointGroup F 2.2. AffineCrystGroupOfPointGroup F 2.2. PointHomomorphism F 2.2. IsPointHomomorphism S 2.3. Translation lattice I 2.3. translation lattice!of an AffineCrystGroup F 2.3. TranslationBasis F 2.3. InternalBasis F 2.3. AddTranslationBasis F 2.3. CheckTranslationBasis F 2.3. IsSpaceGroup F 2.3. IsStandardAffineCrystGroup F 2.3. IsStandardSpaceGroup F 2.3. StandardAffineCrystGroup F 2.3. IsSymmorphicSpaceGroup S 2.4. Special methods I 2.4. methods!for an AffineCrystGroup I 2.4. \\{\accent 94 }!for an `AffineCrystGroup' F 2.4. power!for an `AffineCrystGroup' F 2.4. IsomorphismFpGroup!for a `PointGroup' F 2.4. IsomorphismFpGroup!for an `AffineCrystGroup' F 2.4. IsomorphismPcpGroup!for a `PointGroup' F 2.4. IsomorphismPcpGroup!for an `AffineCrystGroup' S 2.5. Maximal subgroups I 2.5. subgroups!maximal!for an AffineCrystGroup I 2.5. maximal subgroups!for an AffineCrystGroup F 2.5. MaximalSubgroupClassReps!for an `AffineCrystGroup' F 2.5. ConjugacyClassesMaximalSubgroups!for an `AffineCrystGroup' S 2.6. Space groups with a given point group I 2.6. space groups!for given point group F 2.6. SpaceGroupsByPointGroupOnRight F 2.6. SpaceGroupsByPointGroupOnRight F 2.6. SpaceGroupsByPointGroupOnRight F 2.6. SpaceGroupTypesByPointGroupOnRight F 2.6. SpaceGroupTypesByPointGroupOnRight F 2.6. SpaceGroupsByPointGroupOnLeft F 2.6. SpaceGroupsByPointGroupOnLeft F 2.6. SpaceGroupsByPointGroupOnLeft F 2.6. SpaceGroupTypesByPointGroupOnLeft F 2.6. SpaceGroupTypesByPointGroupOnLeft F 2.6. SpaceGroupsByPointGroup F 2.6. SpaceGroupsByPointGroup F 2.6. SpaceGroupsByPointGroup F 2.6. SpaceGroupTypesByPointGroupOnLeft F 2.6. SpaceGroupTypesByPointGroupOnLeft S 2.7. Wyckoff positions F 2.7. WyckoffPositions F 2.7. WyckoffPositionsByStabilizer F 2.7. IsWyckoffPosition F 2.7. WyckoffBasis F 2.7. WyckoffTranslation F 2.7. WyckoffSpaceGroup F 2.7. WyckoffStabilizer F 2.7. WyckoffOrbit F 2.7. WyckoffGraph F 2.7. WyckoffGraph S 2.8. Normalizers I 2.8. normalizer!of an AffineCrystGroup F 2.8. NormalizerPointGroupInGLnZ F 2.8. CentralizerPointGroupInGLnZ I 2.8. normalizer!in translation group F 2.8. TranslationNormalizer I 2.8. normalizer!in affine group F 2.8. AffineNormalizer F 2.8. AffineInequivalentSubgroups F 2.8. ConjugatorSpaceGroups S 2.9. Color groups F 2.9. ColorGroup F 2.9. IsColorGroup F 2.9. ColorSubgroup F 2.9. ColorCosetList F 2.9. ColorOfElement F 2.9. ColorPermGroup F 2.9. ColorHomomorphism F 2.9. Subgroup!for color groups S 2.10. Colored AffineCrystGroups F 2.10. PointGroup!for a colored `AffineCrystGroup' I 2.10. colorings!inequivalent!for space group S 2.11. International Tables F 2.11. SpaceGroupSettingsIT F 2.11. SpaceGroupOnRightIT F 2.11. SpaceGroupOnRightIT F 2.11. SpaceGroupOnLeftIT F 2.11. SpaceGroupOnLeftIT F 2.11. SpaceGroupIT F 2.11. SpaceGroupIT cryst/doc/manual.lab0000644001325400021140000001142115064274357014104 0ustar gaehleruser\makelabel{cryst:Introduction}{1} \makelabel{cryst:Affine crystallographic groups}{2} \makelabel{cryst:SetCrystGroupDefaultAction}{2} \makelabel{cryst:Construction}{2.1} \makelabel{cryst:AffineCrystGroupOnRight}{2.1.1} \makelabel{cryst:AffineCrystGroupOnRight}{2.1.1} \makelabel{cryst:AffineCrystGroupOnRight}{2.1.1} \makelabel{cryst:AsAffineCrystGroupOnRight}{2.1.2} \makelabel{cryst:IsAffineCrystGroupOnRight}{2.1.3} \makelabel{cryst:AffineCrystGroupOnLeft}{2.1.4} \makelabel{cryst:AffineCrystGroupOnLeft}{2.1.4} \makelabel{cryst:AffineCrystGroupOnLeft}{2.1.4} \makelabel{cryst:AsAffineCrystGroupOnLeft}{2.1.5} \makelabel{cryst:IsAffineCrystGroupOnLeft}{2.1.6} \makelabel{cryst:AffineCrystGroup}{2.1.7} \makelabel{cryst:AffineCrystGroup}{2.1.7} \makelabel{cryst:AffineCrystGroup}{2.1.7} \makelabel{cryst:AsAffineCrystGroup}{2.1.8} \makelabel{cryst:IsAffineCrystGroup}{2.1.9} \makelabel{cryst:TransposedMatrixGroup}{2.1.10} \makelabel{cryst:Point group}{2.2} \makelabel{cryst:PointGroup}{2.2.1} \makelabel{cryst:IsPointGroup}{2.2.2} \makelabel{cryst:AffineCrystGroupOfPointGroup}{2.2.3} \makelabel{cryst:PointHomomorphism}{2.2.4} \makelabel{cryst:IsPointHomomorphism}{2.2.5} \makelabel{cryst:Translation lattice}{2.3} \makelabel{cryst:TranslationBasis}{2.3.1} \makelabel{cryst:InternalBasis}{2.3.2} \makelabel{cryst:AddTranslationBasis}{2.3.3} \makelabel{cryst:CheckTranslationBasis}{2.3.4} \makelabel{cryst:IsSpaceGroup}{2.3.5} \makelabel{cryst:IsStandardAffineCrystGroup}{2.3.6} \makelabel{cryst:IsStandardSpaceGroup}{2.3.7} \makelabel{cryst:StandardAffineCrystGroup}{2.3.8} \makelabel{cryst:IsSymmorphicSpaceGroup}{2.3.9} \makelabel{cryst:Special methods}{2.4} \makelabel{cryst:power!for an `AffineCrystGroup'}{2.4.1} \makelabel{cryst:IsomorphismFpGroup!for a `PointGroup'}{2.4.2} \makelabel{cryst:IsomorphismFpGroup!for an `AffineCrystGroup'}{2.4.3} \makelabel{cryst:IsomorphismPcpGroup!for a `PointGroup'}{2.4.4} \makelabel{cryst:IsomorphismPcpGroup!for an `AffineCrystGroup'}{2.4.5} \makelabel{cryst:Maximal subgroups}{2.5} \makelabel{cryst:MaximalSubgroupClassReps!for an `AffineCrystGroup'}{2.5.1} \makelabel{cryst:ConjugacyClassesMaximalSubgroups!for an `AffineCrystGroup'}{2.5.2} \makelabel{cryst:Space groups with a given point group}{2.6} \makelabel{cryst:SpaceGroupsByPointGroupOnRight}{2.6.1} \makelabel{cryst:SpaceGroupsByPointGroupOnRight}{2.6.1} \makelabel{cryst:SpaceGroupsByPointGroupOnRight}{2.6.1} \makelabel{cryst:SpaceGroupTypesByPointGroupOnRight}{2.6.2} \makelabel{cryst:SpaceGroupTypesByPointGroupOnRight}{2.6.2} \makelabel{cryst:SpaceGroupsByPointGroupOnLeft}{2.6.3} \makelabel{cryst:SpaceGroupsByPointGroupOnLeft}{2.6.3} \makelabel{cryst:SpaceGroupsByPointGroupOnLeft}{2.6.3} \makelabel{cryst:SpaceGroupTypesByPointGroupOnLeft}{2.6.4} \makelabel{cryst:SpaceGroupTypesByPointGroupOnLeft}{2.6.4} \makelabel{cryst:SpaceGroupsByPointGroup}{2.6.5} \makelabel{cryst:SpaceGroupsByPointGroup}{2.6.5} \makelabel{cryst:SpaceGroupsByPointGroup}{2.6.5} \makelabel{cryst:SpaceGroupTypesByPointGroupOnLeft}{2.6.6} \makelabel{cryst:SpaceGroupTypesByPointGroupOnLeft}{2.6.6} \makelabel{cryst:Wyckoff positions}{2.7} \makelabel{cryst:WyckoffPositions}{2.7.1} \makelabel{cryst:WyckoffPositionsByStabilizer}{2.7.2} \makelabel{cryst:IsWyckoffPosition}{2.7.3} \makelabel{cryst:WyckoffBasis}{2.7.4} \makelabel{cryst:WyckoffTranslation}{2.7.5} \makelabel{cryst:WyckoffSpaceGroup}{2.7.6} \makelabel{cryst:WyckoffStabilizer}{2.7.7} \makelabel{cryst:WyckoffOrbit}{2.7.8} \makelabel{cryst:WyckoffGraph}{2.7.9} \makelabel{cryst:WyckoffGraph}{2.7.9} \makelabel{cryst:Normalizers}{2.8} \makelabel{cryst:NormalizerPointGroupInGLnZ}{2.8.1} \makelabel{cryst:CentralizerPointGroupInGLnZ}{2.8.2} \makelabel{cryst:TranslationNormalizer}{2.8.3} \makelabel{cryst:AffineNormalizer}{2.8.4} \makelabel{cryst:AffineInequivalentSubgroups}{2.8.5} \makelabel{cryst:ConjugatorSpaceGroups}{2.8.6} \makelabel{cryst:Color groups}{2.9} \makelabel{cryst:ColorGroup}{2.9.1} \makelabel{cryst:IsColorGroup}{2.9.2} \makelabel{cryst:ColorSubgroup}{2.9.3} \makelabel{cryst:ColorCosetList}{2.9.4} \makelabel{cryst:ColorOfElement}{2.9.5} \makelabel{cryst:ColorPermGroup}{2.9.6} \makelabel{cryst:ColorHomomorphism}{2.9.7} \makelabel{cryst:Subgroup!for color groups}{2.9.8} \makelabel{cryst:Colored AffineCrystGroups}{2.10} \makelabel{cryst:PointGroup!for a colored `AffineCrystGroup'}{2.10.1} \makelabel{cryst:International Tables}{2.11} \makelabel{cryst:SpaceGroupSettingsIT}{2.11.1} \makelabel{cryst:SpaceGroupOnRightIT}{2.11.2} \makelabel{cryst:SpaceGroupOnRightIT}{2.11.2} \makelabel{cryst:SpaceGroupOnLeftIT}{2.11.3} \makelabel{cryst:SpaceGroupOnLeftIT}{2.11.3} \makelabel{cryst:SpaceGroupIT}{2.11.4} \makelabel{cryst:SpaceGroupIT}{2.11.4} \makelabel{cryst:Bibliography}{} \setcitlab {BBNWZ78}{BBNWZ78} \setcitlab {EGN97}{EGN97} \setcitlab {Hah95}{Hah95} \setcitlab {Won95}{Won95} \makelabel{cryst:Index}{} cryst/doc/cryst.tex0000644001325400021140000011157215036140335014030 0ustar gaehleruser%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %A cryst.tex GAP documentation Bettina Eick %A & Franz Gaehler %A & Werner Nickel %% %Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Chapter{Affine crystallographic groups} An affine crystallographic group is a subgroup of the group of all Euclidean motions of $d$-dimensional space, with the property that its subgroup of all pure translations is a discrete normal subgroup of finite index. If the rank of the translation subgroup is $d$, is called a space group. The quotient / is called the point group of . In this package, affine crystallographic groups are represented as groups of augmented matrices of dimension $d+1$. Most functions assume a group of rational matrices, but some may also work with cyclotomic matrix groups. In particular, it is possible to compute the translation basis of an affine crystallographic group given in a cyclotomic representation, and to pass to a rational representation by conjugating with that basis. Further functionality for cyclotomic crystallographic groups is currently not guaranteed. Augmented matrices can take one of two forms. Matrices of the form \begintt [ M 0 ] [ t 1 ] \endtt act from the right on row vectors $(x,1)$. Such a matrix is said to be an affine matrix acting on the right. Since in {\GAP} all groups act from the right, this is the preferred representation of an affine transformation. The second representation of affine transformations is by augmented matrices of the form \begintt [ M t ] [ 0 1 ] \endtt which act from the left on column vectors $(x,1)$. Such matrices are said to be affine matrices acting on the left. This is the representation usually adopted by crystallographers. {\Cryst} supports affine crystallographic groups in both representations. Every affine crystallographic group is constructed in one of these two representations. Affine crystallographic groups in different representations should never be mixed, however. It is recommended to adopt one of the two representations, and then to stick to that decision. In order to facilitate this, there is a global variable `CrystGroupDefaultAction', whose value is either `RightAction' or `LeftAction'. The initial value is `RightAction', but this can be changed with \> SetCrystGroupDefaultAction( ) F where must be either `RightAction' or `LeftAction'. Constructor functions without explicit representation qualifier then will construct an affine crystallographic group in the representation specified by `CrystGroupDefaultAction'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Construction} \atindex{construction!of an AffineCrystGroup}% {@construction!of an \noexpand`AffineCrystGroup'} \> AffineCrystGroupOnRight( ) F \> AffineCrystGroupOnRight( ) F \> AffineCrystGroupOnRight( , ) F returns the matrix group generated by or , which must be affine matrices acting on the right, as affine crystallographic group acting on the right. An already existing group of affine matrices acting on the right can be converted to an affine crystallographic group acting on the right with \>AsAffineCrystGroupOnRight( ) F The property \>IsAffineCrystGroupOnRight( ) P is `true' exactly for those groups which have been constructed in the above two ways. \>AffineCrystGroupOnLeft( ) F \>AffineCrystGroupOnLeft( ) F \>AffineCrystGroupOnLeft( , ) F returns the matrix group generated by or , which must be affine matrices acting on the left, as affine crystallographic group acting on the left. An already existing group of affine matrices acting on the left can be converted to an affine crystallographic group acting on the left with \>AsAffineCrystGroupOnLeft( ) F The property \>IsAffineCrystGroupOnLeft( ) P is `true' exactly for those groups which have been constructed in the above two ways. It is recommended to adopt one representation for affine crystallographic groups, and then to stick to it. To facilitate this, routines are provided which assume a default representation. \>AffineCrystGroup( ) F \>AffineCrystGroup( ) F \>AffineCrystGroup( , ) F calls `AffineCrystGroupOnRight' or `AffineCrystGroupOnLeft' with the same arguments, depending on the value of `CrystGroupDefaultAction'. \>AsAffineCrystGroup( ) F calls `AsAffineCrystGroupOnRight' or `AsAffineCrystGroupOnLeft' with the same argument, depending on the value of `CrystGroupDefaultAction'. \>IsAffineCrystGroup( ) F calls `IsAffineCrystGroupOnRight' or `IsAffineCrystGroupOnLeft' with the same argument, depending on the value of `CrystGroupDefaultAction'. \>TransposedMatrixGroup( ) A returns the transpose of the affine crystallographic group . If is acting on the right, its transpose is acting on the left, and vice versa. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Point group} \atindex{point group!of an AffineCrystGroup}% {@point group!of an \noexpand`AffineCrystGroup'} The point group

    of an affine crystallographic group is the quotient /, where is the normal subgroup of all pure translations.

    is isomorphic to the group generated by the linear parts of all affine matrices contained in . In {\Cryst} this latter group is identified with the point group of . \>PointGroup( ) A returns the point group of . \>IsPointGroup(

    ) P returns `true' if and only if

    has been constructed as the point group of an affine crystallographic group . \>AffineCrystGroupOfPointGroup(

    ) A returns the affine crystallographic group , from which

    has been constructed. \>PointHomomorphism( ) A returns a homomorphism from the affine crystallographic group to its point group. \>IsPointHomomorphism( ) P returns `true' if and only if has been constructed as the `PointHomomorphism' of an affine crystallographic group. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Translation lattice} \atindex{translation lattice!of an AffineCrystGroup}% {@translation lattice!of an \noexpand`AffineCrystGroup'} The vectors by which the pure translations in an affine crystallographic group translate form a discrete lattice, , called the translation lattice of . \>TranslationBasis( ) A returns a basis of the translation lattice of . The basis returned is unique for the translation lattice. \>InternalBasis( ) A returns a basis used internally for many computations. It consists of the translation basis of , extended by further standard basis vectors if has not full rank. If a generating set of the translation lattice of is known from somewhere, this knowledge can be added to with \>AddTranslationBasis( , ) F This function must do further work, so that `SetTranslationBasis' cannot be used for this purpose. If doubts arise about the correctness of the translation basis that has been added by hand, one can check the correctness of the stored value with \>CheckTranslationBasis( ) F An affine crystallographic group acting on $d$-dimensional Euclidean space is called a *space group* if its translation lattice has rank $d$. \>IsSpaceGroup( ) P tests if the affine crystallographic group is a space group. Since many computations are done internally in the `InternalBasis' of , we say that is in standard form if the `InternalBasis' is the standard basis of Euclidean row space or column space, respectively. This means that the translation lattice is generated by the first $k$ standard basis vectors, where $k$ is the rank of the translation lattice. \>IsStandardAffineCrystGroup( ) P checks if is in standard form. \>IsStandardSpaceGroup( ) P checks if is a space group in standard form. \>StandardAffineCrystGroup( ) F returns a conjugate of which is in standard form. If an space group is a semi-direct product of its point group with its translation subgroup, is said to be symmorphic. \>IsSymmorphicSpaceGroup( ) P checks if the space group is symmorphic. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Special methods} \atindex{methods!for an AffineCrystGroup}% {@methods!for an \noexpand`AffineCrystGroup'} In the representation by augmented matrices, affine crystallographic groups are infinite matrix groups. Their infinity is relatively trivial in the sense that they have an abelian normal subgroup of finite index. Nevertheless, for many operations special methods have to be installed that avoid to attempt algorithms that never finish. These methods all make essential use of the exactness of the sequence of homomorphism `0 -> -> ->

    -> 1', where is the translation subgroup of , and

    its point group. All operations for general groups that make sense for affine crystallographic groups should work also in that case. In particular, there should be no restrictions for finite `AffineCrystGroups'. For infinite groups, some restrictions apply, however. For instance, algorithms from the orbit-stabilizer family can work only if the orbits generated are finite. Note, however, that `Normalizer', `Centralizer' and `RepresentativeAction' in an `AffineCrystGroup' work even if the corresponding orbit is infinite. Some methods installed for affine crystallographic groups have a special behavior. \indextt{\\\^{}!for an \noexpand`AffineCrystGroup'} \>`\\^( , )'{power!for an `AffineCrystGroup'}% @{power!for an `AffineCrystGroup'} If is an `AffineCrystGroupOnRight', the group is returned. must be an affine matrix acting on the right. If is an `AffineCrystGroupOnLeft', the group is returned. must be an affine matrix acting on the left. \>IsomorphismFpGroup(

    )!{for a `PointGroup'} A returns an isomorphism from the `PointGroup'

    to an isomorphic `FpGroup' . If

    is solvable, is given in a power-commutator presentation. \>IsomorphismFpGroup( )!{for an `AffineCrystGroup'} A returns an isomorphism from the `AffineCrystGroup' to an isomorphic `FpGroup' . If is solvable, is given in a power-commutator presentation. The presentation of is an extension of the presentation of the point group

    of used in `IsomorphismFpGroup(

    )'. If the package polycyclic is installed, {\Cryst} automatically loads it, and then provides special methods for `IsomorphismPcpGroup'. \>IsomorphismPcpGroup(

    )!{for a `PointGroup'} A with

    a solvable `PointGroup', returns an isomorphism from

    to an isomorphic `PcpGroup' . For details about `PcpGroups', we refer to the documentation of the package polycyclic. \>IsomorphismPcpGroup( )!{for an `AffineCrystGroup'} A with a solvable `AffineCrystGroup' (i.e., one with a solvable `PointGroup'), returns an isomorphism from to an isomorphic `PcpGroup' . The presentation of is an extension of the presentation of the point group

    of used in `IsomorphismPcpGroup(

    )'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Maximal subgroups} \atindex{subgroups!maximal!for an AffineCrystGroup}% {@subgroups!maximal!for an \noexpand`AffineCrystGroup'} \atindex{maximal subgroups!for an AffineCrystGroup}% {@maximal subgroups!for an \noexpand`AffineCrystGroups'} Since an `AffineCrystGroup' has infinitely many maximal subgroups in general, in the computation of maximal subgroups it must be further specified which maximal subgroups are desired. Recall that a maximal subgroup of an `AffineCrystGroup' is either latticeequal or classequal. A latticeequal subgroup has the same translation lattice as the parent, while a classequal subgroup has the same point group as the parent. In the classequal case a maximal subgroup always has prime-power index, whereas in the latticeequal case this is so only in dimensions up to 3. \>MaximalSubgroupClassReps( , )!{for an `AffineCrystGroup'} O returns a list of conjugacy class representatives of maximal subgroups of the `AffineCrystGroup' . \>ConjugacyClassesMaximalSubgroups( , )!{for an `AffineCrystGroup'} O returns a list of conjugacy classes of maximal subgroups of the `AffineCrystGroup' . In these two functions, the argument specifies which maximal subgroups are computed. is a record which may have the following components: \beginitems `flags.primes := [p1 .. pr]' & only maximal subgroups of p-power index for the given primes p are computed `flags.latticeequal := true' & only latticeequal maximal subgroups are computed `flags.classequal := true' & only classequal maximal subgroups are computed \enditems `flags.latticeequal' and `flags.classequal' must not both be bound and `true'. `flags.primes' may be omitted only if `flags.latticeequal' is bound and `true'. \beginexample gap> S := SpaceGroupIT(3,222); SpaceGroupOnRightIT(3,222,'2') gap> L := MaximalSubgroupClassReps( S, rec( primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 3, 27, 125 ] gap> L := MaximalSubgroupClassReps( S, > rec( classequal := true, primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 27, 125 ] gap> L := MaximalSubgroupClassReps( S, > rec( latticeequal := true, primes := [3,5] ) );; gap> List( L, IndexInParent ); [ 3 ] gap> L := MaximalSubgroupClassReps( S, rec( latticeequal := true ) );; gap> Length(L); 5 gap> List( L, IndexInParent ); [ 2, 2, 2, 3, 4 ] \endexample %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Space groups with a given point group} \index{space groups!for given point group} \>SpaceGroupsByPointGroupOnRight(

    ) O \>SpaceGroupsByPointGroupOnRight(

    , ) O \>SpaceGroupsByPointGroupOnRight(

    , , ) O where

    is any finite subgroup of $GL(d,\Z)$, returns a list of all space groups (acting on the right) with point group

    , up to conjugacy in the full translation group of Euclidean space. All these space groups are returned as `AffineCrystGroupOnRight' in standard representation. If a second argument is present, which must be a list of elements of the normalizer of

    in $GL(d,\Z)$, only space groups inequivalent under conjugation with these elements are returned. If these normalizer elements, together with

    , generate the full normalizer of

    in $GL(d,\Z)$, then exactly one representative of each space group type is obtained. If the third argument , which must be `false' or `true', is also present and `true', all space groups up to conjugacy in the full translation group are returned, but these space groups are collected into orbits under the conjugation action with elements from . \beginexample gap> P := Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]); Group([ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ] ]) gap> norm := GeneratorsOfGroup( NormalizerInGLnZ( P ) ); [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ -1, 0 ], [ 0, -1 ] ], [ [ 1, 0 ], [ 0, -1 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ] gap> SpaceGroupsByPointGroupOnRight( P ); [ , , , ] gap> SpaceGroupsByPointGroupOnRight( P, norm ); [ , , ] gap> SpaceGroupsByPointGroupOnRight( P, norm, true ); [ [ ], [ , ], [ ] ] \endexample \>SpaceGroupTypesByPointGroupOnRight(

    ) O \>SpaceGroupTypesByPointGroupOnRight(

    , ) O returns a list of space group type representatives (acting on the right) of the point group

    . As in the case of `SpaceGroupsByPointGroupOnRight', if the boolean argument is present and `true', not only space group type representatives, but all space groups up to conjugacy in the full translation group are returned. These are then collected into lists of space groups of the same space group type. \beginexample gap> SpaceGroupTypesByPointGroupOnRight( P ); [ , , ] gap> SpaceGroupTypesByPointGroupOnRight( P, true ); [ [ ], [ , ], [ ] ] \endexample \>SpaceGroupsByPointGroupOnLeft(

    ) O \>SpaceGroupsByPointGroupOnLeft(

    , ) O \>SpaceGroupsByPointGroupOnLeft(

    , , ) O works the same way as `SpaceGroupsByPointGroupOnRight', except that the space groups acting from the left are returned. \>SpaceGroupTypesByPointGroupOnLeft(

    ) O \>SpaceGroupTypesByPointGroupOnLeft(

    , ) O works the same way as `SpaceGroupTypesByPointGroupOnRight', except that the space groups acting from the left are returned. \>SpaceGroupsByPointGroup(

    ) O \>SpaceGroupsByPointGroup(

    , ) O \>SpaceGroupsByPointGroup(

    , , ) O calls `SpaceGroupByPointGroupOnRight' or `SpaceGroupByPointGroupOnLeft' with the same arguments, depending on the value of `CrystGroupDefaultAction'. \>SpaceGroupTypesByPointGroupOnLeft(

    ) O \>SpaceGroupTypesByPointGroupOnLeft(

    , ) O calls either `SpaceGroupTypesByPointGroupOnRight' or `SpaceGroupTypesByPointGroupOnLeft' with the same arguments, depending on the variable `CrystGroupDefaultAction'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Wyckoff positions} A Wyckoff position of a space group is an equivalence class of points in Euclidean space, having stabilizers which are conjugate subgroups of . Apart from a subset of lower dimension, which contains points with even bigger stabilizers, a Wyckoff position consists of an -orbit of some affine subspace . In {\Cryst}, a Wyckoff position is specified by such a representative affine subspace. \>WyckoffPositions( ) A returns the list of Wyckoff positions of the space group . \beginexample gap> S := SpaceGroupIT(2,14); SpaceGroupOnRightIT(2,14,'1') gap> W := WyckoffPositions(S); [ < Wyckoff position, point group 1, translation := [ 0, 0 ], basis := [ ] > , < Wyckoff position, point group 1, translation := [ 1/3, 2/3 ], basis := [ ] > , < Wyckoff position, point group 1, translation := [ 2/3, 1/3 ], basis := [ ] > , < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] > , < Wyckoff position, point group 3, translation := [ 0, 0 ], basis := [ [ 1, 0 ], [ 0, 1 ] ] > ] \endexample In the previous example, has three kinds of special points (the basis is empty), whose representatives all have a stabilizer with the a point group in the same conjugacy class (with label 1), one kind of special line (the basis has length 1), and the general position. \>WyckoffPositionsByStabilizer( , ) O where is a space group and a subgroup of the point group or a list of such subgroups, determines only the Wyckoff positions whose representatives have a stabilizer with a point group conjugate to the subgroup or to a subgroup contained in the list , respectively. \beginexample gap> sub := Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]); Group([ [ [ 0, -1 ], [ -1, 0 ] ] ]) gap> IsSubgroup( PointGroup( S ), sub ); true gap> WyckoffPositionsByStabilizer( S, sub ); [ < Wyckoff position, point group 1, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] > ] \endexample \>IsWyckoffPosition( ) R checks whether is a Wyckoff position. \beginexample gap> ForAll( W, IsWyckoffPosition ); true \endexample \>WyckoffBasis( ) O returns a basis of the representative affine subspace of the Wyckoff position . \beginexample gap> WyckoffBasis( W[4] ); [ [ 1, -1 ] ] \endexample \>WyckoffTranslation( ) O returns a point of the representative affine subspace of the Wyckoff position . \beginexample gap> WyckoffTranslation( W[3] ); [ 2/3, 1/3 ] \endexample \>WyckoffSpaceGroup( ) O returns the space group of which is a Wyckoff position. \beginexample gap> WyckoffSpaceGroup( W[1] ); SpaceGroupOnRightIT(2,14,'1') \endexample \>WyckoffStabilizer( ) O returns the stabilizer of the (generic) points in the representative affine subspace of the Wyckoff position . This stabilizer is a subgroup of the space group of , and thus an `AffineCrystGroup'. \beginexample gap> stab := WyckoffStabilizer( W[4] ); Group([ [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ] ]) gap> IsAffineCrystGroupOnRight( stab ); true \endexample \>WyckoffOrbit( ) O determines the orbit of the representative affine subspace of the Wyckoff position under the space group of (modulo lattice translations). The affine subspaces in this orbit are then converted into a list of Wyckoff positions, which is returned. The Wyckoff positions in this list are just different representations of . Their `WyckoffBasis' and `WyckoffTranslation' are chosen such that the induced parametrizations of their representative subspaces are mapped onto each other under the space group operation. \beginexample gap> orb := WyckoffOrbit( W[4] ); [ < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ -2, -1 ] ] > , < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, -1 ] ] > , < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ 1, 2 ] ] > ] gap> Set(orb); [ < Wyckoff position, point group 2, translation := [ 0, 0 ], basis := [ [ -2, -1 ] ] > ] \endexample \>WyckoffGraph( [, def ] ) O \>WyckoffGraph( [, def ] ) O displays the incidence relations of a set of Wyckoff positions graphically. This function is available only under {\XGAP}. In the first form, is a list of Wyckoff positions, which must belong to the same space group. In the second form, is a space group; in this case, the function is applied to the complete list of Wyckoff positions of . In both forms, a second argument, , is possible, which is a record with optional components `title', `width' and `height', specifying the title, width and height of the graphic sheet on which the graph will be displayed. Each vertex of the graph represents a Wyckoff position. Vertices are arranged in horizontal layers, determined by the dimension of the Wyckoff position and the size of its stabilizer. For each layer, the list <[ d, s ]> is displayed at the right border of the graphic sheet. The vertical positions of the layers are ordered according to the dimension of the Wyckoff position (primary criterion, smaller dimension above) and the size of the stabilizer (secondary criterion, bigger stabilizer above). Two Wyckoff positions are connected if the closure of the lower one contains the upper one. Two Wyckoff positions are connected by a line only if there is no Wyckoff position in between. The connection line is labelled with the number of affine subspaces contained in the lower Wyckoff position that contain a fixed representative affine subspace of the upper Wyckoff position. For instance, if the lower Wyckoff position consists of a space group orbit of lines (and thus the upper one of an orbit of points), the label of the connection line is the number of lines in the orbit which cross a fixed representative point of the upper Wyckoff position. The initial layout of the graph is not always optimal. In particular, several connection lines can be drawn on top of each other, so that it is not easy to see who is connected with whom. With the left mouse button, the graph can be rearranged, however. Just drag each vertex to a more suitable place. Note, however, that a vertex can not leave its layer. For more details, please consult the {\XGAP} manual. By right-clicking on a vertex, a popup menu with information on the Wyckoff position of that vertex appears. It informs on the size of the `WyckoffStabilizer', the dimension of the Wyckoff position, the length of the `WyckoffOrbit' (modulo lattice translations), the translation and basis of a representative affine subspace, the isomorphims type of the `WyckoffStabilizer', and the ConjugacyClassInfo of the point group

    of the `WyckoffStabilizer'. The ConjugacyClassInfo lists for each conjugacy class of elements of

    the number of that class, the order, trace and determinant of its elements, and the size of the class. This information is useful to identify the geometric operation of the stabilizer. The isomorphism type and ConjugacyClassInfo may not be displayed initially. It this case, they can be obtained by left-clicking on them, or by left-clicking on the button labelled . Unfortunately, the popup window cannot be resized automatically, and since the ConjugacyClassInfo needs several lines for the display, the information may be hidden behind the border of the window. You will have to use the slider of the popup window to make it visible, or resize the window with the help of your window manager. Alternatively, you can right-click again on the same vertex, in which case a new popup window of sufficient size appears. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Normalizers} \atindex{normalizer!of an AffineCrystGroup}% {@normalizer!of an \noexpand`AffineCrystGroup'} At present, most of the functions in this section require that the {\GAP} package {\CaratInterface} is installed (and compiled). Otherwise, they are available only for space groups from the crystallographic groups catalogue or the International Tables (section "International Tables"). \>NormalizerPointGroupInGLnZ(

    ) A returns the normalizer of the `PointGroup'

    in the group of all unimodular transformations of the lattice spanned by the `InternalBasis' of the `AffineCrystGroup' of

    . If is in standard representation, this is the same as `Normalizer( GL(dim,Integers), P )', otherwise it is `Normalizer( GL(dim,Integers), P^(B^-1) )^B'. This notion probably makes sense only if is a space group. Note that

    must have elements with integer entries (which is the case if is a space group). \>CentralizerPointGroupInGLnZ(

    ) A returns the centralizer of the `PointGroup'

    in the group of all unimodular transformations of the lattice spanned by the `InternalBasis' of the `AffineCrystGroup' of

    . If is in standard representation, this is the same as `Centralizer( GL(dim,Integers), P )', otherwise it is `Centralizer( GL(dim,Integers), P^(B^-1) )^B'. This notion probably makes sense only if is a space group. Note that

    must have elements with integer entries (which is the case if is a space group). \index{normalizer!in translation group} \>TranslationNormalizer( ) F returns the normalizer of the space group in the full translation group. At present, this function is implemented only for space groups, not for general `AffineCrystGroups'. The translation normalizer of may contain a continuous subgroup . A basis of the space of such continuous translations is bound in `TN!.continuousTranslations'. Since this subgroup is not finitely generated, it is *not* contained in the group generated by `GeneratorsOfGroup( )'. Properly speaking, the translation normalizer is the span of and together. \index{normalizer!in affine group} \>AffineNormalizer( ) F returns the affine normalizer of the space group . The affine normalizer contains the translation normalizer as a subgroup. Similarly as with `TranslationNormalizer', the subgroup of continuous translations, which is not finitely generated, is not part of the group that is returned. However, a basis of the space of continuous translations is bound in the component `AF!.continuousTranslations'. \>AffineInequivalentSubgroups( , ) F takes as input a space group and list of subgroups of , and returns a sublist of affine inequivalent subgroups. Note that the affine normalizer of must be discrete in the current implementation. If it is not, `fail' is returned. For two space groups and of the same dimension (and acting from the same side), \>ConjugatorSpaceGroups( , ) F returns an affine matrix such that `S1\^{}m = S2', of `fail' if no such matrix exists, i.e., if the two space groups are not equivalent. This function requires that the {\GAP} package {\CaratInterface} is installed (and compiled). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Color groups} A color group is a group whose elements are colored in the following way. The elements having the same color as the identity element `One(C)' form a subgroup of finite index . is called the `ColorSubgroup' of . Elements of have the same color if and only if they are in the same right coset of in . The labelling of the colors, which runs from 1 to , is determined by a fixed labelling of the right cosets of . The list of right cosets of is stored in the attribute `ColorCosetList'. The color of the elements of a coset corresponds to the position of the coset in that list. Elements of by definition have color 1, i.e., the coset with representative `One(C)' is always the first element of the `ColorCosetList' of . Color groups which have a parent inherit their coloring from that parent, including the labelling of the colors. As with other groups, color groups having no parent are their own parent. Right multiplication by a fixed element of induces a permutation of the colors of the parent of . This defines a natural homomorphism of into the symmetric group of degree . The image of this homomorphism is called the `ColorPermGroup' of , and the homomorphism to it is called the `ColorHomomorphism' of . \>ColorGroup( , ) F constructs a colored copy of , with color subgroup (which should have finite index in ). Color groups constructed in this way are always their own parent. It is not possible to set their parent attribute to a different value. Groups which may be colored include, in particular, `AffineCrystGroups', but coloring of any finite group should work as well. \>IsColorGroup( ) P checks whether is a color group. \>ColorSubgroup( ) A returns the color subgroup of . \>ColorCosetList( ) A returns the color labelling cosets of . \>ColorOfElement( , ) F returns the color of an element of . \>ColorPermGroup( ) A returns the ColorPermGroup of , which is the permutation group induced by acting on the colors of the parent of . \>ColorHomomorphism( ) A returns the homomomorphism from to its `ColorPermGroup'. \>Subgroup( , )!{for color groups} O where is a color group, returns the colored subgroup of generated by . The parent of is set to the parent of , from which the coloring of is inherited. \beginexample gap> G := Group( (1,2,3), (2,3,4) ); Group([ (1,2,3), (2,3,4) ]) gap> H := Group( (1,2,3) ); Group([ (1,2,3) ]) gap> C := ColorGroup( G, H ); Group([ (1,2,3), (2,3,4) ]) gap> ColorSubgroup( C ) = H; true gap> ColorCosetList( C ); [ RightCoset(Group( [ (1,2,3) ] ),()), RightCoset(Group( [ (1,2,3) ] ),(1,2) (3,4)), RightCoset(Group( [ (1,2,3) ] ),(1,3)(2,4)), RightCoset(Group( [ (1,2,3) ] ),(1,4)(2,3)) ] gap> List( last, x -> ColorOfElement( C, Representative(x) ) ); [ 1, 2, 3, 4 ] gap> U := Subgroup( C, [(1,3)(2,4)] ); Group([ (1,3)(2,4) ]) gap> IsColorGroup( U ); true gap> ColorSubgroup( U ); Group(()) gap> ColorCosetList( U ); [ RightCoset(Group( () ),()), RightCoset(Group( () ),(1,3)(2,4)) ] gap> List( last, x -> ColorOfElement( U, Representative(x) ) ); [ 1, 3 ] \endexample %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Colored AffineCrystGroups} If is a colored `AffineCrystGroup' whose `ColorSubgroup' is lattice-equal (translationengleich) with , then the `PointGroup' of can consistently be colored. In that case, \>PointGroup( C )!{for a colored `AffineCrystGroup'} A returns a colored point group. Otherwise, the `PointGroup' of is an ordinary, uncolored group. \beginexample gap> S := SpaceGroupIT( 2, 10 ); SpaceGroupOnRightIT(2,10,'1') gap> m := MaximalSubgroupClassReps( S, rec( primes := [2] ) ); [ , , ] gap> List( last, x -> TranslationBasis(x) = TranslationBasis(S) ); [ false, true, false ] gap> C := ColorGroup( S, m[1] );; IsColorGroup( PointGroup( C ) ); false gap> C := ColorGroup( S, m[2] );; IsColorGroup( PointGroup( C ) ); true \endexample Two colorings of a *space group* are *equivalent* if the two `ColorSubgroups' are conjugate in the affine normalizer of . For instance, a list of inequivalent index-2 `ColorSubgroups' of can be obtained with the following code: \index{colorings!inequivalent!for space group} \beginexample gap> sub := MaximalSubgroupClassReps( S, rec( primes := [2] ) ); [ , , ] gap> List( sub, Size ); [ infinity, infinity, infinity ] gap> sub := Filtered( sub, s -> IndexInParent( s ) = 2 ); [ , , ] gap> Length( AffineInequivalentSubgroups( S, sub ) ); 2 \endexample Note that `AffineInequivalentSubgroups' requires the {\GAP} package {\CaratInterface} to be installed. Otherwise, this function is supported only for `AffineCrystGroups' constructed from the crystallographic groups catalog. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{International Tables} For the user's convenience, a table with the 17 plane groups and the 230 space groups is included in {\Cryst}. These groups are given in exactly the same settings (i.e., choices of basis and origin) as in the International Tables. Space groups with a centered lattice are therefore given in the non-primitive basis crystallographers are used to. This is in contrast to the crystallographic groups catalogue, where always a primitive basis is used. For some of the 3D space groups, two different settings are available. The possible settings are labelled with the characters `\pif{1}\pif', `\pif{2}\pif',`\pif{b}\pif',`\pif{c}\pif',`\pif{h}\pif' and `\pif{r}\pif'. If only one setting is available, it is labelled `\pif{1}\pif'. For some space groups there exists a point with higher symmetry than the origin of the `\pif{1}\pif' setting. In such cases, a second setting `\pif{2}\pif' is available, which has this high symmetry point as origin. This second setting `\pif{2}\pif' then is the default setting. Space groups which have a unique axis can have this axis in direction (setting`\pif{b}\pif') or direction (setting `\pif{c}\pif'). `\pif{b}\pif' is the default setting. Rhombohedral space groups are given in a hexagonal basis (setting `\pif{h}\pif') and in a rhombohedral basis (setting `\pif{r}\pif'). `\pif{h}\pif' is the default setting. \>SpaceGroupSettingsIT( , ) F returns a string, whose characters label the available settings of the space group with number and dimension . \> SpaceGroupOnRightIT( , ) F \> SpaceGroupOnRightIT( , , ) F returns space group number in dimension in the representation acting on the right. In the third argument, the desired setting can be specified. Otherwise, the space group is returned in the default setting for that space group. \> SpaceGroupOnLeftIT( , ) F \> SpaceGroupOnLeftIT( , , ) F returns space group number in dimension in the representation acting on the left. In the third argument, the desired setting can be specified. Otherwise, the space group is returned in the default setting for that space group. \> SpaceGroupIT( , ) F \> SpaceGroupIT( , , ) F returns either `SpaceGroupOnRightIT' or `SpaceGroupOnLeftIT' with the same arguments, depending on the value of `CrystGroupDefaultAction'. \beginexample gap> SpaceGroupSettingsIT( 3, 146 ); "hr" gap> SpaceGroupOnRightIT( 3, 146 ); SpaceGroupOnRightIT(3,146,'h') gap> SpaceGroupOnRightIT( 3, 146, 'r' ); SpaceGroupOnRightIT(3,146,'r') \endexample cryst/doc/manual.toc0000644001325400021140000000116515064274357014137 0ustar gaehleruser\chapcontents {1}{Introduction}{3} \chapcontents {2}{Affine crystallographic groups}{4} \seccontents {2.1}{Construction} {5} \seccontents {2.2}{Point group} {6} \seccontents {2.3}{Translation lattice} {6} \seccontents {2.4}{Special methods} {7} \seccontents {2.5}{Maximal subgroups} {8} \seccontents {2.6}{Space groups with a given point group} {9} \seccontents {2.7}{Wyckoff positions} {10} \seccontents {2.8}{Normalizers} {13} \seccontents {2.9}{Color groups} {13} \seccontents {2.10}{Colored AffineCrystGroups} {15} \seccontents {2.11}{International Tables} {16} \chapcontents {}{Bibliography}{17} \chapcontents {}{Index}{18} cryst/doc/manual.bbl0000644001325400021140000000160313232361435014073 0ustar gaehleruser\begin{thebibliography}{} \bibitem[BBNWZ78]{BBNWZ78} H. Brown, R. B{\accent127 u}low, J. Neub{\accent127 u}ser, H. Wondratschek, and H. Zassenhaus. \newblock {\em Crystallographic Groups of Four-Dimensional Space}. \newblock John Wiley, New York, 1978. \bibitem[EGN97]{EGN97} F. G{\"a}hler, B. Eick and W. Nickel. \newblock Computing maximal subgroups and wyckoff positions of space groups. \newblock {\em Acta Cryst A} 53, 467--474 (1997). \bibitem[Hah95]{Hah95} T. Hahn, editor. \newblock {\em International Tables for Crystallography, Volume A, Space-group Symmetry, 4th Edition}. \newblock Kluwer, Dordrecht, 1995. \bibitem[Won95]{Won95} H. Wondratschek. \newblock Introduction to space-group symmetry. \newblock In {\em Internation Tables for Crystallography, Vol. A} \cite{Hah95}, pages 711--735. \end{thebibliography} cryst/doc/make_doc0000755001325400021140000000120215061751215013621 0ustar gaehleruser#!/bin/sh set -e echo "TeXing documentation" # delete old stuff to avoid spurious or "hidden errors" caused by their presence rm -f manual.{aux,bbl,blg,dvi,idx,ilg,ind,lab,log,pdf,ps,six,toc} # TeX the manual tex manual # ... and build its bibliography #bibtex manual # TeX the manual again to incorporate the ToC tex manual # ... and build the index ../../../doc/manualindex manual # Finally TeX the manual again to get cross-references right tex manual # Create PDF version pdftex manual pdftex manual # The HTML version of the manual mkdir -p ../htm echo "Creating HTML documentation" ../../../etc/convert.pl -i -u -c -n cryst . ../htm cryst/Changelog0000644001325400021140000001253115064273607013214 0ustar gaehleruserVersion 4.1.30 - fixed a regression in WyckoffPositions (thanks to kiryph for reporting). Version 4.1.29 - fix an inconsistent numbering of stabilizer classes of WyckoffPositions (thanks to Bernard Field for analyzing and reporting) - replaced an incorrect implementation of IsSymmorphicSpaceGroup by a correct one (thanks to Hongyi Zhao for analyzing and reporting) Version 4.1.28 - standardized Wyckoff position representation, which is now stable across GAP versions - adaptions to new treatment of rational matrix groups (we need the polenta package now) Version 4.1.27 - fixed incomplete conjugation of Wyckoff positions (thanks to Bernard Field and Max Horn) Version 4.1.26 - Bugfix in SolveInhomEquationsModZ - Bugfix in comparison of affine cryst groups. - Catch the case of a trivial point group in ConjugatorSpaceGroups. - Corrected the documentation regarding conjugation of space groups. Version 4.1.25 - Improved documentation conversion and formatting Version 4.1.24 - Catch another trivial case in IntSolutionMat. - Turn RowEchelonForm into an attribute, to make it read-only. - Switch to GitHub Actions CI. - Test CrystCat functionality only when CrystCat is available. Version 4.1.23 - Make Cryst work at assertion level 2. Version 4.1.22 - Adjustments due to name change from Carat to CaratInterface. Version 4.1.21 - Make silent assumption on pcgs in MaximalSubgroupRepsSG explicit. - Fixed bug in WyckoffPositions. Some Wyckoff positions were listed more than once, due to improper normalization of the representative affine subspace. Version 4.1.20 - Catch trivial case before calling IsDiagonalMat Version 4.1.19 - Compatibility fixes for GAP 4.11. Version 4.1.18 - Fixed trivial changes in output of a manual example and several test examples. Version 4.1.17 - Bug in ConjugatorSpaceGroups fixed. Version 4.1.16 - Bug in ImagesRepresentative for isomorphism to PcpGroup fixed. - Bug in kernel of PointHomomorphism for left-acting group fixed. - Bugs in Centralizer and CanonicalRightCosetElement fixed. - Test files with better code coverage. Version 4.1.15 - PackageInfo record corrected Version 4.1.14 - Corrected incompatible standardizations of affine subspaces. - Added various testfiles. Version 4.1.13 - Fixed a bug in ImagesRepresentative for IsFromAffineCrystGroupToPcpGroup Version 4.1.12 - Fixed a bug in RepresentativeAction for AffineCrystGroups Version 4.1.11 - Fixed a bug in the conjugation of left-acting AffineCrystGroups - Changed outdated RequirePackage in manual Version 4.1.10 - Fixed file permission problem Version 4.1.9 - Minor Update Version 4.1.8 - Bugfix in AffineNormalizer Version 4.1.7 - Adapted to GAP 4.5 Version 4.1.6 - TranslationBasis for trivial point group fixed - Bug in ImagesRepresentative for IsomorphismFpGroup of an AffineCrystGroupOnLeft fixed - Multiplication with empty matrix in WyckoffPositions fixed - Membership test in AffineCrystGroups improved Version 4.1.5 - Incomplete translation basis fixed Version 4.1.4 - Two instances of multiplying an empty list with a matrix fixed Version 4.1.3: - Mutability problem fixed Version 4.1.2: - File manual.toc added Version 4.1.1: - Online help should now work for all functions. - Fixed several manual examples changed output or wrong input. - Avoided some multiplications of an empty list with a matrix. - Support for new package loading mechanism in GAP 4.4 Version 4.1: - Name change from CrystGAP (or CrystGap) to just Cryst. This avoids confusion, as even CrystGAP was always loaded as "cryst". - A second algorithm for the computation of Wyckoff positions (due to Ad Thiers) has been implemented. It avoids the computation of a subgroup lattice, and is faster in small dimensions. It is used by default for dimensions <= 4. The two available algorithms can be called directly using the functions WyPosAT( S ); # algorithm due to Ad Thiers WyPosSGL( S ); # algorithm using the subgroup lattice These functions are still undocumented. - A bug in WyckoffGraph was fixed. The labels of the lines in the graph were not what was intended, and the manual was even selfcontradictory in this respect. This required code for intersections of affine subspace lattices, and a better subset test for affine subspace lattices. These are still undocumented. - The function ConjugatorSpaceGroups is now documented. - Cryst now tries to load the package polycyclic, and then installs methods for IsomorphismPcpGroup for PointGroups and AffineCrystGroups. - A method for ImagesRepresentative for an IsomorphismFpGroup of an AffineCrystGroup has been added, so that the resulting isomorphism can now really be used. - Switch to the new attribute MappingGeneratorsImages. Compatibility with GAP 4.2 and GAP 4.1 is maintained. - A bug in Normalizer for two AffineCrystGroupsOnLeft was fixed; it returned an AffineCrystGroupOnRight. - The number of generators returned by Normalizer for two AffineCrystGroups was reduced. - A bug in ConjugacyClassesMaximalSubgroups for space groups was fixed; their size was set to a wrong value in certain cases. - A mutability bug in AffineNormalizer was fixed. Version 4.0: Initial release for GAP 4. cryst/init.g0000644001325400021140000000276514372461414012521 0ustar gaehleruser############################################################################# ## #A init.g Cryst library Bettina Eick #A Franz Gaehler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Cryst - the crystallographic groups package ## ## GAP 4 Version ## ## introducing globally the NC version of PreImagesRepresentative if not IsBound( PreImagesRepresentativeNC ) then BindGlobal( "PreImagesRepresentativeNC", PreImagesRepresentative ); fi; ############################################################################# ## #R read the declaration files ## ReadPackage( "cryst", "gap/common.gd" ); # declarations for integral matrices ReadPackage( "cryst", "gap/cryst.gd" ); # declarations for AffineCrystGroups ReadPackage( "cryst", "gap/hom.gd" ); # declarations for homomorphism ReadPackage( "cryst", "gap/wyckoff.gd" ); # declarations for Wyckoff position ReadPackage( "cryst", "gap/zass.gd" ); # declarations for Zassenhaus alg. ReadPackage( "cryst", "gap/max.gd" ); # declarations for maximal subgroups ReadPackage( "cryst", "gap/color.gd" ); # declarations for color groups ReadPackage( "cryst", "gap/equiv.gd" ); # isomorphism test for space groups ReadPackage( "cryst", "grp/spacegrp.gd" ); # the IT space group catalogue cryst/read.g0000644001325400021140000000461413232361435012460 0ustar gaehleruser############################################################################# ## #A read.g Cryst library Bettina Eick #A Franz Gaehler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Cryst - the crystallographic groups package ## ## GAP 4 Version ## ############################################################################# ## #R read the general stuff for integer matrix groups ## ReadPackage( "cryst", "gap/common.gi" ); # routines for integral matrices ############################################################################# ## #R read the crystallographic groups specific functions ## ReadPackage( "cryst", "gap/hom.gi" ); # methods for PointHomomorphisms ReadPackage( "cryst", "gap/cryst.gi" ); # methods for CrystGroups ReadPackage( "cryst", "gap/cryst2.gi" ); # more methods for CrystGroups ReadPackage( "cryst", "gap/fpgrp.gi" ); # FpGroup for CrystGroups # and PointGroups ReadPackage( "cryst", "gap/zass.gi" ); # methods for Zassenhaus algorithm ReadPackage( "cryst", "gap/max.gi" ); # methods for maximal subgroups ReadPackage( "cryst", "gap/wyckoff.gi" ); # methods for Wyckoff positions ReadPackage( "cryst", "gap/color.gi" ); # methods for color groups if IsBound( GAPInfo.PackagesLoaded.xgap ) then ReadPackage( "cryst", "gap/wypopup.gi" ); # popup menu for Wyckoff graph ReadPackage( "cryst", "gap/wygraph.gi" ); # Wyckoff graph methods; needs XGAP else ReadPackage( "cryst", "gap/noxgap.gi" ); # dummy for WyckoffGraph fi; if IsBound( GAPInfo.PackagesLoaded.polycyclic ) then # PcpGroup for CrystGroups and PointGroups ReadPackage( "cryst", "gap/pcpgrp.gi" ); fi; ############################################################################# ## #R read the orbit stabilizer methods ## ReadPackage( "cryst", "gap/orbstab.gi" ); # Orbit, Stabilizer & Co. ReadPackage( "cryst", "gap/equiv.gi" ); # conjugator between space groups ############################################################################# ## #R load the IT space group catalogue ## ReadPackage( "cryst", "grp/spacegrp.grp" ); # the catalogue ReadPackage( "cryst", "grp/spacegrp.gi" ); # access functions cryst/COPYING0000644001325400021140000004367714241201135012433 0ustar gaehleruserPackage Cryst is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. The text of the GPL v2 is appended below, and can also be found at https://www.gnu.org/licenses/old-licenses/gpl-2.0.html. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. cryst/PackageInfo.g0000644001325400021140000000742515064274022013717 0ustar gaehleruser############################################################################# ## ## PackageInfo.g for Cryst ## SetPackageInfo( rec( PackageName := "Cryst", Subtitle := "Computing with crystallographic groups", Version := "4.1.30", Date := "22/09/2025", # dd/mm/yyyy format License := "GPL-2.0-or-later", ArchiveURL := Concatenation( "https://www.math.uni-bielefeld.de/~gaehler/gap/Cryst/cryst-", ~.Version ), ArchiveFormats := ".tar.gz", BinaryFiles := [ "doc/manual.pdf", "doc/manual.dvi" ], Persons := [ rec( LastName := "Eick", FirstNames := "Bettina", IsAuthor := true, IsMaintainer := true, Email := "beick@tu-bs.de", WWWHome := "http://www.iaa.tu-bs.de/beick", PostalAddress := Concatenation( "Institut Analysis und Algebra\n", "TU Braunschweig\n", "Universitätsplatz 2\n", "D-38106 Braunschweig\n", "Germany" ), Place := "Braunschweig", Institution := "TU Braunschweig" ), rec( LastName := "Gähler", FirstNames := "Franz", IsAuthor := true, IsMaintainer := true, Email := "gaehler@math.uni-bielefeld.de", WWWHome := "https://www.math.uni-bielefeld.de/~gaehler/", #PostalAddress := "", Place := "Bielefeld", Institution := "Mathematik, Universität Bielefeld" ), rec( LastName := "Nickel", FirstNames := "Werner", IsAuthor := true, IsMaintainer := false, Email := "nickel@mathematik.tu-darmstadt.de", ) ], Status := "accepted", CommunicatedBy := "Herbert Pahlings (Aachen)", AcceptDate := "02/2000", README_URL := "https://www.math.uni-bielefeld.de/~gaehler/gap/Cryst/README.cryst", PackageInfoURL := "https://www.math.uni-bielefeld.de/~gaehler/gap/Cryst/PackageInfo.g", AbstractHTML := "This package, previously known as CrystGAP, \ provides a rich set of methods for the computation with affine \ crystallographic groups, in particular space groups. Affine \ crystallographic groups are fully supported both in representations \ acting from the right or from the left, the latter one being preferred \ by crystallographers. Functions to determine representatives of all \ space group types of a given dimension are also provided. Where necessary, \ Cryst can also make use of functionality \ provided by the package CaratInterface.", PackageWWWHome := "https://www.math.uni-bielefeld.de/~gaehler/gap/packages.php", SourceRepository := rec( Type := "git", URL := Concatenation( "https://github.com/gap-packages/", LowercaseString( ~.PackageName ) ) ), IssueTrackerURL := Concatenation( ~.SourceRepository.URL, "/issues" ), SupportEmail := "gaehler@math.uni-bielefeld.de", PackageDoc := rec( BookName := "Cryst", ArchiveURLSubset := ["doc", "htm"], HTMLStart := "htm/chapters.htm", PDFFile := "doc/manual.pdf", SixFile := "doc/manual.six", LongTitle := "Computing with crystallographic groups", ), Dependencies := rec( GAP := ">=4.12", NeededOtherPackages := [ [ "polycyclic", ">=2.16" ], [ "polenta", ">= 1.3.10" ] ], SuggestedOtherPackages := [ [ "CrystCat", ">=1.1.9" ], [ "CaratInterface", ">=2.3.3" ], [ "XGAP", ">=4.22" ] ], ExternalConditions := [] ), AvailabilityTest := ReturnTrue, #BannerString := "", TestFile := "tst/testall.g", Keywords := [ "crystallographic groups", "affine crystallographic groups", "space groups", "color groups", "point group", "Wyckoff positions", "International Tables for Crystallography", "maximal subgroups", "normalizer" ] )); cryst/gap/0000755001325400021140000000000015064274357012152 5ustar gaehlerusercryst/gap/cryst2.gi0000644001325400021140000006732214372461414013724 0ustar gaehleruser############################################################################# ## #A cryst2.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-2012 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## More methods for affine crystallographic groups ## ############################################################################# ## #M IsSolvableGroup( S ) . . . . . . . . . . . . . . . . . . .IsSolvableGroup ## InstallMethod( IsSolvableGroup, "for AffineCrystGroup, via PointGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, S -> IsSolvableGroup( PointGroup( S ) ) ); ############################################################################# ## #M IsCyclic( S ) . . . . . . . . . . . . . . . . . . . . . . . . . .IsCyclic ## InstallMethod( IsCyclic, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local P, T; P := PointGroup(S); T := TranslationBasis(S); if Length(T) = 0 then return IsCyclic(P); elif Length(T) > 1 then return false; elif IsTrivial(P) then return true; else return IsCyclic(P) and T=CocVecs(S); fi; end ); ############################################################################# ## #M Index( G, H ) . . . . . . . . . . . . . . . . . . . . . . . . . . . Index ## InstallMethod( IndexOp, "AffineCrystGroupOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G, H ) if not IsSubgroup( G, H ) then Error( "H must be a subgroup of G" ); fi; return IndexNC( G, H ); end ); InstallMethod( IndexOp, "AffineCrystGroupOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G, H ) if not IsSubgroup( G, H ) then Error( "H must be a subgroup of G" ); fi; return IndexNC( G, H ); end ); InstallMethod( IndexNC, "AffineCrystGroupOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G, H ) local TG, TH, IP, M; TG := TranslationBasis( G ); TH := TranslationBasis( H ); if Length( TG ) > Length( TH ) then return infinity; fi; IP := Index( PointGroup( G ), PointGroup( H ) ); if IsFinite( G ) then return IP; else M := List( TH, x -> SolutionMat( TG, x ) ); return IP * DeterminantMat( M ); fi; end ); InstallMethod( IndexNC, "AffineCrystGroupOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G, H ) local TG, TH, IP, M; TG := TranslationBasis( G ); TH := TranslationBasis( H ); if Length( TG ) > Length( TH ) then return infinity; fi; IP := Index( PointGroup( G ), PointGroup( H ) ); if IsFinite( G ) then return IP; else M := List( TH, x -> SolutionMat( TG, x ) ); return IP * DeterminantMat( M ); fi; end ); ############################################################################# ## #M ClosureGroup( G, elm ) . . . . . . . . .closure of a group and an element ## InstallMethod( ClosureGroup, "AffineCrystGroupOnRight method for group and element", IsCollsElms, [ IsAffineCrystGroupOnRight, IsMultiplicativeElementWithInverse ], 0, function( G, elm ) local gens, C; if not IsAffineMatrixOnRight( elm ) then Error( "elm must be an affine matrix acting OnRight" ); fi; gens:= GeneratorsOfGroup( G ); # try to avoid adding an element to a group that already contains it if elm in gens or elm^-1 in gens or elm = One( G ) then return G; fi; # make the closure group C := AffineCrystGroupOnRightNC( Concatenation( gens, [ elm ] ) ); # if is infinite then so is if HasIsFinite( G ) and not IsFinite( G ) then SetIsFinite( C, false ); SetSize( C, infinity ); fi; return C; end ); InstallMethod( ClosureGroup, "AffineCrystGroupOnLeft method for group and element", IsCollsElms, [ IsAffineCrystGroupOnLeft, IsMultiplicativeElementWithInverse ], 0, function( G, elm ) local gens, C; if not IsAffineMatrixOnLeft( elm ) then Error( "elm must be an affine matrix acting OnLeft" ); fi; gens:= GeneratorsOfGroup( G ); # try to avoid adding an element to a group that already contains it if elm in gens or elm^-1 in gens or elm = One( G ) then return G; fi; # make the closure group C := AffineCrystGroupOnLeftNC( Concatenation( gens, [ elm ] ) ); # if is infinite then so is if HasIsFinite( G ) and not IsFinite( G ) then SetIsFinite( C, false ); SetSize( C, infinity ); fi; return C; end ); ############################################################################# ## #M ConjugateGroup( , ) . . . . . . . . . . . . . . . . ConjugateGroup ## ## InstallMethod( ConjugateGroup, "method for AffineCrystGroupOnRight and element", IsCollsElms, [ IsAffineCrystGroupOnRight, IsMultiplicativeElementWithInverse ], 0, function( G, g ) local gen, H, d, T; if not IsAffineMatrixOnRight( g ) then Error( "g must be an affine matrix action OnRight" ); fi; # if is trivial conjugating is trivial if IsTrivial(G) then return G; fi; # create the domain gen := List( GeneratorsOfGroup( G ), x -> g^-1 * x * g ); H := AffineCrystGroupOnRightNC( gen ); if HasTranslationBasis( G ) then d := DimensionOfMatrixGroup( G ) - 1; T := TranslationBasis( G ); AddTranslationBasis( H, T*g{[1..d]}{[1..d]} ); fi; # maintain useful information UseIsomorphismRelation( G, H ); return H; end ); InstallMethod( ConjugateGroup, "method for AffineCrystGroupOnLeft and element", IsCollsElms, [ IsAffineCrystGroupOnLeft, IsMultiplicativeElementWithInverse ], 0, function( G, g ) local gen, H, d, T; if not IsAffineMatrixOnLeft( g ) then Error( "g must be an affine matrix action OnLeft" ); fi; # if is trivial conjugating is trivial if IsTrivial(G) then return G; fi; # create the domain gen := List( GeneratorsOfGroup( G ), x -> g * x * g^-1 ); H := AffineCrystGroupOnLeftNC( gen ); if HasTranslationBasis( G ) then d := DimensionOfMatrixGroup( G ) - 1; T := TranslationBasis( G ); AddTranslationBasis( H, T*g{[1..d]}{[1..d]} ); fi; # maintain useful information UseIsomorphismRelation( G, H ); return H; end ); ############################################################################# ## #M RightCosets( G, H ) . . . . . . . . . . . . . . . . . . . . . RightCosets ## InstallMethod( RightCosetsNC, "AffineCrystGroupOnRight", true, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G, H ) local orb, pnt, img, gen, rep; # first some simple checks if Length( TranslationBasis(G) ) <> Length( TranslationBasis(H) ) then Error("sorry, there are infinitely many cosets"); fi; orb := [ RightCoset( H, One( H ) ) ]; for pnt in orb do rep := Representative( pnt ); for gen in GeneratorsOfGroup( G ) do img := RightCoset( H, rep*gen ); if not img in orb then Add( orb, img ); fi; od; od; return orb; end ); InstallMethod( RightCosetsNC, "AffineCrystGroupOnLeft", true, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G, H ) local orb, pnt, img, gen, rep; # first some simple checks if Length( TranslationBasis(G) ) <> Length( TranslationBasis(H) ) then Error("sorry, there are infinitely many cosets"); fi; orb := [ RightCoset( H, One( H ) ) ]; for pnt in orb do rep := Representative( pnt ); for gen in GeneratorsOfGroup( G ) do img := RightCoset( H, rep*gen ); if not img in orb then Add( orb, img ); fi; od; od; return orb; end ); ############################################################################# ## #M CanonicalRightCosetElement( S, rep ) . . . . . CanonicalRightCosetElement ## InstallMethod( CanonicalRightCosetElement, "for AffineCrystGroupOnRight", IsCollsElms, [ IsAffineCrystGroupOnRight, IsObject ], 0, function( S, rep ) local P, d, m, T, mm, res; P := PointGroup( S ); d := DimensionOfMatrixGroup( P ); m := rep{[1..d]}{[1..d]}; T := ReducedLatticeBasis( TranslationBasis( S )*m ); mm := CanonicalRightCosetElement( P, m ); res := PreImagesRepresentativeNC( PointHomomorphism( S ), mm*m^-1 ) * rep; res := MutableCopyMat( res ); res[d+1]{[1..d]} := VectorModL( res[d+1]{[1..d]}, T ); return res; end ); InstallMethod( CanonicalRightCosetElement, "for AffineCrystGroupOnLeft", IsCollsElms, [ IsAffineCrystGroupOnLeft, IsObject ], 0, function( S, rep ) local P, d, m, T, mm, res; P := PointGroup( S ); d := DimensionOfMatrixGroup( P ); m := rep{[1..d]}{[1..d]}; T := ReducedLatticeBasis( TranslationBasis( S )*m ); mm := CanonicalRightCosetElement( P, m ); res := PreImagesRepresentativeNC( PointHomomorphism( S ), mm*m^-1 ) * rep; res := MutableCopyMat( res ); res{[1..d]}[d+1] := VectorModL( res{[1..d]}[d+1], T ); return res; end ); ############################################################################# ## #M Intersection2( G1, G2 ) . . . . . . . . . intersection of two CrystGroups ## InstallMethod( Intersection2, "two AffineCrystGroupsOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G1, G2 ) local d, P1, P2, P, T1, T2, T, L, gen, gen1, gen2, orb, set, rep, stb, pnt, i, img, sch, new, g, g1, g2, t1, t2, s, t, R; # get the intersections of the point groups and the translation groups d := DimensionOfMatrixGroup( G1 ) - 1; P1 := PointGroup(G1); P2 := PointGroup(G2); P := Intersection( P1, P2 ); T1 := TranslationBasis( G1 ); T2 := TranslationBasis( G2 ); T := IntersectionModule( T1, T2 ); L := UnionModule( T1, T2 ); gen := GeneratorsOfGroup( P ); gen1 := List( gen, x -> PreImagesRepresentativeNC( PointHomomorphism( G1 ), x) ); gen2 := List( gen, x -> PreImagesRepresentativeNC( PointHomomorphism( G2 ), x)^-1 ); orb := [ MutableMatrix( One( G1 ) ) ]; set := [ One( G1 ) ]; rep := [ One( P ) ]; stb := TrivialSubgroup( P ); # get the subgroup of P that can be lifted to the intersection for pnt in orb do for i in [1..Length( gen )] do img := gen2[i]*pnt*gen1[i]; img[d+1]{[1..d]} := VectorModL( img[d+1]{[1..d]}, L ); if not img in set then Add( orb, img ); AddSet( set, img ); Add( rep, rep[Position(orb,pnt)]*gen[i] ); else sch := rep[Position(orb,pnt)]*gen[i] / rep[Position(orb,img)]; if not sch in stb then stb := ClosureGroup( stb, sch ); fi; fi; od; od; # determine the lift of stb new := []; for g in GeneratorsOfGroup( stb ) do g1 := PreImagesRepresentativeNC( PointHomomorphism( G1 ), g ); g1 := AffMatMutableTrans( g1 ); if Length(T1) > 0 then g2 := PreImagesRepresentativeNC( PointHomomorphism( G2 ), g ); t1 := g1[d+1]{[1..d]}; t2 := g2[d+1]{[1..d]}; s := IntSolutionMat( Concatenation( T1, -T2 ), t2-t1 ); g1[d+1]{[1..d]} := t1+s{[1..Length(T1)]}*T1; fi; Add( new, g1 ); od; # add the translations for t in T do g1 := IdentityMat( d+1 ); g1[d+1]{[1..d]} := t; Add( new, g1 ); od; R := AffineCrystGroupOnRightNC( new, One( G1 ) ); AddTranslationBasis( R, T ); return R; end ); InstallMethod( Intersection2, "two AffineCrystGroupsOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G1, G2 ) local T1, T2, I; T1 := TransposedMatrixGroup( G1 ); T2 := TransposedMatrixGroup( G2 ); I := Intersection2( T1, T2 ); return TransposedMatrixGroup( I ); end ); ############################################################################# ## #M NormalizerPointGroupInGLnZ(

    ) . . . . . . .Normalizer of a PointGroup ## InstallMethod( NormalizerPointGroupInGLnZ, true, [ IsPointGroup ], 0, function( P ) local S, T; S := AffineCrystGroupOfPointGroup( P ); T := InternalBasis( S ); if T <> One(P) then return NormalizerInGLnZ( P^(T^-1) )^T; else return NormalizerInGLnZ( P ); fi; end ); ############################################################################# ## #M CentralizerPointGroupInGLnZ( G ) . . . . . . .Centralizer of a PointGroup ## InstallMethod( CentralizerPointGroupInGLnZ, "via NormalizerPointGroupInGLnZ", true, [ IsPointGroup ], 0, function( G ) return Centralizer( NormalizerPointGroupInGLnZ( G ), G ); end ); ############################################################################# ## #F CentralizerElement ## CentralizerElement := function( G, u, TT ) local d, I, U, L, orb, set, rep, stb, pnt, gen, img, sch, v; d := DimensionOfMatrixGroup( G ) - 1; I := IdentityMat( d ); U := List( TT, t -> t * (u{[1..d]}{[1..d]} - I) ); L := ReducedLatticeBasis( U ); orb := [ MutableMatrix( u ) ]; set := [ u ]; rep := [ MutableMatrix( One( G ) ) ]; stb := TrivialSubgroup( G ); for pnt in orb do for gen in GeneratorsOfGroup( G ) do img := pnt^gen; # reduce image mod L img[d+1]{[1..d]} := VectorModL( img[d+1]{[1..d]}, L ); if not img in set then Add( orb, img ); AddSet( set, img ); Add( rep, rep[Position(orb,pnt)]*gen ); else sch := rep[Position(orb,pnt)]*gen / rep[Position(orb,img)]; # check if a translation conjugate of sch is in stabilizer v := u^sch - u; v := v[d+1]{[1..d]}; if v <> 0 * v then Assert(0, U <> [] ); v := IntSolutionMat( U, v ); Assert( 0, v <> fail ); sch[d+1]{[1..d]} := sch[d+1]{[1..d]} + v*TT; fi; stb := ClosureGroup( stb, sch ); fi; od; od; return stb; end; ############################################################################# ## #F CentralizerAffineCrystGroup( G, obj ) . . centralizer of subgroup/element ## CentralizerAffineCrystGroup := function ( G, obj ) local d, P, T, e, I, M, m, L, i, U, o, gen, Q, C, u; d := DimensionOfMatrixGroup( G ) - 1; P := PointGroup( G ); T := TranslationBasis( G ); e := Length( T ); I := IdentityMat( d ); # we first determine the subgroup of G that centralizes the # point group and the translation group of obj or its span if IsGroup( obj ) then M := PointGroup( obj ); L := List( [1..e], x -> [] ); gen := GeneratorsOfGroup( M ); for i in [ 1..Length( gen ) ] do L{[1..e]}{[1..d]+(i-1)*d} := T*(gen[i]-I); od; P := Centralizer( P, M ); if not IsEmpty( TranslationBasis( obj ) ) then P := Stabilizer( P, TranslationBasis( obj ), OnRight ); fi; U := Filtered( GeneratorsOfGroup(obj), x -> x{[1..d]}{[1..d]} <> I ); else if not IsAffineMatrixOnRight( obj ) then Error( "obj must be an affine matrix acting OnRight" ); fi; M := obj{[1..d]}{[1..d]}; L := T*(M - I); P := Centralizer( P, M ); o := Order( M ); m := obj^o; P := Stabilizer( P, m[d+1]{[1..d]} ); if o > 1 then U := [ obj ]; else U := []; fi; fi; gen := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( G ), x ) ); # if G is finite if e = 0 then return SubgroupNC( G, gen ); fi; # we keep only translation generators which centralize obj Q := IdentityMat( e ); if L <> [] then L := RowEchelonFormT( L, Q ); fi; for i in [ Length( L )+1..e ] do Add( gen, AugmentedMatrix( I, Q[i]*T ) ); od; # C centralizes the point group and the translation group of obj C := SubgroupNC( G, gen ); # now find the centralizer for each u in U for u in U do C := CentralizerElement( C, u, T ); T := TranslationBasis( C ); od; return C; end; ############################################################################# ## #M Centralizer( G, obj ) . . . . . . . . . . centralizer of subgroup/element ## InstallMethod( CentralizerOp, "AffineCrystGroupOnRight and element", IsCollsElms, [ IsAffineCrystGroupOnRight, IsMatrix ], 0, function( G, m ) if not IsAffineMatrixOnRight( m ) then Error( "m must be an affine matrix acting OnRight" ); fi; return CentralizerAffineCrystGroup( G, m ); end ); InstallMethod( CentralizerOp, "AffineCrystGroupOnLeft and element", IsCollsElms, [ IsAffineCrystGroupOnLeft, IsMatrix ], 0, function( G, m ) local T, C; if not IsAffineMatrixOnLeft( m ) then Error( "m must be an affine matrix acting OnLeft" ); fi; T := TransposedMatrixGroup( G ); C := CentralizerAffineCrystGroup( T, TransposedMat( m ) ); return TransposedMatrixGroup( C ); end ); InstallMethod( CentralizerOp, "two AffineCrystGroupsOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G1, G2 ) return CentralizerAffineCrystGroup( G1, G2 ); end ); InstallMethod( CentralizerOp, "two AffineCrystGroupsOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G1, G2 ) local G, U, C; G := TransposedMatrixGroup( G1 ); U := TransposedMatrixGroup( G2 ); C := CentralizerAffineCrystGroup( G, U ); return TransposedMatrixGroup( C ); end ); ############################################################################# ## #M TranslationNormalizer( S ) . . . . . . . . . . . . translation normalizer ## InstallMethod( TranslationNormalizer, "for SpaceGroup acting OnRight", true, [ IsAffineCrystGroupOnRight and IsSpaceGroup ], 0, function( S ) local P, T, d, N, M, I, Pgens, B, invB, g, i, Q, L, K, k, l, j, gen; P := PointGroup( S ); T := TranslationBasis( S ); d := DimensionOfMatrixGroup( S ) - 1; if Size( P ) = 1 then N := GroupByGenerators( [], IdentityMat( d+1 ) ); N!.continuousTranslations := IdentityMat( d ); return N; fi; M := List( [1..d], i->[] ); i := 0; I := IdentityMat( d ); Pgens := GeneratorsOfGroup( P ); if not IsStandardAffineCrystGroup( S ) then B := InternalBasis( S ); invB := B^-1; Pgens := List( Pgens, x -> B * x * invB ); fi; for g in Pgens do g := g - I; M{[1..d]}{[1..d]+i*d} := g; i := i+1; od; # first diagonalize M Q := IdentityMat( Length(M) ); M := TransposedMat(M); M := RowEchelonForm( M ); while Length(M) > 0 and not IsDiagonalMat(M) do M := TransposedMat(M); M := RowEchelonFormT(M,Q); if not IsDiagonalMat(M) then M := TransposedMat(M); M := RowEchelonForm(M); fi; od; # and then determine the solutions of x*M=0 mod Z if Length(M)>0 then L := List( [1..Length(M)], i -> [ 0 .. M[i][i]-1 ] / M[i][i] ); L := List( Cartesian( L ), l -> l * Q{[1..Length(M)]} ); else L := NullMat( 1, Length(Q) ); fi; # get the kernel if Length(M) < Length(Q) then K := Q{[Length(M)+1..Length(Q)]}; TriangulizeMat( K ); else K := []; fi; # reduce to basis modulo kernel Append( L, IdentityMat( d ) ); for k in K do j := PositionProperty( k, x -> x=1 ); for l in L do l := l-l[j]*k; od; od; L := ReducedLatticeBasis( L ); # conjugate if not standard if not IsStandardAffineCrystGroup( S ) then L := L*T; fi; # get generators gen := List( L, x -> IdentityMat( d+1 ) ); for i in [1..Length(L)] do gen[i][d+1]{[1..d]} := L[i]; od; N := GroupByGenerators( gen, IdentityMat( d+1 ) ); N!.continuousTranslations := K; return N; end ); InstallMethod( TranslationNormalizer, "for SpaceGroup acting OnLeft", true, [ IsAffineCrystGroupOnLeft and IsSpaceGroup ], 0, function( S ) local N1, gen, N; N1 := TranslationNormalizer( TransposedMatrixGroup( S ) ); gen := List( GeneratorsOfGroup( N1 ), TransposedMat ); N := GroupByGenerators( gen, One( N1 ) ); N!.continuousTranslations := N1!.continuousTranslations; return N; end ); RedispatchOnCondition( TranslationNormalizer, true, [IsAffineCrystGroupOnRight], [IsAffineCrystGroupOnRight and IsSpaceGroup], 0); RedispatchOnCondition( TranslationNormalizer, true, [IsAffineCrystGroupOnLeft], [IsAffineCrystGroupOnLeft and IsSpaceGroup], 0); ############################################################################# ## #F AffineLift( pnt, d ) ## AffineLift := function( pnt, d ) local M, b, i, I, p, m, Q, j, s; M := List( [1..d], i->[] ); b := []; i := 0; I := IdentityMat( d ); for p in pnt do m := p[1]{[1..d]}{[1..d]} - I; M{[1..d]}{[1..d]+i*d} := m; Append( b, p[2] - p[1][d+1]{[1..d]} ); i := i+1; od; Q := IdentityMat( d ); M := TransposedMat(M); M := RowEchelonFormVector( M,b ); while Length(M) > 0 and not IsDiagonalMat(M) do M := TransposedMat(M); M := RowEchelonFormT(M,Q); if not IsDiagonalMat(M) then M := TransposedMat(M); M := RowEchelonFormVector(M,b); fi; od; ## Check if we have any solutions modulo Z. for j in [Length(M)+1..Length(b)] do if not IsInt( b[j] ) then return []; fi; od; s := List( [1..Length(M)], i -> b[i]/M[i][i] ); for i in [Length(M)+1..d] do Add( s, 0); od; return s*Q; end; ############################################################################# ## #M AffineNormalizer( S ) . . . . . . . . . . . . . . . . . affine normalizer ## InstallMethod( AffineNormalizer, "for SpaceGroup acting OnRight", true, [ IsAffineCrystGroupOnRight and IsSpaceGroup ], 0, function( S ) local d, P, H, T, N, Pgens, Sgens, invT, gens, Pi, Si, hom, opr, orb, g, m, set, rep, lst, pnt, img, t, sch, n, nn, normgens, TN, AN; d := DimensionOfMatrixGroup( S ) - 1; P := PointGroup( S ); H := PointHomomorphism( S ); T := TranslationBasis( S ); N := NormalizerPointGroupInGLnZ( P ); Pgens := GeneratorsOfGroup( P ); Sgens := List( Pgens, x -> PreImagesRepresentativeNC( H, x ) ); # we work in a standard representation if not IsStandardAffineCrystGroup( S ) then invT := T^-1; gens := List( GeneratorsOfGroup( N ), x -> T * x * invT ); Pgens := List( Pgens, x -> T * x * invT ); Sgens := List( Sgens, x -> S!.lconj * x * S!.rconj ); else gens := GeneratorsOfGroup( N ); fi; Pi := Group( Pgens, One( P ) ); Si := Group( Sgens, One( S ) ); hom := GroupHomomorphismByImagesNC( Si, Pi, Sgens, Pgens ); # the operation we shall need in the stabilizer algorithm opr := function( data, g ) local m, mm, res; m := data[1]{[1..d]}{[1..d]}; mm := m^g; if m = mm then res := [ data[1], List( data[2]*g, FractionModOne ) ]; else m := AffMatMutableTrans( PreImagesRepresentativeNC( hom, mm ) ); m[d+1]{[1..d]} := List( m[d+1]{[1..d]}, FractionModOne ); res := [ m, List( data[2]*g, FractionModOne ) ]; fi; return res; end; orb := []; for g in Sgens do m := AffMatMutableTrans( g ); m[d+1]{[1..d]} := List( m[d+1]{[1..d]}, FractionModOne ); Add( orb, [ m, m[d+1]{[1..d]} ] ); od; orb := [ orb ]; set := ShallowCopy( orb ); rep := [ One( N ) ]; lst := []; for pnt in orb do for g in gens do img := List( pnt, x -> opr( x, g ) ); if not img in set then Add( orb, img ); AddSet( set, img ); Add( rep, rep[Position(orb,pnt)]*g ); else t := AffineLift( img, d ); if t<>[] then sch := rep[Position(orb,pnt)]*g; n := IdentityMat( d+1 ); n{[1..d]}{[1..d]} := sch; n[d+1]{[1..d]} := t; AddSet( lst, n ); fi; fi; od; od; if IsFinite( N ) then nn := Subgroup( N, [] ); normgens := []; for g in lst do m := g{[1..d]}{[1..d]}; if not m in nn then Add( normgens, g ); nn := ClosureGroup( nn, m ); fi; od; else normgens := lst; fi; m := IdentityMat( d+1 ); m{[1..d]}{[1..d]} := T; if not IsStandardAffineCrystGroup( S ) then normgens := List( normgens, x -> x^m ); fi; TN := TranslationNormalizer( S ); Append( normgens, GeneratorsOfGroup( TN ) ); AN := Group( normgens, One( S ) ); AN!.continuousTranslations := TN!.continuousTranslations; # can AN be made an AffineCrystGroup? if IsFinite( N ) and AN!.continuousTranslations = [] then SetIsAffineCrystGroupOnRight( AN, true ); lst := List( GeneratorsOfGroup( TN ), x -> x[d+1]{[1..d]} ); lst := ReducedLatticeBasis( lst ); AddTranslationBasis( AN, lst ); fi; return AN; end ); InstallMethod( AffineNormalizer, "for SpaceGroup acting OnLeft", true, [ IsAffineCrystGroupOnLeft and IsSpaceGroup ], 0, function( S ) local A1, A, gen; A1 := AffineNormalizer( TransposedMatrixGroup( S ) ); if IsAffineCrystGroupOnRight( A1 ) then A := TransposedMatrixGroup( A1 ); else gen := List( GeneratorsOfGroup( A1 ), TransposedMat ); A := Group( gen, One( A1 ) ); fi; A!.continuousTranslations := A1!.continuousTranslations; return A; end ); RedispatchOnCondition( AffineNormalizer, true, [IsAffineCrystGroupOnRight], [IsAffineCrystGroupOnRight and IsSpaceGroup], 0); RedispatchOnCondition( AffineNormalizer, true, [IsAffineCrystGroupOnLeft], [IsAffineCrystGroupOnLeft and IsSpaceGroup], 0); ############################################################################# ## #M AffineInequivalentSubgroups( S, subs ) . . reps of affine ineq. subgroups ## InstallGlobalFunction( AffineInequivalentSubgroups, function( S, subs ) local C, A, opr, reps, orb, grp, gen, img; if subs = [] then return subs; fi; C := ShallowCopy( subs ); A := AffineNormalizer( S ); if A!.continuousTranslations <> [] then return fail; fi; reps := []; while C <> [] do if not IsSubgroup( S, C[1] ) then Error( "subs must be a list of subgroups of S" ); fi; orb := [ C[1] ]; for grp in orb do for gen in GeneratorsOfGroup( A ) do img := List( GeneratorsOfGroup( grp ), x -> x^gen ); if not ForAny( orb, g -> ForAll( img, x -> x in g ) ) then Add( orb, ConjugateGroup( grp, gen ) ); fi; od; od; Add( reps, orb[1] ); C := Filtered( C, x -> not x in orb ); od; return reps; end ); cryst/gap/common.gd0000644001325400021140000000032214053147612013741 0ustar gaehleruser############################################################################# ## #A RowEchelonForm . . . . . . . . . . row echelon form of an integer matrix ## DeclareAttribute( "RowEchelonForm", IsMatrix ); cryst/gap/wyckoff.gd0000644001325400021140000001003615036405561014126 0ustar gaehleruser############################################################################# ## #A wyckoff.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #R IsWyckoffPosition . . . . . . . . . . . . . . . . . . . IsWyckoffPosition ## DeclareRepresentation( "IsWyckoffPosition", IsComponentObjectRep and IsAttributeStoringRep, [ "basis", "translation", "spaceGroup", "class" ] ); ############################################################################# ## #F WyckoffPositionObject . . . . . . . . . . .make a Wyckoff position object ## DeclareGlobalFunction( "WyckoffPositionObject" ); ############################################################################# ## #F WyckoffSpaceGroup . . . . . . . . . . . . .space group of WyckoffPosition ## DeclareOperation( "WyckoffSpaceGroup", [ IsWyckoffPosition ] ); ############################################################################# ## #F WyckoffTranslation . . . . . . . . . .translation of representative space ## DeclareOperation( "WyckoffTranslation", [ IsWyckoffPosition ] ); ############################################################################# ## #F WyckoffBasis . . . . . . . . . . . . . . . .basis of representative space ## DeclareOperation( "WyckoffBasis", [ IsWyckoffPosition ] ); ############################################################################# ## #F ReduceAffineSubspaceLattice . . . . reduce affine subspace modulo lattice ## DeclareGlobalFunction( "ReduceAffineSubspaceLattice" ); ############################################################################# ## #F ImageAffineSubspaceLattice . . . .image of affine subspace modulo lattice ## DeclareGlobalFunction( "ImageAffineSubspaceLattice" ); ############################################################################# ## #F ImageAffineSubspaceLatticePointwise . . . . . . image of pointwise affine #F subspace modulo lattice ## DeclareGlobalFunction( "ImageAffineSubspaceLatticePointwise" ); ############################################################################# ## #A WyckoffStabilizer . . . . . . . . . stabilizer of representative subspace ## DeclareAttribute( "WyckoffStabilizer", IsWyckoffPosition ); ############################################################################# ## #F WyckoffOrbit . . . . . . . . . . . . orbit of pointwise subspace lattices ## DeclareAttribute( "WyckoffOrbit", IsWyckoffPosition ); ############################################################################# ## #A WyckoffPositions( ) . . . . . . . . . . . . . . . . Wyckoff positions ## DeclareAttribute( "WyckoffPositions", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #F WyckoffPositionsByStabilizer( S, stabs ) . . Wyckoff pos. for given stabs ## DeclareGlobalFunction( "WyckoffPositionsByStabilizer" ); ############################################################################# ## #F IsWyckoffGraph( G ) . . . . . . . . . . . . . . . . . . . .IsWyckoffGraph ## DeclareFilter( "IsWyckoffGraph" ); ############################################################################# ## #F WyckoffGraphFun( W, def ) . . . . . . . . . . . . display a Wyckoff graph ## DeclareGlobalFunction( "WyckoffGraphFun" ); ############################################################################# ## #O WyckoffGraph( S, def ) . . . . . . . . . . . . . .display a Wyckoff graph ## DeclareOperation( "WyckoffGraph", [ IsAffineCrystGroupOnLeftOrRight, IsRecord ] ); ############################################################################# ## #F SolveInhomEquationsModZ( mat, vec, onRight ) . . . solve inhom. eq. mod Z ## DeclareGlobalFunction( "SolveInhomEquationsModZ" ); cryst/gap/pcpgrp.gi0000644001325400021140000001661714372461414013772 0ustar gaehleruser############################################################################# ## #A pgpgrp.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #M IsomorphismPcpGroup(

    ) . . . . . . . . . . . . . . . . for PointGroup ## InstallMethod( IsomorphismPcpGroup, "for PointGroup", true, [ IsPointGroup ], 0, function ( P ) local mono, N, repr, F, gens, prei, iso; # compute an isomorphic permutation group mono := NiceMonomorphism( P ); N := NiceObject( P ); # distinguish between solvable and non-solvable case if not IsSolvableGroup( N ) then return fail; fi; repr := IsomorphismPcpGroup( N ); F := Image( repr ); gens := Igs( F ); prei := List( gens, x -> PreImagesRepresentativeNC( repr, x ) ); prei := List( prei, x -> PreImagesRepresentativeNC( mono, x ) ); iso := GroupHomomorphismByImagesNC( P, F, prei, gens ); SetMappingGeneratorsImages( iso, [ prei, gens ] ); SetIsBijective( iso, true ); SetKernelOfMultiplicativeGeneralMapping( iso, TrivialSubgroup( P ) ); return iso; end ); ############################################################################# ## #M IsomorphismPcpGroup( ) . . . . . . for AffineCrystGroupOnLeftOrRight ## InstallMethod( IsomorphismPcpGroup, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local P, N, T, iso, F, gensF, gensN, matsP, d, n, t, matsT, i, mats, coll, j, r, g, e, o, s, G, new, v; # get presentation for the point group P := PointGroup( S ); N := NiceObject( P ); T := TranslationBasis( S ); iso := IsomorphismPcpGroup( N ); if IsBool( iso ) then return fail; fi; # determine preimages F := Image( iso ); gensF := Cgs(F); gensN := List( gensF, x -> PreImagesRepresentativeNC( iso, x ) ); matsP := List( gensN, x -> ImagesRepresentative( NiceToCryst( P ), x ) ); # set up some variables d := DimensionOfMatrixGroup( S ) - 1; n := Length( gensN ); t := Length( T ); # get mats of translation matsT := List( [1..t], x -> IdentityMat( d+1 ) ); for i in [1..Length( matsT )] do if IsAffineCrystGroupOnRight( S ) then matsT[i][d+1]{[1..d]} := T[i]; else matsT[i]{[1..d]}[d+1] := T[i]; fi; od; mats := Concatenation( matsP, matsT ); # compute collector coll := FromTheLeftCollector( n + t ); # point group rels for i in [1..n] do # compute power rel r := RelativeOrderPcp( gensF[i] ); g := gensF[i]^r; e := Exponents( gensF[i]^r ); s := matsP[i]^-r * MappedVector( e, matsP ); if t > 0 then if IsAffineCrystGroupOnRight( S ) then v := SolutionMat( T, - s[d+1]{[1..d]} ); else v := SolutionMat( T, - s{[1..d]}[d+1] ); fi; e := Concatenation( e, v ); fi; o := ObjByExponents( coll, e ); SetRelativeOrder( coll, i, r ); SetPower( coll, i, o ); for j in [1..i-1] do # get conjugate rel g := gensF[i]^gensF[j]; e := Exponents( gensF[i]^gensF[j] ); s := (matsP[i]^matsP[j])^-1 * MappedVector( e, matsP ); if t > 0 then if IsAffineCrystGroupOnRight( S ) then v := SolutionMat( T, - s[d+1]{[1..d]} ); else v := SolutionMat( T, - s{[1..d]}[d+1] ); fi; e := Concatenation( e, v ); fi; o := ObjByExponents( coll, e ); SetConjugate( coll, i, j, o ); od; od; # operation rels e := List( [1..n], x -> 0 ); for i in [1..n] do for j in [1..t] do s := matsT[j]^matsP[i]; if IsAffineCrystGroupOnRight( S ) then v := SolutionMat( T, s[d+1]{[1..d]} ); else v := SolutionMat( T, s{[1..d]}[d+1] ); fi; o := ObjByExponents( coll, Concatenation( e, v ) ); SetConjugate( coll, n+j, i, o ); od; od; # set up homomorphims G := PcpGroupByCollector( coll ); new := GroupHomomorphismByImagesNC( S, G, mats, Cgs(G)); SetMappingGeneratorsImages( new, [ mats, Cgs(G) ] ); SetIsFromAffineCrystGroupToPcpGroup( new, true ); SetIsBijective( new, true ); SetKernelOfMultiplicativeGeneralMapping( new, TrivialSubgroup( S ) ); return new; end ); ############################################################################# ## #M ImagesRepresentative( , ) for IsFromAffineCrystGroupToPcpGroup ## InstallMethod( ImagesRepresentative, FamSourceEqFamElm, [IsGroupGeneralMappingByImages and IsFromAffineCrystGroupToPcpGroup, IsMultiplicativeElementWithInverse ], 0, function(iso, elm) local d, S, T, P, m, l, w, N, F, gensF, gensN, matsP, e, f, g, exp, new, rem, v, s, H, h, p; # set up dim and space group d := Length(elm)-1; S := Source(iso); T := TranslationBasis(S); # set up point group P := PointGroup(S); m := NiceMonomorphism(P); # P -> N N := Image(m); l := NiceToCryst(P); # N -> S w := IsomorphismPcpGroup(N); # N -> Pcp # get preimages F := Image(w); gensF := Cgs(F); gensN := List(gensF, x -> PreImagesRepresentativeNC(w, x)); matsP := List(gensN, x -> ImagesRepresentative(l, x)); # point group part e := elm{[1..d]}{[1..d]}; f := Image(m, e); g := Image(w, f); exp := Exponents(g); # divide off new := MappedVector( exp, matsP ); rem := new^-1 * elm; if Length( T ) > 0 then if IsAffineCrystGroupOnRight( S ) then v := rem[d+1]{[1..d]}; else v := rem{[1..d]}[d+1]; fi; s := SolutionMat(T, v); exp := Concatenation( exp, s ); fi; # translate H := Image(iso); h := Cgs(H); # do some check p := List(h, x -> PreImagesRepresentativeNC(iso,x)); if MappedVector(exp, p) <> elm then Error("hier"); fi; return MappedVector(exp, h); end ); ############################################################################# ## #M NaturalHomomorphismByNormalSubgroup( , ) for solv. AffineCrystGrp ## InstallMethod( NaturalHomomorphismByNormalSubgroupOp, "for AffineCrystGroup, via pcp representation", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 10, function( G, N ) local iso, hom; if not IsSolvableGroup( G ) then TryNextMethod(); fi; iso := IsomorphismPcpGroup( G ); hom := NaturalHomomorphismByPcp( Pcp( Image(iso), Image(iso,N) ) ); return CompositionMapping( hom, iso ); end ); InstallMethod( NaturalHomomorphismByNormalSubgroupOp, "for AffineCrystGroup, via pcp representation", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 10, function( G, N ) local iso, hom; if not IsSolvableGroup( G ) then TryNextMethod(); fi; iso := IsomorphismPcpGroup( G ); hom := NaturalHomomorphismByPcp( Pcp( Image(iso), Image(iso,N) ) ); return CompositionMapping( hom, iso ); end ); cryst/gap/color.gd0000644001325400021140000000364013232361435013574 0ustar gaehleruser############################################################################# ## #A color.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Cryst - the crystallographic groups package for GAP (color groups) ## ############################################################################# ## #P IsColorGroup( G ) . . . . . . . . . . . . . . . . . .is it a color group? ## DeclareProperty( "IsColorGroup", IsGroup ); ############################################################################# ## #A ColorSubgroup( G ) . . . . . . . . . . . . . . extract the color subgroup ## DeclareAttribute( "ColorSubgroup", IsColorGroup ); ############################################################################# ## #A ColorCosetList( G ) . . . . . . . . . . . . . .color labelling coset list ## DeclareAttribute( "ColorCosetList", IsColorGroup ); ############################################################################# ## #A ColorPermGroup( G ) . . . . . . . . . . . . . . . . . . . color PermGroup ## DeclareAttribute( "ColorPermGroup", IsColorGroup ); ############################################################################# ## #A ColorHomomorphism( G ) . . . . . . . . . .homomorphism to color PermGroup ## DeclareAttribute( "ColorHomomorphism", IsColorGroup ); ############################################################################# ## #F ColorOfElement( G, elem ) . . . . . . . . . . . . . . color of an element ## DeclareGlobalFunction( "ColorOfElement" ); ############################################################################# ## #F ColorGroup( G, H ) . . . . . . . . . . . . . . . . . . make a color group ## DeclareGlobalFunction( "ColorGroup" ); cryst/gap/common.gi0000644001325400021140000002227714053147612013763 0ustar gaehleruser############################################################################# ## #A common.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Common utility routines, most of which deal with integral matrices ## ############################################################################# ## #F MutableMatrix( M ) . . . . . . . . . . . . . . . . mutable copy of matrix ## MutableMatrix := function( M ) return List( M, ShallowCopy ); end; ############################################################################# ## #F AffMatMutableTrans( M ) . . . . . .affine matrix with mutable translation ## AffMatMutableTrans := function( M ) local l; if not IsMutable( M ) then M := ShallowCopy( M ); fi; l := Length( M ); if not IsMutable( M[l] ) then M[l] := ShallowCopy( M[l] ); fi; return M; end; ############################################################################# ## #F AugmentedMatrix( , ). . . . . construct augmented matrix ## AugmentedMatrix := function( m, b ) local g, t, x; g := MutableMatrix( m ); for x in g do Add( x, 0 ); od; t := ShallowCopy( b ); Add( t, 1 ); Add( g, t ); return g; end; ############################################################################# ## #F RowEchelonForm . . . . . . . . . . row echelon form of an integer matrix ## InstallMethod( RowEchelonForm, "for matrices", [ IsMatrix ], function( M ) local a, i, j, k, m, n, r, Cleared; if M = [] then return []; fi; M := MutableMatrix( M ); m := Length( M ); n := Length( M[1] ); i := 1; j := 1; while i <= m and j <= n do k := i; while k <= m and M[k][j] = 0 do k := k+1; od; if k <= m then r := M[i]; M[i] := M[k]; M[k] := r; for k in [k+1..m] do a := AbsInt( M[k][j] ); if a <> 0 and a < AbsInt( M[i][j] ) then r := M[i]; M[i] := M[k]; M[k] := r; fi; od; if M[i][j] < 0 then M[i] := -1 * M[i]; fi; Cleared := true; for k in [i+1..m] do a := QuoInt(M[k][j],M[i][j]); if a <> 0 then M[k] := M[k] - a * M[i]; fi; if M[k][j] <> 0 then Cleared := false; fi; od; if Cleared then i := i+1; j := j+1; fi; else j := j+1; fi; od; return M{[1..i-1]}; end ); ############################################################################# ## #F RowEchelonFormVector . . . . . . . . . . . .row echelon form with vector ## RowEchelonFormVector := function( M, b ) local a, i, j, k, m, n, r, Cleared; M := MutableMatrix( M ); m := Length( M ); if m = 0 then return M; fi; n := Length( M[1] ); i := 1; j := 1; while i <= m and j <= n do k := i; while k <= m and M[k][j] = 0 do k := k+1; od; if k <= m then r := M[i]; M[i] := M[k]; M[k] := r; r := b[i]; b[i] := b[k]; b[k] := r; for k in [k+1..m] do a := AbsInt( M[k][j] ); if a <> 0 and a < AbsInt( M[i][j] ) then r := M[i]; M[i] := M[k]; M[k] := r; r := b[i]; b[i] := b[k]; b[k] := r; fi; od; if M[i][j] < 0 then M[i] := -1 * M[i]; b[i] := -1 * b[i]; fi; Cleared := true; for k in [i+1..m] do a := QuoInt(M[k][j],M[i][j]); if a <> 0 then M[k] := M[k] - a * M[i]; b[k] := b[k] - a * b[i]; fi; if M[k][j] <> 0 then Cleared := false; fi; od; if Cleared then i := i+1; j := j+1; fi; else j := j+1; fi; od; return M{[1..i-1]}; end; ############################################################################# ## #F RowEchelonFormT . . . . . . . row echelon form with transformation matrix ## RowEchelonFormT := function( M, T ) local a, i, j, k, m, n, r, Cleared; M := MutableMatrix( M ); m := Length( M ); n := Length( M[1] ); i := 1; j := 1; while i <= m and j <= n do k := i; while k <= m and M[k][j] = 0 do k := k+1; od; if k <= m then r := M[i]; M[i] := M[k]; M[k] := r; r := T[i]; T[i] := T[k]; T[k] := r; for k in [k+1..m] do a := AbsInt( M[k][j] ); if a <> 0 and a < AbsInt( M[i][j] ) then r := M[i]; M[i] := M[k]; M[k] := r; r := T[i]; T[i] := T[k]; T[k] := r; fi; od; if M[i][j] < 0 then M[i] := -1 * M[i]; T[i] := -1 * T[i]; fi; Cleared := true; for k in [i+1..m] do a := QuoInt(M[k][j],M[i][j]); if a <> 0 then M[k] := M[k] - a * M[i]; T[k] := T[k] - a * T[i]; fi; if M[k][j] <> 0 then Cleared := false; fi; od; if Cleared then i := i+1; j := j+1; fi; else j := j+1; fi; od; return M{[1..i-1]}; end; ############################################################################# ## #F FractionModOne . . . . . . . . . . . . . . . . . . a fraction modulo one ## FractionModOne := function( q ) q := q - Int(q); if q < 0 then q := q+1; fi; return q; end; ############################################################################# ## #F VectorModL . . . . . . . . . . . . . . . . .vector modulo a free Z-module ## VectorModL := function( v, L ) local l, i, x, j; for l in L do i := PositionProperty( l, x -> x<>0 ); x := v[i]/l[i]; j := Int( x ); if x < 0 and not IsInt( x ) then j := j-1; fi; v := v - j*l; od; return v; end; ############################################################################# ## #F IntSolutionMat( M, b ) . . integer solution for inhom system of equations ## IntSolutionMat := function( M, b ) local Q, den, sol, i, x; if Concatenation(M) = [] then return fail; fi; # the trivial solution if RankMat( M ) = 0 then if b = 0 * M[1] then return List( M, x -> 0 ); else return fail; fi; fi; den := Lcm( List( Flat( M ), x -> DenominatorRat( x ) ) ); if den <> 1 then M := den*M; b := den*b; fi; b := ShallowCopy(b); Q := IdentityMat( Length(M) ); M := TransposedMat(M); M := RowEchelonFormVector( M,b ); while not IsDiagonalMat(M) do M := TransposedMat(M); M := RowEchelonFormT(M,Q); if not IsDiagonalMat(M) then M := TransposedMat(M); M := RowEchelonFormVector(M,b); fi; od; # are there integer solutions? sol:=[]; for i in [1..Length(M)] do x := b[i]/M[i][i]; if IsInt( x ) then Add( sol, x ); else return fail; fi; od; # are there solutions at all? for i in [Length(M)+1..Length(b)] do if b[i]<>0 then return fail; fi; od; return sol*Q{[1..Length(sol)]}; end; ############################################################################# ## #F ReducedLatticeBasis . . . . . . . . . reduce lattice basis to normal form ## ReducedLatticeBasis := function ( trans ) local m, f, b, r, L; if trans = [] or ForAll( trans, x -> IsZero( x ) ) then return []; fi; m := ShallowCopy( trans ); f := Flat( trans ); if not ForAll( f, IsRat ) then b := Basis( Field( f ) ); m := List( m, x -> BlownUpVector( b, x ) ); f := Flat( m ); fi; if not ForAll( f, IsInt ) then m := m * Lcm( List( f, DenominatorRat ) ); fi; r := NormalFormIntMat( m, 6 ); L := r.rowtrans{[1..r.rank]} * trans; return L; end; ############################################################################# ## #F UnionModule( M1, M2 ) . . . . . . . . . . . . union of two free Z-modules ## UnionModule := function( M1, M2 ) return ReducedLatticeBasis( Concatenation( M1, M2 ) ); end; ############################################################################# ## #F IntersectionModule( M1, M2 ) . . . . . intersection of two free Z-modules ## IntersectionModule := function( M1, M2 ) local M, Q, r, T; if M1 = [] or M2 = [] then return []; fi; M := Concatenation( M1, M2 ); M := M * Lcm( List( Flat( M ), DenominatorRat ) ); # Q := IdentityMat( Length( M ) ); # M := RowEchelonFormT( M, Q ); # T := Q{[Length(M)+1..Length(Q)]}{[1..Length(M1)]}; # if not IsEmpty(T) then T := T * M1; fi; r := NormalFormIntMat( M, 4 ); T := r.rowtrans{[r.rank+1..Length(M)]}{[1..Length(M1)]}; if not IsEmpty( T ) then T := T * M1; fi; return ReducedLatticeBasis( T ); end; cryst/gap/color.gi0000644001325400021140000001354213232361435013603 0ustar gaehleruser############################################################################# ## #A color.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Cryst - the crystallographic groups package for GAP (color groups) ## ############################################################################# ## #M IsColorGroup( G ) . . . . . . . . . . . . . . . . . .is it a color group? ## # Subgroups of ColorGroups are ColorGroups InstallSubsetMaintenance( IsColorGroup, IsGroup, IsCollection ); # ColorGroups always know that they are ColorGroups InstallMethod( IsColorGroup, "fallback method", true, [ IsGroup ], 0, G -> false ); ############################################################################# ## #M ColorSubgroup( G ) . . . . . . . . . . . . . . extract the color subgroup ## InstallMethod( ColorSubgroup, "for subgroups", true, [ IsColorGroup and HasParent ], 0, function( G ) local P; P := Parent( G ); while HasParent( P ) and P <> Parent( P ) do P := Parent( P ); od; return Intersection( ColorSubgroup( P ), G ); # return Stabilizer( G, ColorCosetList( P )[1], OnRight ); end ); ############################################################################# ## #M ColorCosetList( G ) . . . . . . . . . . . . . .color labelling coset list ## InstallMethod( ColorCosetList, "generic", true, [ IsColorGroup ], 0, G -> RightCosets( G, ColorSubgroup( G ) ) ); ############################################################################# ## #M ColorOfElement( G, elm ) . . . . . . . . . . . . . . .color of an element ## InstallGlobalFunction( ColorOfElement, function( G, elm ) local P, cos, i; P := G; while HasParent( P ) and Parent( P ) <> P do P := Parent( P ); od; cos := ColorCosetList( P ); for i in [1..Length( cos )] do if elm in cos[i] then return i; fi; od; Error("elm must be an element of G"); end ); ############################################################################# ## #F ColorPermGroupHomomorphism( G ) . . . . .color PermGroup and homomorphism ## ColorPermGroupHomomorphism := function( G ) local P, pmg, hom; P := G; while HasParent( P ) and P <> Parent( P ) do P := Parent( P ); od; pmg := Action( G, ColorCosetList( P ), OnRight ); hom := ActionHomomorphism( G, pmg ); return [ pmg, hom ]; end; ############################################################################# ## #M ColorPermGroup( G ) . . . . . . . . . . . . . . . . . . . color PermGroup ## InstallMethod( ColorPermGroup, "generic", true, [ IsColorGroup ], 0, function( G ) local tmp; tmp := ColorPermGroupHomomorphism( G ); SetColorHomomorphism( G, tmp[2] ); return tmp[1]; end ); ############################################################################# ## #M ColorHomomorphism( G ) . . . . . . . . . .homomorphism to color PermGroup ## InstallMethod( ColorHomomorphism, "generic", true, [ IsColorGroup ], 0, function( G ) local tmp; tmp := ColorPermGroupHomomorphism( G ); SetColorPermGroup( G, tmp[1] ); return tmp[2]; end ); ############################################################################# ## #M PointGroup( G ) . . . . . . . . . . . . . . . . . . . . .color PointGroup ## InstallMethod( PointGroup, "for colored AffineCrystGroups", true, [ IsColorGroup and IsAffineCrystGroupOnLeftOrRight ], 0, function( G ) local tmp, P, hom, H, reps; tmp := PointGroupHomomorphism( G ); P := tmp[1]; hom := tmp[2]; SetPointGroup( G, P ); SetPointHomomorphism( G, hom ); # color the point group if possible H := ColorSubgroup( G ); if TranslationBasis( G ) = TranslationBasis( H ) then H := PointGroup( H ); SetIsColorGroup( P, true ); SetColorSubgroup( P, H ); reps := List( ColorCosetList( G ), x -> ImagesRepresentative( hom, Representative( x ) ) ); SetColorCosetList( P, List( reps, x -> RightCoset( H, x ) ) ); fi; return P; end ); ############################################################################# ## #M ColorGroup( G, H ) . . . . . . . . . . . . . . . . . . make a color group ## InstallGlobalFunction( ColorGroup, function( G, H ) local C, U, P, reps; # H must be a subgroup of G if not IsSubgroup( G, H ) then Error("H must be contained in G"); fi; # since G may contain uncolored information components, make a new group C := GroupByGenerators( GeneratorsOfGroup( G ), One( G ) ); U := GroupByGenerators( GeneratorsOfGroup( H ), One( H ) ); # make C a color group SetIsColorGroup( C, true ); SetColorSubgroup( C, U ); # if G is an AffineCrystGroup, make C am AffineCrystGroup if IsCyclotomicMatrixGroup( G ) then if IsAffineCrystGroupOnRight( G ) then SetIsAffineCrystGroupOnRight( C, true ); SetIsAffineCrystGroupOnRight( U, true ); if HasTranslationBasis( H ) then AddTranslationBasis( U, TranslationBasis( H ) ); fi; if HasTranslationBasis( G ) then AddTranslationBasis( C, TranslationBasis( G ) ); fi; fi; if IsAffineCrystGroupOnLeft( G ) then SetIsAffineCrystGroupOnLeft( C, true ); SetIsAffineCrystGroupOnLeft( U, true ); if HasTranslationBasis( H ) then AddTranslationBasis( U, TranslationBasis( H ) ); fi; if HasTranslationBasis( G ) then AddTranslationBasis( C, TranslationBasis( G ) ); fi; fi; fi; SetParent( C, C ); return C; end ); cryst/gap/hom.gd0000644001325400021140000000275513236025737013255 0ustar gaehleruser############################################################################# ## #A hom.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #P IsPointHomomorphism . . . . . . . . . . . . . . . . . IsPointHomomorphism ## DeclareProperty( "IsPointHomomorphism", IsGroupGeneralMappingByImages ); ############################################################################# ## #A NiceToCryst . . . . . . .Lift from NiceObject of PointGroup to CrystGroup ## DeclareAttribute( "NiceToCryst", IsPointGroup ); ############################################################################# ## #F NiceToCrystStdRep( P, perm ) ## DeclareGlobalFunction( "NiceToCrystStdRep" ); ############################################################################# ## #P IsFromAffineCrystGroupToFpGroup ## DeclareProperty( "IsFromAffineCrystGroupToFpGroup", IsGroupGeneralMappingByImages ); ############################################################################# ## #P IsFromAffineCrystGroupToPcpGroup ## DeclareProperty( "IsFromAffineCrystGroupToPcpGroup", IsGroupGeneralMappingByImages ); cryst/gap/wygraph.gi0000644001325400021140000001320513232361435014142 0ustar gaehleruser############################################################################# ## #A wygraph.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for the determination and the display of a Wyckoff graph ## ############################################################################# ## #M CompareLevels( param1, param2 ) . . . . . . . . . . . . . . CompareLevels ## InstallMethod( CompareLevels, true, [ IsGraphicPosetRep and IsWyckoffGraph, IsList, IsList ], 0, function( graph, level1, level2 ) # a smaller dimension is higher if level1[1] < level2[1] then return -1; elif level1[1] > level2[1] then return 1; else # for equal dimension, the bigger size is higher if level1[2] > level2[2] then return -1; elif level1[2] > level2[2] then return 1; else return 0; fi; fi; end ); ############################################################################# ## #F WyckoffPosRelations( ) . . . incidence relations of Wyckoff positions ## WyckoffPosRelations := function( W ) local S, T, d, len, gens, G, L, m, O, o, i, j, k, Si, Sj, index, lst; S := WyckoffSpaceGroup( W[1] ); T := TranslationBasis( S ); d := DimensionOfMatrixGroup( S ) - 1; len := Length( W ); gens := GeneratorsOfGroup( S ); gens := Filtered( gens, g -> g{[1..d]}{[1..d]} <> IdentityMat( d ) ); if IsAffineCrystGroupOnLeft( S ) then gens := List( gens, TransposedMat ); fi; G := GroupByGenerators( gens, One( S ) ); L := List( W, w -> rec( translation := WyckoffTranslation( w ), basis := WyckoffBasis( w ), spaceGroup := S ) ); m := NullMat( len, len ); for i in [1..len] do O := Orbit( G, L[i], ImageAffineSubspaceLattice ); for j in [1..len] do Sj := WyckoffStabilizer( W[j] ); Si := WyckoffStabilizer( W[i] ); index := Size(Sj) / Size(Si); if Length(L[j].basis) < Length(L[i].basis) and IsInt(index) then lst := Filtered(O,o->IsSubspaceAffineSubspaceLattice(o,L[j])); m[j][i] := Length( lst ); fi; od; od; for i in Reversed([1..Length(W)]) do for j in Reversed([1..i-1]) do if m[j][i]<>0 then for k in [1..j-1] do if m[k][j]<>0 then m[k][i]:=0; fi; od; fi; od; od; return m; end; ############################################################################# ## #F WyckoffGraphRecord( ) . . . . . . . Create record for Wyckoff graph ## WyckoffGraphRecord := function( lst ) local L, m, R, i, level, j; L := List( lst, w -> rec( wypos := w, dim := Length( WyckoffBasis(w) ), size := Size( WyckoffStabilizer(w) ), class := w!.class ) ); Sort( L, function(a,b) return a.size > b.size; end ); m := WyckoffPosRelations( List( L, x -> x.wypos ) ); R := rec( levels := [], classes := [], vertices := [], edges := [] ); for i in [1..Length(L)] do level := [ L[i].dim, L[i].size ]; AddSet( R.levels, level ); AddSet( R.classes, [ L[i].class, level ] ); Add( R.vertices, [ L[i].wypos, level, L[i].class ] ); for j in [1..i-1] do if m[j][i]<>0 then Add( R.edges, [ i, j, m[j][i] ] ); fi; od; od; return R; end; ############################################################################# ## #M WyckoffGraphFun( W, def ) . . . . . . . . . . . . display a Wyckoff graph ## InstallGlobalFunction( WyckoffGraphFun, function( W, def ) local S, defaults, R, wygr, x, vertices, i, v, info, data, v1, v2; # set up defaults S := WyckoffSpaceGroup( W[1] ); defaults := rec(width := 800, height := 600, title := "WyckoffGraph"); if HasName(S) then defaults.title := Concatenation( defaults.title, " of ", Name(S) ); fi; if IsBound(def.width) then defaults.width := def.width; fi; if IsBound(def.height) then defaults.height := def.height; fi; if IsBound(def.title) then defaults.title := def.title; fi; R := WyckoffGraphRecord( W ); # open a graphic poset and make it a Wyckoff graph wygr := GraphicPoset( defaults.title, defaults.width, defaults.height ); SetFilterObj( wygr, IsWyckoffGraph ); # create levels for x in R.levels do CreateLevel( wygr, x, String( x ) ); od; # create classes for x in R.classes do CreateClass( wygr, x[2], x[1] ); od; # create vertices vertices := []; for i in [1..Length(R.vertices)] do v := R.vertices[i]; info := rec( label := String(i), levelparam := v[2], classparam := v[3] ); data := rec( wypos := v[1], info := rec() ); Add( vertices, Vertex( wygr, data, info ) ); od; # create edges for x in R.edges do v1 := vertices[ x[1] ]; v2 := vertices[ x[2] ]; Edge( wygr, v1, v2, rec( label := String( x[3]) ) ); od; # Install the info method wygr!.selector := false; wygr!.infodisplays := WyckoffInfoDisplays; InstallPopup( wygr, GGLRightClickPopup ); return wygr; end ); cryst/gap/equiv.gd0000644001325400021140000000125113232361435013603 0ustar gaehleruser############################################################################# ## #A equiv.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #O ConjugatorSpaceGroups( S1, S2 ) . . . . . . . . .returns C with S1^C = S2 ## DeclareOperation( "ConjugatorSpaceGroups", [ IsAffineCrystGroupOnLeftOrRight, IsAffineCrystGroupOnLeftOrRight ] ); cryst/gap/zass.gd0000644001325400021140000000364713232361435013445 0ustar gaehleruser############################################################################# ## #A zass.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for the determination of space groups for a given a point group ## ############################################################################# ## #O SpaceGroupsByPointGroupOnRight( [, [, ] ] ) ## DeclareOperation("SpaceGroupsByPointGroupOnRight",[IsCyclotomicMatrixGroup]); ############################################################################# ## #O SpaceGroupsByPointGroupOnLeft( [, [, ] ] ) ## DeclareOperation("SpaceGroupsByPointGroupOnLeft", [IsCyclotomicMatrixGroup]); ############################################################################# ## #O SpaceGroupsByPointGroup( [, [, ] ] ) ## DeclareOperation( "SpaceGroupsByPointGroup", [ IsCyclotomicMatrixGroup ] ); ############################################################################# ## #O SpaceGroupTypesByPointGroupOnRight( [, ] ) ## DeclareOperation("SpaceGroupTypesByPointGroupOnRight", [ IsCyclotomicMatrixGroup ] ); ############################################################################# ## #O SpaceGroupTypesByPointGroupOnLeft( [, ] ) ## DeclareOperation("SpaceGroupTypesByPointGroupOnLeft", [ IsCyclotomicMatrixGroup ] ); ############################################################################# ## #O SpaceGroupTypesByPointGroup( [, ] ) ## DeclareOperation( "SpaceGroupTypesByPointGroup", [IsCyclotomicMatrixGroup] ); cryst/gap/cryst.gi0000644001325400021140000006721415036404632013637 0ustar gaehleruser############################################################################# ## #A cryst.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-2012 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Methods for affine crystallographic groups ## ############################################################################# ## ## Utility functions ## ############################################################################# ############################################################################# ## #M IsAffineMatrixOnRight( ) . . . . . . . affine matrix action OnRight ## InstallGlobalFunction( IsAffineMatrixOnRight, function( mat ) local d, v; if not IsMatrix( mat ) or not IsCyclotomicCollColl( mat ) then return false; fi; d := Length( mat ); if not DimensionsMat( mat ) = [d,d] then return false; fi; v := 0 * [1..d]; v[d] := 1; return mat{[1..d]}[d] = v; end ); ############################################################################# ## #M IsAffineMatrixOnLeft( ) . . . . . . . . affine matrix action OnLeft ## InstallGlobalFunction( IsAffineMatrixOnLeft, function( mat ) local d, v; if not IsMatrix( mat ) or not IsCyclotomicCollColl( mat ) then return false; fi; d := Length( mat ); if not DimensionsMat( mat ) = [d,d] then return false; fi; v := 0 * [1..d]; v[d] := 1; return mat[d] = v; end ); ############################################################################# ## ## Methods and functions for CrystGroups and PointGroups ## ############################################################################# ############################################################################# ## #M IsAffineCrystGroupOnLeftOrRight( ) . . . . . AffineCrystGroup acting #M . . . . . . . . . . . . . . . . . . . . . . . . either OnLeft or OnRight ## InstallTrueMethod(IsAffineCrystGroupOnLeftOrRight,IsAffineCrystGroupOnRight); InstallTrueMethod(IsAffineCrystGroupOnLeftOrRight,IsAffineCrystGroupOnLeft); ############################################################################# ## #M TransposedMatrixGroup( ) . . . . . . . .transpose of AffineCrystGroup ## InstallMethod( TransposedMatrixGroup, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local gen, grp; gen := List( GeneratorsOfGroup( S ), TransposedMat ); grp := Group( gen, One( S ) ); if IsAffineCrystGroupOnRight( S ) then SetIsAffineCrystGroupOnLeft( grp, true ); else SetIsAffineCrystGroupOnRight( grp, true ); fi; if HasTranslationBasis( S ) then AddTranslationBasis( grp, TranslationBasis( S ) ); fi; SetTransposedMatrixGroup( grp, S ); UseIsomorphismRelation( S, grp ); return grp; end ); ############################################################################# ## #M InternalBasis( S ) . . . . . . . . . . . . . . . . . . . . internal basis ## InstallMethod( InternalBasis, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local d, T, basis, comp, i, j, k, mat; d := DimensionOfMatrixGroup( S ) - 1; T := TranslationBasis( S ); if Length( T ) = d then basis := T; elif Length( T ) = 0 then basis := IdentityMat( d ); else comp := NullMat( d - Length(T), d ); i:=1; j:=1; k:=1; while i <= Length( T ) do while T[i][j] = 0 do comp[k][j] := 1; k := k+1; j:=j+1; od; i := i+1; j := j+1; od; while j <= d do comp[k][j] := 1; k := k+1; j:=j+1; od; basis := Concatenation( T, comp ); fi; SetIsStandardAffineCrystGroup( S, basis = IdentityMat( d ) ); if not IsStandardAffineCrystGroup( S ) then mat := IdentityMat( d+1 ); mat{[1..d]}{[1..d]} := basis; if IsAffineCrystGroupOnRight( S ) then S!.lconj := mat; S!.rconj := mat^-1; else mat := TransposedMat( mat ); S!.lconj := mat^-1; S!.rconj := mat; fi; fi; return basis; end ); ############################################################################# ## #F TranslationBasisFun( S ) . . . . . determine basis of translation lattice ## TranslationBasisFun := function ( S ) local d, P, Sgens, Pgens, trans, g, m, F, Fgens, rel, new; if IsAffineCrystGroupOnLeft( S ) then Error( "use only for an AffineCrystGroupOnRight" ); fi; d := DimensionOfMatrixGroup( S ) - 1; P := PointGroup( S ); Pgens := []; Sgens := []; trans := []; # first the obvious translations for g in GeneratorsOfGroup( S ) do m := g{[1..d]}{[1..d]}; if IsOne( m ) then Add( trans, g[d+1]{[1..d]} ); else Add( Sgens, g ); Add( Pgens, m ); fi; od; # then the hidden translations if not IsTrivial( P ) then F := Image( IsomorphismFpGroupByGenerators( P, Pgens ) ); Fgens := GeneratorsOfGroup( FreeGroupOfFpGroup( F ) ); for rel in RelatorsOfFpGroup( F ) do new := MappedWord( rel, Fgens, Sgens ); Add( trans, new[d+1]{[1..d]} ); od; fi; # make translations invariant under point group trans := Set( Union( Orbits( P, trans ) ) ); return ReducedLatticeBasis( trans ); end; ############################################################################# ## #M AddTranslationBasis( S, basis ) . . . . .add basis of translation lattice ## InstallGlobalFunction( AddTranslationBasis, function ( S, basis ) local T; if not IsAffineCrystGroupOnLeftOrRight( S ) then Error("S must be an AffineCrystGroup"); fi; T := ReducedLatticeBasis( basis ); if HasTranslationBasis( S ) then if T <> TranslationBasis( S ) then Error("adding incompatible translation basis attempted"); fi; else SetTranslationBasis( S, T ); if not IsStandardAffineCrystGroup( S ) then InternalBasis( S ); # computes S!.lconj, S!.rconj fi; fi; end ); ############################################################################# ## #M TranslationBasis( S ) . . . . . . . . . . . .basis of translation lattice ## InstallMethod( TranslationBasis, true, [ IsAffineCrystGroupOnLeftOrRight ],0, function( S ) local T; if IsAffineCrystGroupOnRight( S ) then T := TranslationBasisFun( S ); else T := TranslationBasis( TransposedMatrixGroup( S ) ); fi; AddTranslationBasis( S, T ); return T; end ); ############################################################################# ## #M CheckTranslationBasis( S ) . . . . . . check basis of translation lattice ## InstallGlobalFunction( CheckTranslationBasis, function( S ) local T; if IsAffineCrystGroupOnRight( S ) then T := TranslationBasisFun( S ); else T := TranslationBasisFun( TransposedMatrixGroup( S ) ); fi; if HasTranslationBasis( S ) then if T <> TranslationBasis( S ) then Print( "#W Warning: translations are INCORRECT - you better\n", "#W start again with a fresh group!\n" ); fi; else AddTranslationBasis( S, T ); fi; end ); ############################################################################# ## #M \^( S, conj ) . . . . . . . . . . . . . . . . . . . . . . . change basis ## InstallOtherMethod( \^, IsCollsElms, [ IsAffineCrystGroupOnRight, IsMatrix ], 0, function ( S, conj ) local d, c, C, Ci, gens, i, R, W, r, w, t; d := DimensionOfMatrixGroup( S ) - 1; if not IsAffineMatrixOnRight( conj ) then Error( "conj must represent an affine transformation" ); fi; # get the conjugators; C := conj; Ci := conj^-1; c := C {[1..d]}{[1..d]}; t := C [d+1]{[1..d]}; # Translation # conjugate the generators of S gens := ShallowCopy( GeneratorsOfGroup( S ) ); for i in [1..Length(gens)] do gens[i] := Ci * gens[i] * C; od; R := AffineCrystGroupOnRight( gens, One( S ) ); # add translations if known if HasTranslationBasis( S ) then AddTranslationBasis( R, TranslationBasis( S ) * c ); fi; # add Wyckoff positions if known if HasWyckoffPositions( S ) then W := []; for w in WyckoffPositions( S ) do r := rec( basis := w!.basis, translation := w!.translation*c + t, class := w!.class, spaceGroup := R ); if r.basis <> [] then r.basis := r.basis * c; fi; ReduceAffineSubspaceLattice( r ); Add( W, WyckoffPositionObject( r ) ); od; SetWyckoffPositions( R, W ); fi; return R; end ); InstallOtherMethod( \^, IsCollsElms, [ IsAffineCrystGroupOnLeft, IsMatrix ], 0, function ( S, conj ) local d, c, C, Ci, gens, i, R, W, r, w, t; d := DimensionOfMatrixGroup( S ) - 1; if not IsAffineMatrixOnLeft( conj ) then Error( "conj must represent an affine transformation" ); fi; # get the conjugators; C := conj; Ci := conj^-1; c := TransposedMat( C {[1..d]}{[1..d]} ); t := C {[1..d]}[d+1]; # Translation # conjugate the generators of S gens := ShallowCopy( GeneratorsOfGroup( S ) ); for i in [1..Length(gens)] do gens[i] := C * gens[i] * Ci; od; R := AffineCrystGroupOnLeft( gens, One( S ) ); # add translations if known if HasTranslationBasis( S ) then AddTranslationBasis( R, TranslationBasis( S ) * c ); fi; # add Wyckoff positions if known if HasWyckoffPositions( S ) then W := []; for w in WyckoffPositions( S ) do r := rec( basis := w!.basis, translation := w!.translation*c + t, class := w!.class, spaceGroup := R ); if r.basis <> [] then r.basis := r.basis * c; fi; ReduceAffineSubspaceLattice( r ); Add( W, WyckoffPositionObject( r ) ); od; SetWyckoffPositions( R, W ); fi; return R; end ); ############################################################################# ## #M StandardAffineCrystGroup( S ) . . . . . . . . . . change basis to std rep ## InstallGlobalFunction( StandardAffineCrystGroup, function( S ) local B, d, C; if IsAffineCrystGroupOnRight( S ) then B := InternalBasis( S ); elif IsAffineCrystGroupOnLeft( S ) then B := TransposedMat( InternalBasis( S ) ); else Error( "S must be an AffineCrystGroup" ); fi; d := DimensionOfMatrixGroup( S ) - 1; C := IdentityMat( d+1 ); C{[1..d]}{[1..d]} := B^-1; return S^C; end ); ############################################################################# ## #M Size( S ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Size ## InstallMethod( Size, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) if Length( TranslationBasis( S ) ) > 0 then return infinity; else return Size( PointGroup( S ) ); fi; end ); ############################################################################# ## #M IsFinite( S ) . . . . . . . . . . . . . . . . . . . . . . . . . .IsFinite ## InstallMethod( IsFinite, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, S -> Length( TranslationBasis( S ) ) = 0 ); ############################################################################# ## #M EnumeratorSorted( S ) . . . . . . . . . . EnumeratorSorted for CrystGroup ## InstallMethod( EnumeratorSorted, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) if not IsFinite( S ) then Error("S is infinite"); else TryNextMethod(); fi; end ); ############################################################################# ## #M Enumerator( S ) . . . . . . . . . . . . . . . . Enumerator for CrystGroup ## InstallMethod( Enumerator, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) if not IsFinite( S ) then Error("S is infinite"); else TryNextMethod(); fi; end ); ############################################################################# ## #M TransParts( S ) reduced transl. parts of GeneratorsSmallest of point grp ## InstallMethod( TransParts, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local T, P, H, d, gens; T := TranslationBasis( S ); P := PointGroup( S ); H := PointHomomorphism( S ); d := DimensionOfMatrixGroup( P ); gens := GeneratorsSmallest( P ); gens := List( gens, x -> PreImagesRepresentative( H, x ) ); if IsAffineCrystGroupOnRight( S ) then gens := List( gens, x -> VectorModL( x[d+1]{[1..d]}, T ) ); else gens := List( gens, x -> VectorModL( x{[1..d]}[d+1], T ) ); fi; return gens; end ); ############################################################################# ## #M \<( S1, S2 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \< ## AffineCrystGroupLessFun := function( S1, S2 ) local T1, T2, P1, P2; # first compare the translation lattices T1 := TranslationBasis( S1 ); T2 := TranslationBasis( S2 ); if not T1 = T2 then return T1 < T2; fi; # then the point groups P1 := PointGroup( S1 ); P2 := PointGroup( S2 ); if not P1 = P2 then return P1 < P2; fi; # finally the translation parts return TransParts( S1 ) < TransParts( S2 ); end; InstallMethod( \<, "two AffineCrystGroupOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, AffineCrystGroupLessFun ); InstallMethod( \<, "two AffineCrystGroupOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, AffineCrystGroupLessFun ); ############################################################################# ## #M \in( m, S ) . . . . . . . . . . . . . . . .check membership in CrystGroup ## InstallMethod( \in, "for CrystGroup", IsElmsColls, [ IsMatrix, IsAffineCrystGroupOnLeftOrRight ], 0, function( m, S ) local d, P, mm, t; if not DimensionsMat( m ) = DimensionsMat( One(S) ) then return false; fi; d := DimensionOfMatrixGroup( S ) - 1; P := PointGroup( S ); mm := m{[1..d]}{[1..d]}; if not mm in P then return false; fi; mm := PreImagesRepresentativeNC( PointHomomorphism( S ), mm ); if IsAffineCrystGroupOnRight( S ) then if not IsAffineMatrixOnRight( m ) then return false; fi; t := m[d+1]{[1..d]} - mm[d+1]{[1..d]}; else if not IsAffineMatrixOnLeft( m ) then return false; fi; t := m{[1..d]}[d+1] - mm{[1..d]}[d+1]; fi; return 0*t = VectorModL( t, TranslationBasis( S ) ); end ); ############################################################################# ## #M IsSpaceGroup( S ) . . . . . . . . . . . . . . . . . . is S a space group? ## InstallMethod( IsSpaceGroup, true, [ IsCyclotomicMatrixGroup ], 0, function( S ) local d; if IsAffineCrystGroupOnLeftOrRight( S ) then d := DimensionOfMatrixGroup( S ) - 1; return d = Length( TranslationBasis( S ) ); else return false; fi; end ); ############################################################################# ## #M IsSymmorphicSpaceGroup( S ) . . . . . . . . . . . . . . .is S symmorphic? ## InstallMethod( IsSymmorphicSpaceGroup, "generic method", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function ( S ) local d, gen, mat, vec, sol; d := DimensionOfMatrixGroup( S ) - 1; gen := GeneratorsOfGroup( StandardAffineCrystGroup(S) ); gen := Filtered( List( gen, g -> g - One(S) ), m -> not IsZero( m{[1..d]}{[1..d]} ) ); if IsEmpty( gen ) then gen := [ One(S) ]; fi; if IsAffineCrystGroupOnLeft(S) then gen := List( gen, TransposedMat ); fi; mat := List( [1..d], i -> Concatenation( List( gen, g -> g[i]{[1..d]} ) ) ); vec := List( Concatenation( List( gen, g -> g[d+1]{[1..d]} ) ), FractionModOne ); sol := SolveInhomEquationsModZ( mat, vec, true ); return not IsEmpty( sol[1] ); end ); ############################################################################# ## #M IsStandardAffineCrystGroup( S ) . . . . . . . . . is S in standard form? ## InstallMethod( IsStandardAffineCrystGroup, true, [ IsCyclotomicMatrixGroup ], 0, function( S ) local d, T; if IsAffineCrystGroupOnLeftOrRight( S ) then d := DimensionOfMatrixGroup( S ) - 1; return InternalBasis( S ) = IdentityMat( d ); else return false; fi; end ); ############################################################################# ## #F PointGroupHomomorphism( S ) . . . . . . . . . . . .PointGroupHomomorphism ## PointGroupHomomorphism := function( S ) local d, gen, im, I, Pgens, Sgens, i, P, nice, N, perms, lift, H; d := DimensionOfMatrixGroup( S ) - 1; gen := GeneratorsOfGroup( S ); im := List( gen, m -> m{[1..d]}{[1..d]} ); I := IdentityMat( d ); Pgens := []; Sgens := []; for i in [1..Length( im )] do if im[i] <> I and not im[i] in Pgens then Add( Pgens, im[i] ); Add( Sgens, MutableMatrix( gen[i] ) ); fi; od; P := GroupByGenerators( Pgens, I ); SetIsPointGroup( P, true ); SetAffineCrystGroupOfPointGroup( P, S ); if not IsFinite( P ) then Error( "AffineCrystGroups must have a *finite* point group" ); fi; nice := NiceMonomorphism( P ); N := NiceObject( P ); perms := List( Pgens, x -> ImagesRepresentative( nice, x ) ); lift := GroupGeneralMappingByImagesNC( N, S, perms, Sgens : noassert ); SetNiceToCryst( P, lift ); H := GroupHomomorphismByImagesNC( S, P, gen, im : noassert ); SetIsPointHomomorphism( H, true ); return [ P, H ]; end; ############################################################################# ## #M PointGroup( S ) . . . . . . . . . . . . PointGroup of an AffineCrystGroup ## InstallMethod( PointGroup, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local res; res := PointGroupHomomorphism( S ); SetPointHomomorphism( S, res[2] ); return res[1]; end ); ############################################################################# ## #M PointHomomorphism( S ) . . . . . PointHomomorphism of an AffineCrystGroup ## InstallMethod( PointHomomorphism, true, [IsAffineCrystGroupOnLeftOrRight], 0, function( S ) local res; res := PointGroupHomomorphism( S ); SetPointGroup( S, res[1] ); return res[2]; end ); ############################################################################# ## #M IsPointGroup(

    ) . . . . . . . . . PointGroup of an AffineCrystGroup? ## # PointGroups always know that they are PointGroups InstallMethod( IsPointGroup, "fallback method", true, [ IsCyclotomicMatrixGroup ], 0, P -> false ); ############################################################################# ## #M IsSubset( , ) . . . . . . . . . . . . . . . for AffineCrystGroups ## InstallMethod( IsSubset, IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnLeft ], 0, ReturnFalse); InstallMethod( IsSubset, IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnRight ], 0, ReturnFalse); ############################################################################# ## ## Identification and construction of affine crystallographic groups ## ############################################################################# ############################################################################# ## #M IsAffineCrystGroupOnRight( ) . . . . AffineCrystGroup acting OnRight ## # Subgroups of AffineCrystGroups are AffineCrystGroups InstallSubsetMaintenance( IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, IsCollection ); # AffineCrystGroups always know that they are AffineCrystGroups InstallMethod( IsAffineCrystGroupOnRight, "fallback method", true, [ IsCyclotomicMatrixGroup ], 0, S -> false ); ############################################################################# ## #M IsAffineCrystGroupOnLeft( ) . . . . . AffineCrystGroup acting OnLeft ## # Subgroups of AffineCrystGroups are AffineCrystGroups InstallSubsetMaintenance( IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, IsCollection ); # AffineCrystGroups always know that they are AffineCrystGroups InstallMethod( IsAffineCrystGroupOnLeft, "fallback method", true, [ IsCyclotomicMatrixGroup ], 0, S -> false ); ############################################################################# ## #M IsAffineCrystGroup( ) . . . . . . . . . . . . AffineCrystGroup acting #M . . . . . . . . . . . . . . . . . as specified by CrystGroupDefaultAction ## InstallGlobalFunction( IsAffineCrystGroup, function( S ) if CrystGroupDefaultAction = RightAction then return IsAffineCrystGroupOnRight( S ); elif CrystGroupDefaultAction = LeftAction then return IsAffineCrystGroupOnLeft( S ); else Error(" CrystGroupDefaultAction must be RightAction or LeftAction" ); fi; end ); ############################################################################# ## #M AffineCrystGroupOnRight( ) . . . . . . . . . . . . . . . . . . . . #M AffineCrystGroupOnRight( ) . . . . . . . . . . . . . . . . . . #M AffineCrystGroupOnRight( , ) . . . . . . constructor ## InstallGlobalFunction( AffineCrystGroupOnRight, function( arg ) local G; G := CallFuncList( Group, arg ); return AsAffineCrystGroupOnRight( G ); end ); InstallGlobalFunction( AffineCrystGroupOnRightNC, function( arg ) local G; G := CallFuncList( Group, arg ); SetIsAffineCrystGroupOnRight( G, true ); return G; end ); ############################################################################# ## #M AffineCrystGroupOnLeft( ) . . . . . . . . . . . . . . . . . . . . #M AffineCrystGroupOnLeft( ) . . . . . . . . . . . . . . . . . . . #M AffineCrystGroupOnLeft( , ) . . . . . . . constructor ## InstallGlobalFunction( AffineCrystGroupOnLeft, function( arg ) local G; G := CallFuncList( Group, arg ); return AsAffineCrystGroupOnLeft( G ); end ); InstallGlobalFunction( AffineCrystGroupOnLeftNC, function( arg ) local G; G := CallFuncList( Group, arg ); SetIsAffineCrystGroupOnLeft( G, true ); return G; end ); ############################################################################# ## #M AffineCrystGroup( ) . . . . . . . . . . . . . . . . . . . . . . . #M AffineCrystGroup( ) . . . . . . . . . . . . . . . . . . . . . . #M AffineCrystGroup( , ) . . . . . . . . . . constructor ## InstallGlobalFunction( AffineCrystGroup, function( arg ) local G; G := CallFuncList( Group, arg ); if CrystGroupDefaultAction = RightAction then return AsAffineCrystGroupOnRight( G ); else return AsAffineCrystGroupOnLeft( G ); fi; end ); InstallGlobalFunction( AffineCrystGroupNC, function( arg ) local G; G := CallFuncList( Group, arg ); if CrystGroupDefaultAction = RightAction then SetIsAffineCrystGroupOnRight( G, true ); return G; else SetIsAffineCrystGroupOnLeft( G, true ); return G; fi; end ); ############################################################################# ## #M AsAffineCrystGroupOnRight( S ) . . . . . . . . . . . convert matrix group ## InstallGlobalFunction( AsAffineCrystGroupOnRight, function( S ) local ph; if HasIsAffineCrystGroupOnRight( S ) then if IsAffineCrystGroupOnRight( S ) then return S; else S := Group( GeneratorsOfGroup( S ), One( S ) ); fi; fi; # an AffineCrystGroup cannot act both OnLeft and OnRight if IsAffineCrystGroupOnLeft( S ) then S := Group( GeneratorsOfGroup( S ), One( S ) ); fi; # do a few basic checks if ForAny( GeneratorsOfGroup( S ), x -> not IsAffineMatrixOnRight( x ) ) then Error("this group can not be made an AffineCrystGroupOnRight"); fi; # check if PointGroup is finite ph := PointGroupHomomorphism( S ); # if check did not fail, we can make S an AffineCrystGroupOnRight SetIsAffineCrystGroupOnRight( S, true ); SetPointGroup( S, ph[1] ); SetPointHomomorphism( S, ph[2] ); return S; end ); ############################################################################# ## #M AsAffineCrystGroupOnLeft( S ) . . . . . . . . . . . convert matrix group ## InstallGlobalFunction( AsAffineCrystGroupOnLeft, function( S ) local ph; if HasIsAffineCrystGroupOnLeft( S ) then if IsAffineCrystGroupOnLeft( S ) then return S; else S := Group( GeneratorsOfGroup( S ), One( S ) ); fi; fi; # an AffineCrystGroup cannot act both OnLeft and OnRight if IsAffineCrystGroupOnRight( S ) then S := Group( GeneratorsOfGroup( S ), One( S ) ); fi; # do a few basic checks if ForAny( GeneratorsOfGroup( S ), x -> not IsAffineMatrixOnLeft( x ) ) then Error("this group can not be made an AffineCrystGroupOnLeft"); fi; # check if PointGroup is finite ph := PointGroupHomomorphism( S ); # if check did not fail, we can make S an AffineCrystGroupOnLeft SetIsAffineCrystGroupOnLeft( S, true ); SetPointGroup( S, ph[1] ); SetPointHomomorphism( S, ph[2] ); return S; end ); ############################################################################# ## #F AsAffineCrystGroup( ) . . . . . . . . . . . . . convert matrix group ## InstallGlobalFunction( AsAffineCrystGroup, function( S ) if CrystGroupDefaultAction = RightAction then return AsAffineCrystGroupOnRight( S ); else return AsAffineCrystGroupOnLeft( S ); fi; end ); ############################################################################# ## #M CanEasilyTestMembership( ) ## InstallTrueMethod( CanEasilyTestMembership, IsAffineCrystGroupOnLeftOrRight); ############################################################################# ## #M CanComputeSize( ) ## InstallTrueMethod( CanComputeSize, IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #M CanComputeSizeAnySubgroup( ) ## InstallTrueMethod(CanComputeSizeAnySubgroup,IsAffineCrystGroupOnLeftOrRight); ############################################################################# ## #M CanComputeIndex( , ) ## InstallMethod( CanComputeIndex, IsIdenticalObj, [IsAffineCrystGroupOnRight,IsAffineCrystGroupOnRight], 0, ReturnTrue ); InstallMethod( CanComputeIndex, IsIdenticalObj, [IsAffineCrystGroupOnLeft,IsAffineCrystGroupOnLeft], 0, ReturnTrue ); ############################################################################# ## #M CanComputeIsSubset( , ) ## InstallMethod( CanComputeIsSubset, IsIdenticalObj, [IsAffineCrystGroupOnRight,IsAffineCrystGroupOnRight], 0, ReturnTrue ); InstallMethod( CanComputeIsSubset, IsIdenticalObj, [IsAffineCrystGroupOnLeft,IsAffineCrystGroupOnLeft], 0, ReturnTrue ); ############################################################################# ## #M HirschLength( ) . . . . . . . . . . . . . . . . .Hirsch length of ## InstallMethod( HirschLength, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) return Length( TranslationBasis( S ) ); end ); cryst/gap/wyckoff.gi0000644001325400021140000005706615064273214014150 0ustar gaehleruser############################################################################# ## #A wyckoff.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-2012 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for the determination of Wyckoff positions ## ############################################################################# ## #M WyckoffPositionObject . . . . . . . . . . .make a Wyckoff position object ## InstallGlobalFunction( WyckoffPositionObject, function( w ) return Objectify( NewType( FamilyObj( w ), IsWyckoffPosition ), w ); end ); ############################################################################# ## #M PrintObj . . . . . . . . . . . . . . . . . . . . . Print Wyckoff position ## InstallMethod( PrintObj, "Wyckoff position", true, [ IsWyckoffPosition ], 0, function( w ) Print( "< Wyckoff position, point group ", w!.class, ", translation := ", w!.translation, ", \nbasis := ", w!.basis, " >\n" ); end ); ############################################################################# ## #M ViewObj . . . . . . . . . . . . . . . . . . . . . View a Wyckoff position ## InstallMethod( ViewObj, "Wyckoff position", true, [ IsWyckoffPosition ], 0, function( w ) Print( "< Wyckoff position, point group ", w!.class, ", translation := ", w!.translation, ", \nbasis := ", w!.basis, " >\n" ); end ); ############################################################################# ## #M WyckoffSpaceGroup . . . . . . . . . . . . .space group of WyckoffPosition ## InstallMethod( WyckoffSpaceGroup, true, [ IsWyckoffPosition ], 0, w -> w!.spaceGroup ); ############################################################################# ## #M WyckoffTranslation . . . . . . . . . .translation of representative space ## InstallMethod( WyckoffTranslation, true, [ IsWyckoffPosition ], 0, w -> w!.translation ); ############################################################################# ## #M WyckoffBasis . . . . . . . . . . . . . . . .basis of representative space ## InstallMethod( WyckoffBasis, true, [ IsWyckoffPosition ], 0, w -> w!.basis ); ############################################################################# ## #M ReduceAffineSubspaceLattice . . . . reduce affine subspace modulo lattice ## InstallGlobalFunction( ReduceAffineSubspaceLattice, function( r ) local rk, d, T, Ti, M, R, Q, Qi, P, v, j; r.basis := ReducedLatticeBasis( r.basis ); rk := Length( r.basis ); d := Length( r.translation ); T := TranslationBasis( r.spaceGroup ); Ti := T^-1; if rk = d then v := 0 * r.translation; elif rk > 0 then M := r.basis; v := r.translation; if not IsStandardAffineCrystGroup( r.spaceGroup ) then M := M * Ti; v := v * Ti; fi; # these three lines are faster than the other four Q := IdentityMat(d); RowEchelonFormT(TransposedMat(M),Q); Q := TransposedMat(Q); # R := NormalFormIntMat( TransposedMat( M ), 4 ); # Q := TransposedMat( R.rowtrans ); # R := NormalFormIntMat( M, 9 ); # Q := R.coltrans; Qi := Q^-1; P := Q{[1..d]}{[rk+1..d]} * Qi{[rk+1..d]}; v := List( v * P, FractionModOne ); if not IsStandardAffineCrystGroup( r.spaceGroup ) then v := v * T; fi; v := VectorModL( v, T ); else v := VectorModL( r.translation, T ); fi; r.translation := v; end ); ############################################################################# ## #F ImageAffineSubspaceLattice . . . .image of affine subspace modulo lattice ## InstallGlobalFunction( ImageAffineSubspaceLattice, function( s, g ) local d, m, t, b, r; d := Length( s.translation ); m := g{[1..d]}{[1..d]}; t := g[d+1]{[1..d]}; b := s.basis; if not IsEmpty(b) then b := b * m; fi; r := rec( translation := s.translation * m + t, basis := b, spaceGroup := s.spaceGroup ); ReduceAffineSubspaceLattice( r ); return r; end ); ############################################################################# ## #F ImageAffineSubspaceLatticePointwise . . . . . . image of pointwise affine #F subspace modulo lattice ## InstallGlobalFunction( ImageAffineSubspaceLatticePointwise, function( s, g ) local d, m, t, b, L, r; d := Length( s.translation ); m := g{[1..d]}{[1..d]}; t := g[d+1]{[1..d]}; b := s.basis; if not IsEmpty(b) then b := b * m; fi; L := TranslationBasis( s.spaceGroup ); r := rec( translation := VectorModL( s.translation * m + t, L ), basis := b, spaceGroup := s.spaceGroup ); return r; end ); ############################################################################# ## #M \= . . . . . . . . . . . . . . . . . . . . . . .for two Wyckoff positions ## InstallMethod( \=, IsIdenticalObj, [ IsWyckoffPosition, IsWyckoffPosition ], 0, function( w1, w2 ) local S, r1, r2, d, gens, U, rep; S := WyckoffSpaceGroup( w1 ); if S <> WyckoffSpaceGroup( w2 ) then return false; fi; r1 := rec( translation := WyckoffTranslation( w1 ), basis := WyckoffBasis( w1 ), spaceGroup := WyckoffSpaceGroup( w1 ) ); r2 := rec( translation := WyckoffTranslation( w2 ), basis := WyckoffBasis( w2 ), spaceGroup := WyckoffSpaceGroup( w2 ) ); r1 := ImageAffineSubspaceLattice( r1, One(S) ); r2 := ImageAffineSubspaceLattice( r2, One(S) ); d := DimensionOfMatrixGroup( S ) - 1; gens := Filtered( GeneratorsOfGroup( S ), x -> x{[1..d]}{[1..d]} <> One( PointGroup( S ) ) ); U := SubgroupNC( S, gens ); if IsAffineCrystGroupOnLeft( U ) then U := TransposedMatrixGroup( U ); fi; rep := RepresentativeAction( U, r1, r2, ImageAffineSubspaceLattice ); return rep <> fail; end ); ############################################################################# ## #M \< . . . . . . . . . . . . . . . . . . . . . . .for two Wyckoff positions ## InstallMethod( \<, IsIdenticalObj, [ IsWyckoffPosition, IsWyckoffPosition ], 0, function( w1, w2 ) local S, r1, r2, d, gens, U, o1, o2; S := WyckoffSpaceGroup( w1 ); if S <> WyckoffSpaceGroup( w2 ) then return S < WyckoffSpaceGroup( w2 ); fi; r1 := rec( translation := WyckoffTranslation( w1 ), basis := WyckoffBasis( w1 ), spaceGroup := WyckoffSpaceGroup( w1 ) ); r2 := rec( translation := WyckoffTranslation( w2 ), basis := WyckoffBasis( w2 ), spaceGroup := WyckoffSpaceGroup( w2 ) ); r1 := ImageAffineSubspaceLattice( r1, One(S) ); r2 := ImageAffineSubspaceLattice( r2, One(S) ); d := DimensionOfMatrixGroup( S ) - 1; gens := Filtered( GeneratorsOfGroup( S ), x -> x{[1..d]}{[1..d]} <> One( PointGroup( S ) ) ); U := SubgroupNC( S, gens ); if IsAffineCrystGroupOnLeft( U ) then U := TransposedMatrixGroup( U ); fi; o1 := Orbit( U, r1, ImageAffineSubspaceLattice ); o2 := Orbit( U, r2, ImageAffineSubspaceLattice ); o1 := Set( List( o1, x -> rec( t := x.translation, b := x.basis ) ) ); o2 := Set( List( o2, x -> rec( t := x.translation, b := x.basis ) ) ); return o1[1] < o2[1]; end ); ############################################################################# ## #M WyckoffStabilizer . . . . . . . . . . .stabilizer of representative space ## InstallMethod( WyckoffStabilizer, true, [ IsWyckoffPosition ], 0, function( w ) local S, t, B, d, I, gen, U, r, new, n, g, v; S := WyckoffSpaceGroup( w ); t := WyckoffTranslation( w ); B := WyckoffBasis( w ); d := Length( t ); I := IdentityMat( d ); gen := GeneratorsOfGroup( S ); gen := Filtered( gen, g -> g{[1..d]}{[1..d]} <> I ); if IsAffineCrystGroupOnLeft( S ) then gen := List( gen, TransposedMat ); fi; U := AffineCrystGroupOnRight( gen, One( S ) ); r := rec( translation := t, basis := B, spaceGroup := S ); U := Stabilizer( U, r, ImageAffineSubspaceLatticePointwise ); t := ShallowCopy( t ); Add( t, 1 ); gen := GeneratorsOfGroup( U ); new := []; for g in gen do v := t * g - t; n := List( g, ShallowCopy ); n[d+1] := g[d+1] - v; if n <> One( S ) then AddSet( new, n ); fi; od; if IsAffineCrystGroupOnLeft( S ) then new := List( new, TransposedMat ); fi; return SubgroupNC( S, new ); end ); ############################################################################# ## #M WyckoffOrbit( w ) . . . . . . . . . orbit of pointwise subspace lattices ## InstallMethod( WyckoffOrbit, true, [ IsWyckoffPosition ], 0, function( w ) local S, t, B, d, I, gen, U, r, o, s; S := WyckoffSpaceGroup( w ); t := WyckoffTranslation( w ); B := WyckoffBasis( w ); d := Length( t ); I := IdentityMat( d ); gen := GeneratorsOfGroup( S ); gen := Filtered( gen, g -> g{[1..d]}{[1..d]} <> I ); if IsAffineCrystGroupOnLeft( S ) then gen := List( gen, TransposedMat ); fi; U := AffineCrystGroupOnRight( gen, One( S ) ); r := rec( translation := t, basis := B, spaceGroup := S ); o := SortedList( Orbit( U, r, ImageAffineSubspaceLatticePointwise ) ); s := List( o, x -> WyckoffPositionObject( rec( translation := x.translation, basis := x.basis, spaceGroup := w!.spaceGroup, class := w!.class ) ) ); return s; end ); ############################################################################# ## #F SolveOneInhomEquationModZ . . . . . . . . solve one inhom equation mod Z ## ## Solve the inhomogeneous equation ## ## a x = b (mod Z). ## ## The set of solutions is ## {0, 1/a, ..., (a-1)/a} + b/a. ## Note that 0 < b < 1, so 0 < b/a and (a-1)/a + b/a < 1. ## SolveOneInhomEquationModZ := function( a, b ) return [0..a-1] / a + b/a; end; ############################################################################# ## #F SolveInhomEquationsModZ . . . . .solve an inhom system of equations mod Z ## ## If onRight = true, compute the set of solutions of the equation ## ## x * M = b (mod Z). ## ## If onRight = false, compute the set of solutions of the equation ## ## M * x = b (mod Z). ## ## RowEchelonFormT() returns a matrix Q such that Q * M is in row echelon ## form. This means that (modulo column operations) we have the equation ## x * Q^-1 * D = b with D a diagonal matrix. ## Solving y * D = b we get x = y * Q. ## InstallGlobalFunction( SolveInhomEquationsModZ, function( M, b, onRight ) local Q, j, L, space, i, v; b := ShallowCopy(b); if onRight then M := TransposedMat(M); fi; Q := IdentityMat( Length(M[1]) ); M := RowEchelonFormVector( M,b ); while Length(M) > 0 and not IsDiagonalMat(M) do M := TransposedMat(M); M := RowEchelonFormT(M,Q); if Length(M) > 0 and not IsDiagonalMat(M) then M := TransposedMat(M); M := RowEchelonFormVector(M,b); fi; od; ## Now we have D * y = b with y = Q * x ## Check if we have any solutions modulo Z. for j in [Length(M)+1..Length(b)] do if not IsInt( b[j] ) then return [ [], [] ]; fi; od; ## Solve each line in D * y = b separately. L := List( [1..Length(M)], i->SolveOneInhomEquationModZ( M[i][i],b[i] ) ); L := Cartesian( L ); L := List( L, l->Concatenation( l, 0 * [Length(M)+1..Length(Q)] ) ); L := List( L, l-> l * Q ); L := List( L, l->List( l, q->FractionModOne(q) ) ); return [ L, Q{[Length(M)+1..Length(Q)]} ]; end ); ############################################################################# ## #F FixedPointsModZ . . . . . . fixed points up to translational equivalence ## ## This function takes a space group and computes the fixpoint spaces of ## this group modulo the translation subgroup. It is assumed that the ## translation subgroup has full rank. ## FixedPointsModZ := function( gens, d ) local I, M, b, i, g, f, F; # Solve x * M + t = x modulo Z for all pairs (M,t) in the generators. # This leads to the system # x * [ M_1 M_2 ... ] = [ b_1 b_2 ... ] (mod Z) M := List( [1..d], i->[] ); b := []; i := 0; I := IdentityMat(d+1); for g in gens do g := g - I; M{[1..d]}{[1..d]+i*d} := g{[1..d]}{[1..d]}; Append( b, -g[d+1]{[1..d]} ); i := i+1; od; # Catch trivial case if Length(M[1]) = 0 then M := List( [1..d], x->[0] ); b := [0]; fi; ## Compute the spaces of points fixed modulo translations. F := SolveInhomEquationsModZ( M, b, true ); return List( F[1], f -> rec( translation := f, basis := F[2] ) ); end; ############################################################################# ## #F IntersectionsAffineSubspaceLattice( , ) ## IntersectionsAffineSubspaceLattice := function( U, V ) local T, m, t, Ti, s, b, lst, x, len, tt; T := TranslationBasis( U.spaceGroup ); m := Concatenation( U.basis, -V.basis ); t := V.translation - U.translation; Ti := T^-1; s := SolveInhomEquationsModZ( m*Ti, t*Ti, true ); if s[1] = [] then return fail; fi; b := IntersectionModule( U.basis, -V.basis ); lst := []; for x in s[1] do tt := x{[1..Length(U.basis)]} * U.basis + U.translation; Add( lst, rec( translation := tt, basis := b, spaceGroup := U.spaceGroup ) ); od; for x in lst do ReduceAffineSubspaceLattice( x ); od; return lst; end; ############################################################################# ## #F IsSubspaceAffineSubspaceLattice( , ) repres. of V contained in U? ## IsSubspaceAffineSubspaceLattice := function( U, V ) local s; s := IntersectionsAffineSubspaceLattice( U, V ); if s = fail then return false; else return V in s; fi; end; ############################################################################# ## #F WyPos( S, stabs, lift ) . . . . . . . . . . . . . . . . Wyckoff positions ## WyPos := function( S, stabs, lift ) local d, W, T, i, lst, w, dim, a, s, r, new, orb, I, gen, U, c; # get representative affine subspace lattices d := DimensionOfMatrixGroup( S ) - 1; W := List( [0..d], i -> [] ); T := TranslationBasis( S ); for i in [1..Length(stabs)] do lst := List( GeneratorsOfGroup( stabs[i] ), lift ); if IsAffineCrystGroupOnLeft( S ) then lst := List( lst, TransposedMat ); fi; lst := FixedPointsModZ( lst, d ); for w in lst do dim := Length( w.basis ) + 1; w.translation := w.translation * T; if not IsEmpty( w.basis ) then w.basis := w.basis * T; fi; w.spaceGroup := S; ReduceAffineSubspaceLattice( w ); w.class := i; if Size( WyckoffStabilizer( WyckoffPositionObject( ShallowCopy(w) ) ) ) = Size( stabs[i] ) then Add( W[dim], w ); fi; od; od; # eliminate multiple copies I := IdentityMat( d ); gen := Filtered( GeneratorsOfGroup( S ), g -> g{[1..d]}{[1..d]} <> I ); if IsAffineCrystGroupOnLeft( S ) then gen := List( gen, TransposedMat ); fi; U := AffineCrystGroupOnRight( gen, One( S ) ); for i in [1..d+1] do lst := ShallowCopy( W[i] ); new := []; while lst <> [] do s := lst[1]; c := s.class; Unbind( s.class ); orb := SortedList( Orbit( U, Immutable(s), ImageAffineSubspaceLattice ) ); lst := Filtered( lst, x -> not rec( translation := x.translation, basis := x.basis, spaceGroup := x.spaceGroup ) in orb ); s := ShallowCopy( orb[1] ); s.class := c; Add( new, WyckoffPositionObject( s ) ); od; W[i] := new; od; return Flat( W ); end; ############################################################################# ## #F WyPosSGL( S ) . . . Wyckoff positions via subgroup lattice of point group ## WyPosSGL := function( S ) local P, N, lift, stabs, W; # get point group P, and its nice representation N P := PointGroup( S ); N := NiceObject( P ); # set up lift from nice rep to std rep lift := x -> NiceToCrystStdRep( P, x ); stabs := List( ConjugacyClassesSubgroups( N ), Representative ); Sort( stabs, function(x,y) return Size(x) > Size(y); end ); # now get the Wyckoff positions return WyPos( S, stabs, lift ); end; ############################################################################# ## #F WyPosStep . . . . . . . . . . . . . . . . . . .induction step for WyPosAT ## WyPosStep := function( idx, G, M, b, lst ) local g, G2, ln, M2, b2, F, c, added, stop, f, d, w, O, o; g := lst.z[idx]; if not g in G then G2 := ClosureGroup( G, g ); ln := Size( PointGroup(lst.S2) ) / Size( G2 ); M2 := Concatenation( M, lst.mat[idx] ); b2 := Concatenation( b, lst.vec[idx] ); if M <> [] then M2 := RowEchelonFormVector( M2, b2 ); fi; if ForAll( b2{[Length(M2)+1..Length(b2)]}, IsInt ) then b2 := b2{[1..Length(M2)]}; F := SolveInhomEquationsModZ( M2, b2, false ); F := List( F[1], f -> rec( translation := f, basis := F[2] ) ); else F := []; fi; c := lst.c + 1; added := false; for f in F do d := Length( f.basis ) + 1; stop := d=lst.dim+1; f.translation := f.translation * lst.T; if not IsEmpty( f.basis ) then f.basis := f.basis * lst.T; fi; f.spaceGroup := lst.S; ReduceAffineSubspaceLattice( f ); if not f in lst.sp[d] then O := SortedList( Orbit( lst.S2, Immutable(f), ImageAffineSubspaceLattice ) ); w := ShallowCopy( O[1] ); w.class := c; UniteSet( lst.sp[d], O ); Add( lst.W[d], WyckoffPositionObject(w) ); added := true; fi; od; if added and not stop then lst.c := lst.c+1; if idx < Length(lst.z) then WyPosStep( idx+1, G2, M2, b2, lst ); fi; fi; fi; if idx < Length(lst.z) then WyPosStep( idx+1, G, M, b, lst ); fi; end; ############################################################################# ## #F WyPosAT( S ) . . . . Wyckoff positions with recursive method by Ad Thiers ## WyPosAT := function( S ) local d, P, gen, S2, lst, zz, mat, vec, g, m, M, b, s, w; d := DimensionOfMatrixGroup(S)-1; P := PointGroup( S ); gen := Filtered( GeneratorsOfGroup(S), x -> x{[1..d]}{[1..d]} <> One(P) ); S2 := Subgroup( S, gen ); if IsAffineCrystGroupOnLeft( S ) then S2 := TransposedMatrixGroup( S2 ); fi; lst := rec( dim := d, T := TranslationBasis(S), S := S, c := 1, S2 := S2 ); zz := []; mat := []; vec := []; for g in Zuppos( NiceObject( P ) ) do if not IsOne(g) then m := NiceToCrystStdRep(P,g); if IsAffineCrystGroupOnRight( S ) then m := TransposedMat(m); fi; M := m{[1..d]}{[1..d]}-IdentityMat(d); b := m{[1..d]}[d+1]; M := RowEchelonFormVector(M,b); if ForAll( b{[Length(M)+1..Length(b)]}, IsInt ) then Add( zz, g ); Add( mat, M ); Add( vec, -b{[1..Length(M)]} ); fi; fi; od; lst.z := zz; lst.mat := mat; lst.vec := vec; s := rec( translation := ListWithIdenticalEntries(d,0), basis := TranslationBasis(S), spaceGroup := S ); ReduceAffineSubspaceLattice(s); lst.sp := List( [1..d+1], x-> [] ); Add( lst.sp[d+1], s ); w := ShallowCopy( s ); w.class := 1; w := WyckoffPositionObject( w ); lst.W := List( [1..d+1], x -> [] ); Add( lst.W[d+1], w ); if 1 <= Length(lst.z) then WyPosStep(1,TrivialSubgroup(NiceObject( P )),[],[],lst); fi; return Flat(lst.W); end; ############################################################################# ## #M WyckoffPositions( S ) . . . . . . . . . . . . . . . . . Wyckoff positions ## InstallMethod( WyckoffPositions, "for AffineCrystGroupOnLeftOrRight", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local W, c1, c2, z, i, j; # check if we indeed have a space group if not IsSpaceGroup( S ) then Error("S must be a space group"); fi; # for small dimensions, the recursive method is faster if DimensionOfMatrixGroup( S ) < 6 then W := WyPosAT( S ); else W := WyPosSGL( S ); fi; W := SortedList( W ); c1 := List( W, w -> w!.class ); c2 := []; z := 1; for i in DuplicateFreeList( c1 ) do for j in Positions( c1, i ) do c2[j] := z; od; z := z + 1; od; return List( [1..Length(W)], i -> WyckoffPositionObject( rec( basis := W[i]!.basis, spaceGroup := W[i]!.spaceGroup, translation := W[i]!.translation, class := c2[i] ) ) ); end ); ############################################################################# ## #M WyckoffPositionsByStabilizer( S, stabs ) . . Wyckoff pos. for given stabs ## InstallGlobalFunction( WyckoffPositionsByStabilizer, function( S, stb ) local stabs, P, lift; # check the arguments if not IsSpaceGroup( S ) then Error( "S must be a space group" ); fi; if IsGroup( stb ) then stabs := [ stb ]; else stabs := stb; fi; # get point group P P := PointGroup( S ); # set up lift from nice rep to std rep lift := x -> NiceToCrystStdRep( P, x ); stabs := List( stabs, x -> Image( NiceMonomorphism( P ), x ) ); Sort( stabs, function(x,y) return Size(x) > Size(y); end ); # now get the Wyckoff positions return WyPos( S, stabs, lift ); end ); ############################################################################# ## #M WyckoffGraphFun( S, def ) . . . . . . . . . . . . display a Wyckoff graph ## InstallMethod( WyckoffGraph, true, [ IsAffineCrystGroupOnLeftOrRight, IsRecord ], 0, function( S, def ) return WyckoffGraphFun( WyckoffPositions( S ), def ); end ); InstallOtherMethod( WyckoffGraph, true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) return WyckoffGraphFun( WyckoffPositions( S ), rec() ); end ); InstallOtherMethod( WyckoffGraph, true, [ IsList, IsRecord ], 0, function( L, def ) if not ForAll( L, IsWyckoffPosition ) then Error("L must be a list of Wyckoff positions of the same space group"); fi; return WyckoffGraphFun( L, def ); end ); InstallOtherMethod( WyckoffGraph, true, [ IsList ], 0, function( L ) if not ForAll( L, IsWyckoffPosition ) then Error("L must be a list of Wyckoff positions of the same space group"); fi; return WyckoffGraphFun( L, rec() ); end ); cryst/gap/equiv.gi0000644001325400021140000001345414404635412013621 0ustar gaehleruser############################################################################# ## #A equiv.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #F ConjugatorSpaceGroupsStdSamePG( S1, S2 ) . . . . returns C with S1^C = S2 ## ## S1 and S2 act on the right, are in standard form, ## and have the same point group ## ConjugatorSpaceGroupsStdSamePG := function( S1, S2 ) local P, d, M, I, g, i, gen1, t1, gen2, t2, sol, Ngen, orb, img, S, rep, nn, n1; P := PointGroup( S1 ); # catch trivial case if IsTrivial( P ) then return One( S1 ); fi; d := DimensionOfMatrixGroup( P ); # determine space in which translational parts of generators can # be shifted by conjugating the space group with pure translations M := List( [1..d], i->[] ); i := 0; I := IdentityMat(d); for g in GeneratorsOfGroup( P ) do g := g - I; M{[1..d]}{[1..d]+i*d} := g{[1..d]}{[1..d]}; i := i+1; od; gen1 := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( S1 ), x ) ); t1 := Concatenation( List( gen1, x -> x[d+1]{[1..d]} ) ); gen2 := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( S2 ), x ) ); t2 := Concatenation( List( gen2, x -> x[d+1]{[1..d]} ) ); sol := SolveInhomEquationsModZ( M, t1-t2, true )[1]; if sol <> [] then return AugmentedMatrix( IdentityMat( d ), sol[1] ); fi; # if we arrive here, we need the normalizer Ngen := GeneratorsOfGroup( NormalizerPointGroupInGLnZ( P ) ); Ngen := List( Filtered( Ngen, x -> not x in P ), y -> AugmentedMatrix( y, 0*[1..d] ) ); orb := [ S1 ]; rep := [ One( S1 ) ]; for S in orb do for g in Ngen do img := S^g; if not img in orb then nn := rep[Position(orb,S)]*g; Add( orb, img ); Add( rep, nn ); gen1 := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( img ), x ) ); n1 := nn{[1..d]}{[1..d]}; t1 := Concatenation( List( gen1, x -> x[d+1]{[1..d]})); sol := SolveInhomEquationsModZ( M, t1-t2, true )[1]; if sol <> [] then return AugmentedMatrix( n1, sol[1] ); fi; fi; od; od; return fail; end; ############################################################################# ## #M ConjugatorSpaceGroups( S1, S2 ) . . . . . . . . .returns C with S1^C = S2 ## InstallMethod( ConjugatorSpaceGroups, IsIdenticalObj, [ IsAffineCrystGroupOnRight and IsSpaceGroup, IsAffineCrystGroupOnRight and IsSpaceGroup ], 0, function( S1, S2 ) local d, P1, P2, ls1, ls2, C1, C2, C3, C4, c, S1std, S2std, P1std, P2std, S3; d := DimensionOfMatrixGroup( S1 ) - 1; # some short cuts P1 := PointGroup( S1 ); P2 := PointGroup( S2 ); if Size( P1 ) <> Size( P2 ) then return fail; fi; ls1 := AsSortedList( List( ConjugacyClasses( P1 ), x -> [ Size(x), TraceMat( Representative(x) ), DeterminantMat( Representative(x) ) ] ) ); ls2 := AsSortedList( List( ConjugacyClasses( P2 ), x -> [ Size(x), TraceMat( Representative(x) ), DeterminantMat( Representative(x) ) ] ) ); if ls1 <> ls2 then return fail; fi; # go to standard representation # S1 = S1std^C1 if IsStandardSpaceGroup( S1 ) then S1std := S1; C1 := IdentityMat( d+1 ); else S1std := StandardAffineCrystGroup( S1 ); C1 := AugmentedMatrix( InternalBasis( S1 ), 0*[1..d] ); fi; # S2 = S2std^C2 if IsStandardSpaceGroup( S2 ) then S2std := S2; C2 := IdentityMat( d+1 ); else S2std := StandardAffineCrystGroup( S2 ); C2 := AugmentedMatrix( InternalBasis( S2 ), 0*[1..d] ); fi; P1std := PointGroup( S1std ); P2std := PointGroup( S2std ); if P1std = P2std then C3 := IdentityMat( d+1 ); S3 := S2std; else c := RepresentativeAction( GL(d,Integers), P2std, P1std ); if c = fail then return fail; fi; C3 := AugmentedMatrix( c, 0*[1..d] ); S3 := S2std^C3; fi; C4 := ConjugatorSpaceGroupsStdSamePG( S1std, S3 ); if C4 = fail then return fail; else return C1^-1 * C4 * C3^-1 * C2; fi; end ); ############################################################################# ## #M ConjugatorSpaceGroups( S1, S2 ) . . . . . . . . .returns C with S1^C = S2 ## InstallMethod( ConjugatorSpaceGroups, IsIdenticalObj, [ IsAffineCrystGroupOnLeft and IsSpaceGroup, IsAffineCrystGroupOnLeft and IsSpaceGroup ], 0, function( S1, S2 ) local S1tr, S2tr, C; S1tr := TransposedMatrixGroup( S1 ); S2tr := TransposedMatrixGroup( S2 ); C := ConjugatorSpaceGroups( S1tr, S2tr ); if C = fail then return fail; else return TransposedMat( C ); fi; end ); RedispatchOnCondition( ConjugatorSpaceGroups, IsIdenticalObj, [IsAffineCrystGroupOnRight,IsAffineCrystGroupOnRight], [IsAffineCrystGroupOnRight and IsSpaceGroup, IsAffineCrystGroupOnRight and IsSpaceGroup],0); RedispatchOnCondition( ConjugatorSpaceGroups, IsIdenticalObj, [IsAffineCrystGroupOnLeft,IsAffineCrystGroupOnLeft], [IsAffineCrystGroupOnLeft and IsSpaceGroup, IsAffineCrystGroupOnLeft and IsSpaceGroup],0); cryst/gap/zass.gi0000644001325400021140000003302314372461414013445 0ustar gaehleruser############################################################################# ## #A zass.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for the determination of space groups for a given a point group ## ############################################################################# ## #F NullBlockMat( , , ). . . . . . d1xd2-matrix of d-NullMatrices ## NullBlockMat := function( d, d1, d2 ) # return d1 x d2 matrix, whose entries are d x d NullMatrices return List( [1..d1], i -> List( [1..d2], j -> NullMat( d, d ) ) ); end; ############################################################################# ## #F FlattenedBlockMat( < BlockMat > ). . . . . . . . . flattened block matrix ## FlattenedBlockMat := function( mat ) # flatten a matrix whose entries are matrices to a normal matrix local m; m := mat; m := List( [1..Length(m[1])], j -> Concatenation( List([1..Length(m)], i -> m[i][j] ) ) ); m := TransposedMat( Concatenation( List( [1..Length(m)], i -> TransposedMat(m[i]) ) ) ); return m; end; ############################################################################# ## #F MakeSpaceGroup( , , , ) construct space group ## MakeSpaceGroup := function( d, Pgens, transl, transp ) # construct space group from point group and translation vector local Sgens, i, m, S; # first the non-translational generators Sgens := List( [1..Length( Pgens )], i -> AugmentedMatrix( Pgens[i], transl{[(i-1)*d+1..i*d]} ) ); # the pure translation generators for i in [1..d] do m := IdentityMat( d+1 ); m[d+1][i] := 1; Add( Sgens, m ); od; # make the space group and return it if transp then Sgens := List( Sgens, TransposedMat ); S := AffineCrystGroupOnLeftNC( Sgens, IdentityMat(d+1) ); else S := AffineCrystGroupOnRightNC( Sgens, IdentityMat(d+1) ); fi; AddTranslationBasis( S, IdentityMat( d ) ); return S; end; ############################################################################# ## #F GroupExtEquations( , , ) . equations for group extensions ## GroupExtEquations := function( d, gens, rels ) # construct equations which determine the non-primitive translations local mat, i, j, k, r, r0, max, prod; mat := NullBlockMat( d, Length(gens), Length(rels) ); for i in [1..Length(rels)] do # interface to GAP-3 format r0 := rels[i]; r := []; for k in [1..Length(r0)/2] do max := r0[2*k]; if max > 0 then for j in [1..max] do Add( r, r0[2*k-1] ); od; else for j in [1..-max] do Add( r, -r0[2*k-1] ); od; fi; od; prod := IdentityMat(d); for j in Reversed([1..Length(r)]) do if r[j]>0 then mat[ r[j] ][i] := mat[ r[j] ][i]+prod; prod := gens[ r[j] ]*prod; else prod := gens[-r[j] ]^-1*prod; mat[-r[j] ][i] := mat[-r[j] ][i]-prod; fi; od; od; return FlattenedBlockMat( mat ); end; ############################################################################# ## #F StandardTranslation( , ) . .reduce to std. translation ## StandardTranslation := function( L, NN ) # reduce non-primitive translations to "standard" form local N, j, k; # first apply "continuous" translations for N in NN[1] do j := PositionProperty( N, x -> x=1 ); L := L-L[j]*N; od; L := List( L, FractionModOne ); # and then "discrete" translations for N in NN[2] do j := PositionProperty( N, x -> x<>0 ); k := Int( L[j] / N[j] ); if k > 0 then L := List( L-k*N, FractionModOne ); fi; od; return L; end; ############################################################################# ## #F SolveHomEquationsModZ( ) . . . . . . . . . . . solve x*mat=0 mod Z ## SolveHomEquationsModZ := function( M ) local Q, L, N, N2; Q := IdentityMat( Length(M) ); # first diagonalize M M := TransposedMat(M); M := RowEchelonForm( M ); while Length(M) > 0 and not IsDiagonalMat(M) do M := TransposedMat(M); M := RowEchelonFormT(M,Q); if not IsDiagonalMat(M) then M := TransposedMat(M); M := RowEchelonForm(M); fi; od; # and then determine the solutions of x*M=0 mod Z if Length(M)>0 then L := List( [1..Length(M)], i -> [ 0 .. M[i][i]-1 ] / M[i][i] ); L := List( Cartesian( L ), l -> l * Q{[1..Length(M)]} ); else L := NullMat( 1, Length(Q) ); fi; # we later need the space in which one can freely shift # non-primitive translations; first the translations which # can be applied with rational coefficients if Length(M)[] then N2 := List( N, n -> List( n, FractionModOne ) ); N2 := ReducedLatticeBasis( N2 ); N2 := List( N2, n -> List( n, FractionModOne ) ); N2 := Filtered( N2, n -> n<>0*N[1] ); else N2 := []; fi; # reduce non-primitive translations to standard form L := Set( List( L, x -> StandardTranslation( x, [ N, N2 ] ) ) ); return [ L, [ N, N2 ] ]; end; ############################################################################# ## #F CollectEquivExtensions( , , , ) . . . . . . #F . . . . collect extensions equivalent by conjugation with elems from norm ## CollectEquivExtensions := function( ll, nn, norm, grp ) # check for conjugacy with generators of the normalizer of grp in GL(n,Z) local cent, d, gens, sgens, res, orb, x, y, c, n, i, j, sg, h, m; norm := Set( Filtered( norm, x -> not x in grp ) ); cent := Filtered( norm, x -> ForAll( GeneratorsOfGroup( grp ), g -> x*g=g*x ) ); SubtractSet( norm, cent ); d := DimensionOfMatrixGroup( grp ); gens := GeneratorsOfGroup( grp ); sgens := List( gens, g -> AugmentedMatrix( g, List( [1..d], x -> 0 ) ) ); res := [ ]; while ll<>[] do orb := [ ll[1] ]; for x in orb do # first the generators which are in the centralizer for c in cent do y := List([1..Length(gens)], i -> x{ [(i-1)*d+1..i*d] }*c ); y := StandardTranslation( Concatenation(y), nn ); if not y in orb then Add( orb, y ); fi; od; # then the remaining ones; this is more complicated for n in norm do for i in [1..Length(gens)] do for j in [1..d] do sgens[i][d+1][j]:=x[(i-1)*d+j]; od; od; sg := Group( sgens, IdentityMat( d+1 ) ); SetIsFinite( sg, false ); h :=GroupHomomorphismByImagesNC( sg, grp, sgens, gens ); y :=[]; for i in [1..Length(gens)] do m := PreImagesRepresentativeNC( h, n*gens[i]*n^-1 ); Append( y, m[d+1]{[1..d]}*n ); od; y := StandardTranslation( y, nn ); if not y in orb then Add( orb, y ); fi; od; od; Add( res, orb ); SubtractSet( ll, orb ); od; return res; end; ############################################################################# ## #F ZassFunc( , , , ) . Zassenhaus algorithm ## ZassFunc := function( grp, norm, orbsflag, transpose ) local d, S, N, F, Fam, rels, gens, mat, ext, lst, res; d := DimensionOfMatrixGroup( grp ); if transpose then grp := TransposedMatrixGroup( grp ); norm := List( norm, TransposedMat ); fi; if not IsIntegerMatrixGroup( grp ) then Error( "the point group must be an integer matrix group" ); fi; if not IsFinite( grp ) then Error("the point group must be finite" ); fi; # catch the trivial case if IsTrivial( grp ) then S := MakeSpaceGroup( d, [], [], transpose ); if orbsflag then return [[S]]; else return [ S ]; fi; fi; # first get group relators for grp N := NiceObject( grp ); F := Image( IsomorphismFpGroupByGenerators( N, GeneratorsOfGroup( N ) ) ); rels := List( RelatorsOfFpGroup( F ), ExtRepOfObj ); gens := GeneratorsOfGroup( grp ); # construct equations which determine the non-primitive translations # an alternative would be # mat := MatJacobianMatrix( F, gens ); mat := GroupExtEquations( d, gens, rels ); # now solve them modulo integers ext := SolveHomEquationsModZ( mat ); # collect group extensions which are equivalent as space groups lst := CollectEquivExtensions( ext[1], ext[2], norm, grp ); # make the space groups if orbsflag then res := List( lst, x -> List( x, y -> MakeSpaceGroup( d, gens, y, transpose ) ) ); else res := List( lst, x -> MakeSpaceGroup( d, gens, x[1], transpose ) ); fi; return res; end; ############################################################################# ## #M SpaceGroupsByPointGroupOnRight( [, [, ] ] ) ## InstallMethod( SpaceGroupsByPointGroupOnRight, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) return ZassFunc( grp, [], false, false ); end ); InstallOtherMethod( SpaceGroupsByPointGroupOnRight, IsIdenticalObj, [ IsCyclotomicMatrixGroup, IsList ], 0, function( grp, norm ) return ZassFunc( grp, norm, false, false ); end ); InstallOtherMethod( SpaceGroupsByPointGroupOnRight, function(a,b,c) return IsIdenticalObj(a,b); end, [ IsCyclotomicMatrixGroup, IsList, IsBool ], 0, function( grp, norm, orbsflag ) return ZassFunc( grp, norm, orbsflag, false ); end ); ############################################################################# ## #M SpaceGroupsByPointGroupOnLeft( [, , [ ] ] ) ## InstallMethod( SpaceGroupsByPointGroupOnLeft, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) return ZassFunc( grp, [], false, true ); end ); InstallOtherMethod( SpaceGroupsByPointGroupOnLeft, IsIdenticalObj, [ IsCyclotomicMatrixGroup, IsList ], 0, function( grp, norm ) return ZassFunc( grp, norm, false, true ); end ); InstallOtherMethod( SpaceGroupsByPointGroupOnLeft, function(a,b,c) return IsIdenticalObj(a,b); end, [ IsCyclotomicMatrixGroup, IsList, IsBool ], 0, function( grp, norm, orbsflag ) return ZassFunc( grp, norm, orbsflag, true ); end ); ############################################################################# ## #M SpaceGroupsByPointGroup( [, [, ] ] ) ## InstallMethod( SpaceGroupsByPointGroup, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) return ZassFunc( grp, [], false, CrystGroupDefaultAction=LeftAction ); end ); InstallOtherMethod( SpaceGroupsByPointGroup, IsIdenticalObj, [ IsCyclotomicMatrixGroup, IsList ], 0, function( grp, norm ) return ZassFunc( grp, norm, false, CrystGroupDefaultAction=LeftAction ); end ); InstallOtherMethod( SpaceGroupsByPointGroup, function(a,b,c) return IsIdenticalObj(a,b); end, [ IsCyclotomicMatrixGroup, IsList, IsBool ], 0, function( grp, norm, orbsflag ) return ZassFunc( grp, norm, orbsflag, CrystGroupDefaultAction=LeftAction ); end ); ############################################################################# ## #M SpaceGroupTypesByPointGroupOnRight( [, ] ) ## InstallMethod( SpaceGroupTypesByPointGroupOnRight, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, false, false ); end ); InstallOtherMethod( SpaceGroupTypesByPointGroupOnRight, true, [ IsCyclotomicMatrixGroup, IsBool ], 0, function( grp, orbsflag ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, orbsflag, false ); end ); ############################################################################# ## #M SpaceGroupTypesByPointGroupOnLeft( [, ] ) ## InstallMethod( SpaceGroupTypesByPointGroupOnLeft, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, false, true ); end ); InstallOtherMethod( SpaceGroupTypesByPointGroupOnLeft, true, [ IsCyclotomicMatrixGroup, IsBool ], 0, function( grp, orbsflag ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, orbsflag, true ); end ); ############################################################################# ## #M SpaceGroupTypesByPointGroup( [, ] ) ## InstallMethod( SpaceGroupTypesByPointGroup, true, [ IsCyclotomicMatrixGroup ], 0, function( grp ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, false, CrystGroupDefaultAction=LeftAction ); end ); InstallOtherMethod( SpaceGroupTypesByPointGroup, true, [ IsCyclotomicMatrixGroup, IsBool ], 0, function( grp, orbsflag ) local norm; norm := GeneratorsOfGroup( NormalizerInGLnZ( grp ) ); return ZassFunc( grp, norm, orbsflag, CrystGroupDefaultAction=LeftAction ); end ); cryst/gap/fpgrp.gi0000644001325400021140000001361114372461414013604 0ustar gaehleruser############################################################################# ## #A fpgrp.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #M IsomorphismFpGroup(

    ) . . . . . . . IsomorphismFpGroup for PointGroup ## InstallMethod( IsomorphismFpGroup, "for PointGroup", true, [ IsPointGroup ], 0, function ( P ) local mono, N, F, gens, gensP, gensS, gensF, iso; # compute an isomorphic permutation group mono := NiceMonomorphism( P ); N := NiceObject( P ); # distinguish between solvable and non-solvable case if IsSolvableGroup( N ) then F := Image( IsomorphismFpGroupByPcgs( Pcgs( N ), "f" ) ); gens := AsList( Pcgs( N ) ); else gens := GeneratorsOfGroup( N ); F := Image( IsomorphismFpGroupByGenerators( N, gens ) ); fi; gensP := List( gens, x -> PreImagesRepresentativeNC( mono, x ) ); gensS := List( gens, x -> ImagesRepresentative( NiceToCryst( P ), x ) ); gensF := GeneratorsOfGroup( F ); iso := GroupHomomorphismByImagesNC( P, F, gensP, gensF ); SetMappingGeneratorsImages( iso, [ gensP, gensF ] ); SetIsBijective( iso, true ); SetKernelOfMultiplicativeGeneralMapping( iso, TrivialSubgroup( P ) ); iso!.preimagesInAffineCrystGroup := Immutable( gensS ); return iso; end ); ############################################################################# ## #M IsomorphismFpGroup( ) . . . . . . . for AffineCrystGroupOnLeftOrRight ## InstallMethod( IsomorphismFpGroup, "for AffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight ], 0, function( S ) local P, hom, T, iso, F, gensP, relsP, matsP, d, n, t, R, gensR, gensT, matsT, i, j, l, k, rels, relsR, rel, tail, vec, word, gens, ims; P := PointGroup( S ); hom := PointHomomorphism( S ); T := TranslationBasis( S ); iso := IsomorphismFpGroup( P ); F := Image( iso ); gensP := GeneratorsOfGroup( FreeGroupOfFpGroup( F ) ); relsP := RelatorsOfFpGroup( F ); matsP := iso!.preimagesInAffineCrystGroup; d := DimensionOfMatrixGroup( S ) - 1; n := Length( gensP ); t := Length( T ); R := FreeGroup( n + t ); gensR := GeneratorsOfGroup( R ){[1..n]}; gensT := GeneratorsOfGroup( R ){[n+1..n+t]}; matsT := List( gensT, x -> IdentityMat( d+1 ) ); for i in [1..Length( matsT )] do if IsAffineCrystGroupOnRight( S ) then matsT[i][d+1]{[1..d]} := T[i]; else matsT[i]{[1..d]}[d+1] := T[i]; fi; od; rels := List( relsP, rel -> MappedWord( rel, gensP, gensR ) ); relsR := []; # compute tails for rel in rels do tail := MappedWord( rel, gensR, matsP ); word := rel; if t > 0 then if IsAffineCrystGroupOnRight( S ) then vec := SolutionMat( T, - tail[d+1]{[1..d]} ); else vec := SolutionMat( T, - tail{[1..d]}[d+1] ); fi; for i in [1..t] do word := word * gensT[i]^vec[i]; od; fi; Add( relsR, word ); od; # compute operation for i in [1..n] do for j in [1..t] do rel := Comm( gensT[j], gensR[i] ); tail := Comm( matsT[j], matsP[i] ); if IsAffineCrystGroupOnRight( S ) then vec := SolutionMat( T, - tail[d+1]{[1..d]} ); else vec := SolutionMat( T, - tail{[1..d]}[d+1] ); fi; word := rel; for k in [1..t] do word := word * gensT[k]^vec[k]; od; Add( relsR, word ); od; od; # compute presentation of T for i in [1..t-1] do for j in [i+1..t] do Add( relsR, Comm( gensT[j], gensT[i] ) ); od; od; # construct isomorphism R := R / relsR; gens := Concatenation( matsP, matsT ); ims := GeneratorsOfGroup( R ); iso := GroupHomomorphismByImagesNC( S, R, gens, ims ); SetMappingGeneratorsImages( iso, [ gens, ims ] ); SetIsFromAffineCrystGroupToFpGroup( iso, true ); SetIsBijective( iso, true ); SetKernelOfMultiplicativeGeneralMapping( iso, TrivialSubgroup( S ) ); return iso; end ); ############################################################################# ## #M ImagesRepresentative( , ) for IsFromAffineCrystGroupToFpGroup ## InstallMethod( ImagesRepresentative, FamSourceEqFamElm, [IsGroupGeneralMappingByImages and IsFromAffineCrystGroupToFpGroup, IsMultiplicativeElementWithInverse ], 0, function( iso, elm ) local d, S, T, elmP, isoP, word, genP, len, genS, genF, elm2, v, i; d := Length( elm ) - 1; S := Source( iso ); T := TranslationBasis( S ); elmP := elm{[1..d]}{[1..d]}; isoP := IsomorphismFpGroup( PointGroup( S ) ); word := ImagesRepresentative( isoP, elmP ); genP := MappingGeneratorsImages( isoP )[2]; len := Length( genP ); genS := MappingGeneratorsImages( iso )[1]; genF := MappingGeneratorsImages( iso )[2]; elm2 := MappedWord( word, genP, genS{[1..len]} ); word := MappedWord( word, genP, genF{[1..len]} ); if Length( T ) > 0 then if IsAffineCrystGroupOnRight( S ) then v := SolutionMat( T, elm[d+1]{[1..d]} - elm2[d+1]{[1..d]} ); for i in [1..Length(v)] do word := word * genF[len+i]^v[i]; od; else v := SolutionMat( T, elm{[1..d]}[d+1] - elm2{[1..d]}[d+1] ); for i in [1..Length(v)] do word := genF[len+i]^v[i] * word; od; fi; fi; return word; end ); cryst/gap/max.gi0000644001325400021140000006162615036402361013256 0ustar gaehleruser############################################################################# ## #A max.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for the determination of maximal subgroups of CrystGroups ## ############################################################################# ## #F CoefficientsMod( base, v ) . . . . . . . coefficients of v in factorspace ## CoefficientsMod := function( base, v ) local head, i, zero, coeff, w, j, h; if not IsBound( base.fullbase ) then base.fullbase := Concatenation( base.subspace, base.factorspace ); fi; if not IsBound( base.depth ) then head := []; for i in [1..Length( base.fullbase )] do head[i] := PositionNonZero( base.fullbase[i] ); od; base.depth := head; fi; zero := base.fullbase[1] * Zero( base.field ); coeff := ShallowCopy( zero ); w := v; while w <> zero do j := PositionNonZero( w ); h := Position( base.depth, j ); coeff[h] := coeff[h] + w[j]; w := w - w[j] * base.fullbase[h]; od; return coeff{[Length(base.subspace)+1..Length(base.fullbase)]}; end; ############################################################################# ## #F InducedMatrix( base, mat ) . . . . . . . . induced action of mat on base ## InducedMatrix := function( base, mat ) local ind, n, l, b, v, s; ind := []; n := Length(base.fullbase); l := Length(base.subspace); for b in base.factorspace do v := b * mat; s := SolutionMat( base.fullbase, v ); Add( ind, s{[l+1..n]} ); od; return ind; end; ############################################################################# ## #F TriangularizeMatVector . . . . . . . . . . compute triangularized matrix ## ## This function computes the upper triangular form of the integer ## matrix M via elementary row operations and performs the same ## operations on the (column) vector b. ## ## The function works in place. ## TriangularizeMatVector := function( M, b ) local zero, c, r, i, t; zero := M[1][1] * 0; c := 1; r := 1; while c <= Length(M[1]) and r <= Length(M) do i := r; while i <= Length(M) and M[i][c] = zero do i := i+1; od; if i <= Length(M) then t := b[r]; b[r] := b[i]; b[i] := t; t := M[r]; M[r] := M[i]; M[i] := t; b[r] := b[r] / M[r][c]; M[r] := M[r] / M[r][c]; for i in [1..r-1] do b[i] := b[i] - b[r] * M[i][c]; M[i] := ShallowCopy( M[i] ); AddCoeffs( M[i], M[r], -M[i][c] ); od; for i in [r+1..Length(M)] do b[i] := b[i] - b[r] * M[i][c]; M[i] := ShallowCopy( M[i] ); AddCoeffs( M[i], M[r], -M[i][c] ); od; r := r+1; fi; c := c+1; od; for i in Reversed( [r..Length(M)] ) do Unbind( M[i] ); od; end; ############################################################################# ## #F SolutionInhomEquations . . . solve an inhomogeneous system of equations ## ## This function computes the set of solutions of the equation ## ## X * M = b. ## SolutionInhomEquations := function( M, b ) local zero, one, i, c, d, r, heads, S, v; zero := M[1][1] * 0; one := M[1][1] ^ 0; M := MutableTransposedMat( M ); d := Length(M[1]); b := ShallowCopy( b ); TriangularizeMatVector( M, b ); for i in [Length(M)+1..Length(b)] do if b[i] <> zero then return false; fi; od; # determine the null space c := 1; r := 1; heads := []; S := []; while r <= Length(M) and c <= d do while c <= d and M[r][c] = zero do v := ShallowCopy( zero * [1..d] ); v{heads} := M{[1..r-1]}[c]; v[c] := -one; Add( S, v ); c := c+1; od; if c <= d then Add( heads, c ); c := c+1; r := r+1; fi; od; while c <= d do v := ShallowCopy( zero * [1..d] ); v{heads} := M{[1..r-1]}[c]; v[c] := -one; Add( S, v ); c := c+1; od; # one particular solution v := ShallowCopy( zero * [1..d] ); v{heads} := b{[1..Length(M)]}; if Length(S) > 0 then TriangulizeMat( S ); fi; return rec( basis := S, translation := v ); end; ############################################################################# ## #F SolutionHomEquations . . . . . . solve a homogeneous system of equations ## ## This function computes the set of solutions of the equation ## ## X * M = 0. ## SolutionHomEquations := function( M ) return SolutionInhomEquations( M, Zero(Field(M[1][1]))*[1..Length(M[1])]); end; ############################################################################# ## #F MatJacobianMatrix( G, mats ) ## MatJacobianMatrix := function( G, mats ) local gens, rels, J, D, # the result, the one `column' of J imats, # list of inverted matrices d, # dimension of matrices j, k, l, # loop variables r, # run through the relators h, p; # generator in r, its position in G.generators gens := GeneratorsOfGroup( FreeGroupOfFpGroup( G ) ); rels := RelatorsOfFpGroup( G ); if Length(gens) = 0 then return []; fi; d := Length( mats[1] ); imats := List( mats, m->m^-1 ); J := List( [1..d*Length(gens)], k->[] ); for j in [1..Length(rels)] do r := rels[j]; D := NullMat( d*Length(gens), d ); for k in [1..Length(r)] do h := Subword( r,k,k ); p := Position( gens, h ); if not IsBool( p ) then D := D * mats[p]; for l in [1..d] do D[(p-1)*d+l][l] := D[(p-1)*d+l][l] + 1; od; else p := Position( gens, h^-1 ); for l in [1..d] do D[(p-1)*d+l][l] := D[(p-1)*d+l][l] - 1; od; D := D * imats[p]; fi; J{[1..Length(gens)*d]}{[(j-1)*d+1..j*d]} := D; od; od; return J; end; ############################################################################# ## #F OneCoboundariesSG( , ) . . . . . . . . . . . . . . B^1( G, M ) ## OneCoboundariesSG := function( G, mats ) local d, I, S, i; d := Length( mats[1] ); I := IdentityMat( d ); if Length(mats) <> Length( GeneratorsOfGroup(G) ) then return Error( "As many matrices as generators expected" ); fi; S := List( [1..d], i->[] ); for i in [1..Length(mats)] do S{[1..d]}{[(i-1)*d+1..i*d]} := mats[i] - I; od; TriangulizeMat( S ); return S; end; ############################################################################# ## #F OneCocyclesVector( , , ) . . . . . . . . . . . . . . . . . . ## OneCocyclesVector := function( G, mats, b ) local J, L; J := MatJacobianMatrix( G, mats ); ## ## b needs to be inverted for the following reason (I don't know how to ## say this better without setting up a lot of notation. ## ## b was computed by CocycleInfo() by evaluating the relators of the ## group. In solving the system X * J = b we need to find all tuples of ## elements with the following property: If we modify the generating ## sequence with such a tuple by multiplying from the rigth, then the ## relators on the modified generators have to evaluate to the identity. ## For example, if we have the relation [g2,g1] = m, then [g2*y,g1*x] ## should be 1. Therefore, x and y should be chosen such that after ## collection we have [g2,g1] m^-1 = m m^-1 = 1. Hence we need to ## invert b. b := -Concatenation( b ); L := SolutionInhomEquations( J, b ); return L; end; ############################################################################# ## #F OneCocyclesSG( , ) . . . . . . . . . . . . . . . . Z^1( G, M ) ## OneCocyclesSG := function( G, mats ) local J, L; J := MatJacobianMatrix( G, mats ); L := SolutionHomEquations( J ).basis; return L; end; ############################################################################# ## #F OneCohomology( , ) . . . . . . . . . . . . . . . . H^1( G, M ) ## OneCohomologySG := function( G, mats ) return rec( cocycles := OneCocyclesSG( G, mats ), coboundaries := OneCoboundariesSG( G, mats ) ); end; ############################################################################# ## #F ListOneCohomology( ) . . . . . . . . . . . . . . . . . . . . list H^1 ## ## Run through the triangularized basis of Z and find those head ## entries which do not occur in the basis of B. For each such ## vector in the basis of Z we need to run through the coefficients ## 0..p-1. ## ListOneCohomology := function( H ) local Z, B, C, zero, coeffs, h, j, i; Z := H.cocycles; B := H.coboundaries; if Length(Z) = 0 then return B; fi; C := AsSSortedList( Field( Z[1][1] ) ); zero := Z[1][1]*0; coeffs := []; h := 1; j := 1; for i in [1..Length(Z)] do while Z[i][h] = zero do h := h+1; od; if j > Length(B) or B[j][h] = zero then coeffs[i] := C; else coeffs[i] := [ zero ]; j := j+1; fi; od; return List( Cartesian( coeffs ), t->t*Z ); end; ############################################################################# ## #F ComplementsSG . . . . . . . . . . . . compute complements up to conjugacy ## ComplementsSG := function( G, mats, b ) local Z, B, C, d, n; if Length(GeneratorsOfGroup(G)) = 0 then return [ [] ]; fi; Z := OneCocyclesVector( G, mats, b ); if Z = false then return []; fi; B := OneCoboundariesSG( G, mats ); C := ListOneCohomology( rec( cocycles := Z.basis, coboundaries := B ) ); C := List( C, c->c + Z.translation ); d := Length( mats[1] ); n := Length(GeneratorsOfGroup(G)); return List( C, c->List( [0..n-1], x->c{ [1..d] + x*d } ) ); end; ############################################################################# ## #F MaximalSubgroupRepsTG( < S > ) . .translationengleiche maximal subgroups ## ## This function computes conjugacy class representatives of the maximal ## subgroups of $S$ which contain $T$. Note that this function may be ## slow, if $S$ is not solvable. ## MaximalSubgroupRepsTG := function( S ) local d, P, N, T, Sgens, A, max, ind, l, i, gens, g, exp, h, j, trans, sub; d := DimensionOfMatrixGroup( S ) - 1; P := PointGroup( S ); N := NiceObject( P ); # catch a trivial case if Size( N ) = 1 then return []; fi; # compute the translation generators T := TranslationBasis( S ); trans := List( T, x -> IdentityMat( d+1 ) ); for i in [1..Length(T)] do trans[i][d+1]{[1..d]} := T[i]; od; # first the solvable case if IsSolvableGroup( N ) then A := GroupByPcgs( Pcgs( N ) ); Sgens := List( AsList( Pcgs( N ) ), x -> ImagesRepresentative( NiceToCryst( P ), x ) ); # compute maximal subgroups in ag group max := ShallowCopy( MaximalSubgroupClassReps( A ) ); # compute preimages in space group and construct subgroups for i in [1..Length(max)] do gens := []; for g in GeneratorsOfGroup( max[i] ) do exp := ExponentsOfPcElement( Pcgs( A ), g ); h := IdentityMat( d+1 ); for j in [1..Length(exp)] do h := h * Sgens[j]^exp[j]; od; Add( gens, h ); od; Append( gens, trans ); sub := SubgroupNC( S, gens ); AddTranslationBasis( sub, T ); SetIndexInParent( sub, IndexInParent( max[i] ) ); max[i] := sub; od; return max; fi; # now the non-solvable case max := List( ConjugacyClassesMaximalSubgroups( N ), Representative ); ind := List( max, x -> Index( N, x ) ); # go back to S, and construct the subgroups for i in [1..Length(max)] do gens := List( GeneratorsOfGroup( max[i] ), x -> ImagesRepresentative( NiceToCryst( P ), x ) ); Append( gens, trans ); sub := SubgroupNC( S, gens ); AddTranslationBasis( sub, T ); SetIndexInParent( sub, ind[i] ); max[i] := sub; od; return max; end; ############################################################################# ## #F CocycleInfo( ) . . . . . . . . . . .information about extension type ## CocycleInfo := function( S ) local P, iso, F, d, gens, mats, coc, rel, new; P := PointGroup( S ); iso := IsomorphismFpGroup( P ); F := Image( iso ); d := DimensionOfMatrixGroup( S ) - 1; gens := GeneratorsOfGroup( FreeGroupOfFpGroup( F ) ); mats := iso!.preimagesInAffineCrystGroup; coc := []; for rel in RelatorsOfFpGroup( F ) do new := MappedWord( rel, gens, mats ); Add( coc, new[d+1]{[1..d]} ); od; return coc; end; ############################################################################# ## #M CocVecs( ) . . Cocycles of extension of point group with translations ## InstallMethod( CocVecs, true, [ IsAffineCrystGroupOnRight ], 0, function( S ) return ReducedLatticeBasis( CocycleInfo( S ) ); end ); InstallMethod( CocVecs, true, [ IsAffineCrystGroupOnLeft ], 0, function( S ) return CocVecs( TransposedMatrixGroup( S ) ); end ); ############################################################################# ## #F SimpleGenerators( d, gens ) . . . . . . . . . . . simplify the generators ## SimpleGenerators := function( d, gens ) local I, new, g, trans, t, m; I := IdentityMat( d ); new := []; trans := []; for g in gens do if g{[1..d]}{[1..d]} = I then Add( trans, g[d+1]{[1..d]} ); else Add( new, g ); fi; od; trans := ReducedLatticeBasis( trans ); # add the new translation generators for t in trans do m := IdentityMat( d+1 ); m[d+1]{[1..d]} := t; Add( new, m ); od; return [ new, trans ]; end; ############################################################################# ## #F MaximalSubgroupRepsKG( < G >, ) . .klassengleiche maximal subgroups ## ## This function computes represenatives of the conjugacy classes of maximal ## subgroups of $G$ which have $p$-power index for some $p$ in the list $ps$ ## and do not contain $T$. ## In the case that $G$ is solvable it is more efficient to use the function ## 'MaximalSubgroupSG' and filter the corresponding maximal subgroups. ## MaximalSubgroupRepsKG := function( G, primes ) local P, iso, pres, coc, rep, d, n, maximals, p, field, repp, cocp, mods, sub, F, hom, cocin, repin, comp, c, modu, modgens, powers, vec, elm, basis, cocpre, gens, i, j, h, base, primeslist, Ggens, T, trans; # check argument if IsInt( primes ) then primeslist := [primes]; else primeslist := primes; fi; T := TranslationBasis( G ); n := Length( T ); # extract the point group P := PointGroup( G ); iso := IsomorphismFpGroup( P ); Ggens := iso!.preimagesInAffineCrystGroup; if not IsStandardAffineCrystGroup( G ) then Ggens := List ( Ggens, x -> G!.lconj * x * G!.rconj ); fi; pres := Image( iso ); rep := List( Ggens, x -> x{[1..n]}{[1..n]} ); coc := CocycleInfo( G ); if not IsEmpty( coc ) then coc := coc * T^-1; fi; d := DimensionOfMatrixGroup( G ) - 1; trans := List( T, x -> IdentityMat( d+1 ) ); for i in [1..n] do trans[i][d+1][i] := 1; od; # view them as matrices over GF(p) maximals := []; for p in primeslist do field := GF(p); repp := List( rep, x -> x * One( field ) ); cocp := List( coc, x -> x * One( field ) ); modu := GModuleByMats( repp, d, field ); mods := MTX.BasesMaximalSubmodules( modu ); powers:= List( trans, x -> x^p ); # compute induced operation on T/maxmod and induced cocycle for sub in mods do # compute group of translations of maximal subgroup modgens := []; for vec in sub do elm := One( G ); for j in [1..Length( vec )] do elm := elm * trans[j]^IntFFE(vec[j]); od; Add( modgens, elm ); od; Append( modgens, powers ); # compute quotient space base := BaseSteinitzVectors( IdentityMat( n, field ), sub ); TriangulizeMat(base.factorspace); base.field := field; cocin := List( cocp, x -> CoefficientsMod( base, x ) ); repin := List( repp, x -> InducedMatrix( base, x ) ); # use complement routine comp := ComplementsSG( pres, repin, cocin ); # compute generators of G corresponding to complements for i in [1..Length( comp )] do cocpre := List( comp[i], x -> x * base.factorspace ); gens := []; for j in [1..Length( cocpre )] do elm := Ggens[j]; for h in [1..Length( cocpre[j] )] do elm := elm*trans[h]^IntFFE(cocpre[j][h]); od; Add( gens, elm ); od; # append generators of group of translations Append( gens, modgens ); # conjugate generators if necessary if not IsStandardAffineCrystGroup( G ) then for j in [1..Length(gens)] do gens[j] := G!.rconj * gens[j] * G!.lconj; od; fi; # construct subgroup and append index gens := SimpleGenerators( d, gens ); comp[i] := SubgroupNC( G, gens[1] ); AddTranslationBasis( comp[i], gens[2] ); SetIndexInParent( comp[i], p^(n - Length( sub ) ) ); od; Append( maximals, comp ); od; od; return maximals; end; ############################################################################# ## #F MaximalSubgroupRepsSG( ,

    ) . . .maximal subgroups of solvable ## ## This function computes representatives of the conjugacy classes of the ## maximal subgroups of $p$-power index in $G$ in the case that $G$ is ## solvable. ## MaximalSubgroupRepsSG := function( G, p ) local iso, F, Fgens, Frels, Ffree, Ggens, T, n, d, t, gens, A, kernel, i, imgs, max, M, g, exp, h, j, Agens, pcgs, spcgs, first, weights; if not IsSolvableGroup( G ) then Error("G must be solvable \n"); fi; iso := IsomorphismFpGroup( PointGroup( G ) ); Ggens := iso!.preimagesInAffineCrystGroup; if not IsStandardAffineCrystGroup( G ) then Ggens := List ( Ggens, x -> G!.lconj * x * G!.rconj ); fi; F := Image( IsomorphismFpGroup( G ) ); Frels := RelatorsOfFpGroup( F ); Ffree := FreeGroupOfFpGroup( F ); Fgens := GeneratorsOfGroup( Ffree ); T := TranslationBasis( G ); n := Length( Ggens ); d := DimensionOfMatrixGroup( G ) - 1; t := Length( T ); gens := List( [n+1..n+t], x -> Fgens[x]^p ); F := Ffree / Concatenation( Frels, gens ); A := PcGroupFpGroup( F ); # compute maximal subgroups of S Agens := GeneratorsOfGroup( A ); if IsEmpty( Agens ) then pcgs := Pcgs(A); else pcgs := PcgsByPcSequence( FamilyObj(Agens[1]), Agens ); fi; spcgs := SpecialPcgs(A); first := LGFirst( spcgs ); weights := LGWeights( spcgs ); max := []; for i in [1..Length(first)-1] do if weights[first[i]][2] = 1 and weights[first[i]][3] = p then Append(max,ShallowCopy(MaximalSubgroupClassesRepsLayer(spcgs,i))); fi; od; # compute generators of kernel G -> A and preimages kernel := List( [1..t], x -> IdentityMat( d+1 ) ); for i in [1..t] do kernel[i][d+1][i] := 1; od; imgs := Concatenation( Ggens, List( kernel, m -> MutableMatrix( m ) ) ); for i in [1..t] do kernel[i][d+1][i] := p; od; # compute corresponding subgroups in G for i in [1..Length(max)] do M := max[i]; gens := []; for g in GeneratorsOfGroup( M ) do exp := ExponentsOfPcElement( pcgs, g ); h := Product( List( [1..Length(exp)], x -> imgs[x]^exp[x] ) ); Add( gens, h ); od; Append( gens, kernel ); if not IsStandardAffineCrystGroup( G ) then for j in [1..Length(gens)] do gens[j] := G!.rconj * gens[j] * G!.lconj; od; fi; gens := SimpleGenerators( d, gens ); M := SubgroupNC( G, gens[1] ); AddTranslationBasis( M, gens[2] ); SetIndexInParent( M, Index( A, max[i] ) ); max[i] := M; od; return max; end; ############################################################################# ## #M MaximalSubgroupClassReps( S, flags ) ## InstallOtherMethod( MaximalSubgroupClassReps, "for AffineCrystGroupOnRight", true, [ IsAffineCrystGroupOnRight, IsRecord ], 0, function( S, flags ) local reps, new, M, i; if IsBound( flags.primes ) then if not IsList( flags.primes ) or not ForAll( flags.primes, IsPrimeInt ) then Error("flags.primes must be a list of primes"); fi; fi; # the lattice-equal case if IsBound( flags.latticeequal ) and flags.latticeequal=true then if IsBound( flags.classequal ) and flags.classequal=true then Error("both classequal and latticeequal is impossible!"); fi; reps := MaximalSubgroupRepsTG( S ); if IsBound( flags.primes ) then new := []; for M in reps do i := Index( S, M ); if IsPrimePowerInt( i ) and FactorsInt(i)[1] in flags.primes then Add( new, M ); fi; od; return new; fi; return reps; fi; # the class-equal case if IsBound( flags.classequal ) and flags.classequal=true then if not IsBound( flags.primes ) then Error("flags.primes must be bound"); fi; return MaximalSubgroupRepsKG( S, flags.primes ); fi; # the p-index case if IsBound( flags.primes ) then if IsSolvableGroup( S ) then return Concatenation( List( flags.primes, x -> MaximalSubgroupRepsSG( S, x ) ) ); else reps := MaximalSubgroupRepsTG( S ); new := []; for M in reps do i := Index( S, M ); if IsPrimePowerInt( i ) and FactorsInt(i)[1] in flags.primes then Add( new, M ); fi; od; Append( new, MaximalSubgroupRepsKG( S, flags.primes ) ); return new; fi; fi; Error("inconsistent input - check manual"); end ); InstallOtherMethod( MaximalSubgroupClassReps, "for AffineCrystGroupOnLeft", true, [ IsAffineCrystGroupOnLeft, IsRecord ], 0, function( S, flags ) local G, reps, lst, max, gen, new; G := TransposedMatrixGroup( S ); reps := MaximalSubgroupClassReps( G, flags ); lst := []; for max in reps do gen := List( GeneratorsOfGroup( max ), TransposedMat ); new := SubgroupNC( S, gen ); if HasTranslationBasis( max ) then AddTranslationBasis( new, TranslationBasis( max ) ); fi; if HasIndexInParent( max ) then SetIndexInParent( new, IndexInParent( max ) ); fi; Add( lst, new ); od; return lst; end ); ############################################################################# ## #M ConjugacyClassesMaximalSubgroups( S, flags ) ## InstallOtherMethod( ConjugacyClassesMaximalSubgroups, "forAffineCrystGroup", true, [ IsAffineCrystGroupOnLeftOrRight, IsRecord ], 0, function( S, flags ) local reps, cls, M, c; reps := MaximalSubgroupClassReps( S, flags ); cls := []; for M in reps do c := ConjugacyClassSubgroups( S, M ); if not IsNormal( S, M ) then SetSize( c, IndexInParent( M ) ); else SetSize( c, 1 ); fi; Add( cls, c ); od; return cls; end ); cryst/gap/max.gd0000644001325400021140000000116513232361435013243 0ustar gaehleruser############################################################################# ## #A max.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #A CocVecs( ) . . Cocycles of extension of point group with translations ## DeclareAttribute( "CocVecs", IsAffineCrystGroupOnLeftOrRight ); cryst/gap/hom.gi0000644001325400021140000000734514372461414013260 0ustar gaehleruser############################################################################# ## #A hom.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #M ImagesRepresentative( , ) . . . . . . . for PointHomomorphism ## InstallMethod( ImagesRepresentative, FamSourceEqFamElm, [ IsGroupGeneralMappingByImages and IsPointHomomorphism, IsMultiplicativeElementWithInverse ], 0, function( hom, elm ) local d; d := Length( elm ) - 1; return elm{[1..d]}{[1..d]}; end ); ############################################################################# ## #M PreImagesRepresentativeNC( , ) . . . . . for PointHomomorphism ## InstallMethod( PreImagesRepresentativeNC, FamRangeEqFamElm, [ IsGroupGeneralMappingByImages and IsPointHomomorphism, IsMultiplicativeElementWithInverse ], 0, function( hom, elm ) local P, perm; P := PointGroup( Source( hom ) ); perm := ImagesRepresentative( NiceMonomorphism( P ), elm ); return ImagesRepresentative( NiceToCryst( P ), perm ); end ); ############################################################################# ## #M CoKernelOfMultiplicativeGeneralMapping( ) . . for PointHomomorphism ## InstallMethod( CoKernelOfMultiplicativeGeneralMapping, true, [ IsGroupGeneralMappingByImages and IsPointHomomorphism ], 0, hom -> TrivialSubgroup( Range( hom ) ) ); ############################################################################# ## #M KernelOfMultiplicativeGeneralMapping( ) . . . for PointHomomorphism ## InstallMethod( KernelOfMultiplicativeGeneralMapping, true, [ IsGroupGeneralMappingByImages and IsPointHomomorphism ], 0, function( hom ) local S, d, T, gens, t, m; S := Source( hom ); d := DimensionOfMatrixGroup( S ) - 1; T := TranslationBasis( S ); gens := []; for t in T do m := IdentityMat( d+1 ); m[d+1]{[1..d]} := t; Add( gens, m ); od; if IsAffineCrystGroupOnLeft( S ) then gens := List( gens, TransposedMat ); fi; return SubgroupNC( S, gens ); end ); ############################################################################# ## #F NiceToCrystStdRep( P, perm ) ## InstallGlobalFunction( NiceToCrystStdRep, function( P, perm ) local S, m, d, c; S := AffineCrystGroupOfPointGroup( P ); m := ImagesRepresentative( NiceToCryst( P ), perm ); if IsStandardAffineCrystGroup( S ) then return m; else return S!.lconj * m * S!.rconj; fi; end ); ############################################################################# ## #M NaturalHomomorphismByNormalSubgroup( , ) . . for AffineCrystGroup ## InstallMethod( NaturalHomomorphismByNormalSubgroupOp, "for AffineCrystGroup", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G, N ) if IsFinite(G) or Length( TranslationBasis(G) ) <> Length( TranslationBasis(N) ) then TryNextMethod(); fi; return SparseActionHomomorphism( G, [ RightCoset(N,()) ], OnRight ); end ); InstallMethod( NaturalHomomorphismByNormalSubgroupOp, "for AffineCrystGroup", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G, N ) if IsFinite(G) or Length( TranslationBasis(G) ) <> Length( TranslationBasis(N) ) then TryNextMethod(); fi; return SparseActionHomomorphism( G, [ RightCoset(N,()) ], OnRight ); end ); cryst/gap/wypopup.gi0000644001325400021140000001576713232361435014223 0ustar gaehleruser############################################################################# ## #A wypopup.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## Routines for text selector popup for Wyckoff graph ## ############################################################################ ## #F CCInfo . . . . . . . . . . . . . ConjugacyClassInfo of WyckoffStabilizer ## CCInfo := function( W ) local G, C, R, L, max; G := PointGroup( WyckoffStabilizer( W ) ); C := ConjugacyClasses( G ); R := List( C, Representative ); L := [ [1..Length(C)], List( R, Order ), List( R, TraceMat ), List( R, DeterminantMat ), List( C, Size ) ]; L := TransposedMat( L ); L := Concatenation( [[ "cl", "ord", "tr", "det", "sz" ]], L ); max := Maximum( List( L, l -> Maximum( List( l, x -> Length( String(x) ) ) ) ) ); max := max + 1; L := List( L, l -> Concatenation( List( l, x -> String( x, max ) ) ) ); return L; end; ############################################################################ ## #F WyckoffInfoDisplays . . . . functions call by WyckoffGraph text selector ## BindGlobal( "WyckoffInfoDisplays", rec( Isomorphism := rec( name := "Isomorphism", func := x -> IdGroup( PointGroup( WyckoffStabilizer(x) ) ) ), ConjugacyClassInfo := rec( name := "ConjugacyClassInfo", func := x -> CCInfo( x ) ) ) ); ############################################################################ ## #M GGLRightClickPopup . . . . . . . . . . called if user does a right click ## ## This is called if the user does a right click on a vertex or somewhere ## else on the sheet. This operation is highly configurable with respect ## to the Attributes of groups it can display/calculate. See the ## configuration section in "ilatgrp.gi" for an explanation. ## InstallMethod( GGLRightClickPopup, "for a Wyckoff graph", true, [ IsGraphicSheet and IsWyckoffGraph, IsObject, IsInt, IsInt ], 0, function(sheet,v,x,y) local w, r, textselectfunc, text, pg, ps, i, str, basis, vec, funcclose, funcall, maxlengthofname, names; maxlengthofname := 11; # did we get a vertex? if v = fail then return; fi; # destroy other text selectors flying around if sheet!.selector <> false then Close(sheet!.selector); sheet!.selector := false; fi; # get the Wyckoff position of w := v!.data.wypos; # how long are the names of the info displays? r := sheet!.infodisplays; # maxlengthofname := Maximum( List( RecNames(r), x -> Length( r.(x).name ) ) ); # text select function textselectfunc := function( sel, name ) local tid, text, str, curr, value; tid := sel!.selected; name := sel!.names[tid]; text := ShallowCopy(sel!.labels); if name = "ConjugacyClassInfo" then str := text[tid]{[1..Length(name)]}; else str := text[tid]{[1..maxlengthofname+1]}; fi; if name = "dummy" then return true; fi; curr := sheet!.infodisplays.(name); value := curr.func( w ); v!.data.info.(name) := value; if name = "ConjugacyClassInfo" then Append( str, ":" ); else Append( str, String( value ) ); fi; text[tid] := str; if name = "ConjugacyClassInfo" then for str in value do Add( text, str ); Add( sel!.textFuncs, textselectfunc ); Add( sel!.names, "dummy" ); od; sel!.labels := text; fi; Relabel( sel, text ); SetName( sel, tid, "dummy" ); LastResultOfInfoDisplay := value; return true; end; # construct the initial text selector text := []; names := []; pg := PointGroup( WyckoffStabilizer( w ) ); ps := PointGroup( WyckoffSpaceGroup( w ) ); # the stabilizer size str := String( "StabSize", -(maxlengthofname+1) ); Append( str, String( Size( pg ) ) ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); # the stabilizer dimension str := String( "StabDim", -(maxlengthofname+1) ); Append( str, String( Length( WyckoffBasis( w ) ) ) ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); # the orbit length modulo lattice translations str := String( "OrbitLength", -(maxlengthofname+1) ); Append( str, String( Size( ps ) / Size( pg ) ) ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); # the translation of the affine subspace str := String( "Translation", -(maxlengthofname+1) ); Append( str, String( WyckoffTranslation( w ) ) ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); # the basis of the affine subspace basis := WyckoffBasis( w ); str := String( "Basis", -(maxlengthofname+1) ); if basis = [] then Append( str, "[ ]" ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); elif Length( basis ) = 1 then Append( str, String( basis ) ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); else Append( str, "[ " ); Append( str, String( basis[1] ) ); for vec in basis{[2..Length(basis)]} do Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); str := String( " ", -(maxlengthofname+3) ); Append( str, String( vec ) ); od; Append( str, " ]" ); Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); fi; # the isomorphism type str := String( "Isomorphism", -(maxlengthofname+1) ); if HasIdGroup( pg ) then Append( str, String( IdGroup( pg ) ) ); else Append( str, "unknown" ); fi; Append( text, [ str, textselectfunc ] ); Add( names, "Isomorphism" ); # the conjugacy class info str := "ConjugacyClassInfo"; if IsBound( v!.data.info.ConjugacyClassInfo ) then Append( str, ":" ); Add( names, "dummy" ); else Add( names, "ConjugacyClassInfo" ); fi; Append( text, [ str, textselectfunc ] ); Add( names, "Isomorphism" ); if IsBound( v!.data.info.ConjugacyClassInfo ) then for str in v!.data.info.ConjugacyClassInfo do Append( text, [ str, textselectfunc ] ); Add( names, "dummy" ); od; fi; # button select functions: funcclose := function( sel, bt ) Close(sel); sheet!.selector := false; return true; end; funcall := function( sel, bt ) local i; for i in [ 1 .. Length(sel!.labels) ] do sel!.selected := i; sel!.textFuncs[i]( sel, sel!.labels[i] ); od; Enable( sel, "all", false ); return true; end; # construct text selector sheet!.selector := TextSelector( Concatenation( " Information about ", v!.label ), text, [ "all", funcall, "close", funcclose ] ); # set entry names for i in [1..Length(names)] do SetName( sheet!.selector, i, names[i] ); od; end); cryst/gap/cryst.gd0000644001325400021140000002304013473202324013614 0ustar gaehleruser############################################################################# ## #A cryst.gd Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ## The main declarations ## ############################################################################# ## ## Identification and construction of affine crystallographic groups ## ############################################################################# ############################################################################# ## #P IsAffineCrystGroupOnRight( ) . . . . AffineCrystGroup acting OnRight ## DeclareProperty( "IsAffineCrystGroupOnRight", IsCyclotomicMatrixGroup ); InstallTrueMethod( IsCyclotomicMatrixGroup, IsAffineCrystGroupOnRight ); ############################################################################# ## #P IsAffineCrystGroupOnLeft( ) . . . . . AffineCrystGroup acting OnLeft ## DeclareProperty( "IsAffineCrystGroupOnLeft", IsCyclotomicMatrixGroup ); InstallTrueMethod( IsCyclotomicMatrixGroup, IsAffineCrystGroupOnLeft ); ############################################################################# ## #P IsAffineCrystGroupOnLeftOrRight( ) . . . . . AffineCrystGroup acting #P . . . . . . . . . . . . . . . . . . . . . . . . either OnLeft or OnRight ## DeclareProperty( "IsAffineCrystGroupOnLeftOrRight",IsCyclotomicMatrixGroup ); InstallTrueMethod( IsCyclotomicMatrixGroup, IsAffineCrystGroupOnLeftOrRight ); InstallTrueMethod( IsAffineCrystGroupOnLeftOrRight, IsAffineCrystGroupOnRight ); InstallTrueMethod( IsAffineCrystGroupOnLeftOrRight, IsAffineCrystGroupOnLeft ); ############################################################################# ## #P IsAffineCrystGroup( ) . . . . . . . . . . . . AffineCrystGroup acting #P . . . . . . . . . . . . . . . . . as specified by CrystGroupDefaultAction ## DeclareGlobalFunction( "IsAffineCrystGroup" ); ############################################################################# ## #F AffineCrystGroupOnRight( ) . . . . . . . . . . . . . . . . . . . . #F AffineCrystGroupOnRight( ) . . . . . . . . . . . . . . . . . . #F AffineCrystGroupOnRight( , ) . . . . . . constructor ## DeclareGlobalFunction( "AffineCrystGroupOnRight" ); DeclareGlobalFunction( "AffineCrystGroupOnRightNC" ); ############################################################################# ## #F AffineCrystGroupOnLeft( ) . . . . . . . . . . . . . . . . . . . . #F AffineCrystGroupOnLeft( ) . . . . . . . . . . . . . . . . . . . #F AffineCrystGroupOnLeft( , ) . . . . . . . constructor ## DeclareGlobalFunction( "AffineCrystGroupOnLeft" ); DeclareGlobalFunction( "AffineCrystGroupOnLeftNC" ); ############################################################################# ## #F AffineCrystGroup( ) . . . . . . . . . . . . . . . . . . . . . . . #F AffineCrystGroup( ) . . . . . . . . . . . . . . . . . . . . . . #F AffineCrystGroup( , ) . . . . . . . . . . constructor ## DeclareGlobalFunction( "AffineCrystGroup" ); DeclareGlobalFunction( "AffineCrystGroupNC" ); ############################################################################# ## #F AsAffineCrystGroupOnRight( ) . . . . . . . . . . convert matrix group ## DeclareGlobalFunction( "AsAffineCrystGroupOnRight" ); ############################################################################# ## #F AsAffineCrystGroupOnLeft( ) . . . . . . . . . . convert matrix group ## DeclareGlobalFunction( "AsAffineCrystGroupOnLeft" ); ############################################################################# ## #F AsAffineCrystGroup( ) . . . . . . . . . . . . . convert matrix group ## DeclareGlobalFunction( "AsAffineCrystGroup" ); ############################################################################# ## ## Utility functions ## ############################################################################# ############################################################################# ## #F IsAffineMatrixOnRight( ) . . . . . . . affine matrix action OnRight ## DeclareGlobalFunction( "IsAffineMatrixOnRight" ); ############################################################################# ## #F IsAffineMatrixOnLeft( ) . . . . . . . . affine matrix action OnLeft ## DeclareGlobalFunction( "IsAffineMatrixOnLeft" ); ############################################################################# ## ## Properties and Attributes for matrix groups ## (AffineCrystGroups or PointGroups) ## ############################################################################# ############################################################################# ## #P IsSpaceGroup( ) . . . . . . . . . . . . . . . . is S a space group? ## DeclareProperty( "IsSpaceGroup", IsCyclotomicMatrixGroup ); InstallTrueMethod( IsGroup, IsSpaceGroup ); ############################################################################# ## #P IsStandardAffineCrystGroup( ) . . . AffineCrystGroup in standard form ## DeclareProperty( "IsStandardAffineCrystGroup", IsCyclotomicMatrixGroup ); InstallTrueMethod( IsGroup, IsStandardAffineCrystGroup ); ############################################################################# ## #P IsStandardSpaceGroup( ) . . . . . . . .space group in standard form? ## DeclareSynonym( "IsStandardSpaceGroup", IsSpaceGroup and IsStandardAffineCrystGroup ); ############################################################################# ## #P IsSymmorphicSpaceGroup( ) . . . . . . . . . . . . . .is S symmorphic? ## DeclareProperty( "IsSymmorphicSpaceGroup", IsCyclotomicMatrixGroup); InstallTrueMethod( IsGroup, IsSymmorphicSpaceGroup ); ############################################################################# ## #P IsPointGroup(

    ) . . . . . . . . . . PointGroup of an AffineCrystGroup ## DeclareProperty( "IsPointGroup", IsCyclotomicMatrixGroup ); InstallTrueMethod( IsGroup, IsPointGroup ); ############################################################################# ## #A NormalizerPointGroupInGLnZ(

    ) . . . . . . .Normalizer of a PointGroup ## DeclareAttribute( "NormalizerPointGroupInGLnZ", IsPointGroup ); ############################################################################# ## #A CentralizerPointGroupInGLnZ(

    ) . . . . . .Centralizer of a PointGroup ## DeclareAttribute( "CentralizerPointGroupInGLnZ", IsPointGroup ); ############################################################################# ## #A AffineCrystGroupOfPointGroup(

    ) . . AffineCrystGroup of a PointGroup ## DeclareAttribute( "AffineCrystGroupOfPointGroup", IsPointGroup ); ############################################################################# ## ## Properties and Attributes for AffineCrystGroups ## ############################################################################# ############################################################################# ## #A PointGroup( ) . . . . . . . . . . . PointGroup of an AffineCrystGroup ## DeclareAttribute( "PointGroup", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #A PointHomomorphism( ) . . . . PointHomomorphism of an AffineCrystGroup ## DeclareAttribute( "PointHomomorphism", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #A TranslationBasis( ) . . . . . . . . . . basis of translation lattice ## DeclareAttribute( "TranslationBasis", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #F AddTranslationBasis( , ) . . . . add basis of translation lattice ## DeclareGlobalFunction( "AddTranslationBasis" ); ############################################################################# ## #A CheckTranslationBasis( ) . . . . . check basis of translation lattice ## DeclareGlobalFunction( "CheckTranslationBasis" ); ############################################################################# ## #A InternalBasis( ) . . . . . . . . . . . . . . . . . . .internal basis ## DeclareAttribute( "InternalBasis", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #A TransParts( ) . . . . . translation parts (reduced modulo lattice) of ## . . . . . . . . . . . . . . . . . . . . .GeneratorsSmallest of PointGroup ## DeclareAttribute( "TransParts", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #A TranslationNormalizer( ) . . . . . . . . . . translational normalizer ## DeclareAttribute( "TranslationNormalizer", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #A AffineNormalizer( ) . . . . . . . . . . . . . . . . affine normalizer ## DeclareAttribute( "AffineNormalizer", IsAffineCrystGroupOnLeftOrRight ); ############################################################################# ## #F StandardAffineCrystGroup( ) . . . . . . . . . change basis to std rep ## DeclareGlobalFunction( "StandardAffineCrystGroup" ); ############################################################################# ## #F AffineInequivalentSubgroups( , ) reps of affine ineq. subgroups ## DeclareGlobalFunction( "AffineInequivalentSubgroups" ); cryst/gap/noxgap.gi0000644001325400021140000000126013232361435013753 0ustar gaehleruser############################################################################# ## #A noxgap.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #M WyckoffGraphFun( S, def ) . . . . . . . . . . . . display a Wyckoff graph ## InstallGlobalFunction( WyckoffGraphFun, function( W, def ) Error( "WyckoffGraph is available only under XGAP" ); end ); cryst/gap/orbstab.gi0000644001325400021140000003111014372461414014114 0ustar gaehleruser############################################################################# ## #A orbstab.gi Cryst library Bettina Eick #A Franz G"ahler #A Werner Nickel ## #Y Copyright 1997-1999 by Bettina Eick, Franz G"ahler and Werner Nickel ## ############################################################################# ## #M Orbit( G, H, gens, oprs, opr ) . . . . . . . . . .for an AffineCrystGroup ## InstallOtherMethod( OrbitOp, "G, H, gens, oprs, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, IsList, IsList, IsFunction ], 10, function( G, H, gens, oprs, opr ) local orb, grp, gen, img; if opr = OnPoints then orb := [ H ]; for grp in orb do for gen in oprs do img := List( GeneratorsOfGroup( grp ), x -> x^gen ); if not ForAny( orb, g -> ForAll( img, x -> x in g ) ) then Add( orb, ConjugateGroup( grp, gen ) ); fi; od; od; return orb; else TryNextMethod(); fi; end ); InstallOtherMethod( OrbitOp, "G, H, gens, oprs, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, IsList, IsList, IsFunction ], 10, function( G, H, gens, oprs, opr ) local orb, grp, gen, img; if opr = OnPoints then orb := [ H ]; for grp in orb do for gen in oprs do img := List( GeneratorsOfGroup( grp ), x -> x^gen ); if not ForAny( orb, g -> ForAll( img, x -> x in g ) ) then Add( orb, ConjugateGroup( grp, gen ) ); fi; od; od; return orb; else TryNextMethod(); fi; end ); ############################################################################# ## #M OrbitStabilizer( G, H, gens, oprs, opr ) . . . . .for an AffineCrystGroup ## InstallOtherMethod( OrbitStabilizerOp, "G, H, gens, oprs, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, IsList, IsList, IsFunction ], 0, function( G, H, gens, oprs, opr ) local orb, rep, stb, grp, k, img, i, sch; if opr = OnPoints then orb := [ H ]; rep := [ One( G ) ]; if IsSubgroup( G, H ) then stb := H; else stb := Intersection2( G, H ); fi; for grp in orb do for k in [1..Length(gens)] do img := List( GeneratorsOfGroup( grp ), x -> x^oprs[k] ); i := PositionProperty( orb, g -> ForAll( img, x -> x in g ) ); if i = fail then Add( orb, ConjugateGroup( grp, oprs[k] ) ); Add( rep, rep[Position(orb,grp)] * oprs[k] ); else sch := rep[Position(orb,grp)] * gens[k] / rep[i]; if not sch in stb then stb := ClosureGroup( stb, sch ); fi; fi; od; od; return Immutable( rec( orbit := orb, stabilizer := stb ) ); else TryNextMethod(); fi; end ); InstallOtherMethod( OrbitStabilizerOp, "G, H, gens, oprs, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, IsList, IsList, IsFunction ], 0, function( G, H, gens, oprs, opr ) local orb, rep, stb, grp, k, img, i, sch; if opr = OnPoints then orb := [ H ]; rep := [ One( G ) ]; if IsSubgroup( G, H ) then stb := H; else stb := Intersection2( G, H ); fi; for grp in orb do for k in [1..Length(gens)] do img := List( GeneratorsOfGroup( grp ), x -> x^oprs[k] ); i := PositionProperty( orb, g -> ForAll( img, x -> x in g ) ); if i = fail then Add( orb, ConjugateGroup( grp, oprs[k] ) ); Add( rep, rep[Position(orb,grp)] * oprs[k] ); else sch := rep[Position(orb,grp)] * gens[k] / rep[i]; if not sch in stb then stb := ClosureGroup( stb, sch ); fi; fi; od; od; return Immutable( rec( orbit := orb, stabilizer := stb ) ); else TryNextMethod(); fi; end ); ############################################################################# ## #M RepresentativeAction( G, d, e, opr ) . . . . . . for an AffineCrystGroup ## InstallOtherMethod( RepresentativeActionOp, "G, d, e, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, IsFunction ], 0, function( G, d, e, opr ) local Td, Te, PG, f, r, n, Pd, Pe, r2, R, dim, gP, M, i, TG, tr1, tr2, tt, res, gN, orb, rep, x, g, dd, redtrans; if opr <> OnPoints then TryNextMethod(); fi; redtrans := function( TG, tr1, tr2, t2, P, U ) local dim, gen, t1, sol; dim := DimensionOfMatrixGroup( P ); gen := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( U ), x ) ); t1 := Concatenation( List( gen, x -> x[dim+1]{[1..dim]} ) ) - t2; sol := IntSolutionMat( tr1, -t1 ); if sol = fail then return VectorModL( t2, tr2 ); else return AugmentedMatrix( One( P ), sol{[1..Length(TG)]} * TG ); fi; end; # have the translation basis the same length? Td := TranslationBasis( d ); Te := TranslationBasis( e ); if Length( Td ) <> Length( Te ) then return fail; fi; # map translation basis onto each other PG := PointGroup( G ); if Length( Td ) > 0 then f := function(x,g) return ReducedLatticeBasis( x*g ); end; r := RepresentativeAction( PG, Td, Te, f ); if r = fail then return fail; fi; n := Stabilizer( PG, Te, f ); else n := PG; r := One( PG ); fi; # map point groups onto each other Pd := PointGroup( d ); Pe := PointGroup( e ); r2 := RepresentativeAction( n, Pd^r, Pe ); if r2 = fail then return fail; fi; r := r*r2; R := PreImagesRepresentativeNC( PointHomomorphism( G ), r ); dim := DimensionOfMatrixGroup( PG ); gP := GeneratorsOfGroup( Pe ); M := NullMat( Length(gP) * Length(Te), dim * Length(gP) ); if not IsEmpty( Te ) then for i in [1..Length(gP)] do M{[1..Length(Te)]+(i-1)*Length(Te)}{[1..dim]+(i-1)*dim} := Te; od; fi; TG := TranslationBasis( G ); tr1 := List( TG, t -> Concatenation( List( gP, x -> t * ( One(Pe)-x ) ) ) ); tr1 := Concatenation( tr1, M ); tr2 := ReducedLatticeBasis( tr1 ); tt := List( gP, x -> PreImagesRepresentativeNC( PointHomomorphism(e), x )); tt := Concatenation( List( tt, x -> x[dim+1]{[1..dim]} ) ); # is there a conjugating translation? res := redtrans( TG, tr1, tr2, tt, Pe, d^R ); if IsMatrix( res ) then return R * res; fi; # now we have to try the normalizer gN := Filtered( GeneratorsOfGroup( Normalizer(n, Pe) ), x -> not x in Pe ); gN := List( gN, x -> PreImagesRepresentativeNC( PointHomomorphism(G), x ) ); orb := [ res ]; rep := [ R ]; for x in rep do for g in gN do dd := d ^ (x * g); res := redtrans( TG, tr1, tr2, tt, Pe, dd ); if IsMatrix( res ) then return x * g * res; fi; if not res in orb then Add( orb, res ); Add( rep, x * g ); fi; od; od; return fail; end ); InstallOtherMethod( RepresentativeActionOp, "G, d, e, opr for AffineCrystGroups", true, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, IsFunction ], 0, function( G, d, e, opr ) local C; C := RepresentativeAction( TransposedMatrixGroup( G ), TransposedMatrixGroup( d ), TransposedMatrixGroup( e ), opr ); if C = fail then return fail; else return TransposedMat( C ); fi; end ); ############################################################################# ## #F ConjugatingTranslation( G, gen, T) ## ## returns a translation t from the Z-span of T such that the elements ## of gen conjugated with t are in G (or fail if no such t exists) ## ConjugatingTranslation := function( G, gen, T ) local d, b, TG, lt, lg, M, I, i, g, m, sol, t; d := DimensionOfMatrixGroup( G ) - 1; TG := TranslationBasis( G ); lt := Length( T ); lg := Length( TG ); b := []; M := NullMat( lt + lg * Length(gen), d * Length(gen) ); I := IdentityMat( d ); for i in [1..Length(gen)] do g := gen[i]{[1..d]}{[1..d]}; if not g in PointGroup( G ) then return fail; fi; m := PreImagesRepresentativeNC( PointHomomorphism( G ), g ); Append( b, -gen[i][d+1]{[1..d]} + m[d+1]{[1..d]} ); M{[1..lt]}{[1..d]+(i-1)*d} := T * (I - g); if lg > 0 then M{[1..lg]+lt+(i-1)*lg}{[1..d]+(i-1)*d} := TG; fi; od; sol := IntSolutionMat( M, b ); if IsList( sol ) then sol := sol{[1..lt]} * T; # t := AugmentedMatrix( I, sol ); # for g in gen do # Assert( 0, g^t in G ); # od; return sol; else return fail; fi; end; ############################################################################# ## #M Normalizer( G, H ) . . . . . . . . . . . . . . . . . . . . . . normalizer ## InstallMethod( NormalizerOp, "two AffineCrystGroupsOnRight", IsIdenticalObj, [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0, function( G, H ) local P, TH, TG, d, I, gens, T, t, trn, orb, rep, stb, grp, gen, img, i, sch, g, b, M, m, sol, Q, N; # we must normalize the point group and the translation subgroup P := Normalizer( PointGroup( G ), PointGroup( H ) ); TH := TranslationBasis( H ); if TH <> [] then P := Stabilizer( P, TH, function( x, g ) return ReducedLatticeBasis( x * g ); end ); fi; # lift P to G d := DimensionOfMatrixGroup( P ); I := IdentityMat( d ); gens := List( GeneratorsOfGroup( P ), x -> PreImagesRepresentativeNC( PointHomomorphism( G ), x ) ); # stabilizer of translation conjugacy class of H TG := TranslationBasis( G ); orb := [ H ]; rep := [ One( G ) ]; stb := TrivialSubgroup( G ); for grp in orb do for gen in gens do img := List( GeneratorsOfGroup( grp ), x -> x^gen ); i := PositionProperty( orb, g -> ConjugatingTranslation( g, img, TG ) <> fail ); if i = fail then Add( orb, ConjugateGroup( grp, gen ) ); Add( rep, rep[Position(orb,grp)] * gen ); else sch := rep[Position(orb,grp)] * gen / rep[i]; stb := ClosureGroup( stb, sch ); fi; od; od; gens := List( GeneratorsOfGroup( stb ), MutableMatrix ); # fix the translations for gen in gens do img := List( GeneratorsOfGroup( H ), x -> x^gen ); trn := ConjugatingTranslation( H, img, TG ); gen[d+1]{[1..d]} := gen[d+1]{[1..d]} + trn; od; gens := Set( gens ); # construct the pure translations T := TG; for g in GeneratorsOfGroup( PointGroup( H ) ) do if T <> [] then M := Concatenation( T * (g-I), TH ); M := M * Lcm( List( Flat( M ), DenominatorRat ) ); Q := IdentityMat( Length( M ) ); M := RowEchelonFormT( M, Q ); T := Q{[Length(M)+1..Length(Q)]}{[1..Length(T)]} * T; T := ReducedLatticeBasis( T ); fi; od; for t in T do Add( gens, AugmentedMatrix( I, t ) ); od; # for g in gens do # Assert( 0, H^g = H ); # od; # construct the normalizer N := AffineCrystGroupOnRight( gens, One( G ) ); AddTranslationBasis( N, T ); return N; end ); InstallMethod( NormalizerOp, "two AffineCrystGroupsOnLeft", IsIdenticalObj, [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0, function( G, H ) return TransposedMatrixGroup( Normalizer( TransposedMatrixGroup(G), TransposedMatrixGroup(H) ) ); end );