Changeset 464
- Timestamp:
- Jun 6, 2006, 10:33:16 AM (18 years ago)
- Location:
- trunk/gui
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gui/apps/driver
r462 r464 29 29 package require Rappture 30 30 package require RapptureGUI 31 32 # install a better bug handler33 Rappture::bugreport::install34 31 35 32 option add *MainWin.mode desktop startupFile … … 55 52 option add *Balloon.titleBackground #6666cc 56 53 option add *Balloon.titleForeground white 54 option add *Balloon*Label.font -*-helvetica-medium-r-normal-*-*-120-* 55 option add *Balloon*Radiobutton.font -*-helvetica-medium-r-normal-*-*-120-* 56 option add *Balloon*Checkbutton.font -*-helvetica-medium-r-normal-*-*-120-* 57 57 option add *ResultSet.controlbarBackground #6666cc 58 58 option add *ResultSet.controlbarForeground white … … 60 60 option add *ResultSet.activeControlForeground black 61 61 option add *Radiodial.length 3i 62 option add *BugReport*banner*foreground white 63 option add *BugReport*banner*background #a9a9a9 64 option add *BugReport*banner*highlightBackground #a9a9a9 65 option add *BugReport*banner*font -*-helvetica-bold-r-normal-*-*-180-* 62 66 63 67 switch $tcl_platform(platform) { … … 69 73 } 70 74 } 75 76 # install a better bug handler 77 Rappture::bugreport::install 71 78 72 79 # fix the "grab" command to support a stack of grab windows -
trunk/gui/scripts/analyzer.tcl
r428 r464 223 223 button $w.top.dl -image [Rappture::icon download] -anchor e \ 224 224 -borderwidth 1 -relief flat -overrelief raised \ 225 -command [itcl::code $this download now$w.top.dl]225 -command [itcl::code $this download start $w.top.dl] 226 226 } 227 227 pack $itk_component(download) -side right -padx {4 0} … … 533 533 $itk_component(resultpages) current $page 534 534 $itk_component(resultselector) value $first 535 set _lastlabel $first 535 536 break 536 537 } … … 592 593 # ---------------------------------------------------------------------- 593 594 # USAGE: download coming 595 # USAGE: download controls <downloadCommand> 596 # USAGE: download start ?widget? 594 597 # USAGE: download now ?widget? 595 598 # … … 610 613 set f [$itk_component(resultpages) page $page] 611 614 $f.rviewer download coming 615 } 616 } 617 controls { 618 # no controls for this download yet 619 return "" 620 } 621 start { 622 set widget $itk_component(download) 623 if {[llength $args] > 0} { 624 set widget [lindex $args 0] 625 if {[catch {winfo class $widget}]} { 626 set widget $itk_component(download) 627 } 628 } 629 # 630 # See if this download has any controls. If so, then 631 # post them now and let the user continue the download 632 # after selecting a file format. 633 # 634 if {$page != ""} { 635 set ext "" 636 set f [$itk_component(resultpages) page $page] 637 set popup [$f.rviewer download controls \ 638 [itcl::code $this download now $widget]] 639 640 if {"" != $popup} { 641 $popup activate $widget below 642 } else { 643 download now $widget 644 } 645 } else { 646 # this shouldn't happen 647 set file error.html 648 set data "<h1>Not Found</h1>There is no result selected." 612 649 } 613 650 } … … 661 698 } 662 699 default { 663 error "bad option \"$option\": should be coming, now"700 error "bad option \"$option\": should be coming, controls, now, start" 664 701 } 665 702 } … … 769 806 $itk_component(resultselector) component entry configure -state disabled 770 807 # perform the actual download 771 download now$itk_component(resultselector)808 download start $itk_component(resultselector) 772 809 } elseif {$page == "---"} { 773 810 # put the combobox back to its last value -
trunk/gui/scripts/bugreport.tcl
r462 r464 83 83 pack .bugreport.banner.icon -side left -padx 2 -pady 2 84 84 label .bugreport.banner.title -text "Oops! Unexpected Error" 85 pack .bugreport.banner.title -side left -padx 2-pady 285 pack .bugreport.banner.title -side left -padx {0 8} -pady 2 86 86 87 87 button .bugreport.ok -text "OK" -command Rappture::bugreport::deactivate -
trunk/gui/scripts/contourresult.tcl
r456 r464 42 42 public method delete {args} 43 43 public method scale {args} 44 public method download {option }44 public method download {option args} 45 45 46 46 protected method _rebuild {} … … 337 337 -brightness 0 338 338 -raise 0 339 -description "" 339 340 } 340 341 foreach {opt val} $settings { … … 449 450 # ---------------------------------------------------------------------- 450 451 # USAGE: download coming 452 # USAGE: download controls <downloadCommand> 451 453 # USAGE: download now 452 454 # … … 456 458 # "string" is the data itself. 457 459 # ---------------------------------------------------------------------- 458 itcl::body Rappture::ContourResult::download {option } {460 itcl::body Rappture::ContourResult::download {option args} { 459 461 switch $option { 460 462 coming { … … 463 465 $_download put #000000 464 466 } 467 } 468 controls { 469 # no controls for this download yet 470 return "" 465 471 } 466 472 now { … … 480 486 } 481 487 default { 482 error "bad option \"$option\": should be coming, now"488 error "bad option \"$option\": should be coming, controls, now" 483 489 } 484 490 } -
trunk/gui/scripts/deviceViewer1D.tcl
r437 r464 33 33 34 34 public method controls {option args} 35 public method download {option }35 public method download {option args} 36 36 37 37 protected method _loadDevice {} … … 106 106 107 107 bind $itk_component(graph) <Configure> " 108 after cancel [itcl::code $this _fixAxes]109 after 100 [itcl::code $this _fixAxes]108 [list after cancel [list catch [itcl::code $this _align]]] 109 [list after 100 [list catch [itcl::code $this _align]]] 110 110 " 111 111 … … 170 170 # ---------------------------------------------------------------------- 171 171 # USAGE: download coming 172 # USAGE: download controls <downloadCommand> 172 173 # USAGE: download now 173 174 # … … 177 178 # "string" is the data itself. 178 179 # ---------------------------------------------------------------------- 179 itcl::body Rappture::DeviceViewer1D::download {option } {180 itcl::body Rappture::DeviceViewer1D::download {option args} { 180 181 switch $option { 181 182 coming { 182 183 # nothing to do 183 184 } 185 controls { 186 # no controls for this download yet 187 return "" 188 } 184 189 now { 185 190 return "" ;# not implemented yet! 186 191 } 187 192 default { 188 error "bad option \"$option\": should be coming, now"193 error "bad option \"$option\": should be coming, controls, now" 189 194 } 190 195 } … … 460 465 461 466 # let the widget settle, then fix the axes to "nice" values 462 after cancel [ itcl::code $this _fixAxes]463 after 100 [ itcl::code $this _fixAxes]467 after cancel [list catch [itcl::code $this _fixAxes]] 468 after 100 [list catch [itcl::code $this _fixAxes]] 464 469 } 465 470 … … 489 494 set graph $itk_component(graph) 490 495 if {![winfo ismapped $graph]} { 491 after cancel [ itcl::code $this _fixAxes]492 after 100 [ itcl::code $this _fixAxes]496 after cancel [list catch [itcl::code $this _fixAxes]] 497 after 100 [list catch [itcl::code $this _fixAxes]] 493 498 return 494 499 } -
trunk/gui/scripts/imageresult.tcl
r413 r464 32 32 public method delete {args} 33 33 public method scale {args} 34 public method download {option }34 public method download {option args} 35 35 36 36 protected method _rebuild {args} … … 166 166 -raise 0 167 167 -linestyle solid 168 -description "" 168 169 } 169 170 foreach {opt val} $settings { … … 266 267 # ---------------------------------------------------------------------- 267 268 # USAGE: download coming 269 # USAGE: download controls <downloadCommand> 268 270 # USAGE: download now 269 271 # … … 273 275 # "string" is the data itself. 274 276 # ---------------------------------------------------------------------- 275 itcl::body Rappture::ImageResult::download {option } {277 itcl::body Rappture::ImageResult::download {option args} { 276 278 switch $option { 277 279 coming { 278 280 # nothing to do 281 } 282 controls { 283 # no controls for this download yet 284 return "" 279 285 } 280 286 now { … … 299 305 } 300 306 default { 301 error "bad option \"$option\": should be coming, now"307 error "bad option \"$option\": should be coming, controls, now" 302 308 } 303 309 } -
trunk/gui/scripts/meshresult.tcl
r413 r464 36 36 public method delete {args} 37 37 public method scale {args} 38 public method download {option }38 public method download {option args} 39 39 40 40 protected method _rebuild {} … … 131 131 -raise 0 132 132 -linestyle solid 133 -description "" 133 134 } 134 135 foreach {opt val} $settings { … … 259 260 260 261 # ---------------------------------------------------------------------- 261 # USAGE: download 262 # USAGE: download coming 263 # USAGE: download controls <downloadCommand> 264 # USAGE: download now 262 265 # 263 266 # Clients use this method to create a downloadable representation … … 266 269 # "string" is the data itself. 267 270 # ---------------------------------------------------------------------- 268 itcl::body Rappture::MeshResult::download {option } {271 itcl::body Rappture::MeshResult::download {option args} { 269 272 switch $option { 270 273 coming { 271 274 # nothing to do 275 } 276 controls { 277 # no controls for this download yet 278 return "" 272 279 } 273 280 now { … … 291 298 } 292 299 default { 293 error "bad option \"$option\": should be coming, now"300 error "bad option \"$option\": should be coming, controls, now" 294 301 } 295 302 } -
trunk/gui/scripts/moleculeViewer.tcl
r413 r464 32 32 33 33 public method emblems {option} 34 public method download {option }34 public method download {option args} 35 35 36 36 protected method _clear {} … … 205 205 # ---------------------------------------------------------------------- 206 206 # USAGE: download coming 207 # USAGE: download controls <downloadCommand> 207 208 # USAGE: download now 208 209 # … … 212 213 # "string" is the data itself. 213 214 # ---------------------------------------------------------------------- 214 itcl::body Rappture::MoleculeViewer::download {option } {215 itcl::body Rappture::MoleculeViewer::download {option args} { 215 216 switch $option { 216 217 coming { … … 219 220 $_download put #000000 220 221 } 222 } 223 controls { 224 # no controls for this download yet 225 return "" 221 226 } 222 227 now { … … 236 241 } 237 242 default { 238 error "bad option \"$option\": should be coming, now"243 error "bad option \"$option\": should be coming, controls, now" 239 244 } 240 245 } -
trunk/gui/scripts/nanovisviewer.tcl
r462 r464 41 41 public method delete {args} 42 42 public method scale {args} 43 public method download {option }43 public method download {option args} 44 44 45 45 public method connect {{hostlist ""}} … … 441 441 -brightness 0 442 442 -raise 0 443 -description "" 443 444 } 444 445 foreach {opt val} $settings { … … 552 553 # ---------------------------------------------------------------------- 553 554 # USAGE: download coming 555 # USAGE: download controls <downloadCommand> 554 556 # USAGE: download now 555 557 # … … 559 561 # "string" is the data itself. 560 562 # ---------------------------------------------------------------------- 561 itcl::body Rappture::NanovisViewer::download {option } {563 itcl::body Rappture::NanovisViewer::download {option args} { 562 564 switch $option { 563 565 coming { … … 566 568 $_image(download) put #000000 567 569 } 570 } 571 controls { 572 # no controls for this download yet 573 return "" 568 574 } 569 575 now { … … 583 589 } 584 590 default { 585 error "bad option \"$option\": should be coming, now"591 error "bad option \"$option\": should be coming, controls, now" 586 592 } 587 593 } -
trunk/gui/scripts/resultset.tcl
r428 r464 66 66 protected method _toggleAll {{column "current"}} 67 67 protected method _getTooltip {role column} 68 protected method _getParamDesc {{index "current"}} 68 69 69 70 private variable _dispatcher "" ;# dispatchers for !events … … 1118 1119 1 { 1119 1120 # only one data set? then plot it 1120 _doSettings [list 0 [list -width 2 ]]1121 _doSettings [list 0 [list -width 2 -description [_getParamDesc]]] 1121 1122 return 1122 1123 } … … 1243 1244 # single result -- always use active color 1244 1245 set i [lindex $ilist 0] 1245 set plist [list $i [list -width 2 ]]1246 set plist [list $i [list -width 2 -description [_getParamDesc $i]]] 1246 1247 } else { 1247 1248 # … … 1252 1253 foreach i $ilist { 1253 1254 if {$i == $icurr} { 1254 lappend plist $i [list -width 3 -raise 1] 1255 lappend plist $i [list -width 3 -raise 1 \ 1256 -description [_getParamDesc $i]] 1255 1257 } else { 1256 lappend plist $i [list -brightness 0.7 -width 1] 1258 lappend plist $i [list -brightness 0.7 -width 1 \ 1259 -description [_getParamDesc $i]] 1257 1260 } 1258 1261 } … … 1513 1516 1514 1517 # ---------------------------------------------------------------------- 1518 # USAGE: _getParamDesc ?<index>? 1519 # 1520 # Used internally to build a descripton of parameters for the data 1521 # tuple at the specified <index>. This is passed on to the underlying 1522 # results viewer, so it will know what data is being viewed. 1523 # ---------------------------------------------------------------------- 1524 itcl::body Rappture::ResultSet::_getParamDesc {{index "current"}} { 1525 if {$index == "current"} { 1526 # search for the result for these settings 1527 set format "" 1528 set tuple "" 1529 foreach col [lrange [$_results column names] 1 end] { 1530 lappend format $col 1531 lappend tuple $_cntlInfo($this-$col-value) 1532 } 1533 set index [$_results find -format $format -- $tuple] 1534 if {"" == $index} { 1535 return "" ;# somethings wrong -- bail out! 1536 } 1537 } 1538 1539 set desc "" 1540 foreach col $_cntlInfo($this-all) { 1541 set quantity $_cntlInfo($this-$col-label) 1542 set val [lindex [$_results get -format $col $index] 0] 1543 if {$col == "xmlobj"} { 1544 set num [lindex [$_results find -format xmlobj $val] 0] 1545 set val "#[expr {$num+1}]" 1546 } 1547 append desc "$quantity = $val\n" 1548 } 1549 return [string trim $desc] 1550 } 1551 1552 # ---------------------------------------------------------------------- 1515 1553 # OPTION: -missingdata 1516 1554 # ---------------------------------------------------------------------- -
trunk/gui/scripts/resultviewer.tcl
r460 r464 33 33 34 34 public method plot {option args} 35 public method download {option }35 public method download {option args} 36 36 37 37 protected method _plotAdd {xmlobj {settings ""}} … … 358 358 # ---------------------------------------------------------------------- 359 359 # USAGE: download coming 360 # USAGE: download controls <downloadCommand> 360 361 # USAGE: download now 361 362 # … … 365 366 # "string" is the data itself. 366 367 # ---------------------------------------------------------------------- 367 itcl::body Rappture::ResultViewer::download {option } {368 itcl::body Rappture::ResultViewer::download {option args} { 368 369 if {"" == $_mode} { 369 370 return "" 370 371 } 371 return [ $_mode2widget($_mode) download $option]372 return [eval $_mode2widget($_mode) download $option $args] 372 373 } 373 374 -
trunk/gui/scripts/scroller.tcl
r168 r464 30 30 31 31 constructor {args} { # defined below } 32 destructor { # defined below } 32 33 33 34 public method contents {{frame "!@#query"}} … … 90 91 91 92 eval itk_initialize $args 93 } 94 95 # ---------------------------------------------------------------------- 96 # DESTRUCTOR 97 # ---------------------------------------------------------------------- 98 itcl::body Rappture::Scroller::destructor {} { 99 after cancel [itcl::code $this _lock reset x] 100 after cancel [itcl::code $this _lock reset y] 92 101 } 93 102 -
trunk/gui/scripts/sequenceresult.tcl
r459 r464 34 34 public method delete {args} 35 35 public method scale {args} 36 public method download {option }36 public method download {option args} 37 37 38 38 public method play {} … … 191 191 -raise 0 192 192 -linestyle solid 193 -description "" 193 194 } 194 195 foreach {opt val} $settings { … … 271 272 # ---------------------------------------------------------------------- 272 273 # USAGE: download coming 274 # USAGE: download controls <downloadCommand> 273 275 # USAGE: download now 274 276 # … … 278 280 # "string" is the data itself. 279 281 # ---------------------------------------------------------------------- 280 itcl::body Rappture::SequenceResult::download {option } {282 itcl::body Rappture::SequenceResult::download {option args} { 281 283 switch $option { 282 284 coming { 283 285 return [$itk_component(area).viewer download coming] 286 } 287 controls { 288 # no controls for this download yet 289 return "" 284 290 } 285 291 now { … … 311 317 } 312 318 default { 313 error "bad option \"$option\": should be coming, now"319 error "bad option \"$option\": should be coming, controls, now" 314 320 } 315 321 } -
trunk/gui/scripts/textresult.tcl
r413 r464 31 31 public method delete {args} 32 32 public method scale {args} 33 public method download {option }33 public method download {option args} 34 34 35 35 public method select {option args} … … 152 152 -linestyle "" 153 153 -raise 0 154 -description "" 154 155 } 155 156 foreach {opt val} $settings { … … 271 272 # ---------------------------------------------------------------------- 272 273 # USAGE: download coming 274 # USAGE: download controls <downloadCommand> 273 275 # USAGE: download now 274 276 # … … 278 280 # "string" is the data itself. 279 281 # ---------------------------------------------------------------------- 280 itcl::body Rappture::TextResult::download {option } {282 itcl::body Rappture::TextResult::download {option args} { 281 283 switch $option { 282 284 coming { 283 285 # nothing to do 284 286 } 287 controls { 288 # no controls for this download yet 289 return "" 290 } 285 291 now { 286 292 return [list .txt [$itk_component(text) get 1.0 end]] 287 293 } 288 294 default { 289 error "bad option \"$option\": should be coming, now"295 error "bad option \"$option\": should be coming, controls, now" 290 296 } 291 297 } -
trunk/gui/scripts/valueresult.tcl
r195 r464 28 28 public method delete {args} 29 29 public method scale {args} 30 public method download {option }30 public method download {option args} 31 31 32 32 set _dataobj "" ;# data object currently being displayed … … 73 73 -linestyle "" 74 74 -raise "" 75 -description "" 75 76 } 76 77 foreach {opt val} $settings { … … 148 149 # ---------------------------------------------------------------------- 149 150 # USAGE: download coming 151 # USAGE: download controls <downloadCommand> 150 152 # USAGE: download now 151 153 # … … 155 157 # "string" is the data itself. 156 158 # ---------------------------------------------------------------------- 157 itcl::body Rappture::ValueResult::download {option } {159 itcl::body Rappture::ValueResult::download {option args} { 158 160 switch $option { 159 161 coming { 160 162 # nothing to do 163 } 164 controls { 165 # no controls for this download yet 166 return "" 161 167 } 162 168 now { … … 166 172 } 167 173 default { 168 error "bad option \"$option\": should be coming, now"174 error "bad option \"$option\": should be coming, controls, now" 169 175 } 170 176 } -
trunk/gui/scripts/xyresult.tcl
r413 r464 48 48 public method delete {args} 49 49 public method scale {args} 50 public method download {option }50 public method download {option args} 51 51 52 52 protected method _rebuild {} … … 64 64 private variable _curve2dashes ;# maps curve => BLT -dashes list 65 65 private variable _curve2raise ;# maps curve => raise flag 0/1 66 private variable _curve2desc ;# maps curve => description of data 66 67 private variable _elem2curve ;# maps graph element => curve 67 68 private variable _label2axis ;# maps axis label => axis ID … … 72 73 private variable _axis ;# info for axis manipulations 73 74 private variable _axisPopup ;# info for axis being edited in popup 75 common _downloadPopup ;# download options from popup 74 76 } 75 77 … … 85 87 $_dispatcher register !rebuild 86 88 $_dispatcher dispatch $this !rebuild "[itcl::code $this _rebuild]; list" 89 90 array set _downloadPopup { 91 format csv 92 } 87 93 88 94 option add hull.width hull.height … … 213 219 -raise 0 214 220 -linestyle solid 221 -description "" 215 222 } 216 223 foreach {opt val} $settings { … … 266 273 set _curve2dashes($curve) $params(-linestyle) 267 274 set _curve2raise($curve) $params(-raise) 275 set _curve2desc($curve) $params(-description) 268 276 269 277 $_dispatcher event -idle !rebuild … … 391 399 # ---------------------------------------------------------------------- 392 400 # USAGE: download coming 401 # USAGE: download controls <downloadCommand> 393 402 # USAGE: download now 394 403 # … … 398 407 # "string" is the data itself. 399 408 # ---------------------------------------------------------------------- 400 itcl::body Rappture::XyResult::download {option } {409 itcl::body Rappture::XyResult::download {option args} { 401 410 switch $option { 402 411 coming { 403 412 # nothing to do 404 413 } 414 controls { 415 set popup .xyresultdownload 416 if {![winfo exists .xyresultdownload]} { 417 # if we haven't created the popup yet, do it now 418 Rappture::Balloon $popup -title "Download as..." 419 set inner [$popup component inner] 420 label $inner.summary -text "" -anchor w 421 pack $inner.summary -side top 422 radiobutton $inner.csv -text "Data as Comma-Separated Values" \ 423 -variable Rappture::XyResult::_downloadPopup(format) \ 424 -value csv 425 pack $inner.csv -anchor w 426 radiobutton $inner.pdf -text "Image as PDF/PostScript" \ 427 -variable Rappture::XyResult::_downloadPopup(format) \ 428 -value pdf 429 pack $inner.pdf -anchor w 430 button $inner.go -text "Download Now" \ 431 -command [lindex $args 0] 432 pack $inner.go -pady 4 433 } else { 434 set inner [$popup component inner] 435 } 436 set num [llength [get]] 437 set num [expr {($num == 1) ? "1 result" : "$num results"}] 438 $inner.summary configure -text "Download $num in the following format:" 439 update idletasks ;# fix initial sizes 440 return $popup 441 } 405 442 now { 406 set psdata [$itk_component(plot) postscript output -maxpect 1] 407 408 set cmds { 409 set fout "xy[pid].pdf" 410 exec ps2pdf - $fout << $psdata 411 412 set fid [open $fout r] 413 fconfigure $fid -translation binary -encoding binary 414 set pdfdata [read $fid] 415 close $fid 416 417 file delete -force $fout 418 } 419 if {[catch $cmds result] == 0} { 420 return [list .pdf $pdfdata] 421 } 422 return [list .ps $psdata] 443 set popup .xyresultdownload 444 if {[winfo exists .xyresultdownload]} { 445 $popup deactivate 446 } 447 switch -- $_downloadPopup(format) { 448 csv { 449 # reverse the objects so the selected data appears on top 450 set dlist "" 451 foreach dataobj [get] { 452 set dlist [linsert $dlist 0 $dataobj] 453 } 454 455 # generate the comma-separated value data for these objects 456 set csvdata "" 457 foreach dataobj $dlist { 458 append csvdata "[string repeat - 60]\n" 459 append csvdata " [$dataobj hints label]\n" 460 if {[info exists _curve2desc($dataobj)] 461 && [llength [split $_curve2desc($dataobj) \n]] > 1} { 462 set indent "for:" 463 foreach line [split $_curve2desc($dataobj) \n] { 464 append csvdata " $indent $line\n" 465 set indent " " 466 } 467 } 468 append csvdata "[string repeat - 60]\n" 469 470 append csvdata "[$dataobj hints xlabel], [$dataobj hints ylabel]\n" 471 set first 1 472 foreach comp [$dataobj components] { 473 if {!$first} { 474 # blank line between components 475 append csvdata "\n" 476 } 477 set xv [$dataobj mesh $comp] 478 set yv [$dataobj values $comp] 479 foreach x [$xv range 0 end] y [$yv range 0 end] { 480 append csvdata [format "%20.15g, %20.15g\n" $x $y] 481 } 482 set first 0 483 } 484 append csvdata "\n" 485 } 486 return [list .txt $csvdata] 487 } 488 pdf { 489 set psdata [$itk_component(plot) postscript output -maxpect 1] 490 491 set cmds { 492 set fout "xy[pid].pdf" 493 exec ps2pdf - $fout << $psdata 494 495 set fid [open $fout r] 496 fconfigure $fid -translation binary -encoding binary 497 set pdfdata [read $fid] 498 close $fid 499 500 file delete -force $fout 501 } 502 if {[catch $cmds result] == 0} { 503 return [list .pdf $pdfdata] 504 } 505 return [list .ps $psdata] 506 } 507 } 423 508 } 424 509 default { 425 error "bad option \"$option\": should be coming, now"510 error "bad option \"$option\": should be coming, controls, now" 426 511 } 427 512 }
Note: See TracChangeset
for help on using the changeset viewer.