Changeset 197
- Timestamp:
- 02/24/08 22:17:23 (4 months ago)
- Files:
-
- GtkRadiant/branches/ZeroRadiant/config.py (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps (moved) (moved from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_flipx.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_flipx.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_flipy.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_flipy.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_flipz.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_flipz.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_rotatex.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_rotatex.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_rotatey.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_rotatey.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/brush_rotatez.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/brush_rotatez.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/cap_bevel.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/cap_bevel.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/cap_endcap.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/cap_endcap.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/cap_ibevel.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/cap_ibevel.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/cap_iendcap.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/cap_iendcap.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/curve_cap.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/curve_cap.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/dontselectcurve.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/dontselectcurve.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/dontselectmodel.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/dontselectmodel.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/file_open.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/file_open.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/file_save.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/file_save.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/icon.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/icon.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/logo.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/logo.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_bend.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_bend.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_drilldown.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_drilldown.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_insdel.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_insdel.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_showboundingbox.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_showboundingbox.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_weld.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_weld.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/patch_wireframe.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/patch_wireframe.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/popup_selection.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/popup_selection.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/scalelockx.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/scalelockx.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/scalelocky.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/scalelocky.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/scalelockz.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/scalelockz.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/select_mouserotate.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/select_mouserotate.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/select_mousescale.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/select_mousescale.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_csgmerge.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_csgmerge.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_csgsubtract.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_csgsubtract.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_makehollow.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_makehollow.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_selectcompletetall.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_selectcompletetall.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_selectinside.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_selectinside.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_selectpartialtall.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_selectpartialtall.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/selection_selecttouching.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/selection_selecttouching.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/show_entities.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/show_entities.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/splash.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/splash.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/textures_popup.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/textures_popup.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_cameratoggle.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_cameratoggle.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_cameraupdate.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_cameraupdate.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_change.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_change.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_clipper.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_clipper.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_cubicclipping.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_cubicclipping.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/view_entity.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/view_entity.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/window1.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/window1.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/window2.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/window2.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/window3.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/window3.bmp)
- GtkRadiant/branches/ZeroRadiant/install/bitmaps/window4.bmp (copied) (copied from GtkRadiant/branches/ZeroRadiant/radiant/bitmaps/window4.bmp)
- GtkRadiant/branches/ZeroRadiant/libs/missing.h (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/radiant/brush.cpp (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/radiant/camwindow.cpp (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/radiant/dialog.cpp (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/radiant/filters.cpp (modified) (1 diff)
- GtkRadiant/branches/ZeroRadiant/radiant/missing.cpp (modified) (6 diffs)
- GtkRadiant/branches/ZeroRadiant/radiant/preferences.cpp (modified) (5 diffs)
- GtkRadiant/branches/ZeroRadiant/radiant/preferences.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
GtkRadiant/branches/ZeroRadiant/config.py
r195 r197 232 232 env.Append( CPPDEFINES = [ '_DEBUG' ] ) 233 233 else: 234 env.Append( CFLAGS = [ '-O3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations' ] )235 env.Append( CXXFLAGS = [ '-O3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations' ] )234 env.Append( CFLAGS = [ '-O3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations', '-fno-strict-aliasing' ] ) 235 env.Append( CXXFLAGS = [ '-O3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations','-fno-strict-aliasing' ] ) 236 236 #env.Append( CFLAGS = [ '-march=pentium3' ] ) 237 237 GtkRadiant/branches/ZeroRadiant/libs/missing.h
r183 r197 68 68 int GetFullPathName(const char *lpFileName, int nBufferLength, char *lpBuffer, char **lpFilePart); 69 69 bool CopyFile(const char *lpExistingFileName, const char *lpNewFileName); 70 bool CopyTree( const char* source, const char* dest ); 70 71 71 72 #ifndef APIENTRY GtkRadiant/branches/ZeroRadiant/radiant/brush.cpp
r185 r197 1535 1535 void Brush_MakeSided (int sides) 1536 1536 { 1537 int i, axis ;1537 int i, axis = 0; 1538 1538 vec3_t mins, maxs; 1539 1539 brush_t *b; GtkRadiant/branches/ZeroRadiant/radiant/camwindow.cpp
r185 r197 1272 1272 float screenaspect; 1273 1273 float yfov; 1274 double start , end;1274 double start = 0.0, end; 1275 1275 int i; 1276 1276 GtkRadiant/branches/ZeroRadiant/radiant/dialog.cpp
r192 r197 95 95 g_object_set_data (G_OBJECT (m_pWidget), "ret", &m_nReturn); 96 96 97 BuildDialog ();97 BuildDialog(); 98 98 m_bNeedBuild = false; 99 99 } GtkRadiant/branches/ZeroRadiant/radiant/filters.cpp
r185 r197 138 138 || !strncmp( pb->owner->eclass->name, "trigger", 7) ) && !pb->patchBrush ) 139 139 { 140 bool filterbrush ;140 bool filterbrush = false; 141 141 for (face_t *f=pb->brush_faces;f!=NULL;f = f->next) 142 142 { GtkRadiant/branches/ZeroRadiant/radiant/missing.cpp
r185 r197 40 40 #include <unistd.h> 41 41 #include <sys/time.h> 42 #include <sys/types.h> 43 #include <sys/stat.h> 42 44 #include <stdlib.h> 45 #include <dirent.h> 43 46 #include "missing.h" 47 #include "qsysprintf.h" 44 48 45 49 bool CopyFile(const char *lpExistingFileName, const char *lpNewFileName) … … 47 51 FILE *src, *dst; 48 52 void* buf; 49 int l, ret = 0; 53 int l; 54 bool ret = false; 50 55 char realsrc[PATH_MAX], realdest[PATH_MAX]; 51 56 … … 54 59 55 60 src = fopen (realsrc, "rb"); 56 if (!src) 57 return 0; 61 if ( !src ) { 62 return false; 63 } 58 64 dst = fopen (realdest, "wb"); 59 if (!dst) 60 { 65 if (!dst) { 61 66 fclose (src); 62 return 0;67 return false; 63 68 } 64 69 … … 71 76 if (fread (buf, l, 1, src) == 1) 72 77 if (fwrite (buf, l, 1, dst) == 1) 73 ret = 1;78 ret = true; 74 79 75 80 g_free (buf); … … 78 83 79 84 return ret; 85 } 86 87 bool CreateDirectory( const char *directory ) { 88 if ( mkdir( directory, 0777 ) == -1 ) { 89 Sys_Printf( "mkdir %s failed\n", directory ); 90 return false; 91 } 92 return true; 93 } 94 95 bool CopyTree( const char *source, const char *dest ) { 96 DIR *dir; 97 struct dirent *dirlist; 98 struct stat sbuf; 99 Str srcEntry; 100 Str dstEntry; 101 102 dir = opendir( source ); 103 if ( dir != NULL ) { 104 while ( ( dirlist = readdir( dir ) ) != NULL ) { 105 if ( strcmp( dirlist->d_name, "." ) == 0 || strcmp( dirlist->d_name, ".." ) == 0 ) { 106 continue; 107 } 108 if ( strcmp( dirlist->d_name, ".svn" ) == 0 ) { 109 continue; 110 } 111 srcEntry = source; 112 srcEntry += "/"; 113 srcEntry += dirlist->d_name; 114 dstEntry = dest; 115 dstEntry += "/"; 116 dstEntry += dirlist->d_name; 117 if ( stat( srcEntry.GetBuffer(), &sbuf ) == -1 ) { 118 Sys_Printf( "stat %s failed\n", srcEntry.GetBuffer() ); 119 } 120 if ( S_ISDIR( sbuf.st_mode ) ) { 121 bool ret; 122 if ( stat( dstEntry.GetBuffer(), &sbuf ) == -1 ) { 123 ret = CreateDirectory( dstEntry.GetBuffer() ); 124 } 125 ret = CopyTree( srcEntry.GetBuffer(), dstEntry.GetBuffer() ); 126 if ( !ret ) { 127 return false; 128 } 129 } else { 130 Sys_Printf( "copy %s -> %s\n", srcEntry.GetBuffer(), dstEntry.GetBuffer() ); 131 bool ret = CopyFile( srcEntry.GetBuffer(), dstEntry.GetBuffer() ); 132 if ( !ret ) { 133 return false; 134 } 135 } 136 } 137 closedir( dir ); 138 } 139 return true; 80 140 } 81 141 … … 117 177 return strlen (lpBuffer); 118 178 } 119 /*120 static void g_string_sprintfa_int (GString *string, const gchar *fmt, va_list args)121 {122 gchar *buffer;123 124 buffer = g_strdup_vprintf (fmt, args);125 g_string_append (string, buffer);126 g_free (buffer);127 }128 129 const CString& CString::operator=(const char* lpsz)130 {131 g_string_assign (m_str, lpsz);132 return *this;133 }134 135 const CString& CString::operator+=(const char* lpsz)136 {137 g_string_append (m_str, lpsz);138 return *this;139 }140 141 CString::operator char*() const142 {143 return m_str->str;144 }145 146 void CString::Format(const char* fmt, ...)147 {148 va_list args;149 150 g_string_truncate (m_str, 0);151 152 va_start (args, fmt);153 g_string_sprintfa_int (m_str, fmt, args);154 va_end (args);155 }156 157 CString CString::Right(int nCount) const158 {159 if (nCount < 0)160 nCount = 0;161 else if (nCount > m_str->len)162 nCount = m_str->len;163 164 CString dest (&m_str->str[m_str->len-nCount]);165 return dest;166 }167 168 CString CString::Left(int nCount) const169 {170 if (nCount < 0)171 nCount = 0;172 else if (nCount > m_str->len)173 nCount = m_str->len;174 175 CString dest;176 dest.m_str = g_string_sized_new (nCount);177 memcpy (dest.m_str->str, m_str->str, nCount);178 dest.m_str->str[nCount] = 0;179 return dest;180 }181 182 void CString::SetAt(int nIndex, char ch)183 {184 if (nIndex >= 0 && nIndex < m_str->len)185 m_str->str[nIndex] = ch;186 }187 188 char CString::GetAt(int nIndex) const189 {190 if (nIndex >= 0 && nIndex < m_str->len)191 return m_str->str[nIndex];192 return 0;193 }194 195 char CString::operator[](int nIndex) const196 {197 if (nIndex >= 0 && nIndex < m_str->len)198 return m_str->str[nIndex];199 return 0;200 }201 */202 179 203 180 #endif GtkRadiant/branches/ZeroRadiant/radiant/preferences.cpp
r192 r197 3123 3123 */ 3124 3124 3125 CGameInstall::CGameInstall() { 3126 memset( m_availGames, 0, sizeof( m_availGames ) ); 3127 } 3128 3125 3129 void CGameInstall::BuildDialog() { 3126 3130 GtkWidget *dlg, *vbox1, *button, *text, *combo, *entry; … … 3142 3146 3143 3147 GList *combo_list = NULL; 3144 combo_list = g_list_append( combo_list, "Quake III Arena and mods" ); 3145 combo_list = g_list_append( combo_list, "Urban Terror standalone" ); 3146 combo_list = g_list_append( combo_list, "Warsaw" ); 3148 int iGame = 0; 3149 while ( m_availGames[ iGame ] != GAME_NONE ) { 3150 switch ( m_availGames[ iGame ] ) { 3151 case GAME_Q3: 3152 combo_list = g_list_append( combo_list, "Quake III Arena (including mods)" ); 3153 break; 3154 case GAME_URT: 3155 combo_list = g_list_append( combo_list, "Urban Terror (standalone)" ); 3156 break; 3157 case GAME_WARSOW: 3158 combo_list = g_list_append( combo_list, "Warsow" ); 3159 break; 3160 } 3161 iGame++; 3162 } 3147 3163 gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list ); 3148 3164 g_list_free( combo_list ); … … 3188 3204 3189 3205 void CGameInstall::Run() { 3206 ScanGames(); 3190 3207 DoModal(); 3191 3208 Sys_Printf( "combo: %d name: %s engine: %s mod: %s\n", m_nComboSelect, m_strName.GetBuffer(), m_strEngine.GetBuffer(), m_strMod.GetBuffer() ); … … 3206 3223 fprintf( fg, " gametools=\"%sgames\"\n", g_strAppPath.GetBuffer() ); 3207 3224 fprintf( fg, " enginepath=\"%s\"\n", m_strEngine.GetBuffer() ); 3208 switch ( m_nComboSelect ) { 3209 case GAME_Q3: 3225 switch ( m_availGames[ m_nComboSelect ] ) { 3226 case GAME_Q3: { 3227 Str source = g_strAppPath.GetBuffer(); 3228 source += "installs/"; 3229 source += Q3_PACK; 3230 Str dest = m_strEngine.GetBuffer(); 3231 CopyTree( source.GetBuffer(), dest.GetBuffer() ); 3210 3232 fprintf( fg, " basegame=\"baseq3\"\n" ); 3211 3233 break; 3212 case GAME_URT: 3234 } 3235 case GAME_URT: { 3236 Str source = g_strAppPath.GetBuffer(); 3237 source += "installs/"; 3238 source += URT_PACK; 3239 Str dest = m_strEngine.GetBuffer(); 3240 CopyTree( source.GetBuffer(), dest.GetBuffer() ); 3213 3241 fprintf( fg, " basegame=\"q3ut4\"\n" ); 3214 3242 break; 3243 } 3215 3244 case GAME_WARSOW: 3216 3245 fprintf( fg, " basegame=\"basewsw\"\n" ); … … 3220 3249 fclose( fg ); 3221 3250 } 3251 3252 /* 3253 =============== 3254 CGameInstall::ScanGames 3255 scan for active games that can be installed, based on the presence 3256 =============== 3257 */ 3258 void CGameInstall::ScanGames() { 3259 Str pakPaths = g_strAppPath.GetBuffer(); 3260 DIR *dir; 3261 struct dirent *dirlist; 3262 int iGame = 0; 3263 3264 pakPaths += "installs/"; 3265 dir = opendir( pakPaths.GetBuffer() ); 3266 if ( dir != NULL ) { 3267 while ( ( dirlist = readdir( dir ) ) != NULL ) { 3268 if ( stricmp( dirlist->d_name, Q3_PACK ) == 0 ) { 3269 m_availGames[ iGame++ ] = GAME_Q3; 3270 } 3271 if ( stricmp( dirlist->d_name, URT_PACK ) == 0 ) { 3272 m_availGames[ iGame++ ] = GAME_URT; 3273 } 3274 } 3275 closedir( dir ); 3276 } 3277 } GtkRadiant/branches/ZeroRadiant/radiant/preferences.h
r192 r197 197 197 select games, copy editing assets and write out configuration files 198 198 */ 199 200 #define Q3_PACK "Q3Pack" 201 #define URT_PACK "UrTPack" 202 199 203 class CGameInstall : public Dialog { 200 204 public: 205 CGameInstall(); 206 void ScanGames(); 201 207 void Run(); 202 208 void BuildDialog(); 203 209 204 210 enum gameType_e { 205 GAME_Q3, 211 GAME_NONE = 0, 212 GAME_Q3 = 1, 206 213 GAME_URT, 207 GAME_WARSOW 214 GAME_WARSOW, 215 GAME_COUNT 208 216 }; 209 217 210 218 protected: 211 Str m_strName; 212 Str m_strMod; 213 Str m_strEngine; 214 int m_nComboSelect; 219 Str m_strName; 220 Str m_strMod; 221 Str m_strEngine; 222 int m_nComboSelect; 223 224 // maps from m_nComboSelect to the games 225 int m_availGames[GAME_COUNT]; 215 226 }; 216 227
