[Evolvis-commits] r405: Initial revision↵
mirabilos at evolvis.org
mirabilos at evolvis.org
Thu Feb 25 14:21:31 CET 2010
Author: mirabilos
Date: 2010-02-25 13:21:30 +0000 (Thu, 25 Feb 2010)
New Revision: 405
Added:
trunk/gforge_base/evolvisforge/gforge/TARBALL
trunk/gforge_base/evolvisforge/gforge/common/
trunk/gforge_base/evolvisforge/gforge/common/include/
trunk/gforge_base/evolvisforge/gforge/common/include/Error.class
trunk/gforge_base/evolvisforge/gforge/common/include/Foundry.class
trunk/gforge_base/evolvisforge/gforge/common/include/Group.class
trunk/gforge_base/evolvisforge/gforge/common/include/Permission.class
trunk/gforge_base/evolvisforge/gforge/common/include/Project.class
trunk/gforge_base/evolvisforge/gforge/common/include/User.class
trunk/gforge_base/evolvisforge/gforge/common/include/account.php
trunk/gforge_base/evolvisforge/gforge/common/include/database.php
trunk/gforge_base/evolvisforge/gforge/common/include/jpcache.php
trunk/gforge_base/evolvisforge/gforge/common/include/ldap.php
trunk/gforge_base/evolvisforge/gforge/common/include/session.php
trunk/gforge_base/evolvisforge/gforge/common/include/timezones.php
trunk/gforge_base/evolvisforge/gforge/common/include/utils.php
trunk/gforge_base/evolvisforge/gforge/common/include/vars.php
trunk/gforge_base/evolvisforge/gforge/common/pm/
trunk/gforge_base/evolvisforge/gforge/common/pm/pm_data.php
trunk/gforge_base/evolvisforge/gforge/common/tracker/
trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifact.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCanned.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCategory.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactFile.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactGroup.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactResolution.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactType.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactTypes.class
trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifacts.class
trunk/gforge_base/evolvisforge/gforge/cronjobs/check_stale_tracker_items.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/db_foundry_boxes.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/db_project_sums.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/db_stats_agg.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/kt_dump.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/massmail.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/project_weekly_metric-backfill.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects-backfill.php
trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects.inc
trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_site.inc
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/README
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql
trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql
trunk/gforge_base/evolvisforge/gforge/db/dbusers.sql
trunk/gforge_base/evolvisforge/gforge/db/languages.tab
trunk/gforge_base/evolvisforge/gforge/db/oci8port/
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/DefaultValues.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/Languages.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/SourceForge.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/database-oci8.php
trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/trove_defaults.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/database.php
trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/pgdb-convert.pl
trunk/gforge_base/evolvisforge/gforge/db/replicate.sh
trunk/gforge_base/evolvisforge/gforge/db/replication-master.sql
trunk/gforge_base/evolvisforge/gforge/db/replication-reset-master.sql
trunk/gforge_base/evolvisforge/gforge/db/replication-reset-slave.sql
trunk/gforge_base/evolvisforge/gforge/db/replication-slave.sql
trunk/gforge_base/evolvisforge/gforge/db/replication.plan
trunk/gforge_base/evolvisforge/gforge/db/sfdocs.sql
trunk/gforge_base/evolvisforge/gforge/db/trove_cat.tab
trunk/gforge_base/evolvisforge/gforge/docs/architecture/
trunk/gforge_base/evolvisforge/gforge/docs/architecture/coding_standards.html
trunk/gforge_base/evolvisforge/gforge/docs/architecture/sf2.sda
trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/
trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.sda
trunk/gforge_base/evolvisforge/gforge/docs/architecture/templating.php
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first0.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first1.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.htm
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.jpg
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.htm
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.jpg
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.htm
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.jpg
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/index.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last0.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last1.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next0.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next1.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev0.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev1.gif
trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/standards.htm
trunk/gforge_base/evolvisforge/gforge/docs/background/
trunk/gforge_base/evolvisforge/gforge/docs/background/charter.html
trunk/gforge_base/evolvisforge/gforge/docs/background/org_chart.html
trunk/gforge_base/evolvisforge/gforge/docs/background/whos_who.html
trunk/gforge_base/evolvisforge/gforge/docs/doc_utils.php
trunk/gforge_base/evolvisforge/gforge/docs/index.php
trunk/gforge_base/evolvisforge/gforge/docs/project_management/
trunk/gforge_base/evolvisforge/gforge/docs/project_management/change_control.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/community.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/development_process.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/ps_engineers.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/requirements.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/review.html
trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_branching.sda
trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_control.html
trunk/gforge_base/evolvisforge/gforge/docs/templates/
trunk/gforge_base/evolvisforge/gforge/docs/templates/generic_document.html
trunk/gforge_base/evolvisforge/gforge/docs/templates/project_index.html
trunk/gforge_base/evolvisforge/gforge/pager.php3
trunk/gforge_base/evolvisforge/gforge/utils/download/README
trunk/gforge_base/evolvisforge/gforge/utils/groupCreator
trunk/gforge_base/evolvisforge/gforge/utils/ldap-check-replica
trunk/gforge_base/evolvisforge/gforge/www/account/unsubscribe.php
trunk/gforge_base/evolvisforge/gforge/www/admin/admin_table.php
trunk/gforge_base/evolvisforge/gforge/www/admin/database.php
trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_filetype.php
trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_processor.php
trunk/gforge_base/evolvisforge/gforge/www/admin/edit_supported_languages.php
trunk/gforge_base/evolvisforge/gforge/www/admin/intelapprove.php
trunk/gforge_base/evolvisforge/gforge/www/admin/massmail-old.php
trunk/gforge_base/evolvisforge/gforge/www/admin/resetapc.php
trunk/gforge_base/evolvisforge/gforge/www/admin/unsubscribe.php
trunk/gforge_base/evolvisforge/gforge/www/admin/vhost.php
trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_featuredprojects.php
trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_mostactive.php
trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_topdownloads.php
trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdn_search.php
trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdnnews.php
trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.php
trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.xsd
trunk/gforge_base/evolvisforge/gforge/www/help/tracker.php
trunk/gforge_base/evolvisforge/gforge/www/images/favicon.ico
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/c.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/i.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/l.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/m.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/n.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/p.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/t.gif
trunk/gforge_base/evolvisforge/gforge/www/images/phorum/trans.gif
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Base.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Bulgarian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Catalan.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Chinese.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Dutch.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/English.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Esperanto.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/French.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/German.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Greek.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Hebrew.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Indonesian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Italian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Japanese.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Korean.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Norwegian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Polish.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Portuguese.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/PortugueseBrazillian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Russian.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/SimplifiedChinese.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Spanish.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Swedish.tab
trunk/gforge_base/evolvisforge/gforge/www/include/languages/Thai.tab
trunk/gforge_base/evolvisforge/gforge/www/kernel_traffic.php
trunk/gforge_base/evolvisforge/gforge/www/my/intelagreement.php
trunk/gforge_base/evolvisforge/gforge/www/news/admin/news_admin_utils.php
trunk/gforge_base/evolvisforge/gforge/www/project/admin/database.php
trunk/gforge_base/evolvisforge/gforge/www/project/admin/rmuser.php
trunk/gforge_base/evolvisforge/gforge/www/project/admin/userpermedit.php
trunk/gforge_base/evolvisforge/gforge/www/project/admin/vhost.php
trunk/gforge_base/evolvisforge/gforge/www/register/projectinfo.php
trunk/gforge_base/evolvisforge/gforge/www/stats/lastlogins.php
trunk/gforge_base/evolvisforge/gforge/www/testsecurity.php
trunk/gforge_base/evolvisforge/gforge/www/themes/ultralite/
trunk/gforge_base/evolvisforge/gforge/www/themes/ultralite/Theme.class
trunk/gforge_base/evolvisforge/gforge/www/top/topusers.php
trunk/gforge_base/evolvisforge/gforge/www/tos/privacy_generic.php
trunk/gforge_base/evolvisforge/gforge/www/tos/tos_generic.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/
trunk/gforge_base/evolvisforge/gforge/www/tracker/add.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/admin/
trunk/gforge_base/evolvisforge/gforge/www/tracker/admin/index.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/browse.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/detail.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/download.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/include/
trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactFileHtml.class
trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactHtml.class
trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactTypeHtml.class
trunk/gforge_base/evolvisforge/gforge/www/tracker/index.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/mod.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/reporting/
trunk/gforge_base/evolvisforge/gforge/www/tracker/reporting/index.php
trunk/gforge_base/evolvisforge/gforge/www/tracker/tracker-er-diagram.sda
Modified:
trunk/gforge_base/evolvisforge/
Log:
Initial revision
Property changes on: trunk/gforge_base/evolvisforge
___________________________________________________________________
Name: bzr:revision-info
- timestamp: 2001-11-01 19:04:02.000000000 +0000
committer: lo-lan-do
+ timestamp: 2001-11-01 19:19:12.000000000 +0000
committer: lo-lan-do
Name: bzr:file-ids
- gforge/debian/changelog 7 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdebian%2Fchangelog
+ gforge/TARBALL 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2FTARBALL
gforge/common 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon
gforge/common/include 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude
gforge/common/include/Error.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FError.class
gforge/common/include/Foundry.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FFoundry.class
gforge/common/include/Group.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FGroup.class
gforge/common/include/Permission.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FPermission.class
gforge/common/include/Project.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FProject.class
gforge/common/include/User.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2FUser.class
gforge/common/include/account.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Faccount.php
gforge/common/include/database.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Fdatabase.php
gforge/common/include/jpcache.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Fjpcache.php
gforge/common/include/ldap.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Fldap.php
gforge/common/include/session.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Fsession.php
gforge/common/include/timezones.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Ftimezones.php
gforge/common/include/utils.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Futils.php
gforge/common/include/vars.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Finclude%2Fvars.php
gforge/common/pm 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Fpm
gforge/common/pm/pm_data.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Fpm%2Fpm_data.php
gforge/common/tracker 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker
gforge/common/tracker/Artifact.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifact.class
gforge/common/tracker/ArtifactCanned.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactCanned.class
gforge/common/tracker/ArtifactCategory.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactCategory.class
gforge/common/tracker/ArtifactFile.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactFile.class
gforge/common/tracker/ArtifactGroup.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactGroup.class
gforge/common/tracker/ArtifactResolution.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactResolution.class
gforge/common/tracker/ArtifactType.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactType.class
gforge/common/tracker/ArtifactTypes.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifactTypes.class
gforge/common/tracker/Artifacts.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcommon%2Ftracker%2FArtifacts.class
gforge/cronjobs/check_stale_tracker_items.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fcheck_stale_tracker_items.php
gforge/cronjobs/db_foundry_boxes.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fdb_foundry_boxes.php
gforge/cronjobs/db_project_sums.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fdb_project_sums.php
gforge/cronjobs/db_stats_agg.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fdb_stats_agg.php
gforge/cronjobs/kt_dump.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fkt_dump.php
gforge/cronjobs/massmail.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fmassmail.php
gforge/cronjobs/project_weekly_metric-backfill.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fproject_weekly_metric-backfill.php
gforge/cronjobs/stats_projects-backfill.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fstats_projects-backfill.php
gforge/cronjobs/stats_projects.inc 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fstats_projects.inc
gforge/cronjobs/stats_site.inc 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fcronjobs%2Fstats_site.inc
gforge/db/SQL_migrate-2.5-to-2.6 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6
gforge/db/SQL_migrate-2.5-to-2.6/README 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2FREADME
gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fartifact-conversion.sql
gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fartifact-convert-files.php
gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fartifact-fkeys.sql
gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fartifact-man.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20001209.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20001214.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20001220.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010109.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010112.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010126.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010206.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010301.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010304.NOTE
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010305.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010313.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010317.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010409.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010412.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010507.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010509.sql
gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2FSQL_migrate-2.5-to-2.6%2Fsqlchanges20010511.sql
gforge/db/dbusers.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Fdbusers.sql
gforge/db/languages.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Flanguages.tab
gforge/db/oci8port 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port
gforge/db/oci8port/pssonline 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline
gforge/db/oci8port/pssonline/DefaultValues.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline%2FDefaultValues.sql
gforge/db/oci8port/pssonline/Languages.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline%2FLanguages.sql
gforge/db/oci8port/pssonline/SourceForge.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline%2FSourceForge.sql
gforge/db/oci8port/pssonline/database-oci8.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline%2Fdatabase-oci8.php
gforge/db/oci8port/pssonline/trove_defaults.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fpssonline%2Ftrove_defaults.sql
gforge/db/oci8port/shaguo 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo
gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo%2FSourceForge2.5_oci8.sql
gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo%2FSourceForge2.5oci8-Trigger_auto.sql
gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo%2FSourceForge2.5oci8-Trigger_er.sql
gforge/db/oci8port/shaguo/database.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo%2Fdatabase.php
gforge/db/oci8port/shaguo/pgdb-convert.pl 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Foci8port%2Fshaguo%2Fpgdb-convert.pl
gforge/db/replicate.sh 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplicate.sh
gforge/db/replication-master.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplication-master.sql
gforge/db/replication-reset-master.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplication-reset-master.sql
gforge/db/replication-reset-slave.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplication-reset-slave.sql
gforge/db/replication-slave.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplication-slave.sql
gforge/db/replication.plan 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Freplication.plan
gforge/db/sfdocs.sql 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Fsfdocs.sql
gforge/db/trove_cat.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdb%2Ftrove_cat.tab
gforge/docs/architecture 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture
gforge/docs/architecture/coding_standards.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Fcoding_standards.html
gforge/docs/architecture/sf2.sda 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Fsf2.sda
gforge/docs/architecture/stats 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Fstats
gforge/docs/architecture/stats/stats-process.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Fstats%2Fstats-process.gif
gforge/docs/architecture/stats/stats-process.sda 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Fstats%2Fstats-process.sda
gforge/docs/architecture/templating.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftemplating.php
gforge/docs/architecture/tour 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour
gforge/docs/architecture/tour/first0.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Ffirst0.gif
gforge/docs/architecture/tour/first1.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Ffirst1.gif
gforge/docs/architecture/tour/img0.htm 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg0.htm
gforge/docs/architecture/tour/img0.jpg 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg0.jpg
gforge/docs/architecture/tour/img1.htm 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg1.htm
gforge/docs/architecture/tour/img1.jpg 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg1.jpg
gforge/docs/architecture/tour/img2.htm 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg2.htm
gforge/docs/architecture/tour/img2.jpg 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fimg2.jpg
gforge/docs/architecture/tour/index.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Findex.gif
gforge/docs/architecture/tour/last0.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Flast0.gif
gforge/docs/architecture/tour/last1.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Flast1.gif
gforge/docs/architecture/tour/next0.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fnext0.gif
gforge/docs/architecture/tour/next1.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fnext1.gif
gforge/docs/architecture/tour/prev0.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fprev0.gif
gforge/docs/architecture/tour/prev1.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fprev1.gif
gforge/docs/architecture/tour/standards.htm 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Farchitecture%2Ftour%2Fstandards.htm
gforge/docs/background 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fbackground
gforge/docs/background/charter.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fbackground%2Fcharter.html
gforge/docs/background/org_chart.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fbackground%2Forg_chart.html
gforge/docs/background/whos_who.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fbackground%2Fwhos_who.html
gforge/docs/doc_utils.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fdoc_utils.php
gforge/docs/index.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Findex.php
gforge/docs/project_management 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management
gforge/docs/project_management/change_control.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fchange_control.html
gforge/docs/project_management/community.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fcommunity.html
gforge/docs/project_management/development_process.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fdevelopment_process.html
gforge/docs/project_management/ps_engineers.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fps_engineers.html
gforge/docs/project_management/requirements.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Frequirements.html
gforge/docs/project_management/review.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Freview.html
gforge/docs/project_management/source_branching.sda 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fsource_branching.sda
gforge/docs/project_management/source_control.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Fproject_management%2Fsource_control.html
gforge/docs/templates 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Ftemplates
gforge/docs/templates/generic_document.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Ftemplates%2Fgeneric_document.html
gforge/docs/templates/project_index.html 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fdocs%2Ftemplates%2Fproject_index.html
gforge/pager.php3 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fpager.php3
gforge/utils/download/README 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Futils%2Fdownload%2FREADME
gforge/utils/groupCreator 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Futils%2FgroupCreator
gforge/utils/ldap-check-replica 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Futils%2Fldap-check-replica
gforge/www/account/unsubscribe.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Faccount%2Funsubscribe.php
gforge/www/admin/admin_table.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fadmin_table.php
gforge/www/admin/database.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fdatabase.php
gforge/www/admin/edit_frs_filetype.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fedit_frs_filetype.php
gforge/www/admin/edit_frs_processor.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fedit_frs_processor.php
gforge/www/admin/edit_supported_languages.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fedit_supported_languages.php
gforge/www/admin/intelapprove.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fintelapprove.php
gforge/www/admin/massmail-old.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fmassmail-old.php
gforge/www/admin/resetapc.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fresetapc.php
gforge/www/admin/unsubscribe.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Funsubscribe.php
gforge/www/admin/vhost.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fadmin%2Fvhost.php
gforge/www/export/rss_foundry_featuredprojects.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Frss_foundry_featuredprojects.php
gforge/www/export/rss_foundry_mostactive.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Frss_foundry_mostactive.php
gforge/www/export/rss_foundry_topdownloads.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Frss_foundry_topdownloads.php
gforge/www/export/rss_osdn_search.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Frss_osdn_search.php
gforge/www/export/rss_osdnnews.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Frss_osdnnews.php
gforge/www/export/sf_tracker_export.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Fsf_tracker_export.php
gforge/www/export/sf_tracker_export.xsd 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fexport%2Fsf_tracker_export.xsd
gforge/www/help/tracker.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fhelp%2Ftracker.php
gforge/www/images/favicon.ico 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Ffavicon.ico
gforge/www/images/phorum 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum
gforge/www/images/phorum/c.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fc.gif
gforge/www/images/phorum/i.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fi.gif
gforge/www/images/phorum/l.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fl.gif
gforge/www/images/phorum/m.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fm.gif
gforge/www/images/phorum/n.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fn.gif
gforge/www/images/phorum/p.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Fp.gif
gforge/www/images/phorum/t.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Ft.gif
gforge/www/images/phorum/trans.gif 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fimages%2Fphorum%2Ftrans.gif
gforge/www/include/languages/Base.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FBase.tab
gforge/www/include/languages/Bulgarian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FBulgarian.tab
gforge/www/include/languages/Catalan.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FCatalan.tab
gforge/www/include/languages/Chinese.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FChinese.tab
gforge/www/include/languages/Dutch.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FDutch.tab
gforge/www/include/languages/English.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FEnglish.tab
gforge/www/include/languages/Esperanto.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FEsperanto.tab
gforge/www/include/languages/French.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FFrench.tab
gforge/www/include/languages/German.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FGerman.tab
gforge/www/include/languages/Greek.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FGreek.tab
gforge/www/include/languages/Hebrew.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FHebrew.tab
gforge/www/include/languages/Indonesian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FIndonesian.tab
gforge/www/include/languages/Italian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FItalian.tab
gforge/www/include/languages/Japanese.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FJapanese.tab
gforge/www/include/languages/Korean.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FKorean.tab
gforge/www/include/languages/Norwegian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FNorwegian.tab
gforge/www/include/languages/Polish.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FPolish.tab
gforge/www/include/languages/Portuguese.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FPortuguese.tab
gforge/www/include/languages/PortugueseBrazillian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FPortugueseBrazillian.tab
gforge/www/include/languages/Russian.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FRussian.tab
gforge/www/include/languages/SimplifiedChinese.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FSimplifiedChinese.tab
gforge/www/include/languages/Spanish.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FSpanish.tab
gforge/www/include/languages/Swedish.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FSwedish.tab
gforge/www/include/languages/Thai.tab 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Finclude%2Flanguages%2FThai.tab
gforge/www/kernel_traffic.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fkernel_traffic.php
gforge/www/my/intelagreement.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fmy%2Fintelagreement.php
gforge/www/news/admin/news_admin_utils.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fnews%2Fadmin%2Fnews_admin_utils.php
gforge/www/project/admin/database.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fproject%2Fadmin%2Fdatabase.php
gforge/www/project/admin/rmuser.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fproject%2Fadmin%2Frmuser.php
gforge/www/project/admin/userpermedit.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fproject%2Fadmin%2Fuserpermedit.php
gforge/www/project/admin/vhost.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fproject%2Fadmin%2Fvhost.php
gforge/www/register/projectinfo.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fregister%2Fprojectinfo.php
gforge/www/stats/lastlogins.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fstats%2Flastlogins.php
gforge/www/testsecurity.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftestsecurity.php
gforge/www/themes/ultralite 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fthemes%2Fultralite
gforge/www/themes/ultralite/Theme.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Fthemes%2Fultralite%2FTheme.class
gforge/www/top/topusers.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftop%2Ftopusers.php
gforge/www/tos/privacy_generic.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftos%2Fprivacy_generic.php
gforge/www/tos/tos_generic.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftos%2Ftos_generic.php
gforge/www/tracker 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker
gforge/www/tracker/add.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fadd.php
gforge/www/tracker/admin 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fadmin
gforge/www/tracker/admin/index.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fadmin%2Findex.php
gforge/www/tracker/browse.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fbrowse.php
gforge/www/tracker/detail.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fdetail.php
gforge/www/tracker/download.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fdownload.php
gforge/www/tracker/include 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Finclude
gforge/www/tracker/include/ArtifactFileHtml.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Finclude%2FArtifactFileHtml.class
gforge/www/tracker/include/ArtifactHtml.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Finclude%2FArtifactHtml.class
gforge/www/tracker/include/ArtifactTypeHtml.class 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Finclude%2FArtifactTypeHtml.class
gforge/www/tracker/index.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Findex.php
gforge/www/tracker/mod.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Fmod.php
gforge/www/tracker/reporting 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Freporting
gforge/www/tracker/reporting/index.php 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Freporting%2Findex.php
gforge/www/tracker/tracker-er-diagram.sda 180 at 9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk%2Fgforge%2Fwww%2Ftracker%2Ftracker-er-diagram.sda
Name: bzr:revision-id:v4
- 1 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:1
2 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:2
3 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:7
4 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:9
5 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:10
6 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:11
7 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:12
8 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:13
9 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:14
10 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:15
11 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:16
12 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:17
13 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:18
14 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:19
15 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:20
16 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:21
17 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:22
18 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:23
19 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:24
20 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:25
21 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:26
22 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:27
23 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:28
24 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:29
25 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:30
26 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:31
27 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:32
28 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:33
29 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:34
30 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:35
31 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:36
32 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:37
33 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:38
34 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:39
35 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:40
36 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:41
37 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:42
38 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:43
39 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:44
40 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:45
41 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:46
42 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:47
43 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:48
44 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:49
45 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:50
46 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:51
47 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:52
48 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:53
49 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:54
50 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:55
51 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:56
52 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:57
53 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:58
54 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:59
55 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:60
56 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:61
57 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:62
58 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:63
59 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:64
60 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:65
61 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:66
62 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:67
63 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:68
64 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:69
65 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:70
66 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:71
67 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:72
68 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:73
69 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:74
70 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:75
71 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:76
72 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:77
73 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:78
74 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:79
75 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:80
76 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:81
77 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:82
78 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:83
79 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:84
80 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:85
81 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:86
82 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:87
83 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:88
84 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:89
85 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:90
86 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:91
87 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:92
88 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:93
89 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:94
90 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:95
91 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:96
92 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:97
93 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:98
94 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:99
95 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:100
96 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:101
97 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:102
98 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:103
99 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:104
100 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:105
101 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:106
102 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:107
103 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:108
104 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:109
105 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:110
106 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:111
107 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:112
108 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:113
109 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:114
110 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:115
111 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:116
112 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:117
113 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:118
114 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:119
115 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:120
116 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:121
117 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:122
118 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:123
119 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:124
120 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:125
121 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:126
122 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:127
123 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:128
124 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:129
125 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:130
126 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:131
127 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:132
128 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:133
129 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:134
130 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:135
131 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:136
132 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:137
133 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:138
134 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:139
135 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:140
136 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:141
137 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:142
138 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:143
139 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:144
140 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:145
141 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:146
142 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:147
143 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:148
144 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:149
145 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:150
146 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:151
147 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:152
148 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:153
149 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:154
150 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:155
151 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:156
152 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:157
153 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:158
154 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:159
155 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:160
156 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:161
157 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:162
158 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:163
159 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:164
160 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:165
161 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:166
162 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:167
163 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:168
164 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:169
165 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:170
166 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:172
167 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:173
168 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:174
169 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:175
170 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:176
+ 1 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:1
2 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:2
3 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:7
4 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:9
5 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:10
6 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:11
7 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:12
8 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:13
9 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:14
10 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:15
11 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:16
12 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:17
13 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:18
14 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:19
15 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:20
16 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:21
17 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:22
18 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:23
19 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:24
20 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:25
21 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:26
22 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:27
23 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:28
24 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:29
25 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:30
26 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:31
27 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:32
28 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:33
29 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:34
30 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:35
31 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:36
32 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:37
33 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:38
34 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:39
35 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:40
36 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:41
37 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:42
38 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:43
39 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:44
40 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:45
41 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:46
42 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:47
43 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:48
44 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:49
45 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:50
46 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:51
47 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:52
48 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:53
49 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:54
50 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:55
51 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:56
52 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:57
53 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:58
54 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:59
55 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:60
56 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:61
57 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:62
58 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:63
59 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:64
60 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:65
61 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:66
62 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:67
63 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:68
64 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:69
65 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:70
66 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:71
67 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:72
68 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:73
69 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:74
70 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:75
71 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:76
72 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:77
73 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:78
74 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:79
75 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:80
76 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:81
77 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:82
78 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:83
79 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:84
80 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:85
81 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:86
82 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:87
83 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:88
84 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:89
85 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:90
86 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:91
87 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:92
88 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:93
89 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:94
90 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:95
91 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:96
92 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:97
93 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:98
94 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:99
95 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:100
96 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:101
97 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:102
98 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:103
99 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:104
100 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:105
101 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:106
102 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:107
103 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:108
104 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:109
105 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:110
106 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:111
107 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:112
108 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:113
109 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:114
110 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:115
111 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:116
112 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:117
113 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:118
114 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:119
115 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:120
116 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:121
117 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:122
118 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:123
119 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:124
120 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:125
121 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:126
122 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:127
123 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:128
124 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:129
125 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:130
126 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:131
127 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:132
128 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:133
129 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:134
130 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:135
131 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:136
132 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:137
133 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:138
134 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:139
135 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:140
136 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:141
137 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:142
138 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:143
139 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:144
140 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:145
141 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:146
142 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:147
143 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:148
144 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:149
145 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:150
146 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:151
147 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:152
148 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:153
149 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:154
150 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:155
151 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:156
152 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:157
153 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:158
154 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:159
155 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:160
156 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:161
157 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:162
158 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:163
159 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:164
160 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:165
161 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:166
162 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:167
163 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:168
164 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:169
165 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:170
166 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:172
167 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:173
168 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:174
169 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:175
170 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:176
171 svn-v4:9d84d37e-dcb1-4aad-b103-6f3d92f53bf6:trunk:180
Added: trunk/gforge_base/evolvisforge/gforge/TARBALL
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/TARBALL (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/TARBALL 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,196 @@
+#!/usr/bin/perl
+#
+# SourceForge: Breaking Down the Barriers to Open Source Development
+# Copyright 1999-2001 (c) VA Linux Systems
+# http://sourceforge.net
+#
+# $Id: TARBALL,v 1.14 2001/07/09 21:54:14 pfalcon Exp $
+#
+
+use strict;
+
+my $CVS_TAG;
+tarball_init();
+
+# ------------------------------------------------------------------------------
+# 1. TARBALL
+# ------------------------------------------------------------------------------
+#
+# This document describes and executes the steps to create a SourceForge tarball
+# release from CVS. This file should be up to date in CVS for each
+# release but should not be included in the actual tarball.
+#
+# ------------------------------------------------------------------------------
+# 2. RELEASE VERSION
+# ------------------------------------------------------------------------------
+#
+#
+# RELEASE_VERSION=2.6.1pre4
+#
+# The above string should be updated with each tarball release to be in
+# the form "MAJOR.MINOR.REVISION".
+#
+# ------------------------------------------------------------------------------
+# 3. PROCESS
+# ------------------------------------------------------------------------------
+#
+# 0. tag CVS at SF_<VERSION>pre<N> where VERSION is listed above (2. RELEASE
+# VERSION) and (with dots replaced with underscores) N is an increasing
+# integer starting at 1.
+
+system('cvs -Q tag SF_' . $CVS_TAG);
+
+# 1. create a scratch directory
+
+system("rm -rf /tmp/scratch");
+system('mkdir /tmp/scratch');
+chdir('/tmp/scratch');
+
+# 2. check out CVS into this directory
+
+system('cvs -z9 -Q export -rHEAD alexandria');
+
+# 3. process the file removal list (4. REMOVE)
+
+process_removes();
+
+# 4. process the file addition list (5. ADD)
+
+process_adds();
+
+# 5. read and act on any notes (6. NOTES)
+
+process_notes();
+
+# 6. Create tarball in the form "SourceForge-VERSIONpreN.tar.gz"
+# and email a URL to the tarball to:
+#
+# - Engine Team and PS (sf-engine at valinux.com)
+# - SF.net Team (staff at sourceforge.net)
+
+create_tarball();
+
+# 7. review should generate changes in CVS to:
+#
+# - critical bugs
+# - files missing copyright statements
+# - README, AUTHORS, and other administrative files
+#
+# 8. Goto 0. Repeat until step 7 generates no comments. Upon approval,
+# tag CVS at VERSION and repeat steps 1 through 5. Create tarball in
+# the form "SourceForge-VERSION.tar.gz" and release on SourceForge.net.
+#
+# ------------------------------------------------------------------------------
+# 4. REMOVE
+# ------------------------------------------------------------------------------
+#
+# Note: this section should be a list of 'rm path/to/file'
+# statements, suitable to be pasted into a console.
+
+sub process_removes {
+ my @stuff_to_remove = (
+ 'rm -rf alexandria/include',
+ 'rm -rf alexandria/backend/',
+ 'rm -rf alexandria/monitor/',
+ 'rm -rf alexandria/docs/',
+ 'rm -rf alexandria/utils/',
+ 'rm -f alexandria/TARBALL',
+ 'rm -f alexandria/pager.php3',
+ 'rm -f alexandria/www/my/intelagreement.php',
+ 'rm -f alexandria/www/admin/intelapprove.php',
+ 'rm -rf alexandria/www/themes/forged/',
+ 'rm -rf alexandria/www/themes/classic/',
+ 'rm -f alexandria/cronjobs/kt_dump.php',
+ 'rm -f alexandria/www/kernel_traffic.php'
+ );
+
+ foreach(@stuff_to_remove) {
+ system $_;
+ }
+}
+
+# ------------------------------------------------------------------------------
+# 5. ADD
+# ------------------------------------------------------------------------------
+
+sub process_adds {
+}
+
+# ------------------------------------------------------------------------------
+# 6. NOTES
+# ------------------------------------------------------------------------------
+
+sub process_notes {
+ print "
+WARNING: PLEASE READ CAREFULLY!
+
+Automated preparation of SF source code snapshot has been completed.
+In particular, removals and additions has been performed. You should
+check that the latter were correct, however.
+
+For your convenience, as the next step, tarball package will be created,
+put at the appropriate place, and notice about snapshot availability
+will be sent to concerned parties. But you should review resulting tarball
+immediately to make sure it is correct, including (but not limited to):
+1. Additions made are based on the latest versions of subfacilities.
+2. Source code does not contain elements pertinent only to .net
+ installation (www/index.php is obvious candidate for review).
+If in doubt, ask via the staff list or IRC.
+
+If you will find that changes are required you may make them (among
+other means) to snapshot tree residing in /tmp/scratch and
+recreate tarball with following command:
+
+cd /tmp/scratch; tar cfz /usr/local/sourceforge.net/www/SourceForge-$ARGV[0].tar.gz alexandria
+
+";
+}
+
+################################################################################
+
+sub tarball_init {
+ # Check that CVS tag is in place
+ if (!$ARGV[0] || !($ARGV[0] =~ /((\d+)\.(\d+)\.(\d+))(\w*)/)) {
+ print("Usage: TARBALL <major.minor.revision>\n");
+ print("Example: TARBALL 1.2.3pre4\n");
+ exit;
+ }
+
+ # Replace '.' with '_'
+ $CVS_TAG = $ARGV[0];
+ $CVS_TAG =~ s/[\.]/_/g;
+
+ # Update this file with the new release name
+ open(FH, "+< TARBALL") or die("Opening: $!");
+ my $out = '';
+ while (<FH>) {
+ s/# RELEASE_VERSION=((\d+)\.(\d+)\.(\d+))(\w*)/# RELEASE_VERSION=$ARGV[0]/g;
+ $out .= $_;
+ }
+
+ seek(FH, 0, 0) or die("Can't seek to start of file: $!");
+ print FH $out or die("Can't print to file: $!");
+ truncate(FH, tell(FH)) or die("Can't truncate file: $!");
+ close(FH) or die("Can't close file: $!");
+}
+
+sub create_tarball {
+ # Create the tarball
+ system('tar cfz /usr/local/sourceforge.net/www/SourceForge-' . $ARGV[0] . '.tar.gz alexandria');
+
+ # Send email notices
+## open(SENDMAIL, "|/usr/sbin/sendmail -oi -t -odq") or die("Can't fork for sendmail: $!\n");
+ open(SENDMAIL, "|/usr/sbin/sendmail -oi -t") or die("Can't fork for sendmail: $!\n");
+## my $body = "From: noreply\@sourceforge.net
+ my $body = "To: sf-engine\@valinux.com, staff\@sourceforge.net
+Subject: New Tarball ($ARGV[0]) Created
+
+A new SourceForge tarball is available for review at http://webdev.sourceforge.net/SourceForge-$ARGV[0].tar.gz";
+ print SENDMAIL $body;
+ close(SENDMAIL) or warn("sendmail didn't close nicely: $!\n");
+
+ # Remove the scratch dir
+ # Don't do this as source tree will likely need manual
+ # augmentation/cleanup for package release
+# system("rm -rf /tmp/scratch");
+}
Added: trunk/gforge_base/evolvisforge/gforge/common/include/Error.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/Error.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/Error.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * A very base error class.
+ *
+ * Provides a basic uniform API for setting and testing error conditions and
+ * error messages.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ * @author Tim Perdue <tperdue at valnux.com>
+ * @date 2000-08-28
+ *
+ */
+
+class Error {
+ /**
+ * The current error state.
+ *
+ * @var bool $error_state
+ */
+ var $error_state;
+
+ /**
+ * The current error message(s).
+ *
+ * @var string $error_message
+ */
+ var $error_message;
+
+ /**
+ * Error() - Constructor
+ * Constructor for the Error class.
+ * Sets the error state to false.
+ *
+ */
+ function Error() {
+ //nothing
+ $this->error_state=false;
+ }
+
+ /**
+ * setError() - Sets the error string.
+ * Set the error string $error_message to the value of $string
+ # and enable the $error_state flag.
+ *
+ * @param string The error string to set.
+ *
+ */
+ function setError($string) {
+ $this->error_state=true;
+ $this->error_message=$string;
+ }
+
+ /**
+ * clearError() - Clear the current error.
+ * Clear the current error string and disable the $error_state flag.
+ *
+ */
+ function clearError() {
+ $this->error_state=false;
+ $this->error_message='';
+ }
+
+ /**
+ * getErrorMessage() - Retrieve the error message string.
+ * Returns the value of $error_message.
+ *
+ * @return $error_message The current error message string.
+ *
+ */
+ function getErrorMessage() {
+ if ($this->error_state) {
+ return $this->error_message;
+ } else {
+ return 'No Error';
+ }
+ }
+
+ /**
+ * isError() - Determines the current error state.
+ * This function returns the current value of $error_state.
+ *
+ * @return $error_state The boolean error status.
+ *
+ */
+ function isError() {
+ return $this->error_state;
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/Foundry.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/Foundry.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/Foundry.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Wrapper for Foundry data.
+ *
+ * An object wrapper for Foundry (as opposed to project) data.
+ * Extends the base object, Group.
+ *
+ * Example of proper use:
+ *
+ * // Instantiates the object
+ * $grp = new Foundry($group_id);
+ *
+ * // Now use the object to get the unix_name for the project
+ * $grp->getUnixName();
+ *
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: Foundry.class,v 1.4 2001/06/06 21:30:03 dbrogdon Exp $
+ * @author Tim Perdue <tperdue at valnux.com>
+ * @date 2000-08-28
+ *
+ */
+
+class Foundry extends Group {
+ /**
+ * Foundry preferences, etc - associative array from the database
+ *
+ * @var array $foundry_data_array
+ */
+ var $foundry_data_array;
+
+ /**
+ * Database result set handle for foundry_data
+ *
+ * @var int $foundry_db_result
+ */
+ var $foundry_db_result;
+
+ /**
+ * Foundry() - Constructor
+ * Constructor for the Error class.
+ * Basically just call the parent to set up everything
+ *
+ * @param int The foundry ID
+ * @param int Database resource ID
+ *
+ */
+ function Foundry($id,$res=false) {
+ $this->Group($id,$res);
+
+ //now set up the foundry data
+
+ $this->foundry_db_result=db_query("SELECT * FROM foundry_data WHERE foundry_id='$id'");
+ if (db_numrows($this->foundry_db_result) < 1) {
+ //function in class we extended
+ $this->setError('Foundry Data Not Found');
+ $this->foundry_data_array=array();
+ } else {
+ //set up an associative array for use by other functions
+ $this->foundry_data_array=db_fetch_array($this->foundry_db_result);
+ }
+ }
+
+ /**
+ * refreshFoundryData() - Refresh object member values.
+ * Retreive the latest foundry data and update object members with the new data.
+ *
+ */
+ function refreshFoundryData() {
+ $this->refreshGroupData();
+ $this->foundry_db_result=db_query("SELECT * FROM foundry_data WHERE foundry_id='". $this->getID() ."'");
+ $this->foundry_data_array=db_fetch_array($this->foundry_db_result);
+ }
+
+ /**
+ * getFreeformHTML1() - Return value of 'freeform1_html' from the foundry_data table.
+ * Return value of 'freeform1_html'.
+ *
+ * @return $foundry_data_array['freeform1_html'] The value of 'freeform1_html' from the foundry_data table.
+ *
+ */
+ function getFreeformHTML1() {
+ return $this->foundry_data_array['freeform1_html'];
+ }
+
+ /**
+ * getFreeformHTML2() - Return value of 'freeform2_html' from the foundry_data table.
+ * Return value of 'freeform2_html'.
+ *
+ * @return $foundry_data_array['freeform2_html'] The value of 'freeform2_html' from the foundry_data table.
+ *
+ */
+ function getFreeformHTML2() {
+ return $this->foundry_data_array['freeform2_html'];
+ }
+
+ /**
+ * getSponsorHTML1() - Return value of 'sponsor1_html' from the foundry_data table.
+ * Return value of 'sponsor1_html'.
+ *
+ * @return $foundry_data_array['sponsor1_html'] The value of 'sponsor1_html' from the foundry_data table.
+ *
+ */
+ function getSponsorHTML1() {
+ return $this->foundry_data_array['sponsor1_html'];
+ }
+
+ /**
+ * getSponsorHTML2() - Return value of 'sponsor2_html' from the foundry_data table.
+ * Return value of 'sponsor2_html'.
+ *
+ * @return $foundry_data_array['sponsor2_html'] The value of 'sponsor2_html' from the foundry_data table.
+ *
+ */
+ function getSponsorHTML2() {
+ return $this->foundry_data_array['sponsor2_html'];
+ }
+
+ /**
+ * getGuideImageID() - Return value of 'guide_image_id' from the foundry_data table.
+ * Returns the ID number that corresponds to the appropriate ID # in
+ * the db_images table
+ *
+ * @return $foundry_data_array['guide_image_id'] The value of 'guide_image_id' from the foundry_data table.
+ *
+ */
+ function getGuideImageID() {
+ return $this->foundry_data_array['guide_image_id'];
+ }
+
+ /**
+ * getLogoImageID() - Return value of 'logo_image_id' from the foundry_data table.
+ * Get the ID number that corresponds to the appropriate ID # in the db_images table.
+ *
+ * @return $foundry_data_array['logo_image_id'] The value of 'logo_image_id' from the foundry_data table.
+ *
+ */
+ function getLogoImageID() {
+ return $this->foundry_data_array['logo_image_id'];
+ }
+
+ /**
+ * getTroveCategories() - Get the trove categories.
+ * Return value of 'trove_categories' from the foundry_data table.
+ *
+ * @return $foundry_data_array['trove_categories'] The value of 'trove_categories' from the foundry_data table.
+ *
+ */
+ function getTroveCategories() {
+ return $this->foundry_data_array['trove_categories'];
+ }
+
+ /**
+ * getProjectCommaSep() - Get comma separated list of projects.
+ * Returns a comma separated list of member project ids
+ *
+ * @see getMemberProjects()
+ *
+ */
+ function getProjectsCommaSep() {
+ return implode(',',$this->getMemberProjects());
+ }
+
+ /**
+ * getMemberProjects() - Return an array of member project ID's.
+ * Returns an array of member project ids
+ *
+ * @see utils.php::util_result_column_to_array()
+ *
+ */
+ function getMemberProjects() {
+ //return an array of group_id's in this project
+ $sql="SELECT DISTINCT project_id FROM foundry_projects WHERE foundry_id='". $this->getID() ."' ORDER BY project_id ASC";
+ $result=db_query($sql);
+ return util_result_column_to_array($result);
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/Group.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/Group.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/Group.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,1454 @@
+<?php
+/**
+ * Group object
+ *
+ * Sets up database results and preferences for a group and abstracts this info.
+ *
+ * Foundry.class and Project.class call this.
+ *
+ * Project.class contains all the deprecated API from the old group.php file
+ *
+ * DEPENDS on user.php being present and setup properly
+ *
+ * GENERALLY YOU SHOULD NEVER INSTANTIATE THIS OBJECT DIRECTLY
+ * USE group_get_object() to instantiate properly
+ *
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ * @author Tim Perdue <tperdue at valinux.com>
+ * @date 2000-08-28
+ *
+ */
+
+require_once('common/tracker/ArtifactTypes.class');
+require_once('www/include/frs.class');
+
+$GROUP_OBJ=array();
+
+/**
+ * group_get_object() - Get the group object.
+ *
+ * group_get_object() is useful so you can pool group objects/save database queries
+ * You should always use this instead of instantiating the object directly.
+ *
+ * You can now optionally pass in a db result handle. If you do, it re-uses that query
+ * to instantiate the objects.
+ *
+ * IMPORTANT! That db result must contain all fields
+ * from groups table or you will have problems
+ *
+ * @param int Required
+ * @param int Result set handle ("SELECT * FROM groups WHERE group_id=xx")
+ * @return a group object or false on failure
+ */
+function &group_get_object($group_id,$res=false) {
+ //create a common set of group objects
+ //saves a little wear on the database
+
+ //automatically checks group_type and
+ //returns appropriate object
+
+ global $GROUP_OBJ;
+ if (!isset($GROUP_OBJ["_".$group_id."_"])) {
+ if ($res) {
+ //the db result handle was passed in
+ } else {
+ $res=db_query("SELECT * FROM groups WHERE group_id='$group_id'");
+ }
+ if (!$res || db_numrows($res) < 1) {
+ $GROUP_OBJ["_".$group_id."_"]=false;
+ } else {
+ /*
+ check group type and set up object
+ */
+ if (db_result($res,0,'type')==1) {
+ //project
+ $GROUP_OBJ["_".$group_id."_"]= new Project($group_id,$res);
+ } else if (db_result($res,0,'type')==2) {
+ //foundry
+ $GROUP_OBJ["_".$group_id."_"]= new Foundry($group_id,$res);
+ } else {
+ //invalid
+ $GROUP_OBJ["_".$group_id."_"]=false;
+ }
+ }
+ }
+ return $GROUP_OBJ["_".$group_id."_"];
+}
+
+class Group extends Error {
+ /**
+ * Associative array of data from db
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * The group ID
+ *
+ * @var int $group_id
+ */
+ var $group_id;
+
+ /**
+ * Database result set handle
+ *
+ * @var int $db_result
+ */
+ var $db_result;
+
+ /**
+ * Permissions data row from db
+ *
+ * @var array $perm_data_array
+ */
+ var $perm_data_array;
+
+ /**
+ * Whether the use is an admin/super user of this project
+ *
+ * @var bool $is_admin
+ */
+ var $is_admin;
+
+ /**
+ * Artifact types result handle
+ *
+ * @var int $types_res;
+ */
+ var $types_res;
+
+ /**
+ * Group() - Group object constructor - use group_get_object() to instantiate
+ *
+ * @param int Required - group_id of the group you want to instantiate
+ * @param int Database result from select query
+ */
+ function Group($id=false, $res=false) {
+ $this->Error();
+ if (!$id) {
+ //setting up an empty object
+ //probably going to call create()
+ return true;
+ }
+ $this->group_id=$id;
+ if (!$res) {
+ $this->db_result=db_query("SELECT * FROM groups WHERE group_id='$id'");
+ } else {
+ $this->db_result=$res;
+ }
+ if (db_numrows($this->db_result) < 1) {
+ //function in class we extended
+ $this->setError('Group Not Found');
+ $this->data_array=array();
+ } else {
+ //set up an associative array for use by other functions
+
+ db_reset_result($this->db_result);
+
+ $this->data_array=db_fetch_array($this->db_result);
+ }
+ }
+
+
+ /**
+ * getData()
+ *
+ * Generally should NOT be used - here for supporting deprecated group.php
+ * @return a database result set handle
+ * @access private
+ */
+ function getData() {
+ db_reset_result($this->db_result);
+ return $this->db_result;
+ }
+
+ /**
+ * refreshGroupData() - May need to refresh database fields if an update occurred
+ */
+ function refreshGroupData() {
+ $this->db_result=db_query("SELECT * FROM groups WHERE group_id='". $this->getID() ."'");
+ $this->data_array=db_fetch_array($this->db_result);
+ }
+
+
+ /**
+ * create() - Create new group
+ *
+ * This method should be called on empty Group object
+ *
+ * @param object The User object
+ * @param string The full name of the user
+ * @param string The Unix name of the user
+ * @param string The new group description
+ * @param int The ID of the license to use
+ * @param string The 'other' license to use if any
+ * @param string The purpose of the group
+ */
+ function create(&$user, $full_name, $unix_name, $description,
+ $license, $license_other, $purpose) {
+
+ // $user is ignored - anyone can create pending group
+
+ if ($this->getID()!=0) {
+ $this->setError("Group::create: Group object already exists");
+ return false;
+ }
+
+ srand((double)microtime()*1000000);
+ $random_num = rand(0,1000000);
+
+ db_begin();
+
+ $res = db_query("
+ INSERT INTO groups (
+ group_name,
+ is_public,
+ unix_group_name,
+ short_description,
+ http_domain,
+ homepage,
+ status,
+ unix_box,
+ cvs_box,
+ license,
+ register_purpose,
+ register_time,
+ license_other,
+ rand_hash
+ )
+ VALUES (
+ '$full_name',
+ 1,
+ '$unix_name',
+ '$description',
+ '$unix_name.".$GLOBALS['sys_default_domain']."',
+ '$unix_name.".$GLOBALS['sys_default_domain']."',
+ 'P',
+ 'shell1',
+ 'cvs1',
+ '$license',
+ '".htmlspecialchars($purpose)."',
+ ".time().",
+ '".htmlspecialchars($license_other)."',
+ '".md5($random_num)."'
+ )
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: Could not create group: '.db_error());
+ db_rollback();
+ return false;
+ }
+
+ $this->group_id = db_insertid($res, 'groups', 'group_id');
+
+ //
+ // Now, make the user an admin
+ //
+ $res = db_query("
+ INSERT INTO user_group (
+ user_id,
+ group_id,
+ admin_flags,
+ cvs_flags,
+ artifact_flags,
+ forum_flags
+ )
+ VALUES (
+ ".$user->getID().",
+ ".$this->getID().",
+ 'A',
+ 1,
+ 2,
+ 2
+ )
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: Could not add admin to newly created group: '.db_error());
+ db_rollback();
+ return false;
+ }
+
+ db_commit();
+ $this->refreshGroupData();
+ return true;
+ }
+
+
+ /**
+ * updateAdmin($user) - Update core properties of group object
+ *
+ * This function require site admin privilege
+ *
+ * @param object User requesting operation (for access control)
+ * @param bool Whether group is publicly accessible (0/1)
+ * @param string Project's license (string ident)
+ * @param int Group type (1-project, 2-foundry)
+ * @param string Machine on which group's home directory located
+ * @param string Domain which serves group's WWW
+ * @return status
+ * @access public
+ */
+ function updateAdmin(&$user, $is_public, $license, $type, $unix_box, $http_domain) {
+
+ $perm =& $this->getPermission($user);
+
+ if (!$perm || !is_object($perm)) {
+ $this->setError('Could not get permission');
+ return false;
+ }
+
+ if (!$perm->isSuperUser()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+
+ db_begin();
+
+ $res = db_query("
+ UPDATE groups
+ SET is_public='$is_public',
+ license='$license',type='$type',
+ unix_box='$unix_box',http_domain='$http_domain'
+ WHERE group_id='".$this->getID()."'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: DB: Could not change group properties: '.db_error());
+ db_rollback();
+ return false;
+ }
+
+ /*
+ If this is a foundry, see if they have a preferences row, if not, create one
+ */
+ if ($type=='2') {
+
+ $res = db_query("
+ SELECT *
+ FROM foundry_data
+ WHERE foundry_id='".$this->getID()."'
+ ");
+
+ if (db_numrows($res) < 1) {
+ $res = db_query("
+ INSERT INTO foundry_data (foundry_id)
+ VALUES ('".$this->getID()."')
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('Could not insert foundry_data row: '.db_error());
+ db_rollback();
+ return false;
+ }
+ }
+ }
+
+ db_commit();
+
+ // Log the audit trail
+ if ($is_public != $this->isPublic()) {
+ $this->addHistory('is_public', $this->isPublic());
+ }
+ if ($license != $this->data_array['license']) {
+ $this->addHistory('license', $this->data_array['license']);
+ }
+ if ($type != $this->data_array['type']) {
+ $this->addHistory('type', $this->data_array['type']);
+ }
+ if ($unix_box != $this->data_array['unix_box']) {
+ $this->addHistory('unix_box', $this->data_array['unix_box']);
+ }
+ if ($http_domain != $this->data_array['http_domain']) {
+ $this->addHistory('http_domain', $this->data_array['http_domain']);
+ }
+
+ $this->refreshGroupData();
+ return true;
+ }
+
+ /**
+ * update() - Update number of common properties
+ *
+ * Unlike updateAdmin(), this function accessible to project
+ * admin.
+ *
+ * @param object User requesting operation (for access control)
+ * @param bool Whether group is publicly accessible (0/1)
+ * @param string Project's license (string ident)
+ * @param int Group type (1-project, 2-foundry)
+ * @param string Machine on which group's home directory located
+ * @param string Domain which serves group's WWW
+ * @return status
+ * @access public
+ */
+ function update(&$user, $group_name,$homepage,$short_description,$use_mail,$use_survey,$use_forum,
+ $use_pm,$use_pm_depend_box,$use_cvs,$use_news,$use_docman,
+ $new_task_address,$send_all_tasks,$logo_image_id) {
+
+ $perm =& $this->getPermission($user);
+
+ if (!$perm || !is_object($perm)) {
+ $this->setError('Could not get permission');
+ return false;
+ }
+
+ if (!$perm->isAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+
+ // Validate some values
+ if (!$group_name) {
+ $this->setError('Invalid Group Name');
+ return false;
+ }
+
+ if ($new_task_address && !validate_email($new_task_address)) {
+ $this->setError('Task Address Appeared Invalid');
+ return false;
+ }
+
+ // in the database, these all default to '1',
+ // so we have to explicity set 0
+ if (!$use_mail) {
+ $use_mail=0;
+ }
+ if (!$use_survey) {
+ $use_survey=0;
+ }
+ if (!$use_forum) {
+ $use_forum=0;
+ }
+ if (!$use_pm) {
+ $use_pm=0;
+ }
+ if (!$use_pm_depend) {
+ $use_pm_depend=0;
+ }
+ if (!$use_cvs) {
+ $use_cvs=0;
+ }
+ if (!$use_news) {
+ $use_news=0;
+ }
+ if (!$use_docman) {
+ $use_docman=0;
+ }
+ if (!$send_all_tasks) {
+ $send_all_tasks=0;
+ }
+
+ if (!$homepage) {
+ $homepage='http://'.$GLOBALS['sys_default_domain'].'/projects/'.$this->getUnixName().'/';
+ }
+
+ $res = db_query("
+ UPDATE groups
+ SET
+ group_name='$group_name',
+ homepage='$homepage',
+ short_description='$short_description',
+ use_mail='$use_mail',
+ use_survey='$use_survey',
+ use_forum='$use_forum',
+ use_pm='$use_pm',
+ use_pm_depend_box='$use_pm_depend_box',
+ use_cvs='$use_cvs',
+ use_news='$use_news',
+ use_docman='$use_docman',
+ new_task_address='$new_task_address',
+ send_all_tasks='$send_all_tasks'".
+// XXX: not active yet
+// logo_image_id='$logo_image_id'
+ "
+ WHERE group_id='".$this->getID()."'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('Error updating project information: '.db_error());
+ return false;
+ }
+
+ // Log the audit trail
+ $this->addHistory('Changed Public Info', '');
+
+ $this->refreshGroupData();
+ return true;
+ }
+
+ /**
+ * getID() - Simply return the group_id for this object
+ *
+ * @return integer group_id
+ */
+ function getID() {
+ return $this->group_id;
+ }
+
+ /**
+ * getType() - Foundry, project, etc
+ *
+ * @return the type flag from the database
+ */
+ function getType() {
+ return $this->data_array['type'];
+ }
+
+
+ /**
+ * getStatus()
+ *
+ * Statuses include I,H,A,D
+ */
+ function getStatus() {
+ return $this->data_array['status'];
+ }
+
+ /**
+ * setStatus($user, $status)
+ *
+ * Statuses include I,H,A,D
+ *
+ * @param object User requesting operation (for access control)
+ * @param string Status value
+ *
+ * @access public
+ */
+ function setStatus(&$user, $status) {
+
+ $perm =& $this->getPermission($user);
+
+ if (!$perm || !is_object($perm)) {
+ $this->setError('Could not get permission');
+ return false;
+ }
+
+ if (!$perm->isSuperUser()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+
+ // Projects in 'A' status can only go to 'H' or 'D'
+ // Projects in 'D' status can only go to 'A'
+ // Projects in 'P' status can only go to 'A' OR 'D'
+ // Projects in 'I' status can only go to 'P'
+ // Projects in 'H' status can only go to 'A' OR 'D'
+ $allowed_status_changes = array(
+ 'AH'=>1,'AD'=>1,'DA'=>1,'PA'=>1,'PD'=>1,
+ 'IP'=>1,'HA'=>1,'HD'=>1
+ );
+
+ // Check that status transition is valid
+ if ($this->getStatus() != $status
+ && !$allowed_status_changes[$this->getStatus().$status]) {
+ $this->setError('Invalid Status Change');
+ return false;
+ }
+
+ db_begin();
+
+ $res = db_query("
+ UPDATE groups
+ SET status='$status'
+ WHERE group_id='". $this->getID()."'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: DB: Could not change group status: '.db_error());
+ db_rollback();
+ return false;
+ }
+
+ if ($status=='A') {
+ // Activate LDAP group, if not yet
+ if (!sf_ldap_check_group($this->getID())) {
+
+ if (!sf_ldap_create_group($this->getID())) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+
+ if (!$this->activateUsers()) {
+ db_rollback();
+ return false;
+ }
+ }
+
+ /* Otherwise, the group is not active, and make sure that
+ LDAP group is not active either */
+ } else if (sf_ldap_check_group($this->getID())) {
+
+ if (!sf_ldap_remove_group($this->getID())) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+
+ }
+
+ // Make sure that active group have default trackers
+ if ($status=='A') {
+ $ats = new ArtifactTypes($this);
+ if (!$ats || !is_object($ats)) {
+ $this->setError('Error creating ArtifactTypes object');
+ db_rollback();
+ return false;
+ } else if ($ats->isError()) {
+ $this->setError($ats->getErrorMessage());
+ db_rollback();
+ return false;
+ }
+ if (!$ats->createTrackers()) {
+ $this->setError($ats->getErrorMessage());
+ db_rollback();
+ return false;
+ }
+ }
+
+ db_commit();
+
+ // Log the audit trail
+ if ($status != $this->getStatus()) {
+ $this->addHistory('status', $this->getStatus());
+ }
+
+ $this->data_array['status'] = $status;
+ return true;
+ }
+
+ /**
+ * isFoundry() - Simple boolean test to see if it's a foundry or not
+ *
+ * @return true/false
+ */
+ function isFoundry() {
+ if ($this->getType()==2) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * isProject() - Simple boolean test to see if it's a project or not
+ *
+ * @return true/false
+ */
+ function isProject() {
+ if ($this->getType()==1) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * isPublic() - Simply returns the is_public flag from the database
+ *
+ * @return true/false
+ */
+ function isPublic() {
+ return $this->data_array['is_public'];
+ }
+
+ /**
+ * isActive() - Database field status of 'A' returns true
+ *
+ * @return true/false
+ */
+ function isActive() {
+ if ($this->getStatus()=='A') {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * getUnixName()
+ *
+ * @return text unix_name
+ */
+ function getUnixName() {
+ return strtolower($this->data_array['unix_group_name']);
+ }
+
+ /**
+ * getPublicName()
+ *
+ * @return text group_name
+ */
+ function getPublicName() {
+ return htmlspecialchars($this->data_array['group_name']);
+ }
+
+ /**
+ * getDescription()
+ *
+ * @return text description
+ */
+ function getDescription() {
+ return $this->data_array['short_description'];
+ }
+
+ /**
+ * getStartDate()
+ *
+ * @return integer (unix time) of registration
+ */
+ function getStartDate() {
+ return $this->data_array['register_time'];
+ }
+
+ /**
+ * getLogoImageID()
+ *
+ * @return ID of logo image in db_images table (or 100 if none)
+ */
+ function getLogoImageID() {
+ return $this->data_array['logo_image_id'];
+ }
+
+ /**
+ * getUnixBox()
+ *
+ * @return name of the unix machine for the group
+ */
+ function getUnixBox() {
+ return $this->data_array['unix_box'];
+ }
+
+ /**
+ * getDomain()
+ *
+ * @return name of the group [web] domain
+ */
+ function getDomain() {
+ return $this->data_array['http_domain'];
+ }
+
+ /**
+ * getLicense()
+ *
+ * @return string ident of group license
+ */
+ function getLicense() {
+ return $this->data_array['license'];
+ }
+
+ /**
+ * getLicenseOther()
+ *
+ * @return text custom license
+ */
+ function getLicenseOther() {
+ if ($this->getLicense() == 'other') {
+ return $this->data_array['license_other'];
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * getRegistrationPurpose()
+ *
+ * @return text application for project hosting
+ */
+ function getRegistrationPurpose() {
+ return $this->data_array['register_purpose'];
+ }
+
+
+
+
+
+ /*
+
+ Common Group preferences for tools
+
+ */
+
+ /**
+ * usesCVS() - whether or not this group has opted to use CVS
+ *
+ * @return true/false
+ */
+ function usesCVS() {
+ return $this->data_array['use_cvs'];
+ }
+
+ /**
+ * usesMail() - whether or not this group has opted to use mailing lists
+ *
+ * @return true/false
+ */
+ function usesMail() {
+ return $this->data_array['use_mail'];
+ }
+
+ /**
+ * usesNews() - whether or not this group has opted to use news
+ *
+ * @return true/false
+ */
+ function usesNews() {
+ return $this->data_array['use_news'];
+ }
+
+ /**
+ * usesForum() - whether or not this group has opted to use discussion forums
+ *
+ * @return true/false
+ */
+ function usesForum() {
+ return $this->data_array['use_forum'];
+ }
+
+ /**
+ * usesDocman() - whether or not this group has opted to use docman
+ *
+ * @return true/false
+ */
+ function usesDocman() {
+ return $this->data_array['use_docman'];
+ }
+
+ /**
+ * usesSurvey() - whether or not this group has opted to use surveys
+ *
+ * @return true/false
+ */
+ function usesSurvey() {
+ return $this->data_array['use_survey'];
+ }
+
+ /**
+ * usesPM() - whether or not this group has opted to Project Manager
+ *
+ * @return true/false
+ */
+ function usesPM() {
+ return $this->data_array['use_pm'];
+ }
+
+ /**
+ * usesPMDependencies() - whether or not this group has opted to use task dependencies
+ *
+ * @return true/false
+ */
+ function usesPMDependencies() {
+ return $this->data_array['use_pm_depend'];
+ }
+
+ // Warning: names for 2 functions below were choosen to be
+ // consistent with trackers code
+
+ /**
+ * PMEmailAddress() - get email address to send PM notifications to
+ *
+ * @return true/false
+ */
+ function PMEmailAddress() {
+ return $this->data_array['new_task_address'];
+ }
+
+ /**
+ * PMEmailAll() - whether or not this group has opted to use task dependencies
+ *
+ * @return true/false
+ */
+ function PMEmailAll() {
+ return $this->data_array['send_all_tasks'];
+ }
+
+
+ /**
+ * getHomePage() - The URL for this project's home page
+ *
+ * @return text homepage URL
+ */
+ function getHomePage() {
+ return $this->data_array['homepage'];
+ }
+
+ /**
+ * getArtifactTypes() - Get all Artifact types for this group
+ *
+ * @return result set
+ */
+ function getArtifactTypes() {
+ if (!isset($this->types_res)) {
+ $sql="SELECT group_artifact_id,name
+ FROM artifact_group_list
+ WHERE group_id='".$this->getID()."'
+ ORDER BY name";
+ $this->types_res=db_query($sql);
+ }
+ return $this->types_res;
+ }
+
+ /**
+ * getPermission() - Return a Permission for this Group and the specified User
+ *
+ * @param object The user you wish to get permission for (usually the logged in user)
+ * @return permission
+ */
+ function &getPermission(&$_user) {
+ return permission_get_object(&$this, &$_user);
+ }
+
+ /*
+
+
+ Basic functions to add/remove users to/from a group
+ and update their permissions
+
+
+ */
+
+ /**
+ * addUser() - controls adding a user to a group
+ *
+ * @param string Unix name of the user to add
+ * @return true/false
+ * @access public
+ */
+ function addUser($user_unix_name) {
+ /*
+ Admins can add users to groups
+ */
+?><?php
+//TODO should not assume logged in user only - $user should be passed in or $perm passed in
+ $perm =& $this->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isAdmin()) {
+ $this->setError('You Are Not An Admin For This Group');
+ return false;
+ }
+
+ db_begin();
+
+ /*
+ get user id for this user's unix_name
+ */
+ $res_newuser = db_query("SELECT * FROM users WHERE user_name='" . strtolower($user_unix_name) . "'");
+
+ if (db_numrows($res_newuser) > 0) {
+ //
+ // make sure user is active
+ //
+ if (db_result($res_newuser,0,'status') != 'A') {
+ $this->setError('User is not active. Only active users can be added.');
+ db_rollback();
+ return false;
+ }
+
+ //
+ // user was found - set new user_id var
+ //
+ $form_newuid = db_result($res_newuser,0,'user_id');
+
+ //
+ // if not already a member, add them
+ //
+ $res_member = db_query("SELECT user_id FROM user_group ".
+ "WHERE user_id='$form_newuid' AND group_id='". $this->getID() ."'");
+
+ if (db_numrows($res_member) < 1) {
+ //
+ // user was not already a member
+ //
+ // if no unix account, give them a unix_uid
+ //
+ if ( !db_result($res_newuser,0,'unix_uid') ) {
+ $user=&user_get_object($form_newuid,$res_newuser);
+ if (!$user->setUpUnixUID()) {
+ $this->setError('ERROR: Cannot assign UNIX uid to the user');
+ db_rollback();
+ return false;
+ }
+ if (!sf_ldap_create_user($form_newuid)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ } else {
+ //
+ // User already had unix account
+ //
+ if (!sf_ldap_check_create_user($form_newuid)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+ //
+ // Create this user's row in the user_group table
+ //
+ $res=db_query("INSERT INTO user_group
+ (user_id,group_id,admin_flags,forum_flags,project_flags,
+ doc_flags,cvs_flags,member_role,release_flags,artifact_flags)
+ VALUES ('$form_newuid','". $this->getID() ."','','0','0','0','1','100','0','0')");
+
+ //verify the insert worked
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: Could Not Add User To Group');
+ db_rollback();
+ return false;
+ }
+ //
+ // set up their ldap info
+ //
+ if (!sf_ldap_group_add_user($this->getID(),$form_newuid)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+
+ } else {
+ //
+ // user was already a member
+ // make sure they are set up with a unix_uid,
+ // LDAP entry and membership
+ //
+ $user=&user_get_object($form_newuid,$res_newuser);
+ if (!$user->setUpUnixUID()) {
+ $this->setError('ERROR: could not set up unix_uid for user: '.$user->getErrorMessage());
+ db_rollback();
+ return false;
+ } else {
+ $user->refreshUserData();
+ if (!sf_ldap_check_create_user($form_newuid)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ if (!sf_ldap_group_add_user($this->getID(),$form_newuid)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ db_commit();
+ return true;
+ }
+ }
+ } else {
+ //
+ // user doesn't exist
+ //
+ $this->setError('ERROR: User does not exist on SourceForge');
+ db_rollback();
+ return false;
+ }
+ //
+ // audit trail
+ //
+ $this->addHistory('Added User',$user_unix_name);
+ db_commit();
+ return true;
+ }
+
+ /**
+ * removeUser() - controls removing a user from a group
+ *
+ * Users can remove themselves
+ *
+ * @param int The ID of the user to remove
+ * @return true/false
+ */
+ function removeUser($user_id) {
+
+ if ($user_id==user_getid()) {
+ //users can remove themselves
+ //everyone else must be a project admin
+ } else {
+//TODO should not assume logged in user only - $user should be passed in or $perm passed in
+ $perm =& $this->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isAdmin()) {
+ $this->setError('You Are Not An Admin For This Group');
+ return false;
+ }
+ }
+
+ $res=db_query("SELECT * FROM user_group ".
+ "WHERE group_id='".$this->getID()."' AND user_id='$user_id' AND admin_flags = 'A'");
+ if (db_numrows($res) > 0) {
+ $this->setError('Cannot remove admin');
+ return false;
+ }
+
+ db_begin();
+ $res=db_query("DELETE FROM user_group ".
+ "WHERE group_id='".$this->getID()."' AND user_id='$user_id' AND admin_flags <> 'A'");
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: DB: User not removed.');
+ db_rollback();
+ return false;
+ } else {
+ //
+ // remove them from artifact types
+ //
+ db_query("DELETE FROM artifact_perm
+ WHERE group_artifact_id
+ IN (SELECT group_artifact_id
+ FROM artifact_group_list
+ WHERE group_id='".$this->getID()."')
+ AND user_id='$user_id'");
+
+ if (!sf_ldap_group_remove_user($this->getID(),$user_id)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+
+ //audit trail
+ $this->addHistory('removed user',$user_id);
+ }
+ db_commit();
+ return true;
+ }
+
+ /**
+ * updateUser() - controls updating a user's perms in this group
+ *
+ * NOTE - bug_flags,patch_flags,support flags are deprecated
+ *
+ * @param int The ID of the user
+ * @param string The admin flag for the user
+ * @param int The bug flag for the user DEPRECATED
+ * @param int The forum flag for the user
+ * @param int The project flag for the user
+ * @param int The patch flag for the user DEPRECATED
+ * @param int The support flag for the user DEPRECATED
+ * @param int The doc flag for the user
+ * @param int The CVS flag for the user
+ * @param int The release flag for the user
+ * @param int The member role for the user
+ * @param int The artifact flags for the user
+ * @return true/false
+ */
+ function updateUser($user_id,$admin_flags='',$bug_flags=1,$forum_flags=0,$project_flags=1,$patch_flags=1,$support_flags=1,$doc_flags=0,$cvs_flags=1,$release_flags=1,$member_role=100,$artifact_flags=0) {
+
+//TODO should not assume logged in user only - $user should be passed in or $perm passed in
+ $perm =& $this->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isAdmin()) {
+ $this->setError('You Are Not An Admin For This Group');
+ return false;
+ }
+
+ if (user_getid() == $user_id) {
+ $admin_flags='A';
+ }
+
+ db_begin();
+ $res = db_query("UPDATE user_group SET
+ admin_flags='$admin_flags',
+ forum_flags='$forum_flags',
+ project_flags='$project_flags',
+ doc_flags='$doc_flags',
+ cvs_flags='$cvs_flags',
+ release_flags='$release_flags',
+ artifact_flags='$artifact_flags',
+ member_role='$member_role'
+ WHERE user_id='$user_id' AND group_id='". $this->getID() ."'");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR: Could Not Change Member Permissions: '.db_error());
+ db_rollback();
+ return false;
+ }
+
+ //
+ // If user acquired admin access to CVS,
+ // one to be given normal shell on CVS machine,
+ // else - restricted.
+ //
+ if ($cvs_flags>1) {
+ if (!sf_ldap_user_set_attribute($user_id,"x-cvsShell","/bin/bash")) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ } else {
+ if (!sf_ldap_user_set_attribute($user_id,"x-cvsShell","/bin/cvssh")) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+
+ //
+ // If user acquired at least commit access to CVS,
+ // one to be promoted to CVS group, else, demoted.
+ //
+ if ($cvs_flags>0) {
+ if (!sf_ldap_group_add_user($this->getID(),$user_id,1)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ } else {
+ if (!sf_ldap_group_remove_user($this->getID(),$user_id,1)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+
+
+ db_commit();
+ return true;
+ }
+
+ /**
+ * addHistory() - Makes an audit trail entry for this project
+ *
+ * @param string The name of the field
+ * @param string The Old Value for this $field_name
+ * @return database result handle
+ * @access public
+ */
+ function addHistory($field_name, $old_value) {
+ $sql="
+ INSERT INTO group_history(group_id,field_name,old_value,mod_by,date)
+ VALUES ('". $this->getID() ."','$field_name','$old_value','". user_getid() ."','".time()."')
+ ";
+ return db_query($sql);
+ }
+
+ /**
+ * activateUsers() - Make sure that group members have unix accounts
+ *
+ * Setup unix accounts for group members. Can be called even
+ * if members are already active.
+ *
+ * @access private
+ *
+ */
+ function activateUsers() {
+
+ /*
+ Activate member(s) of the project
+ */
+
+ $member_res = db_query("
+ SELECT *
+ FROM users,user_group
+ WHERE user_group.group_id='".$this->getID()."'
+ AND users.user_id=user_group.user_id
+ ");
+
+ $rows = db_numrows($member_res);
+
+ if ($rows > 0) {
+
+ for ($i=0; $i<$rows; $i++) {
+
+ $member =& user_get_object(db_result($member_res,$i,'user_id'));
+
+ if (!$member || !is_object($member)) {
+ $this->setError('Error getting member object');
+ return false;
+ } else if ($member->isError()) {
+ $this->setError('Error getting member object: '.$member->getErrorMessage());
+ return false;
+ }
+
+ if (!$this->addUser($member->getUnixName())) {
+ return false;
+ }
+ }
+
+ }
+
+ return true;
+ }
+
+ /**
+ * approve() - Approve pending project
+ *
+ * @param object The User object
+ * @access public
+ *
+ */
+ function approve(&$user) {
+
+ if ($this->getStatus()=='A') {
+ $this->setError("Group already active");
+ return false;
+ }
+
+ db_begin();
+
+ // Step 1: Activate group and create LDAP entries
+ if (!$this->setStatus($user, 'A')) {
+ db_rollback();
+ return false;
+ }
+
+ // Step 2: Setup forums for this group
+ forum_create_forum($this->getID(),'Open Discussion',1,'General Discussion');
+ forum_create_forum($this->getID(),'Help',1,'Get Help');
+ forum_create_forum($this->getID(),'Developers',0,'Project Developer Discussion');
+
+ // Step 3: Setup default DocManager doc_group
+ db_query("
+ INSERT INTO doc_groups(groupname,group_id)
+ VALUES ('Uncategorized Submissions',".$this->getID().")
+ ");
+
+ // Step 4: Setup default filerelease package
+ $frs = new FRS($this->getID());
+ $frs->frsCreatePackage($this->getUnixName());
+
+ db_commit();
+
+ $this->sendApprovalEmail();
+ $this->addHistory('approved', 'x');
+
+ return true;
+ }
+
+
+
+ /**
+ * sendApprovalEmail() - Send new project email
+ *
+ * @return completion status
+ * @access public
+ *
+ */
+ function sendApprovalEmail() {
+
+ $res_admins = db_query("
+ SELECT users.user_name,users.email
+ FROM users,user_group
+ WHERE users.user_id=user_group.user_id
+ AND user_group.group_id='".$this->getID()."'
+ AND user_group.admin_flags='A'
+ ");
+
+ if (db_numrows($res_admins) < 1) {
+ $this->setEror("Group does not have any administrators.");
+ return false;
+ }
+
+ // send one email per admin
+ while ($row_admins = db_fetch_array($res_admins)) {
+
+ $message =
+'Your project registration for SourceForge has been approved.
+
+Project Full Name: '.$this->getPublicName().'
+Project Unix Name: '.$this->getUnixName().'
+CVS Server: cvs.'.$this->getUnixName().'.'.$GLOBALS['sys_default_domain'].'
+Shell/Web Server: '.$this->getUnixName().'.'.$GLOBALS['sys_default_domain'].'
+
+Your DNS will take up to a day to become active on our site.
+While waiting for your DNS to resolve, you may try shelling into
+'. $GLOBALS['sys_shell_host']. ' and pointing CVS to '. $GLOBALS['sys_cvs_host'].'.
+
+If after 6 hours your shell/CVS accounts still do not work, please
+open a support ticket so that we may take a look at the problem.
+Please note that all shell/CVS accounts are closed to telnet and only
+work with SSH1.
+
+Your web site is accessible through your shell account. Please read
+site documentation (see link below) about intended usage, available
+services, and directory layout of the account.
+
+Please take some time to read the site documentation about project
+administration (http://'.$GLOBALS['sys_default_domain'].'/docs/site/). If you visit your
+own project page in SourceForge while logged in, you will find
+additional menu functions to your left labeled \'Project Admin\'.
+
+We highly suggest that you now visit SourceForge and create a public
+description for your project. This can be done by visiting your project
+page while logged in, and selecting \'Project Admin\' from the menus
+on the left (or by visiting https://'.$GLOBALS['sys_default_domain'].'/project/admin/?group_id='.$this->getID().'
+after login).
+
+Your project will also not appear in the Trove Software Map (primary
+list of projects hosted on SourceForge which offers great flexibility in
+browsing and search) until you categorize it in the project administration
+screens. So that people can find your project, you should do this now.
+Visit your project while logged in, and select \'Project Admin\' from the
+menus on the left.
+
+Enjoy the system, and please tell others about SourceForge. Let us know
+if there is anything we can do to help you.
+
+ -- the SourceForge crew';
+
+ mail($row_admins['email'],"SourceForge Project Approved",$message,"From: noreply@$GLOBALS[HTTP_HOST]");
+ usleep(250000); // TODO: This is dirty. If sendmail required pause, let send_new... handle it
+
+ }
+
+ return true;
+ }
+
+
+ /*
+ * sendRejectionEmail() - Send project rejection email
+ *
+ * This function sends out a rejection message to a user who
+ * registered a project.
+ *
+ * @param int The id of the response to use
+ * @param string The rejection message
+ * @return completion status
+ * @access public
+ *
+ */
+ function sendRejectionEmail($response_id, $message="zxcv") {
+
+ // Get the email addr of the user who wants to register the project.
+ $email = db_result(db_query("
+ SELECT u.email AS email
+ FROM users u, user_group ug
+ WHERE ug.group_id='".$this->getID()."'
+ AND u.user_id=ug.user_id;
+ "), 0, "email");
+
+ $response =
+'Your project registration for SourceForge has been denied.
+
+Project Full Name: '.$this->getPublicName().'
+Project Unix Name: '.$this->getUnixName().'
+
+Reasons for negative decision:
+
+';
+
+
+ // Check to see if they want to send a custom rejection response
+ if ($response_id == 0) {
+ $response .= $message;
+ } else {
+ $response .= db_result(db_query("
+ SELECT response_text
+ FROM canned_responses
+ WHERE response_id='$response_id'
+ "), 0, "response_text");
+ }
+
+ mail($email, "SourceForge Project Denied", $response, "From: noreply at sourceforge.net");
+
+ return true;
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/Permission.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/Permission.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/Permission.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,300 @@
+<?php
+/**
+ * A base permissions class.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('common/include/Error.class');
+
+$PERMISSION_OBJ=array();
+
+/**
+ * permission_get_object() - Get permission objects
+ *
+ * permission_get_object is useful so you can pool Permission objects/save database queries
+ * You should always use this instead of instantiating the object directly
+ *
+ * @param object The Group in question
+ * @param object The User needing Permission
+ * @return a Permission or false on failure
+ *
+ */
+function &permission_get_object($_Group, $_User) {
+ //create a common set of Permission objects
+ //saves a little wear on the database
+
+ global $PERMISSION_OBJ;
+
+ if (is_object($_Group)) {
+ $group_id = $_Group->getID();
+ } else {
+ $group_id = 0;
+ }
+
+ if (is_object($_User)) {
+ $user_id = $_User->getID();
+ } else {
+ //invalid object, probably from user not being logged in
+ $user_id = 0;
+ }
+
+ if (!isset($PERMISSION_OBJ["_".$group_id."_".$user_id])) {
+ $PERMISSION_OBJ["_".$group_id."_".$user_id]= new Permission($_Group, $_User);
+ }
+ return $PERMISSION_OBJ["_".$group_id."_".$user_id];
+}
+
+class Permission extends Error {
+ /**
+ * Associative array of data from db
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * The Group object
+ *
+ * @var object $Group
+ */
+ var $Group;
+
+ /**
+ * The User object
+ *
+ * @var object $User
+ */
+ var $User;
+
+ /**
+ * Whether the user is an admin/super user of this project
+ *
+ * @var bool $is_admin
+ */
+ var $is_admin=false;
+
+ /**
+ * Whether the user is an admin/super user of the entire site
+ *
+ * @var bool $is_site_admin
+ */
+ var $is_site_admin;
+
+ /**
+ * Constructor for this object
+ *
+ * @param object Group Object required
+ * @param object User Object required
+ *
+ */
+ function Permission (&$_Group, &$_User) {
+ if (!$_Group || !is_object($_Group)) {
+ $this->setError('No Valid Group Object');
+ return false;
+ }
+ if ($_Group->isError()) {
+ $this->setError('Permission: '.$_Group->getErrorMessage());
+ return false;
+ }
+ $this->Group =& $_Group;
+
+ if (!$_User || !is_object($_User)) {
+ $this->setError('No Valid User Object');
+ return false;
+ }
+ if ($_User->isError()) {
+ $this->setError('Permission: '.$_User->getErrorMessage());
+ return false;
+ }
+ $this->User =& $_User;
+
+ if (!$this->fetchData()) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * fetchData() - fetch the data for this Permission from the database
+ *
+ * @return true/false
+ * @access private
+ */
+ function fetchData() {
+ $res=db_query("SELECT * FROM user_group
+ WHERE user_id='". $this->User->getID() ."'
+ AND group_id='". $this->Group->getID() ."'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('Permission: User Not Found');
+
+ if ($this->setUpSuperUser()) {
+ return true;
+ }
+ } else {
+ $this->data_array =& db_fetch_array($res);
+ if (trim($this->data_array['admin_flags']) == 'A') {
+ $this->is_admin=true;
+ } else {
+ $this->setUpSuperUser();
+ }
+ db_free_result($res);
+ return true;
+ }
+ }
+
+ /**
+ * setUpSuperUser() - check to see if this User is a site super-user
+ *
+ * @return true/false
+ * @access private
+ */
+ function setUpSuperUser() {
+ //
+ // see if they are a site super-user
+ // if not a member of this group
+ //
+ if ($this->isSuperUser()) {
+ $this->clearError();
+ $this->is_admin = true;
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * getUser() - get the User object this Permission is associated with
+ *
+ * @return the User object
+ */
+ function &getUser() {
+ return $this->User;
+ }
+
+ /**
+ * getGroup() - get the Group object this ArtifactType is associated with
+ *
+ * @return the Group object
+ */
+ function &getGroup() {
+ return $this->Group;
+ }
+
+ /**
+ * isSuperUser() - whether the current user has site admin privilege
+ *
+ * @return true/false
+ */
+ function isSuperUser() {
+ if (isset($this->is_site_admin)) {
+ return $this->is_site_admin;
+ }
+
+ $res = db_query("SELECT * FROM user_group
+ WHERE user_id='". $this->User->getID() ."'
+ AND group_id='1'
+ AND admin_flags='A'");
+
+ if (!$res || db_numrows($res) < 1) {
+ $this->is_site_admin = false;
+ } else {
+ $this->is_site_admin = true;
+ }
+
+ db_free_result($res);
+ return $this->is_site_admin;
+ }
+
+ /**
+ * isForumAdmin() - whether the current user has form admin perms
+ *
+ * @return true/false
+ */
+ function isForumAdmin() {
+ return $this->isMember('forum_flags',2);
+ }
+
+ /**
+ * isDocEditor() - whether the current user has form doc editor perms
+ *
+ * @return true/false
+ */
+ function isDocEditor() {
+ return $this->isMember('doc_flags',1);
+ }
+
+ /**
+ * isReleaseTechnician() - whether the current user has FRS admin perms
+ *
+ * @return true/false
+ */
+ function isReleaseTechnician() {
+ return $this->isMember('release_flags',1);
+ }
+
+ /**
+ * useIsArtifactAdmin() - whether the current user has artifact admin perms
+ *
+ * @return true/false
+ */
+ function isArtifactAdmin() {
+ return $this->isMember('artifact_flags',2);
+ }
+
+ function isPMAdmin() {
+ return $this->isMember('project_flags',2);
+ }
+
+ /**
+ * isMember() - Simple test to see if the current user is a member of this project
+ *
+ * Can optionally pass in vars to test other permissions
+ *
+ * @param string The field to check
+ * @param int The value that $field should have
+ * @return true/false
+ */
+ function isMember($field='user_id',$value='-1') {
+ if ($this->isAdmin()) {
+ //admins are tested first so that super-users can return true
+ //and admins of a project should always have full privileges
+ //on their project
+ return true;
+ } else {
+ $arr =& $this->getPermData();
+ if ($arr[$field] >= $value) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * userIsAdmin() - User is an admin of the project or admin of the entire site
+ *
+ * @return true/false
+ */
+ function isAdmin() {
+ return $this->is_admin;
+ }
+
+ /**
+ * getPermData() - returns the assocative array from the db
+ *
+ * @return associative array
+ * @access private
+ */
+ function &getPermData() {
+ return $this->data_array;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/Project.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/Project.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/Project.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Project class
+ *
+ * An object wrapper for project (as opposed to foundry) data
+ * Extends the base object, Group
+ *
+ * Example of proper use:
+ *
+ * //get a local handle for the object
+ * $grp =& group_get_object($group_id);
+ *
+ * //now use the object to get the unix_name for the project
+ * $grp->getUnixName();
+ *
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: Project.class,v 1.5 2001/06/06 21:30:03 dbrogdon Exp $
+ * @author Tim Perdue <tperdue at valinux.com>
+ * @date 2000-08-28
+ *
+ */
+
+class Project extends Group {
+
+ /**
+ * An array containing project data.
+ *
+ * @var array $project_data_array
+ */
+ var $project_data_array;
+
+ /**
+ * Project() - Constructor
+ * Basically just call the parent to set up everything
+ *
+ * @param int The project ID
+ * @param int An optional database resource ID
+ *
+ */
+ function Project($id,$res=false) {
+ //echo "\n\nRows: ".db_numrows($res);
+ $this->Group($id,$res);
+
+ //for right now, just point our prefs
+ //array at Group's data array
+ //this will change later when we split the
+ //project_data table off from groups table
+ $this->project_data_array=&$this->data_array;
+ }
+
+
+ /**
+ * usesCVS() - Returns whether a project uses CVS
+ *
+ */
+ function usesCVS() {
+ return $this->project_data_array['use_cvs'];
+ }
+
+ /**
+ * usesPM() - Returns whether a project uses Project Manager
+ *
+ */
+ function usesPM() {
+ return $this->project_data_array['use_pm'];
+ }
+
+ /**
+ * usesPmDependencies() - Returns whether a projected uses PM dependencies
+ *
+ */
+ function usesPmDependencies() {
+ return $this->project_data_array['use_pm_depend_box'];
+ }
+
+ /**
+ * getNewTaskAddress() - Returns the default address to which new task submissions are sent
+ *
+ */
+ function getNewTaskAddress() {
+ return $this->project_data_array['new_task_address'];
+ }
+
+ /**
+ * sendAllTaskUpdates() - Returns whether all task updates should be sent to the default address
+ *
+ * @see getNewTaskAddress()
+ *
+ */
+ function sendAllTaskUpdates() {
+ return $this->project_data_array['send_all_tasks'];
+ }
+}
+
+/**
+ * group_getname() - get the group name
+ *
+ * @param int The group ID
+ * @deprecated
+ *
+ */
+function group_getname ($group_id = 0) {
+ $grp = &group_get_object($group_id);
+ if ($grp) {
+ return $grp->getPublicName();
+ } else {
+ return 'Invalid';
+ }
+}
+
+/**
+ * group_getunixname() - get the unixname for a group
+ *
+ * @param int The group ID
+ * @deprecated
+ *
+ */
+function group_getunixname ($group_id) {
+ $grp = &group_get_object($group_id);
+ if ($grp) {
+ return $grp->getUnixName();
+ } else {
+ return 'Invalid';
+ }
+}
+
+/**
+ * group_get_result() - Get the group object result ID.
+ *
+ * @param int The group ID
+ * @deprecated
+ *
+ */
+function &group_get_result($group_id=0) {
+ $grp = &group_get_object($group_id);
+ if ($grp) {
+ return $grp->getData();
+ } else {
+ return 0;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/User.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/User.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/User.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,1119 @@
+<?php
+/**
+ * User class
+ *
+ * Sets up database results and preferences for a user and abstracts this info
+ *
+ * You can now optionally pass in a db result
+ * handle. If you do, it re-uses that query
+ * to instantiate the objects
+ *
+ * IMPORTANT! That db result must contain all fields
+ * from users table or you will have problems
+ *
+ * GENERALLY YOU SHOULD NEVER INSTANTIATE THIS OBJECT DIRECTLY
+ * USE user_get_object() to instantiate properly - this will pool the objects
+ * and increase efficiency
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ * @author Tim Perdue tperdue at valinux.com
+ * @date 2000-10-11
+ *
+ */
+
+require_once('www/include/vote_function.php');
+$USER_OBJ=array();
+
+/**
+ * user_get_object_by_name() - Get User object by username.
+ * user_get_object is useful so you can pool user objects/save database queries
+ * You should always use this instead of instantiating the object directly
+ *
+ * @param string The unix username - required
+ * @param int The result set handle ("SELECT * FROM USERS WHERE user_id=xx")
+ * @return a user object or false on failure
+ *
+ */
+function &user_get_object_by_name($user_name,$res=false) {
+ $user_name = strtolower($user_name);
+ if (!$res) {
+ $res=db_query("SELECT * FROM users WHERE user_name='$user_name'");
+ }
+ return user_get_object(db_result($res,0,'user_id'),$res);
+}
+
+/**
+ * user_get_object() - Get User object by user ID.
+ * user_get_object is useful so you can pool user objects/save database queries
+ * You should always use this instead of instantiating the object directly
+ *
+ * @param int The ID of the user - required
+ * @param int The result set handle ("SELECT * FROM USERS WHERE user_id=xx")
+ * @return a user object or false on failure
+ *
+ */
+function &user_get_object($user_id,$res=false) {
+ //create a common set of group objects
+ //saves a little wear on the database
+
+ //automatically checks group_type and
+ //returns appropriate object
+
+ global $USER_OBJ;
+ if (!isset($USER_OBJ["_".$user_id."_"])) {
+ if ($res) {
+ //the db result handle was passed in
+ } else {
+ $res=db_query("SELECT * FROM users WHERE user_id='$user_id'");
+ }
+ if (!$res || db_numrows($res) < 1) {
+ $USER_OBJ["_".$user_id."_"]=false;
+ } else {
+ $USER_OBJ["_".$user_id."_"]= new User($user_id,$res);
+ }
+ }
+ return $USER_OBJ["_".$user_id."_"];
+}
+
+class User extends Error {
+ /**
+ * Associative array of data from db
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * The User ID
+ *
+ * @var int $user_id
+ */
+ var $user_id;
+
+ /**
+ * Database result set handle
+ *
+ * @var int $db_result
+ */
+ var $db_result;
+
+ /**
+ * Is this person a site super-admin?
+ *
+ * @var bool $is_super_user
+ */
+ var $is_super_user;
+
+ /**
+ * Is this person the logged in user?
+ *
+ * @var bool $is_logged_in
+ */
+ var $is_logged_in;
+
+ /**
+ * Array of preferences
+ *
+ * @var array $user_pref
+ */
+ var $user_pref;
+
+ /**
+ * User($id,$res) - CONSTRUCTOR - GENERALLY DON'T USE THIS
+ *
+ * instead use the user_get_object() function call
+ *
+ * @param int The user_id
+ * @param int The database result set
+ */
+ function User($id=false,$res=false) {
+ $this->Error();
+ if (!$id) {
+ //setting up an empty object
+ //probably going to call create()
+ return true;
+ }
+ $this->user_id=$id;
+ if (!$res) {
+ $this->db_result=db_query("SELECT * FROM users WHERE user_id='$id'");
+ } else {
+ $this->db_result=$res;
+ }
+ if (db_numrows($this->db_result) < 1) {
+ //function in class we extended
+ $this->setError('User Not Found');
+ $this->data_array=array();
+ return false;
+ } else {
+ //set up an associative array for use by other functions
+
+ db_reset_result($this->db_result);
+
+ $this->data_array =& db_fetch_array($this->db_result);
+ }
+ $this->user_id=$this->data_array['user_id'];
+ $this->is_super_user=false;
+ $this->is_logged_in=false;
+ return true;
+ }
+
+ /**
+ * create() - Create a new user
+ *
+ * @param string The unix username
+ * @param string The real username
+ * @param string The first password
+ * @param string The confirmation password
+ * @param string The users email address
+ * @param string The users preferred default language
+ * @param string The users preferred default timezone
+ * @param string The users preference for receiving site updates by email
+ * @param string The users preference for receiving community updates by email
+ * @param int The ID of the language preference
+ * @param string The users preferred timezone
+ * @returns The newly created user ID
+ *
+ */
+ function create($unix_name,$realname,$password1,$password2,$email,
+ $mail_site,$mail_va,$language_id,$timezone) {
+ if (!$unix_name) {
+ $this->setError('You must supply a username');
+ return false;
+ }
+ if (!$realname) {
+ $this->setError('You must supply a real name');
+ return false;
+ }
+ if (!$password1) {
+ $this->setError('You must supply a password');
+ return false;
+ }
+ if ($password1 != $password2) {
+ $this->setError('Passwords do not match');
+ return false;
+ }
+ if (!account_pwvalid($password1)) {
+ $this->setError('Password must be at least 6 characters');
+ return false;
+ }
+ $unix_name=strtolower($unix_name);
+ if (!account_namevalid($unix_name)) {
+ $this->setError('Invalid Unix Name. ');
+ return false;
+ }
+ if (!validate_email($email)) {
+ $this->setError('Invalid Email Address');
+ return false;
+ }
+ if (db_numrows(db_query("SELECT user_id FROM users WHERE user_name LIKE '$unix_name'")) > 0) {
+ $this->setError('That username already exists.');
+ return false;
+ }
+ if ($GLOBALS['sys_require_unique_email']) {
+ if (db_numrows(db_query("SELECT user_id FROM users WHERE email='$email'")) > 0) {
+ $this->setError('User with this email already exists - use people search to recover your login.');
+ return false;
+ }
+ }
+ // if we got this far, it must be good
+ $confirm_hash = substr(md5($session_hash . $password1 . time()),0,16);
+ $result=db_query("INSERT INTO users (user_name,user_pw,unix_pw,realname,email,add_date,
+ status,confirm_hash,mail_siteupdates,mail_va,language,timezone)
+ VALUES ('$unix_name',
+ '". md5($password1) . "',
+ '". account_genunixpw($password1) . "',
+ '". "$realname',
+ '$email',
+ '" . time() . "',
+ 'P',
+ '$confirm_hash',
+ '". (($mail_site)?"1":"0") . "',
+ '". (($mail_va)?"1":"0") . "',
+ '$language_id',
+ '$timezone')");
+
+ $this->user_id = db_insertid($result,'users','user_id');
+
+ if (!$result || !$this->user_id) {
+ $this->setError('Insert Failed '.db_error());
+ return false;
+ } else {
+
+ // send mail
+ $this->refreshUserData();
+
+ $this->sendRegistrationEmail();
+
+ return $this->user_id;
+ }
+ }
+
+ /**
+ * sendRegistrationEmail() - Send email for registration verification
+ *
+ * @return true or false
+ */
+ function sendRegistrationEmail() {
+ $message = "Thank you for registering on the SourceForge web site. You have\n"
+ . "account with username '".$this->getUnixName()."' created for you. In order\n"
+ . "to complete your registration, visit the following url: \n\n"
+ . "<https://". $GLOBALS['sys_default_domain'] ."/account/verify.php?confirm_hash=_".$this->getConfirmHash().">\n\n"
+ . "(If you don't see any URL above, it is likely due to bug in your mail client.\n"
+ . "Use one below, but make sure it is entered as the single line.)\n\n"
+ . "https://". $GLOBALS['sys_default_domain']."/account/verify.php?confirm_hash=_".$this->getConfirmHash()."\n\n"
+ . "Enjoy the site.\n\n"
+ . " -- the SourceForge staff\n";
+
+ mail(
+ $this->getEmail(),
+ "SourceForge Account Registration",
+ $message,
+ "From: noreply@".$GLOBALS['sys_default_domain']
+ );
+ }
+
+ /**
+ * update() - update *common* properties of User object
+ *
+ * Use specific setter to change other properties
+ *
+ * @param string The users real name
+ * @param int The ID of the users language preference
+ * @param string The useres timezone preference
+ * @param string The users preference for receiving site updates by email
+ * @param string The users preference for receiving community updates by email
+ */
+ function update($realname,$language_id,$timezone,$mail_site,$mail_va,$use_ratings) {
+ $mail_site = $mail_site ? 1 : 0;
+ $mail_va = $mail_va ? 1 : 0;
+ $block_ratings = !$use_ratings;
+
+ $res = db_query("
+ UPDATE users
+ SET
+ realname='$realname',
+ language='$language_id',
+ timezone='$timezone',
+ mail_siteupdates=$mail_site,
+ mail_va=$mail_va,
+ block_ratings='$block_ratings'
+ WHERE user_id='".$this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Object: '.db_error());
+ return false;
+ } else {
+ // If there's a transaction from using to not
+ // using ratings, remove all rating made by the
+ // user (ratings by others should not be removed,
+ // as it opens possibility to abuse rate system)
+ if (!$use_ratings && $this->usesRatings()) {
+ vote_remove_all_ratings_by($this->getID());
+ }
+ $this->refreshUserData();
+ return true;
+ }
+ }
+
+ /**
+ * getData() - Return database result handle for direct access
+ *
+ * Generally should NOT be used - here for supporting deprecated group.php
+ * @return database result set handle
+ */
+ function getData() {
+ db_reset_result($this->db_result);
+ return $this->db_result;
+ }
+
+ /**
+ * refreshUserData() - May need to refresh database fields
+ *
+ * if an update occurred and you need to access the updated info
+ */
+ function refreshUserData() {
+ $this->db_result=db_query("SELECT * FROM users WHERE user_id='". $this->getID() ."'");
+ $this->data_array=db_fetch_array($this->db_result);
+ return $this->db_result;
+ }
+
+ /**
+ * getID() - Simply return the user_id for this object
+ *
+ * @return this user's user_id number
+ */
+ function getID() {
+ return $this->user_id;
+ }
+
+ /**
+ * getStatus()
+ *
+ * Statuses include (A)ctive, (P)ending, (S)uspended ,(D)eleted
+ *
+ * @return this user's status flag
+ */
+ function getStatus() {
+ return $this->data_array['status'];
+ }
+
+ /**
+ * setStatus()
+ *
+ * @param string Status - P, A, S, or D
+ * @sets user status
+ */
+ function setStatus($status) {
+
+ if ($status != 'P' && $status != 'A'
+ && $status != 'S' && $status != 'D') {
+ $this->setError('ERROR: Invalid status value');
+ return false;
+ }
+
+ db_begin();
+ $res=db_query("
+ UPDATE users
+ SET status='$status'
+ WHERE user_id='". $this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Status: '.db_error());
+ db_rollback();
+ return false;
+ } else {
+ $this->data_array['status']=$status;
+ if ($status == 'D') {
+ // Remove this user from all groups
+ $res = db_query("
+ DELETE FROM user_group
+ WHERE user_id='".$this->getID()."'
+ ");
+ if (!$res) {
+ $this->setError('ERROR - Could Not Propogate Deleted Status: '.db_error());
+ db_rollback();
+ return false;
+ }
+ }
+ db_commit();
+ return true;
+ }
+ }
+
+ /**
+ * isActive()
+ *
+ * Database field status of 'A' returns true
+ * @return true or false
+ */
+ function isActive() {
+ if ($this->getStatus()=='A') {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * getUnixStatus() - Status of activation of unix account
+ *
+ * @return (N)one, (A)ctive, (S)uspended or (D)eleted
+ */
+ function getUnixStatus() {
+ return $this->data_array['unix_status'];
+ }
+
+ /**
+ * setUnixStatus() - Sets status of activation of unix account
+ *
+ * @param string The unix tatus
+ * @return true/false
+ */
+ function setUnixStatus($status) {
+ db_begin();
+ $res=db_query("
+ UPDATE users
+ SET unix_status='$status'
+ WHERE user_id='". $this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Unix Status: '.db_error());
+ db_rollback();
+ return false;
+ } else {
+ if ($status == 'A') {
+ if (!sf_ldap_check_create_user($this->getID())) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ } else {
+ if (sf_ldap_check_user($this->getID())) {
+ if (!sf_ldap_remove_user($this->getID())) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+ }
+
+ $this->data_array['unix_status']=$status;
+ db_commit();
+ return true;
+ }
+ }
+
+ /**
+ * getUnixName()
+ *
+ * @return this user's unix/login name
+ */
+ function getUnixName() {
+ return strtolower($this->data_array['user_name']);
+ }
+
+ /**
+ * getUnixPasswd()
+ *
+ * @return this user's unix crypted passwd
+ */
+ function getUnixPasswd() {
+ return $this->data_array['unix_pw'];
+ }
+
+ /**
+ * getUnixBox()
+ *
+ * @return this user's shell login machine
+ */
+ function getUnixBox() {
+ return $this->data_array['unix_box'];
+ }
+
+ /**
+ * getMD5Passwd()
+ *
+ * @return this user's MD5-crypted passwd
+ */
+ function getMD5Passwd() {
+ return $this->data_array['user_pw'];
+ }
+
+ /**
+ * getConfirmHash()
+ *
+ * @return this user's confirmation hash
+ */
+ function getConfirmHash() {
+ return $this->data_array['confirm_hash'];
+ }
+
+ /**
+ * getEmail()
+ *
+ * @return this user's email address
+ */
+ function getEmail() {
+ return $this->data_array['email'];
+ }
+
+ /**
+ * getNewEmail()
+ *
+ * getNewEmail is a private operation for email change
+ *
+ * @return this user's new (not yet confirmed) email address
+ * @private
+ */
+ function getNewEmail() {
+ return $this->data_array['email_new'];
+ }
+
+ /**
+ * setEmail()
+ *
+ * @param string The email address
+ * @sets user's email address
+ */
+ function setEmail($email) {
+ if (!$email || !validate_email($email)) {
+ $this->setError('ERROR: Invalid Email');
+ return false;
+ }
+ $res=db_query("
+ UPDATE users
+ SET email='$email'
+ WHERE user_id='". $this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Email: '.db_error());
+ return false;
+ } else {
+ $this->data_array['email'] = $email;
+ return true;
+ }
+ }
+
+ /**
+ * setNewEmailAndHash()
+ *
+ * setNewEmailAndHash is a private operation for email change
+ *
+ * @param string The email address
+ * @param string The emial hash
+ * @sets record of user's new email address and confirmation hash
+ */
+ function setNewEmailAndHash($email, $hash='') {
+
+ if (!$hash) {
+ $hash = substr(md5(strval(time()) . strval(mt_rand())), 0, 16);
+ }
+
+ if (!$email || !validate_email($email)) {
+ $this->setError('ERROR - Invalid Email');
+ return false;
+ }
+
+ $res=db_query("
+ UPDATE users
+ SET confirm_hash='$hash',
+ email_new='$email'
+ WHERE user_id='".$this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Email And Hash: '.db_error());
+ return false;
+ } else {
+ $this->data_array['email_new'] = $email;
+ $this->data_array['confirm_hash'] = $hash;
+ return true;
+ }
+ }
+
+ /**
+ * getRealName()
+ *
+ * @return this user's real name
+ */
+ function getRealName() {
+ return $this->data_array['realname'];
+ }
+
+ /**
+ * getAddDate()
+ *
+ * @return this user's unix time since account was opened
+ */
+ function getAddDate() {
+ return $this->data_array['add_date'];
+ }
+
+ /**
+ * getTimeZone()
+ *
+ * @return this user's timezone setting
+ */
+ function getTimeZone() {
+ return $this->data_array['timezone'];
+ }
+
+ /**
+ * getShell()
+ *
+ * @return this user's preferred shell
+ */
+ function getShell() {
+?><?php
+ return $this->data_array['shell'];
+ }
+
+ /**
+ * setShell()
+ *
+ * @param string The users preferred shell
+ * @sets user's preferred shell
+ */
+ function setShell($shell) {
+ $shells = file('/etc/shells');
+ $out_shells = array();
+ foreach ($shells as $s) {
+ if (substr($s, 0, 1) == '#') {
+ continue;
+ }
+ $out_shells[] = chop($s);
+ }
+ if (!in_array($shell, $out_shells)) {
+ $this->setError('ERROR: Invalid Shell');
+ return false;
+ }
+
+ db_begin();
+ $res=db_query("
+ UPDATE users
+ SET shell='$shell'
+ WHERE user_id='". $this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User Unix Shell: '.db_error());
+ db_rollback();
+ return false;
+ } else {
+ // Now change LDAP attribute, but only if corresponding
+ // entry exists (i.e. if user have shell access)
+ if (sf_ldap_check_user($this->getID()))
+ {
+ if (!sf_ldap_user_set_attribute($this->getID(),"loginShell",$shell)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+ $this->data_array['shell']=$shell;
+ }
+ db_commit();
+ return true;
+ }
+
+ /**
+ * getUnixUid()
+ *
+ * @return this user's unix_uid
+ */
+ function getUnixUID() {
+ return $this->data_array['unix_uid'];
+ }
+
+ /**
+ * getLanguage()
+ *
+ * @return this user's language_id
+ */
+ function getLanguage() {
+ return $this->data_array['language'];
+ }
+
+ /**
+ * getAuthorizedKeys()
+ *
+ * @return this user's SSH authorized (public) keys
+ */
+ function getAuthorizedKeys() {
+ return ereg_replace("###", "\n", $this->data_array['authorized_keys']);
+ }
+
+ /**
+ * setAuthorizedKeys()
+ *
+ * @param string The users public keys
+ * @sets this user's SSH authorized (public) keys
+ */
+ function setAuthorizedKeys($keys) {
+ $keys = trim($keys);
+ $keys = ereg_replace("(\r\n)|(\n)", "###", $keys);
+
+ $res=db_query("
+ UPDATE users
+ SET authorized_keys='$keys'
+ WHERE user_id='".$this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User SSH Keys: '.db_error());
+ return false;
+ } else {
+ $this->data_array['authorized_keys']=$keys;
+ return true;
+ }
+ }
+
+ /**
+ * getAuthorizedKeys()
+ *
+ * @return this user's SSH authorized (public) keys
+ */
+ function getAuthorizedKeys() {
+ return ereg_replace("###", "\n", $this->data_array['authorized_keys']);
+ }
+
+ /**
+ * setAuthorizedKeys()
+ *
+ * @param string The users public keys
+ * @sets this user's SSH authorized (public) keys
+ */
+ function setAuthorizedKeys($keys) {
+ $keys = trim($keys);
+ $keys = ereg_replace("(\r\n)|(\n)", "###", $keys);
+
+ $res=db_query("
+ UPDATE users
+ SET authorized_keys='$keys'
+ WHERE user_id='".$this->getID()."'
+ ");
+
+ if (!$res) {
+ $this->setError('ERROR - Could Not Update User SSH Keys');
+ return false;
+ } else {
+ $this->data_array['authorized_keys'] = $keys;
+ return true;
+ }
+ }
+
+ /**
+ * setLoggedIn($val) - Really only used by session code
+ *
+ * @param bool The session value
+ */
+ function setLoggedIn($val=true) {
+ $this->is_logged_in=$val;
+ if ($val) {
+ //if this is the logged in user -
+ //see if they are a super user
+ $sql="SELECT * FROM user_group ".
+ "WHERE user_id='". $this->getID() ."' AND group_id='1' AND admin_flags='A'";
+ $result=db_query($sql);
+ if (!$result || db_numrows($result) < 1) {
+ $this->is_super_user=false;
+ } else {
+ $this->is_super_user=true;
+ }
+ }
+ }
+
+ /**
+ * isLoggedIn()
+ *
+ * @return true or false
+ */
+ function isLoggedIn() {
+ return $this->is_logged_in;
+ }
+
+ /**
+ * setPreference($preference_name,$value)
+ *
+ * @param string Tthe unique field name for this preference
+ * @param string The value you are setting this preference to
+ * @return true or false on failure
+ */
+ function setPreference($preference_name,$value) {
+ $preference_name=strtolower(trim($preference_name));
+ $result=db_query("UPDATE user_preferences SET preference_value='$value',set_date='". time() ."' ".
+ "WHERE user_id='". $this->getID() ."' ".
+ "AND preference_name='$preference_name'");
+ if (db_affected_rows($result) < 1) {
+ //echo db_error();
+ $result=db_query("INSERT INTO user_preferences (user_id,preference_name,preference_value,set_date) ".
+ "VALUES ('". $this->getID() ."','$preference_name','$value','". time() ."')");
+ return $result;
+ }
+ }
+
+ /**
+ * getPreference($preference_name)
+ *
+ * @param string The unique field name for this preference
+ * @return the preference or false on failure
+ */
+ function getPreference($preference_name) {
+ $preference_name=strtolower(trim($preference_name));
+ /*
+ First check to see if we have already fetched the preferences
+ */
+ if ($this->user_pref) {
+ //echo "\n\nPrefs were fetched already";
+ if ($this->user_pref["$preference_name"]) {
+ //we have fetched prefs - return part of array
+ return $this->user_pref["$preference_name"];
+ } else {
+ //we have fetched prefs, but this pref hasn't been set
+ return false;
+ }
+ } else {
+ //we haven't returned prefs - go to the db
+ $result=db_query("SELECT preference_name,preference_value FROM user_preferences ".
+ "WHERE user_id='". $this->getID() ."'");
+ if (db_numrows($result) < 1) {
+ //echo "\n\nNo Prefs Found";
+ return false;
+ } else {
+ $pref=array();
+ //iterate and put the results into an array
+ for ($i=0; $i<db_numrows($result); $i++) {
+ $pref["".db_result($result,$i,'preference_name').""]=db_result($result,$i,'preference_value');
+ }
+ $this->user_pref =& $pref;
+
+ if ($this->user_pref["$preference_name"]) {
+ //we have fetched prefs - return part of array
+ return $this->user_pref["$preference_name"];
+ } else {
+ //we have fetched prefs, but this pref hasn't been set
+ return false;
+ }
+ }
+ }
+ }
+
+ /**
+ * setUpUnixUID() - Sets up this user's unix_uid for shell access
+ *
+ * @return true on success false on failure
+ */
+ function setUpUnixUID() {
+ global $sys_database_type;
+ if ($this->getUnixUID() > 1) {
+ //
+ // already have unix_uid
+ //
+ return true;
+ }
+ //get the next unix uid
+
+ /*
+ hack to simulate sequences in mysql
+ */
+ if ($sys_database_type=='mysql') {
+ $res=db_query("INSERT INTO unix_uids (id) values ('')");
+ $unixid=db_insertid($res,'unix_uids','id');
+ db_free_result($res);
+ } else {
+ $res=db_query("SELECT nextval('unix_uid_seq')");
+ $unixid=db_result($res,0,0);
+ db_free_result($res);
+ }
+ if (!$unixid) {
+ $this->setError('ERROR - Could Not Get Next Unix UID');
+ return false;
+ } else {
+ $res=db_query("
+ UPDATE users
+ SET unix_status='A',unix_uid='$unixid'
+ WHERE user_id='". $this->getID()."'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR - Could Not Update User Account Flags: '.db_error());
+ return false;
+ } else {
+ $this->data_array['unix_uid'] = $unixid;
+ return true;
+ }
+ }
+ }
+
+ /**
+ * setPasswd($passwd) - Changes user's password
+ *
+ * @param string The plaintext password
+ * @return true on success false on failure
+ */
+ function setPasswd($passwd) {
+ if (!account_pwvalid($passwd)) {
+ $this->setError('Error: '.$GLOBALS['register_error']);
+ return false;
+ }
+
+ db_begin();
+ $unix_pw = account_genunixpw($passwd);
+
+ $res=db_query("
+ UPDATE users
+ SET user_pw='" . md5($passwd) . "',
+ unix_pw='$unix_pw'
+ WHERE user_id='".$this->getID()."'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ERROR - Could Not Change User Password: '.db_error());
+ db_rollback();
+ return false;
+ } else {
+ // Now change LDAP password, but only if corresponding
+ // entry exists (i.e. if user have shell access)
+ if (sf_ldap_check_user($this->getID()))
+ {
+ if (!sf_ldap_user_set_attribute($this->getID(),"userPassword",'{crypt}'.$unix_pw)) {
+ $this->setError(sf_ldap_get_error_msg());
+ db_rollback();
+ return false;
+ }
+ }
+ }
+ db_commit();
+ return true;
+ }
+
+ /**
+ * usesRatings() - whether user participates in rating system
+ *
+ * @return true/false
+ */
+ function usesRatings() {
+ return !$this->data_array['block_ratings'];
+ }
+
+ /**
+ * getMailingsPrefs($mailing_id) - Get activity status for one of the site mailings
+ *
+ * @param string The id of mailing ('mail_va' for community mailings, 'mail_siteupdates' for site mailings)
+ * @return true/false
+ */
+ function getMailingsPrefs($mailing_id) {
+ if ($mailing_id=='va') {
+ return $this->data_array['mail_va'];
+ } else if ($mailing_id=='site') {
+ return $this->data_array['mail_siteupdates'];
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * unsubscribeFromMailings($all) - Disable email notifications for user
+ *
+ * @param bool If false, disable general site mailings, else - all
+ * @return true on success false on failure
+ */
+ function unsubscribeFromMailings($all=false) {
+ $res1 = $res2 = $res3 = true;
+ $res1 = db_query("
+ UPDATE users
+ SET mail_siteupdates=0,
+ mail_va=0
+ WHERE user_id='".$this->getID()."'
+ ");
+ if ($all) {
+ $res2 = db_query("
+ DELETE FROM forum_monitored_forums
+ WHERE user_id='".$this->getID()."'
+ ");
+ $res3 = db_query("
+ DELETE FROM filemodule_monitor
+ WHERE user_id='".$this->getID()."'
+ ");
+ }
+
+ return $res1 && $res2 && $res3;
+ }
+
+}
+
+/*
+
+
+
+
+ EVERYTHING BELOW HERE IS DEPRECATED
+
+
+ DO NOT USE FOR ANY NEW CODE
+
+
+
+*/
+
+
+
+/**
+ * user_ismember() - DEPRECATED; DO NOT USE!
+ *
+ * @param int The Group ID
+ * @param int The Type
+ * @deprecated
+ *
+ */
+function user_ismember($group_id,$type=0) {
+ if (!user_isloggedin()) {
+ return false;
+ }
+
+ $project =& group_get_object($group_id);
+
+ if (!$project || !is_object($project)) {
+ return false;
+ }
+
+ $perm =& $project->getPermission( session_get_user() );
+ if (!$perm || !is_object($perm) || !$perm->isMember()) {
+ return false;
+ }
+
+ $type=strtoupper($type);
+
+ switch ($type) {
+ case 'P2' : {
+ //pm admin
+ return $perm->isPMAdmin();
+ break;
+ }
+ case 'F2' : {
+ //forum admin
+ return $perm->isForumAdmin();
+ break;
+ }
+ case '0' : {
+ //just in this group
+ return $perm->isMember();
+ break;
+ }
+ case 'A' : {
+ //admin for this group
+ return $perm->isAdmin();
+ break;
+ }
+ case 'D1' : {
+ //document editor
+ return $perm->isDocEditor();
+ break;
+ }
+ default : {
+ //fubar request
+ return false;
+ }
+ }
+ return false;
+}
+
+/**
+ * user_getname() - DEPRECATED; DO NOT USE!
+ *
+ * @param int The User ID
+ * @deprecated
+ *
+ */
+function user_getname($user_id = false) {
+ // use current user if one is not passed in
+ if (!$user_id) {
+ if (user_isloggedin()) {
+ $user=&user_get_object(user_getid());
+ if ($user) {
+ return $user->getUnixName();
+ } else {
+ return 'Error getting user';
+ }
+ } else {
+ return 'No User Id';
+ }
+ } else {
+ $user=&user_get_object($user_id);
+ if ($user) {
+ return $user->getUnixName();
+ } else {
+ return 'Invalid User';
+ }
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/account.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/account.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/account.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,203 @@
+<?php
+/**
+ * account.php - A library of common account management functions.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+/**
+ * account_pwvalid() - Validates a password
+ *
+ * @param string The plaintext password string
+ * @returns true on success/false on failure
+ *
+ */
+function account_pwvalid($pw) {
+ if (strlen($pw) < 6) {
+ $GLOBALS['register_error'] = "Password must be at least 6 characters.";
+ return 0;
+ }
+ return 1;
+}
+
+/**
+ * account_namevalid() - Validates a login username
+ *
+ * @param string The username string
+ * @returns true on success/false on failure
+ *
+ */
+function account_namevalid($name) {
+ // no spaces
+ if (strrpos($name,' ') > 0) {
+ $GLOBALS['register_error'] = "There cannot be any spaces in the login name.";
+ return 0;
+ }
+
+ // min and max length
+ if (strlen($name) < 3) {
+ $GLOBALS['register_error'] = "Name is too short. It must be at least 3 characters.";
+ return 0;
+ }
+ if (strlen($name) > 15) {
+ $GLOBALS['register_error'] = "Name is too long. It must be less than 15 characters.";
+ return 0;
+ }
+
+ if (!ereg('^[a-z][-a-z0-9_]+$', $name)) {
+ $GLOBALS['register_error'] = "Illegal character in name.";
+ return 0;
+ }
+
+ // illegal names
+ if (eregi("^((root)|(bin)|(daemon)|(adm)|(lp)|(sync)|(shutdown)|(halt)|(mail)|(news)"
+ . "|(uucp)|(operator)|(games)|(mysql)|(httpd)|(nobody)|(dummy)"
+ . "|(www)|(cvs)|(shell)|(ftp)|(irc)|(debian)|(ns)|(download))$",$name)) {
+ $GLOBALS['register_error'] = "Name is reserved.";
+ return 0;
+ }
+ if (eregi("^(anoncvs_)",$name)) {
+ $GLOBALS['register_error'] = "Name is reserved for CVS.";
+ return 0;
+ }
+
+ return 1;
+}
+
+/**
+ * account_groupnamevalid() - Validates an account group name
+ *
+ * @param string The group name string
+ * @returns true on success/false on failure
+ *
+ */
+function account_groupnamevalid($name) {
+ if (!account_namevalid($name)) return 0;
+
+ // illegal names
+ if (eregi("^((www[0-9]?)|(cvs[0-9]?)|(shell[0-9]?)|(ftp[0-9]?)|(irc[0-9]?)|(news[0-9]?)"
+ . "|(mail[0-9]?)|(ns[0-9]?)|(download[0-9]?)|(pub)|(users)|(compile)|(lists)"
+ . "|(slayer)|(orbital)|(tokyojoe)|(webdev)|(projects)|(cvs)|(slayer)|(monitor)|(mirrors?))$",$name)) {
+ $GLOBALS['register_error'] = "Name is reserved for DNS purposes.";
+ return 0;
+ }
+
+ if (eregi("_",$name)) {
+ $GLOBALS['register_error'] = "Group name cannot contain underscore for DNS reasons.";
+ return 0;
+ }
+
+ return 1;
+}
+
+/**
+ * rannum() - Generate a random number
+ *
+ * This is a local function used for account_salt()
+ *
+ * @return int $num A random number
+ *
+ */
+function rannum(){
+ mt_srand((double)microtime()*1000000);
+ $num = mt_rand(46,122);
+ return $num;
+}
+
+/**
+ * genchr() - Generate a random character
+ *
+ * This is a local function used for account_salt()
+ *
+ * @return int $num A random character
+ *
+ */
+function genchr(){
+ do {
+ $num = rannum();
+ } while ( ( $num > 57 && $num < 65 ) || ( $num > 90 && $num < 97 ) );
+ $char = chr($num);
+ return $char;
+}
+
+/**
+ * account_gensalt() - A random salt generator
+ *
+ * @returns The random salt string
+ *
+ */
+function account_gensalt(){
+
+ $a = genchr();
+ $b = genchr();
+ $salt = "$1$" . "$a$b";
+ return $salt;
+}
+
+/**
+ * account_genunixpw() - Generate unix password
+ *
+ * @param string The plaintext password string
+ * @return The encrypted password
+ *
+ */
+function account_genunixpw($plainpw) {
+ return crypt($plainpw,account_gensalt());
+}
+
+/**
+ * account_shellselects() - Print out shell selects
+ *
+ * @param string The current shell
+ *
+ */
+function account_shellselects($current) {
+ $shells = file("/etc/shells");
+
+ for ($i = 0; $i < count($shells); $i++) {
+ $this_shell = chop($shells[$i]);
+
+ if ($current == $this_shell) {
+ echo "<option selected value=$this_shell>$this_shell</option>\n";
+ } else {
+ echo "<option value=$this_shell>$this_shell</option>\n";
+ }
+ }
+}
+
+/**
+ * account_user_homedir() - Returns full path of user home directory
+ *
+ * @param string The username
+ * @return home directory path
+ */
+function account_user_homedir($user) {
+ return '/home/users/'.substr($user,0,1).'/'.substr($user,0,2).'/'.$user;
+}
+
+/**
+ * account_group_homedir() - Returns full path of group home directory
+ *
+ * @param string The group name
+ * @return home directory path
+ */
+function account_group_homedir($group) {
+ return '/home/groups/'.substr($group,0,1).'/'.substr($group,0,2).'/'.$group;
+}
+
+/**
+ * account_group_cvsweb_url() - Returns URL for group's CVS interface WWW
+ *
+ * @param string The group name
+ * @return URL to access CVS over HTTP
+ */
+function account_group_cvsweb_url($group) {
+ return 'http://'.$GLOBALS['sys_cvs_host'].'/cgi-bin/viewcvs.cgi/'.$group;
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/database.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/database.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/database.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,305 @@
+<?php
+/**
+ *
+ * database.php - The database abstraction library
+ * This is the PostgreSQL version of our database connection/querying layer
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+//$conn - database connection handle
+
+/**
+ * Current row for each result set
+ *
+ * @var array $sys_db_row_pointer
+ */
+$sys_db_row_pointer=array(); //current row for each result set
+
+
+/**
+ * db_connect() - Connect to the database
+ * Notice the global vars that must be set up
+ * Sets up a global $conn variable which is used
+ * in other functions in this library.
+ */
+function db_connect() {
+ global $sys_dbhost,$sys_dbuser,$sys_dbpasswd,$conn,
+ $sys_dbname,$sys_db_use_replication,$sys_dbreaddb,$sys_dbreadhost;
+
+ //
+ // Connect to primary database
+ //
+ $conn = @pg_pconnect("user=$sys_dbuser dbname=$sys_dbname host=$sys_dbhost password=$sys_dbpasswd");
+
+ //
+ // If any replication is configured, connect
+ //
+ if ($sys_db_use_replication) {
+ $conn2 = @pg_pconnect("user=$sys_dbuser dbname=$sys_dbreaddb host=$sys_dbreadhost password=$sys_dbpasswd");
+ } else {
+ $conn2 = $conn;
+ }
+
+ //
+ // Now map the physical database connections to the
+ // "virtual" list that is used to distribute load in db_query()
+ //
+ define(SYS_DB_PRIMARY,$conn);
+ define(SYS_DB_STATS,$conn2);
+ define(SYS_DB_TROVE,$conn2);
+ define(SYS_DB_SEARCH,$conn2);
+
+ // Register top-level "finally" handler to abort current
+ // transaction in case of error
+ register_shutdown_function("system_cleanup");
+}
+
+/**
+ * db_query() - Query the database.
+ *
+ * @param text SQL statement.
+ * @param int How many rows do you want returned.
+ * @param int Of matching rows, return only rows starting here.
+ * @param int ability to spread load to multiple db servers.
+ * @return int result set handle.
+ */
+function db_query($qstring,$limit='-1',$offset=0,$dbserver=SYS_DB_PRIMARY) {
+ global $QUERY_COUNT;
+ $QUERY_COUNT++;
+
+ if ($limit > 0) {
+ if (!$offset || $offset < 0) {
+ $offset=0;
+ }
+ $qstring=$qstring." LIMIT $limit OFFSET $offset";
+ }
+
+ $GLOBALS['G_DEBUGQUERY'] .= $qstring .' |<font size="-2">'.$dbserver.'</font>'. "<P>\n";
+ return @pg_exec($dbserver,$qstring);
+}
+
+/* Current transaction level, private variable */
+/* FIXME: Having scalar variable for transaction level is
+ no longer correct after multiple database (dbservers) support
+ introduction. However, it is true that in one given PHP
+ script, at most one db is modified, so this works for now. */
+$_sys_db_transaction_level = 0;
+
+/**
+ * db_begin() - Begin a transaction.
+ *
+ * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH)
+ * @return true.
+ */
+function db_begin($dbserver=SYS_DB_PRIMARY) {
+ global $_sys_db_transaction_level;
+
+ // start database transaction only for the top-level
+ // programmatical transaction
+ $_sys_db_transaction_level++;
+ if ($_sys_db_transaction_level == 1) {
+ return db_query("BEGIN WORK", -1, 0, $dbserver);
+ }
+
+ return true;
+}
+
+/**
+ * db_commit() - Commit a transaction.
+ *
+ * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH)
+ * @return true on success/false on failure.
+ */
+function db_commit($dbserver=SYS_DB_PRIMARY) {
+ global $_sys_db_transaction_level;
+
+ // check for transaction stack underflow
+ if ($_sys_db_transaction_level == 0) {
+ echo "COMMIT underflow<br>";
+ return false;
+ }
+
+ // commit database transaction only when top-level
+ // programmatical transaction ends
+ $_sys_db_transaction_level--;
+ if ($_sys_db_transaction_level == 0) {
+ return db_query("COMMIT", -1, 0, $dbserver);
+ }
+
+ return true;
+}
+
+/**
+ * db_rollback() - Rollback a transaction.
+ *
+ * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH)
+ * @return true on success/false on failure.
+ */
+function db_rollback($dbserver=SYS_DB_PRIMARY) {
+ global $_sys_db_transaction_level;
+
+ // check for transaction stack underflow
+ if ($_sys_db_transaction_level == 0) {
+ echo "ROLLBACK underflow<br>";
+ return false;
+ }
+
+ // rollback database transaction only when top-level
+ // programmatical transaction ends
+ $_sys_db_transaction_level--;
+ if ($_sys_db_transaction_level == 0) {
+ return db_query("ROLLBACK", -1, 0, $dbserver);
+ }
+
+ return true;
+}
+
+/**
+ * db_numrows() - Returns the number of rows in this result set.
+ *
+ * @param int Query result set handle.
+ * @return int number of rows.
+ */
+
+function db_numrows($qhandle) {
+ return @pg_numrows($qhandle);
+}
+
+/**
+ * db_free_result() - Frees a database result properly.
+ *
+ * @param int Query result set handle.
+ */
+function db_free_result($qhandle) {
+ return @pg_freeresult($qhandle);
+}
+
+/**
+ * db_reset_result() - Reset is useful for db_fetch_array
+ * sometimes you need to start over.
+ *
+ * @param int Query result set handle.
+ * @param integer Row number.
+ * @return int row.
+ */
+function db_reset_result($qhandle,$row=0) {
+ global $sys_db_row_pointer;
+ return $sys_db_row_pointer[$qhandle]=$row;
+}
+
+/**
+ * db_result() - Returns a field from a result set.
+ *
+ * @param int Query result set handle.
+ * @param integer Row number.
+ * @param string Field name.
+ * @return contents of field from database.
+ */
+function db_result($qhandle,$row,$field) {
+ return @pg_result($qhandle,$row,$field);
+}
+
+/**
+ * db_numfields() - Returns the number of fields in this result set.
+ *
+ * @param int Query result set handle.
+ */
+function db_numfields($lhandle) {
+ return @pg_numfields($lhandle);
+}
+
+/**
+ * db_fieldname() - Returns the number of rows changed in the last query.
+ *
+ * @param int Query result set handle.
+ * @param int Column number.
+ * @return text name of the field.
+ */
+function db_fieldname($lhandle,$fnumber) {
+ return @pg_fieldname($lhandle,$fnumber);
+}
+
+/**
+ * db_affected_rows() - Returns the number of rows changed in the last query.
+ *
+ * @param int Query result set handle.
+ * @return int number of affected rows.
+ */
+function db_affected_rows($qhandle) {
+ return @pg_cmdtuples($qhandle);
+}
+
+/**
+ * db_fetch_array() - Returns an associative array from
+ * the current row of this database result
+ * Use db_reset_result to seek a particular row.
+ *
+ * @param int Query result set handle.
+ * @return associative array of fieldname/value key pairs.
+ */
+function db_fetch_array($qhandle) {
+ global $sys_db_row_pointer;
+ $sys_db_row_pointer[$qhandle]++;
+ return @pg_fetch_array($qhandle,($sys_db_row_pointer[$qhandle]-1));
+}
+
+/**
+ * db_insertid() - Returns the last primary key from an insert.
+ *
+ * @param int Query result set handle.
+ * @param string table_name is the name of the table you inserted into.
+ * @param string pkey_field_name is the field name of the primary key.
+ * @param string Server to which original query was made
+ * @return int id of the primary key or 0 on failure.
+ */
+function db_insertid($qhandle,$table_name,$pkey_field_name,$dbserver=SYS_DB_PRIMARY) {
+ $oid=@pg_getlastoid($qhandle);
+ if ($oid) {
+ $sql="SELECT $pkey_field_name AS id FROM $table_name WHERE oid='$oid'";
+ //echo $sql;
+ $res=db_query($sql, -1, 0, $dbserver);
+ if (db_numrows($res) >0) {
+ return db_result($res,0,'id');
+ } else {
+ // echo "No Rows Matched";
+ // echo db_error();
+ return 0;
+ }
+ } else {
+// echo "No OID";
+// echo db_error();
+ return 0;
+ }
+}
+
+/**
+ * db_error() - Returns the last error from the database.
+ *
+ * @param constant Database server (SYS_DB_PRIMARY, SYS_DB_STATS, SYS_DB_TROVE, SYS_DB_SEARCH)
+ * @return text error message.
+ */
+function db_error($dbserver=SYS_DB_PRIMARY) {
+ return @pg_errormessage($dbserver);
+}
+
+/**
+ * system_cleanup() - In the future, we may wish to do a number
+ * of cleanup functions at script termination.
+ *
+ * For now, we just abort any in-process transaction.
+ */
+function system_cleanup() {
+ global $_sys_db_transaction_level;
+ if ($_sys_db_transaction_level > 0) {
+ echo "Open transaction detected!!!";
+ db_query("ROLLBACK");
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/jpcache.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/jpcache.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/jpcache.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,368 @@
+<?
+
+/*
+ jpcache.php v1.0.1 [2001-03-25]
+ Copyright 2001 Jean-Pierre Deckers <jpcache at weirdpier.com>
+
+ 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.
+*/
+
+/*
+ Credits:
+
+ Most things taken from
+ phpCache v1.2 <nathan at 0x00.org> (http://www.0x00.org/phpCache)
+ gzdoc.php <catoc at 163.net> and <jlim at natsoft.com.my>
+ jr-cache.php <jr-jrcache at quo.to>
+
+ Inspired by the following threads:
+ http://www.aota.net/ubb/Forum15/HTML/000738-1.html
+ http://www.aota.net/ubb/Forum15/HTML/000746-1.html
+ http://www.aota.net/ubb/Forum15/HTML/000749-1.html
+
+ Note:
+ I do not claim anything.
+ Just a first try to 'release' something under the GPL.
+
+ More info on http://www.weirdpier.com/jpcache/
+
+
+--
+-- Table for new caching system
+--
+CREATE TABLE cache_store (
+name varchar(255),
+data text,
+indate int not null default 0
+);
+
+CREATE UNIQUE INDEX cachestore_name ON cache_store(name);
+
+ */
+
+/******************************************************************************/
+
+ $CACHE_TIME=900; // Default: 900 - number seconds to cache
+ $CACHE_DEBUG=0; // Default: 0 - Turn debugging on/off
+ $SINGLE_SITE=1; // Default: 1 - No servername in file
+ $CACHE_POST=0; // Default: 0 - don't cache when HTTP_POST_VARS present
+ $CACHE_COOKIE=0; // Default: 0 - don't cache when HTTP_COOKIE_VARS present
+ $CACHE_ON=1; // Default: 1 - Turn caching on/off
+ $CACHE_USE_GZIP=1; // Default: 0 - Whether or not to use GZIP
+
+ define(CACHE_DIR, "/tmp"); // Default: /tmp - Default cache directory
+ define(CACHE_GC, .1); // Default: 1 - Probability of garbage collection (i.e: 1%)
+
+/******************************************************************************/
+
+
+ /* This resets the cache state */
+ function cache_reset()
+ {
+ global $cache_file, $cache_data;
+ $cache_file = NULL;
+ $cache_data = array();
+ }
+
+ /* duh ? */
+ function cache_debug($s) {
+ global $CACHE_DEBUG,$cache_debug_comments;
+ if ($CACHE_DEBUG) {
+ header("X-Debug: $s");
+ }
+ $cache_debug_comments .= "\n".$s;
+ }
+
+ /* Returns the default key used by the helper functions */
+ function cache_default_key()
+ {
+ global $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS, $REQUEST_URI;
+ return md5("POST=" . serialize($HTTP_POST_VARS) . " GET=" . serialize($HTTP_GET_VARS) . " COOKIE=" . serialize($HTTP_COOKIE_VARS) . $REQUEST_URI );
+ }
+
+ /* Returns the default object used by the helper functions */
+ function cache_default_object()
+ {
+ global $SCRIPT_URI, $SERVER_NAME, $SCRIPT_NAME, $SINGLE_SITE;
+
+ if ($SINGLE_SITE) {
+ $name=$SCRIPT_NAME;
+ } else {
+ $name=$SCRIPT_URI;
+ }
+
+ if ($name=="") {
+ $name="http://$SERVER_NAME/$SCRIPT_NAME";
+ }
+ return $name;
+ }
+
+ /* This is the function that writes out the cache */
+ function cache_write($file, $data)
+ {
+ global $CACHE_TIME,$CACHE_ON;
+
+ if (!$CACHE_ON || $CACHE_TIME < 1) {
+ cache_debug("Not caching, CACHE_ON is off");
+ return 0;
+ }
+
+ db_begin();
+
+ //
+ // Get a lock on this object in the db
+ //
+ $res=db_query("SELECT *
+ FROM cache_store
+ WHERE
+ name='$file'
+ FOR UPDATE");
+
+ if (!$res || db_numrows($res) < 1) {
+ $res=db_query("INSERT INTO cache_store (name,data,indate)
+ VALUES ('$file','". addslashes($data) ."','". time() ."')");
+ //
+ // Assume it worked - it may have been rejected by the UNIQUE INDEX
+ // but that just means another thread inserted in the meantime
+ //
+ db_commit();
+ return true;
+ } else {
+ //
+ // See if we still need to update or not...
+ //
+ if (db_result($res,0,'indate') > (time()-$CACHE_TIME)) {
+ //
+ // Another thread updated the db already....
+ //
+ db_commit();
+ return true;
+ } else {
+ $res=db_query("UPDATE cache_store
+ SET
+ data='". addslashes($data) ."',
+ indate='". time() ."'
+ WHERE
+ name='$file'");
+ //
+ // Assume it worked - it may have been rejected by the UNIQUE INDEX
+ // but that just means another thread inserted in the meantime
+ //
+ db_commit();
+ return true;
+ }
+
+ }
+ return TRUE;
+ }
+
+ /* This function reads in the cache, duh */
+ function cache_read($file)
+ {
+ global $CACHE_TIME;
+ $res=db_query("SELECT data
+ FROM cache_store
+ WHERE
+ name='$file'
+ AND indate > '". (time()-$CACHE_TIME) ."'");
+ return db_result($res,0,'data');
+ }
+
+ /* Cache garbage collection */
+ function cache_gc()
+ {
+ global $CACHE_TIME;
+
+ if (CACHE_GC>0) {
+ mt_srand(time(NULL));
+ $precision=100000;
+ $r=(mt_rand()%$precision)/$precision;
+ if ($r >= (CACHE_GC/100)) {
+ return false;
+ } else {
+ db_query("DELETE FROM cache_store WHERE indate < '". (time()-$CACHE_TIME) ."'");
+ }
+ }
+ }
+
+ /*
+ Caches $object based on $key for $cachetime, will return 0 if the
+ object has expired or the object does not exist.
+ */
+ function check_cache()
+ {
+ global $cache_file, $cache_data, $gzcontent, $CACHE_ON;
+
+ if (!$CACHE_ON) {
+ cache_debug("Not caching, CACHE_ON is off");
+ return false;
+ }
+
+ $cache_file=eregi_replace("[^A-Z,0-9,=]", "_", cache_default_object());
+ $key=eregi_replace("[^A-Z,0-9,=]", "_", cache_default_key());
+
+ cache_debug("Caching based on <b>OBJECT</b>=$cache_file <b>KEY</b>=$key");
+
+ $cache_file=$cache_file . ":" . $key;
+
+ // Can we access the cache_file ?
+ if ($buff=cache_read($cache_file)) {
+ cache_debug("Opened the cache file");
+ return $buff;
+ } else {
+ // No cache file (yet) or unable to read
+ cache_debug("No previous cache of $cache_file or unable to read");
+
+ // If we came here: start caching!
+
+ return false;
+ }
+ }
+
+ /*
+ Sets the handler
+ */
+ function cache_start()
+ {
+ global $CACHE_ON,$CACHE_POST,$CACHE_COOKIE,$CACHE_TIME,$cache_debug_comments;
+
+ //
+ // If you chose not to cache when POST occurs, force cache off
+ //
+ if (!$CACHE_POST && (count($HTTP_POST_VARS) > 0)) {
+ $CACHE_ON = 0;
+ $CACHE_TIME = -1;
+ }
+
+ //
+ // If you chose not to cache when COOKIES present, force cache off
+ //
+ if (!$CACHE_COOKIE && (count($HTTP_COOKIE_VARS) > 0)) {
+ $CACHE_ON = 0;
+ $CACHE_TIME = -1;
+ }
+
+ //
+ // CACHE_TIME of -1 disables caching, just using gzip if possible
+ //
+ if ($CACHE_TIME == -1) {
+ $CACHE_ON=0;
+ }
+
+ // Reset
+ cache_reset();
+
+ // Check cache
+ if ($et=check_cache()) {
+ // Cache is valid: flush it!
+ $size = strlen($et);
+ $crc32 = crc32($et);
+ print cache_flush($et, $size, $crc32);
+//exec("/bin/echo \"$cache_debug_comments\" >> /tmp/out.txt");
+ exit;
+ } else {
+ cache_gc();
+
+ // Start a new cache file
+ ob_start("cache_end");
+ ob_implicit_flush(0);
+ }
+//exec("/bin/echo \"$cache_debug_comments\" >> /tmp/out.txt");
+ }
+
+ /* Are we capable of receiving gzipped data ?
+ *
+ * Returns the encoding that is accepted. Maybe additional check for Mac ?
+ */
+ function cache_get_encoding() {
+ global $HTTP_ACCEPT_ENCODING;
+ if (headers_sent() || connection_aborted()) {
+ return false;
+ }
+ if (strpos($HTTP_ACCEPT_ENCODING,'x-gzip') !== false) {
+ return "x-gzip";
+ }
+ if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) {
+ return "gzip";
+ }
+ return false;
+ }
+
+ /* cache_flush()
+ *
+ * Responsible for final flushing everything.
+ * Sets ETag-headers and returns "Not modified" when possible
+ *
+ * When ETag doesn't match (or is invalid), it is tried to send
+ * the gzipped data. If that is also not possible, we sadly have to
+ * uncompress...
+ */
+ function cache_flush($contents, $size, $crc32)
+ {
+ global $HTTP_SERVER_VARS,$CACHE_USE_GZIP;
+
+ // First check if we can send last-modified
+ $myETag = "\"jpd-$crc32.$size\"";
+ header("ETag: $myETag");
+ $foundETag = stripslashes($HTTP_SERVER_VARS["HTTP_IF_NONE_MATCH"]);
+ $ret = NULL;
+
+ if (strstr($foundETag, $myETag)) {
+ // Not modified!
+ header("HTTP/1.0 304");
+ } else {
+ if ($CACHE_USE_GZIP) {
+ $ENCODING = cache_get_encoding();
+ if ($ENCODING) {
+ // compressed output
+ $contents = gzcompress($contents, 9);
+ header("Content-Encoding: $ENCODING");
+ $ret = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
+ $ret .= substr($contents, 0, strlen($contents) - 4);
+ $ret .= pack('V',$crc32);
+ $ret .= pack('V',$size);
+ } else {
+ // Darn, we need to uncompress :(
+ $ret = $contents;
+ }
+ } else {
+ $ret=$contents;
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * cache_end()
+ *
+ * This one is called by the callback-funtion of the ob_start
+ */
+ function cache_end($contents)
+ {
+ cache_debug("Callback happened");
+ global $size, $cache_file, $crc32;
+
+ $size = strlen($contents);
+ $crc32 = crc32($contents);
+
+ // write the cache
+ cache_write($cache_file,$contents);
+
+ // Return flushed data
+ return cache_flush($contents, $size, $crc32);
+ }
+
+ cache_start();
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/ldap.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/ldap.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/ldap.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,776 @@
+<?php
+/**
+ *
+ * ldap.php - The LDAP library
+ * This is the PostgreSQL version of our database connection/querying layer
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ * @author Paul Sokolovsky pfalcon at users.sourceforge.net
+ * @date 2000-10-17
+ *
+ */
+
+require_once('common/include/account.php');
+
+/*
+ * Constants
+ */
+
+/**
+ * Value to add to group_id to get unix gid
+ *
+ * @var constant $GID_ADD
+ */
+$GID_ADD = 1000;
+
+/**
+ * Value to add to unix_uid to get unix uid
+ *
+ * @var constant $UID_ADD
+ */
+$UID_ADD = 20000;
+
+/**
+ * Value to add to unix gid to get unix uid of anoncvs special user
+ *
+ * @var constant $ANONCVS_UID_ADD
+ */
+$ANONCVS_UID_ADD = 2000;
+
+/*
+ * Auxilary functions
+ */
+
+/**
+ * asciize() - Replace non-ascii characters with question marks
+ *
+ * LDAP expects utf-8 encoded character string. Since we cannot
+ * know which encoding 8-bit characters in database use, we
+ * just replace them with question marks.
+ *
+ * @param string UTF-8 encoded character string.
+ * @return string which contains only ascii characters
+ */
+function asciize($str) {
+ if (!$str) {
+ // LDAP don't allow empty strings for some attributes
+ return '?';
+ }
+
+ return ereg_replace("[\x80-\xff]","?",$str);
+}
+
+/*
+ * Error message passing facility
+ */
+
+/**
+ * sf_ldap_set_error_msg() - Set an LDAP error message
+ *
+ * @param string The message string to set
+ *
+ */
+//var $_sf_ldap_error_msg;
+function sf_ldap_set_error_msg($msg) {
+ global $_sf_ldap_error_msg;
+ $_sf_ldap_error_msg .= $msg;
+}
+
+/**
+ * sf_ldap_get_error_msg() - Get an LDAP error message
+ *
+ * @returns The error message string
+ *
+ */
+function sf_ldap_get_error_msg() {
+ global $_sf_ldap_error_msg;
+ return $_sf_ldap_error_msg;
+}
+
+/**
+ * sf_ldap_reset_error_msg() - Reset the stored LDAP error message
+ *
+ */
+function sf_ldap_reset_error_msg() {
+ global $_sf_ldap_error_msg;
+ $_sf_ldap_error_msg='';
+}
+
+
+/*
+ * Wrappers for PHP LDAP functions
+ */
+
+/**
+ * sf_ldap_connect() - Connect to the LDAP server
+ *
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_connect() {
+ global $sys_ldap_host,$sys_ldap_port;
+ global $sys_ldap_bind_dn,$sys_ldap_passwd,$ldap_conn;
+
+ if (!$ldap_conn) {
+ sf_ldap_reset_error_msg();
+ $ldap_conn = @ldap_connect($sys_ldap_host,$sys_ldap_port);
+ if (!$ldap_conn) {
+ sf_ldap_set_error_msg('ERROR: Cannot connect to LDAP server<br>');
+ return false;
+ }
+ ldap_bind($ldap_conn,$sys_ldap_bind_dn,$sys_ldap_passwd);
+ }
+ return true;
+}
+
+/**
+ * sf_ldap_add() - Wrapper for ldap_add()
+ *
+ * @param string dn
+ * @param string entry
+ *
+ */
+function sf_ldap_add($dn, $entry) {
+ global $ldap_conn;
+ return @ldap_add($ldap_conn,$dn,$entry);
+}
+
+/**
+ * sf_ldap_delete() - Wrapper for ldap_delete()
+ *
+ * @param string dn
+ *
+ */
+function sf_ldap_delete($dn) {
+ global $ldap_conn;
+ return @ldap_delete($ldap_conn,$dn);
+}
+
+/**
+ * sf_ldap_modify() - Wrapper for ldap_modify()
+ *
+ * @param string dn
+ * @param string entry
+ *
+ */
+function sf_ldap_modify($dn,$entry) {
+ global $ldap_conn;
+ return @ldap_modify($ldap_conn,$dn,$entry);
+}
+
+/**
+ * sf_ldap_mod_add() - Wrapper for ldap_mod_add()
+ *
+ * @param string dn
+ * @param string entry
+ *
+ */
+function sf_ldap_mod_add($dn,$entry) {
+ global $ldap_conn;
+ return @ldap_mod_add($ldap_conn,$dn,$entry);
+}
+
+/**
+ * sf_ldap_mod_del() - Wrapper for ldap_mod_del()
+ *
+ * @param string dn
+ * @param string entry
+ *
+ */
+function sf_ldap_mod_del($dn,$entry) {
+ global $ldap_conn;
+ return @ldap_mod_del($ldap_conn,$dn,$entry);
+}
+
+/**
+ * sf_ldap_read() - Wrapper for ldap_read()
+ *
+ * @param string dn
+ * @param string filter
+ * @param int attrs
+ *
+ */
+function sf_ldap_read($dn,$filter,$attrs=0) {
+ global $ldap_conn;
+ return @ldap_read($ldap_conn,$dn,$filter,$attrs);
+}
+
+/**
+ * sf_ldap_error() - Wrapper for ldap_error()
+ *
+ * @see ldap_error()
+ *
+ */
+function sf_ldap_error() {
+ global $ldap_conn;
+ return ldap_error($ldap_conn);
+}
+
+/**
+ * sf_ldap_errno() - Wrapper for ldap_errno()
+ *
+ * @see ldap_errno()
+ *
+ */
+function sf_ldap_errno() {
+ global $ldap_conn;
+ return ldap_errno($ldap_conn);
+}
+
+/**
+ * sf_ldap_already_exists()
+ */
+function sf_ldap_already_exists() {
+ global $ldap_conn;
+ return ldap_errno($ldap_conn)==20;
+}
+
+/**
+ * sf_ldap_does_not_exist()
+ */
+function sf_ldap_does_not_exist() {
+ global $ldap_conn;
+ return ldap_errno($ldap_conn)==16;
+}
+
+/*
+ * User management functions
+ */
+
+/**
+ * sf_ldap_check_user() - Check for the existence of a user
+ *
+ * @param int The user ID of the user to check
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_check_user($user_id) {
+ $user =& user_get_object($user_id);
+ if (!$user) {
+ return false;
+ }
+ return sf_ldap_check_user_by_name($user->getUnixName());
+}
+
+/**
+ * sf_ldap_check_user_by_name() - Check for a user by the username
+ *
+ * @param string The username
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_check_user_by_name($user_name) {
+ global $ldap_conn;
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+
+ $dn = 'uid='.$user_name.',ou=People,'.$sys_ldap_base_dn;
+ $res = sf_ldap_read($dn,"objectClass=*",array("uid"));
+ if ($res) {
+ ldap_free_result($res);
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * sf_ldap_create_user() - Create a user
+ *
+ * @param int The user ID of the user to create
+ * @returns The return status of sf_ldap_create_user_from_object()
+ *
+ */
+function sf_ldap_create_user($user_id) {
+ $user = &user_get_object($user_id);
+ return sf_ldap_create_user_from_object($user);
+}
+
+/**
+ * sf_ldap_check_create_user() - Check that a user has been created
+ *
+ * @param int The ID of the user to check
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_check_create_user($user_id) {
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ if (!sf_ldap_check_user($user_id)){
+ $user = &user_get_object($user_id);
+ return sf_ldap_create_user_from_object($user);
+ }
+ return true;
+}
+
+/**
+ * sf_ldap_create_user_from_object() - Create a user from information contained within an object
+ *
+ * @param object The user object
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_create_user_from_object(&$user) {
+ global $sys_ldap_base_dn;
+ global $UID_ADD;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+//echo "sf_ldap_create_user_from_object(".$user->getUnixName().")<br>";
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn;
+ $entry['objectClass'][0]='top';
+ $entry['objectClass'][1]='account';
+ $entry['objectClass'][2]='posixAccount';
+ $entry['objectClass'][3]='shadowAccount';
+ $entry['objectClass'][4]='x-sourceforgeAccount';
+ $entry['uid']=$user->getUnixName();
+ $entry['cn']=asciize($user->getRealName());
+ $entry['gecos']=asciize($user->getRealName());
+ $entry['userPassword']='{crypt}'.$user->getUnixPasswd();
+ $entry['homeDirectory'] = account_user_homedir($user->getUnixName());
+ $entry['loginShell']=$user->getShell();
+ $entry['x-cvsShell']="/bin/cvssh"; // unless explicitly set otherwise, developer has write access
+ $entry['uidNumber']=$user->getUnixUID() + $UID_ADD;
+ $entry['gidNumber']=100; // users
+ $entry['shadowLastChange']=1; // We don't have expiration, so any non-0
+ $entry['shadowMax']=99999;
+ $entry['shadowWarning']=7;
+
+ if (!sf_ldap_add($dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add LDAP user entry '".
+ $user->getUnixName()."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ return true;
+}
+
+/**
+ * sf_ldap_create_user_from_props() - Creates an LDAP user from
+ *
+ * @param string The username
+ * @param string ????
+ * @param string The encrypted password
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_create_user_from_props($username, $cn, $crypt_pw,
+ $shell, $cvsshell, $uid, $gid) {
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'uid='.$username.',ou=People,'.$sys_ldap_base_dn;
+ $entry['objectClass'][0]='top';
+ $entry['objectClass'][1]='account';
+ $entry['objectClass'][2]='posixAccount';
+ $entry['objectClass'][3]='shadowAccount';
+ $entry['objectClass'][4]='x-sourceforgeAccount';
+ $entry['uid']=$username;
+ $entry['cn']=asciize($cn);
+ $entry['gecos']=asciize($cn);
+ $entry['userPassword']='{crypt}'.$crypt_pw;
+ $entry['homeDirectory'] = account_user_homedir($username);
+ $entry['loginShell']=$shell;
+ $entry['x-cvsShell']=$cvsshell;
+ $entry['uidNumber']=$uid;
+ $entry['gidNumber']=$gid;
+ $entry['shadowLastChange']=1;
+ $entry['shadowMax']=99999;
+ $entry['shadowWarning']=7;
+
+ if (!sf_ldap_add($dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add LDAP user entry '".
+ $username."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ return true;
+}
+
+/**
+ * sf_ldap_remove_user() - Remove an LDAP user
+ *
+ * @param int The user ID of the user to remove
+ * @returns true on success/false on failure
+ *
+ */
+function sf_ldap_remove_user($user_id) {
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $user = &user_get_object($user_id);
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn;
+
+ if (!sf_ldap_delete($dn)) {
+ sf_ldap_set_error_msg("ERROR: cannot delete LDAP user entry '".
+ $user->getUnixName()."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ return true;
+}
+
+/**
+ * sf_ldap_user_set_attribute() - Set an attribute for a user
+ *
+ * @param int The user ID
+ * @param string The attribute to set
+ * @param string The new value of the attribute
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_user_set_attribute($user_id,$attr,$value) {
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $user = &user_get_object($user_id);
+//echo "sf_ldap_user_set_attribute(".$user->getUnixName().",".$attr.",".$value.")<br>";
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'uid='.$user->getUnixName().',ou=People,'.$sys_ldap_base_dn;
+ $entry[$attr]=$value;
+
+ if (!sf_ldap_modify($dn, $entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot change LDAP attribute '$attr' for user '".
+ $user->getUnixName()."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Group management functions
+ */
+
+/**
+ * sf_ldap_check_group() - Check for the existence of a group
+ *
+ * @param int The ID of the group to check
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_check_group($group_id) {
+ global $ldap_conn;
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $group = &group_get_object($group_id);
+ if (!$group) {
+ sf_ldap_set_error_msg("ERROR: Cannot find group [$group_id]<br>");
+ return false;
+ }
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn;
+ $res=sf_ldap_read($dn, "objectClass=*", array("cn"));
+ if ($res) {
+ ldap_free_result($res);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * sf_ldap_create_group() - Create a group
+ *
+ * @param int The ID of the group to create
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_create_group($group_id) {
+ global $sys_ldap_base_dn;
+ global $GID_ADD;
+ global $ANONCVS_UID_ADD;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $group = &group_get_object($group_id);
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn;
+ $entry['objectClass'][0]='top';
+ $entry['objectClass'][1]='posixGroup';
+ $entry['cn']=$group->getUnixName();
+ $entry['userPassword']='{crypt}x';
+ $entry['gidNumber']=$group->getID() + $GID_ADD;
+
+ $i=0; $i_cvs=0;
+
+ $ret_val=true;
+
+ if (!sf_ldap_add($dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add LDAP group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ // If there's error, that's bad. But don't stop.
+ $ret_val=false;
+ }
+
+ //
+ // Now create CVS group
+ //
+
+ // Add virtual anoncvs user to CVS group
+ $cvs_member_list[$i_cvs++] = 'anoncvs_'.$group->getUnixName();
+
+ $dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn;
+
+ if ($cvs_member_list) {
+ $entry['memberUid']=$cvs_member_list;
+ } else {
+ unset($entry['memberUid']);
+ }
+
+ if (!sf_ldap_add($dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add LDAP CVS group entry '"
+ .$group->getUnixName()."': ".sf_ldap_error()."<br>");
+ $ret_val=false;
+ }
+
+ //
+ // Finally, setup AnonCVS virtual user
+ //
+
+ if (!sf_ldap_check_user_by_name('anoncvs_'.$group->getUnixName())
+ && !sf_ldap_create_user_from_props('anoncvs_'.$group->getUnixName(),
+ 'anoncvs', 'x',
+ '/bin/false', '/bin/false',
+ $group_id+$GID_ADD+$ANONCVS_UID_ADD,
+ $group_id+$GID_ADD)) {
+ sf_ldap_set_error_msg("ERROR: cannot add LDAP AnonCVS user entry '"
+ .$group->getUnixName()."': ".sf_ldap_error()."<br>");
+ $ret_val=false;
+ }
+
+ return $ret_val;
+}
+
+/**
+ * sf_ldap_remove_group() - Remove a group
+ *
+ * @param int The ID of the group to remove
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_remove_group($group_id) {
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $group = &group_get_object($group_id);
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+
+ //
+ // Remove shell LDAP group
+ //
+ $ret_val=true;
+
+ $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn;
+
+ if (!sf_ldap_delete($dn)) {
+ sf_ldap_set_error_msg("ERROR: cannot delete LDAP group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ $ret_val = false;
+ }
+
+ //
+ // Remove CVS LDAP group
+ //
+
+ $dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn;
+
+ if (!sf_ldap_delete($dn)) {
+ sf_ldap_set_error_msg("ERROR: cannot delete LDAP CVS group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ $ret_val = false;
+ }
+
+ //
+ // Remove AnonCVS virtual user
+ //
+
+ $dn = 'uid=anoncvs_'.$group->getUnixName().',ou=People,'.$sys_ldap_base_dn;
+ if (!sf_ldap_delete($dn)) {
+ sf_ldap_set_error_msg("ERROR: cannot delete LDAP AnonCVS user entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ $ret_val = false;
+ }
+
+ return $ret_val;
+}
+
+/**
+ * sf_ldap_group_add_user() - Add a user to an LDAP group
+ *
+ * @param int The ID of the group two which the user will be added
+ * @param int The ID of the user to add
+ * @param bool Only add this user to CVS
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_group_add_user($group_id,$user_id,$cvs_only=0) {
+ global $ldap_conn;
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $group = &group_get_object($group_id);
+ $user = &user_get_object($user_id);
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+ $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn;
+ $cvs_dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn;
+ $entry['memberUid'] = $user->getUnixName();
+
+ //
+ // Check if user already a member of CVS group
+ //
+
+ $res=sf_ldap_read($cvs_dn,"memberUid=".$user->getUnixName(),array("cn"));
+ if ($res && ldap_count_entries($ldap_conn,$res)>0) {
+ //echo "already a member of CVS<br>";
+ } else {
+ //
+ // No, add one
+ //
+
+ if (!sf_ldap_mod_add($cvs_dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add member to LDAP CVS group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ }
+
+ ldap_free_result($res);
+
+ if ($cvs_only) {
+ return true;
+ }
+
+ //
+ // Check if user already a member of shell group
+ //
+ $res = sf_ldap_read($dn, "memberUid=".$user->getUnixName(), array("cn"));
+
+ if ($res && ldap_count_entries($ldap_conn,$res)>0) {
+ //echo "already a member<br>";
+ } else {
+ //
+ // No, add one
+ //
+
+ if (!sf_ldap_mod_add($dn,$entry)) {
+ sf_ldap_set_error_msg("ERROR: cannot add member to LDAP group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."<br>");
+ return false;
+ }
+ }
+
+ ldap_free_result($res);
+
+ return true;
+}
+
+/**
+ * sf_ldap_group_remove_user() - Remove a user from an LDAP group
+ *
+ * @param int The ID of the group from which to remove the user
+ * @param int The ID of the user to remove
+ * @param bool Only remove user from CVS group
+ * @returns true on success/false on error
+ *
+ */
+function sf_ldap_group_remove_user($group_id,$user_id,$cvs_only=0) {
+ global $sys_ldap_base_dn;
+
+ global $sys_use_ldap;
+ if (!$sys_use_ldap) {
+ return true;
+ }
+
+ $group = &group_get_object($group_id);
+ $user = &user_get_object($user_id);
+ if (!sf_ldap_connect()) {
+ return false;
+ }
+
+ $dn = 'cn='.$group->getUnixName().',ou=Group,'.$sys_ldap_base_dn;
+ $cvs_dn = 'cn='.$group->getUnixName().',ou=cvsGroup,'.$sys_ldap_base_dn;
+ $entry['memberUid'] = $user->getUnixName();
+
+ $ret_val=true;
+
+ if (!sf_ldap_mod_del($cvs_dn,$entry) && !sf_ldap_does_not_exist()) {
+ sf_ldap_set_error_msg("ERROR: cannot remove member from LDAP CVS group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."(".sf_ldap_errno().")"."<br>");
+ $ret_val=false;
+ }
+
+ if ($cvs_only) {
+ return $ret_val;
+ }
+
+ if (!sf_ldap_mod_del($dn,$entry) && !sf_ldap_does_not_exist()) {
+ sf_ldap_set_error_msg("ERROR: cannot remove member from LDAP group entry '".
+ $group->getUnixName()."': ".sf_ldap_error()."(".sf_ldap_errno().")"."<br>");
+ $ret_val=false;
+ }
+
+ return $ret_val;
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/session.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/session.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/session.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,468 @@
+<?php
+/**
+ *
+ * SourceForge Session Module
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+/**
+ * A User object if user is logged in
+ *
+ * @var constant $G_SESSION
+ */
+$G_SESSION = false;
+
+/**
+ * session_build_session_cookie() - Construct session cookie for the user
+ *
+ * @param int User_id of the logged in user
+ * @return cookie value
+ */
+function session_build_session_cookie($user_id) {
+
+ $session_serial = $user_id.'-'.time().'-'.$GLOBALS['REMOTE_ADDR'].'-'.$GLOBALS['HTTP_USER_AGENT'];
+ $td = mcrypt_module_open($GLOBALS['sys_session_cypher'], "", $GLOBALS['sys_session_cyphermode'], "");
+ $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
+ mcrypt_generic_init($td, $GLOBALS['sys_session_key'], $iv);
+ $encrypted_session_serial = mcrypt_generic($td, $session_serial);
+ mcrypt_generic_end($td);
+ $session_serial_hash = md5($encrypted_session_serial.$GLOBALS['sys_session_key']);
+ $session_serial_cookie = base64_encode($encrypted_session_serial).'-'.$session_serial_hash;
+
+ return $session_serial_cookie;
+}
+
+/**
+ * session_build_username_cookie() - Construct username cookie
+ *
+ * @param string username of the logged in user
+ * @return cookie value
+ */
+function session_build_username_cookie($username) {
+
+ // check if operating in plaintext or encrytped mode
+ //
+ if ($GLOBALS['sys_username_cookie_plaintext']) {
+
+ return $username;
+
+ } else {
+
+ $td = mcrypt_module_open($GLOBALS['sys_username_cookie_cypher'], "", $GLOBALS['sys_username_cookie_cyphermode'], "");
+ $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
+ mcrypt_generic_init($td, $GLOBALS['sys_username_cookie_key'], $iv);
+ $encrypted_username = mcrypt_generic($td, $username);
+ mcrypt_generic_end($td);
+ $session_username_cookie = base64_encode($encrypted_username);
+
+ return $session_username_cookie;
+
+ } // else
+}
+
+/**
+ * session_get_session_cookie_hash() - Get hash of session cookie
+ *
+ * This hash can be used as a key to identify session, e.g. in DB.
+ *
+ * @param string Value of the session cookie
+ * @return hash
+ */
+function session_get_session_cookie_hash($session_cookie) {
+ list ($junk, $hash) = explode('-', $session_cookie);
+ return $hash;
+}
+
+/**
+ * session_check_session_cookie() - Check that session cookie passed from user is ok
+ *
+ * @param string Value of the session cookie
+ * @return user_id if cookie is ok, false otherwise
+ */
+function session_check_session_cookie($session_cookie) {
+
+ list ($encrypted_session_serial, $hash) = explode('-', $session_cookie);
+ $encrypted_session_serial = base64_decode($encrypted_session_serial);
+ $new_hash = md5($encrypted_session_serial.$GLOBALS['sys_session_key']);
+
+ if ($hash != $new_hash) {
+ return false;
+ }
+
+ $td = mcrypt_module_open($GLOBALS['sys_session_cypher'], "", $GLOBALS['sys_session_cyphermode'], "");
+ $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
+ mcrypt_generic_init($td, $GLOBALS['sys_session_key'], $iv);
+ $session_serial = mdecrypt_generic($td, $encrypted_session_serial);
+ mcrypt_generic_end($td);
+
+ list($user_id, $time, $ip, $user_agent) = explode('-', $session_serial, 4);
+
+ if (!session_check_ip($ip, $GLOBALS['REMOTE_ADDR'])) {
+ return false;
+ }
+ if (trim($user_agent) != $GLOBALS['HTTP_USER_AGENT']) {
+ return false;
+ }
+ if ($time - time() >= $GLOBALS['sys_session_expire']) {
+ return false;
+ }
+
+ return $user_id;
+}
+
+/**
+ * session_logout() - Log the user off the system.
+ *
+ * This function destroys object associated with the current session,
+ * making user "logged out". Deletes both user and session cookies.
+ *
+ * @return true/false
+ *
+ */
+function session_logout() {
+
+ // delete both session and username cookies
+ // NB: cookies must be deleted with the same scope parameters they were set with
+ //
+ session_cookie('session_ser', '');
+ session_cookie('username',
+ '',
+ $GLOBALS['sys_username_cookie_urlspace'],
+ 0);
+
+ return true;
+}
+
+/**
+ * session_login_valid() - Log the user to the system.
+ *
+ * High-level function for user login. Check credentials, and if they
+ * are valid, open new session.
+ *
+ * @param string User name
+ * @param string User password (in clear text)
+ * @param bool Allow login to non-confirmed user account (only for confirmation of the very account)
+ * @return true/false, if false reason is in global $feedback
+ * @access public
+ *
+ */
+function session_login_valid($loginname, $passwd, $allowpending=0) {
+ global $feedback;
+
+ if (!$loginname || !$passwd) {
+ $feedback = 'Missing Password Or users Name';
+ return false;
+ }
+
+ //get the users from the database using user_id and password
+ $res = db_query("
+ SELECT user_id,status
+ FROM users
+ WHERE user_name='$loginname'
+ AND user_pw='".md5($passwd)."'
+ ");
+ if (!$res || db_numrows($res) < 1) {
+ //invalid password or user_name
+ $feedback='Invalid Password or User Name';
+ return false;
+ } else {
+ // check status of this user
+ $usr = db_fetch_array($res);
+
+ // if allowpending (for verify.php) then allow
+ if ($allowpending && ($usr['status'] == 'P')) {
+ //1;
+ } else {
+ if ($usr['status'] == 'S') {
+ //acount suspended
+ $feedback = 'Account Suspended';
+ return false;
+ }
+ if ($usr['status'] == 'P') {
+ //account pending
+ $feedback = 'Account Pending';
+ return false;
+ }
+ if ($usr['status'] == 'D') {
+ //account deleted
+ $feedback = 'Account Deleted';
+ return false;
+ }
+ if ($usr['status'] != 'A') {
+ //unacceptable account flag
+ $feedback = 'Account Not Active';
+ return false;
+ }
+ }
+ //create a new session
+ session_set_new(db_result($res,0,'user_id'));
+
+ return true;
+ }
+}
+
+/**
+ * session_check_ip() - Check 2 IP addresses for match
+ *
+ * This function checks that IP addresses match with the
+ * given fuzz factor (within 255.255.0.0 subnet).
+ *
+ * @param string The old IP address
+ * @param string The new IP address
+ * @return true/false
+ * @access private
+ */
+function session_check_ip($oldip,$newip) {
+ $eoldip = explode(".",$oldip);
+ $enewip = explode(".",$newip);
+
+ // ## require same class b subnet
+ if (($eoldip[0]!=$enewip[0])||($eoldip[1]!=$enewip[1])) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+/**
+ * session_issecure() - Check if current session is secure
+ *
+ * @return true/false
+ * @access public
+ */
+function session_issecure() {
+ return (getenv('SERVER_PORT') == '443');
+}
+
+/**
+ * session_cookie() - Set a session cookie
+ *
+ * Set a cookie with default temporal scope of the current browser session
+ * and URL space of the current webserver
+ *
+ * @param string Name of cookie
+ * @param string Value of cookie
+ * @param string Domain scope (default '')
+ * @param string Expiration time in UNIX seconds (default 0)
+ * @return true/false
+ */
+function session_cookie($name ,$value, $domain = '', $expiration = 0) {
+ setcookie($name, $value, $expiration, '/', $domain, 0);
+}
+
+/**
+ * session_redirect() - Redirect browser within the site
+ *
+ * @param string Absolute path within the site
+ * @return never returns
+ */
+function session_redirect($loc) {
+ header('Location: http' . (session_issecure()?'s':'') . '://' . getenv('HTTP_HOST') . $loc);
+ print("\n\n");
+ exit;
+}
+
+/**
+ * session_require() - Convenience function to easily enforce permissions
+ *
+ * Calling page will terminate with error message if current user
+ * fails checks.
+ *
+ * @param array Associative array specifying criteria
+ * @return does not return if check is failed
+ *
+ */
+function session_require($req) {
+ if (!user_isloggedin()) {
+ exit_not_logged_in();
+ //exit_permission_denied();
+ }
+
+ if ($req['group']) {
+ $group =& group_get_object($req['group']);
+ exit_assert_object($group,'Group');
+
+ $perm =& $group->getPermission( session_get_user() );
+ exit_assert_object($perm,'Permission');
+
+ if ($req['admin_flags']) {
+ //$query .= " AND admin_flags = '$req[admin_flags]'";
+ if (!$perm->isAdmin()) {
+ exit_permission_denied();
+ }
+ } else {
+ if (!$perm->isMember()) {
+ exit_permission_denied();
+ }
+ }
+ } else if ($req['isloggedin']) {
+ //no need to check as long as the check is present at top of function
+ } else {
+ exit_permission_denied();
+ }
+}
+
+/**
+ * session_set_new() - Setup session for the given user
+ *
+ * This function sets up SourceForge session for the given user,
+ * making one be "logged in".
+ *
+ * @param int The user ID
+ * @return none
+ */
+function session_set_new($user_id) {
+ global $G_SESSION;
+
+ // set session cookie
+ //
+ $cookie = session_build_session_cookie($user_id);
+ session_cookie("session_ser", $cookie);
+
+ db_query("
+ INSERT INTO session (session_hash, ip_addr, time, user_id)
+ VALUES (
+ '".session_get_session_cookie_hash($cookie)."',
+ '".$GLOBALS['REMOTE_ADDR']."',
+ '".time()."',
+ $user_id
+ )
+ ");
+
+ // check uniqueness of the session_hash in the database
+ //
+ $res = session_getdata($user_id);
+
+ if (!$res || db_numrows($res) < 1) {
+ exit_error("ERROR","ERROR - Cannot initialize session: ".db_error());
+ } else {
+
+ //set up the new user object
+ //
+ $G_SESSION = user_get_object($user_id,$res);
+ if ($G_SESSION) {
+ $G_SESSION->setLoggedIn(true);
+ }
+ }
+
+ // set username cookie for *.hostname.tld, expiration set in local.inc
+ //
+ session_cookie('username',
+ session_build_username_cookie($G_SESSION->getUnixName()),
+ $GLOBALS['sys_username_cookie_urlspace'],
+ time() + $GLOBALS['sys_username_cookie_expiration']);
+}
+
+/**
+ * Private optimization function for logins - fetches user data, language, and session
+ * with one query
+ *
+ * @param int The user ID
+ * @access private
+ */
+function session_getdata($user_id) {
+ $res=db_query("SELECT
+
+ u.*,sl.language_id, sl.name, sl.filename, sl.classname, sl.language_code
+
+ FROM users u,
+ supported_languages sl
+ WHERE u.language=sl.language_id
+ AND u.user_id='$user_id'
+ ");
+ return $res;
+}
+
+/**
+ * session_set() - Re-initialize session for the logged in user
+ *
+ * This function checks that the user is logged in and if so, initialize
+ * internal session environment.
+ *
+ * @return none
+ */
+function session_set() {
+ global $G_SESSION;
+ global $session_ser, $session_key;
+
+ // assume bad session_hash and session. If all checks work, then allow
+ // otherwise make new session
+ $id_is_good = false;
+
+ // If user says he's logged in (by presenting cookie), check that
+ if ($session_ser) {
+
+ $user_id = session_check_session_cookie($session_ser);
+
+ if ($user_id) {
+
+ $result = session_getdata($user_id);
+
+ if (db_numrows($result) > 0) {
+ $id_is_good = true;
+ }
+ }
+ } // else (hash does not exist) or (session hash is bad)
+
+ if ($id_is_good) {
+ $G_SESSION = user_get_object($user_id, $result);
+ if ($G_SESSION) {
+ $G_SESSION->setLoggedIn(true);
+ }
+ } else {
+ $G_SESSION=false;
+
+ // if there was bad session cookie, kill it and the user cookie
+ //
+ if ($session_ser) {
+ session_logout();
+ }
+ }
+}
+
+/**
+ * session_get_user() - Wrapper function to return the User object for the logged in user.
+ *
+ * @return User
+ * @access public
+ */
+function &session_get_user() {
+ global $G_SESSION;
+ return $G_SESSION;
+}
+
+/**
+ * user_getid()
+ * Get user_id of logged in user
+ */
+
+function user_getid() {
+ global $G_SESSION;
+ if ($G_SESSION) {
+ return $G_SESSION->getID();
+ } else {
+ return false;
+ }
+}
+
+/**
+ * user_isloggedin()
+ * See if user is logged in
+ */
+function user_isloggedin() {
+ global $G_SESSION;
+
+ if ($G_SESSION) {
+ return $G_SESSION->isLoggedIn();
+ } else {
+ return false;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/timezones.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/timezones.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/timezones.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,471 @@
+<?php
+
+$TZs[]='US/Alaska';
+$TZs[]='US/Aleutian';
+$TZs[]='US/Arizona';
+$TZs[]='US/Central';
+$TZs[]='US/Eastern';
+$TZs[]='US/East-Indiana';
+$TZs[]='US/Hawaii';
+$TZs[]='US/Indiana-Starke';
+$TZs[]='US/Michigan';
+$TZs[]='US/Mountain';
+$TZs[]='US/Pacific';
+$TZs[]='US/Samoa';
+$TZs[]='Africa/Abidjan';
+$TZs[]='Africa/Accra';
+$TZs[]='Africa/Addis_Ababa';
+$TZs[]='Africa/Algiers';
+$TZs[]='Africa/Asmera';
+$TZs[]='Africa/Bamako';
+$TZs[]='Africa/Bangui';
+$TZs[]='Africa/Banjul';
+$TZs[]='Africa/Bissau';
+$TZs[]='Africa/Blantyre';
+$TZs[]='Africa/Brazzaville';
+$TZs[]='Africa/Bujumbura';
+$TZs[]='Africa/Cairo';
+$TZs[]='Africa/Casablanca';
+$TZs[]='Africa/Ceuta';
+$TZs[]='Africa/Conakry';
+$TZs[]='Africa/Dakar';
+$TZs[]='Africa/Dar_es_Salaam';
+$TZs[]='Africa/Djibouti';
+$TZs[]='Africa/Douala';
+$TZs[]='Africa/El_Aaiun';
+$TZs[]='Africa/Freetown';
+$TZs[]='Africa/Gaborone';
+$TZs[]='Africa/Harare';
+$TZs[]='Africa/Johannesburg';
+$TZs[]='Africa/Kampala';
+$TZs[]='Africa/Khartoum';
+$TZs[]='Africa/Kigali';
+$TZs[]='Africa/Kinshasa';
+$TZs[]='Africa/Lagos';
+$TZs[]='Africa/Libreville';
+$TZs[]='Africa/Lome';
+$TZs[]='Africa/Luanda';
+$TZs[]='Africa/Lubumbashi';
+$TZs[]='Africa/Lusaka';
+$TZs[]='Africa/Malabo';
+$TZs[]='Africa/Maputo';
+$TZs[]='Africa/Maseru';
+$TZs[]='Africa/Mbabane';
+$TZs[]='Africa/Mogadishu';
+$TZs[]='Africa/Monrovia';
+$TZs[]='Africa/Nairobi';
+$TZs[]='Africa/Ndjamena';
+$TZs[]='Africa/Niamey';
+$TZs[]='Africa/Nouakchott';
+$TZs[]='Africa/Ouagadougou';
+$TZs[]='Africa/Porto-Novo';
+$TZs[]='Africa/Sao_Tome';
+$TZs[]='Africa/Timbuktu';
+$TZs[]='Africa/Tripoli';
+$TZs[]='Africa/Tunis';
+$TZs[]='Africa/Windhoek';
+$TZs[]='America/Adak';
+$TZs[]='America/Anchorage';
+$TZs[]='America/Anguilla';
+$TZs[]='America/Antigua';
+$TZs[]='America/Araguaina';
+$TZs[]='America/Aruba';
+$TZs[]='America/Asuncion';
+$TZs[]='America/Atka';
+$TZs[]='America/Barbados';
+$TZs[]='America/Belem';
+$TZs[]='America/Belize';
+$TZs[]='America/Boa_Vista';
+$TZs[]='America/Bogota';
+$TZs[]='America/Boise';
+$TZs[]='America/Buenos_Aires';
+$TZs[]='America/Cambridge_Bay';
+$TZs[]='America/Cancun';
+$TZs[]='America/Caracas';
+$TZs[]='America/Catamarca';
+$TZs[]='America/Cayenne';
+$TZs[]='America/Cayman';
+$TZs[]='America/Chicago';
+$TZs[]='America/Chihuahua';
+$TZs[]='America/Cordoba';
+$TZs[]='America/Costa_Rica';
+$TZs[]='America/Cuiaba';
+$TZs[]='America/Curacao';
+$TZs[]='America/Dawson';
+$TZs[]='America/Dawson_Creek';
+$TZs[]='America/Denver';
+$TZs[]='America/Detroit';
+$TZs[]='America/Dominica';
+$TZs[]='America/Edmonton';
+$TZs[]='America/El_Salvador';
+$TZs[]='America/Ensenada';
+$TZs[]='America/Fortaleza';
+$TZs[]='America/Fort_Wayne';
+$TZs[]='America/Glace_Bay';
+$TZs[]='America/Godthab';
+$TZs[]='America/Goose_Bay';
+$TZs[]='America/Grand_Turk';
+$TZs[]='America/Grenada';
+$TZs[]='America/Guadeloupe';
+$TZs[]='America/Guatemala';
+$TZs[]='America/Guayaquil';
+$TZs[]='America/Guyana';
+$TZs[]='America/Halifax';
+$TZs[]='America/Havana';
+$TZs[]='America/Hermosillo';
+$TZs[]='America/Indiana/Indianapolis';
+$TZs[]='America/Indiana/Knox';
+$TZs[]='America/Indiana/Marengo';
+$TZs[]='America/Indiana/Vevay';
+$TZs[]='America/Indianapolis';
+$TZs[]='America/Inuvik';
+$TZs[]='America/Iqaluit';
+$TZs[]='America/Jamaica';
+$TZs[]='America/Jujuy';
+$TZs[]='America/Juneau';
+$TZs[]='America/Knox_IN';
+$TZs[]='America/La_Paz';
+$TZs[]='America/Lima';
+$TZs[]='America/Los_Angeles';
+$TZs[]='America/Louisville';
+$TZs[]='America/Maceio';
+$TZs[]='America/Managua';
+$TZs[]='America/Manaus';
+$TZs[]='America/Martinique';
+$TZs[]='America/Mazatlan';
+$TZs[]='America/Mendoza';
+$TZs[]='America/Menominee';
+$TZs[]='America/Mexico_City';
+$TZs[]='America/Miquelon';
+$TZs[]='America/Montevideo';
+$TZs[]='America/Montreal';
+$TZs[]='America/Montserrat';
+$TZs[]='America/Nassau';
+$TZs[]='America/New_York';
+$TZs[]='America/Nipigon';
+$TZs[]='America/Nome';
+$TZs[]='America/Noronha';
+$TZs[]='America/Panama';
+$TZs[]='America/Pangnirtung';
+$TZs[]='America/Paramaribo';
+$TZs[]='America/Phoenix';
+$TZs[]='America/Port-au-Prince';
+$TZs[]='America/Porto_Acre';
+$TZs[]='America/Port_of_Spain';
+$TZs[]='America/Porto_Velho';
+$TZs[]='America/Puerto_Rico';
+$TZs[]='America/Rainy_River';
+$TZs[]='America/Rankin_Inlet';
+$TZs[]='America/Regina';
+$TZs[]='America/Rosario';
+$TZs[]='America/Santiago';
+$TZs[]='America/Santo_Domingo';
+$TZs[]='America/Sao_Paulo';
+$TZs[]='America/Scoresbysund';
+$TZs[]='America/Shiprock';
+$TZs[]='America/St_Johns';
+$TZs[]='America/St_Kitts';
+$TZs[]='America/St_Lucia';
+$TZs[]='America/St_Thomas';
+$TZs[]='America/St_Vincent';
+$TZs[]='America/Swift_Current';
+$TZs[]='America/Tegucigalpa';
+$TZs[]='America/Thule';
+$TZs[]='America/Thunder_Bay';
+$TZs[]='America/Tijuana';
+$TZs[]='America/Tortola';
+$TZs[]='America/Vancouver';
+$TZs[]='America/Virgin';
+$TZs[]='America/Whitehorse';
+$TZs[]='America/Winnipeg';
+$TZs[]='America/Yakutat';
+$TZs[]='America/Yellowknife';
+$TZs[]='Antarctica/Casey';
+$TZs[]='Antarctica/Davis';
+$TZs[]='Antarctica/DumontDUrville';
+$TZs[]='Antarctica/Mawson';
+$TZs[]='Antarctica/McMurdo';
+$TZs[]='Antarctica/Palmer';
+$TZs[]='Antarctica/South_Pole';
+$TZs[]='Antarctica/Syowa';
+$TZs[]='Arctic/Longyearbyen';
+$TZs[]='Asia/Aden';
+$TZs[]='Asia/Almaty';
+$TZs[]='Asia/Amman';
+$TZs[]='Asia/Anadyr';
+$TZs[]='Asia/Aqtau';
+$TZs[]='Asia/Aqtobe';
+$TZs[]='Asia/Ashkhabad';
+$TZs[]='Asia/Baghdad';
+$TZs[]='Asia/Bahrain';
+$TZs[]='Asia/Baku';
+$TZs[]='Asia/Bangkok';
+$TZs[]='Asia/Beirut';
+$TZs[]='Asia/Bishkek';
+$TZs[]='Asia/Brunei';
+$TZs[]='Asia/Calcutta';
+$TZs[]='Asia/Chungking';
+$TZs[]='Asia/Colombo';
+$TZs[]='Asia/Dacca';
+$TZs[]='Asia/Damascus';
+$TZs[]='Asia/Dili';
+$TZs[]='Asia/Dubai';
+$TZs[]='Asia/Dushanbe';
+$TZs[]='Asia/Gaza';
+$TZs[]='Asia/Harbin';
+$TZs[]='Asia/Hong_Kong';
+$TZs[]='Asia/Hovd';
+$TZs[]='Asia/Irkutsk';
+$TZs[]='Asia/Istanbul';
+$TZs[]='Asia/Jakarta';
+$TZs[]='Asia/Jayapura';
+$TZs[]='Asia/Jerusalem';
+$TZs[]='Asia/Kabul';
+$TZs[]='Asia/Kamchatka';
+$TZs[]='Asia/Karachi';
+$TZs[]='Asia/Kashgar';
+$TZs[]='Asia/Katmandu';
+$TZs[]='Asia/Krasnoyarsk';
+$TZs[]='Asia/Kuala_Lumpur';
+$TZs[]='Asia/Kuching';
+$TZs[]='Asia/Kuwait';
+$TZs[]='Asia/Macao';
+$TZs[]='Asia/Magadan';
+$TZs[]='Asia/Manila';
+$TZs[]='Asia/Muscat';
+$TZs[]='Asia/Nicosia';
+$TZs[]='Asia/Novosibirsk';
+$TZs[]='Asia/Omsk';
+$TZs[]='Asia/Phnom_Penh';
+$TZs[]='Asia/Pyongyang';
+$TZs[]='Asia/Qatar';
+$TZs[]='Asia/Rangoon';
+$TZs[]='Asia/Riyadh';
+$TZs[]='Asia/Riyadh87';
+$TZs[]='Asia/Riyadh88';
+$TZs[]='Asia/Riyadh89';
+$TZs[]='Asia/Saigon';
+$TZs[]='Asia/Samarkand';
+$TZs[]='Asia/Seoul';
+$TZs[]='Asia/Shanghai';
+$TZs[]='Asia/Singapore';
+$TZs[]='Asia/Taipei';
+$TZs[]='Asia/Tashkent';
+$TZs[]='Asia/Tbilisi';
+$TZs[]='Asia/Tehran';
+$TZs[]='Asia/Tel_Aviv';
+$TZs[]='Asia/Thimbu';
+$TZs[]='Asia/Tokyo';
+$TZs[]='Asia/Ujung_Pandang';
+$TZs[]='Asia/Ulaanbaatar';
+$TZs[]='Asia/Ulan_Bator';
+$TZs[]='Asia/Urumqi';
+$TZs[]='Asia/Vientiane';
+$TZs[]='Asia/Vladivostok';
+$TZs[]='Asia/Yakutsk';
+$TZs[]='Asia/Yekaterinburg';
+$TZs[]='Asia/Yerevan';
+$TZs[]='Atlantic/Azores';
+$TZs[]='Atlantic/Bermuda';
+$TZs[]='Atlantic/Canary';
+$TZs[]='Atlantic/Cape_Verde';
+$TZs[]='Atlantic/Faeroe';
+$TZs[]='Atlantic/Jan_Mayen';
+$TZs[]='Atlantic/Madeira';
+$TZs[]='Atlantic/Reykjavik';
+$TZs[]='Atlantic/South_Georgia';
+$TZs[]='Atlantic/Stanley';
+$TZs[]='Atlantic/St_Helena';
+$TZs[]='Australia/ACT';
+$TZs[]='Australia/Adelaide';
+$TZs[]='Australia/Brisbane';
+$TZs[]='Australia/Broken_Hill';
+$TZs[]='Australia/Canberra';
+$TZs[]='Australia/Darwin';
+$TZs[]='Australia/Hobart';
+$TZs[]='Australia/LHI';
+$TZs[]='Australia/Lindeman';
+$TZs[]='Australia/Lord_Howe';
+$TZs[]='Australia/Melbourne';
+$TZs[]='Australia/North';
+$TZs[]='Australia/NSW';
+$TZs[]='Australia/Perth';
+$TZs[]='Australia/Queensland';
+$TZs[]='Australia/South';
+$TZs[]='Australia/Sydney';
+$TZs[]='Australia/Tasmania';
+$TZs[]='Australia/Victoria';
+$TZs[]='Australia/West';
+$TZs[]='Australia/Yancowinna';
+$TZs[]='Brazil/Acre';
+$TZs[]='Brazil/DeNoronha';
+$TZs[]='Brazil/East';
+$TZs[]='Brazil/West';
+$TZs[]='Canada/Atlantic';
+$TZs[]='Canada/Central';
+$TZs[]='Canada/Eastern';
+$TZs[]='Canada/East-Saskatchewan';
+$TZs[]='Canada/Mountain';
+$TZs[]='Canada/Newfoundland';
+$TZs[]='Canada/Pacific';
+$TZs[]='Canada/Saskatchewan';
+$TZs[]='Canada/Yukon';
+$TZs[]='CET';
+$TZs[]='Chile/Continental';
+$TZs[]='Chile/EasterIsland';
+$TZs[]='China/Beijing';
+$TZs[]='China/Shanghai';
+$TZs[]='CST6CDT';
+$TZs[]='Cuba';
+$TZs[]='EET';
+$TZs[]='Egypt';
+$TZs[]='Eire';
+$TZs[]='EST';
+$TZs[]='EST5EDT';
+$TZs[]='Europe/Amsterdam';
+$TZs[]='Europe/Andorra';
+$TZs[]='Europe/Athens';
+$TZs[]='Europe/Belfast';
+$TZs[]='Europe/Belgrade';
+$TZs[]='Europe/Berlin';
+$TZs[]='Europe/Bratislava';
+$TZs[]='Europe/Brussels';
+$TZs[]='Europe/Bucharest';
+$TZs[]='Europe/Budapest';
+$TZs[]='Europe/Chisinau';
+$TZs[]='Europe/Copenhagen';
+$TZs[]='Europe/Dublin';
+$TZs[]='Europe/Gibraltar';
+$TZs[]='Europe/Helsinki';
+$TZs[]='Europe/Istanbul';
+$TZs[]='Europe/Kaliningrad';
+$TZs[]='Europe/Kiev';
+$TZs[]='Europe/Lisbon';
+$TZs[]='Europe/Ljubljana';
+$TZs[]='Europe/London';
+$TZs[]='Europe/Luxembourg';
+$TZs[]='Europe/Madrid';
+$TZs[]='Europe/Malta';
+$TZs[]='Europe/Minsk';
+$TZs[]='Europe/Monaco';
+$TZs[]='Europe/Moscow';
+$TZs[]='Europe/Oslo';
+$TZs[]='Europe/Paris';
+$TZs[]='Europe/Prague';
+$TZs[]='Europe/Riga';
+$TZs[]='Europe/Rome';
+$TZs[]='Europe/Samara';
+$TZs[]='Europe/San_Marino';
+$TZs[]='Europe/Sarajevo';
+$TZs[]='Europe/Simferopol';
+$TZs[]='Europe/Skopje';
+$TZs[]='Europe/Sofia';
+$TZs[]='Europe/Stockholm';
+$TZs[]='Europe/Tallinn';
+$TZs[]='Europe/Tirane';
+$TZs[]='Europe/Tiraspol';
+$TZs[]='Europe/Uzhgorod';
+$TZs[]='Europe/Vaduz';
+$TZs[]='Europe/Vatican';
+$TZs[]='Europe/Vienna';
+$TZs[]='Europe/Vilnius';
+$TZs[]='Europe/Warsaw';
+$TZs[]='Europe/Zagreb';
+$TZs[]='Europe/Zaporozhye';
+$TZs[]='Europe/Zurich';
+$TZs[]='Factory';
+$TZs[]='GB';
+$TZs[]='GB-Eire';
+$TZs[]='GMT';
+$TZs[]='GMT0';
+$TZs[]='GMT-0';
+$TZs[]='GMT+0';
+$TZs[]='Greenwich';
+$TZs[]='Hongkong';
+$TZs[]='HST';
+$TZs[]='Iceland';
+$TZs[]='Indian/Antananarivo';
+$TZs[]='Indian/Chagos';
+$TZs[]='Indian/Christmas';
+$TZs[]='Indian/Cocos';
+$TZs[]='Indian/Comoro';
+$TZs[]='Indian/Kerguelen';
+$TZs[]='Indian/Mahe';
+$TZs[]='Indian/Maldives';
+$TZs[]='Indian/Mauritius';
+$TZs[]='Indian/Mayotte';
+$TZs[]='Indian/Reunion';
+$TZs[]='Iran';
+$TZs[]='Israel';
+$TZs[]='Jamaica';
+$TZs[]='Japan';
+$TZs[]='Kwajalein';
+$TZs[]='Libya';
+$TZs[]='MET';
+$TZs[]='Mexico/BajaNorte';
+$TZs[]='Mexico/BajaSur';
+$TZs[]='Mexico/General';
+$TZs[]='Mideast/Riyadh87';
+$TZs[]='Mideast/Riyadh88';
+$TZs[]='Mideast/Riyadh89';
+$TZs[]='MST';
+$TZs[]='MST7MDT';
+$TZs[]='Navajo';
+$TZs[]='NZ';
+$TZs[]='NZ-CHAT';
+$TZs[]='Pacific/Apia';
+$TZs[]='Pacific/Auckland';
+$TZs[]='Pacific/Chatham';
+$TZs[]='Pacific/Easter';
+$TZs[]='Pacific/Efate';
+$TZs[]='Pacific/Enderbury';
+$TZs[]='Pacific/Fakaofo';
+$TZs[]='Pacific/Fiji';
+$TZs[]='Pacific/Funafuti';
+$TZs[]='Pacific/Galapagos';
+$TZs[]='Pacific/Gambier';
+$TZs[]='Pacific/Guadalcanal';
+$TZs[]='Pacific/Guam';
+$TZs[]='Pacific/Honolulu';
+$TZs[]='Pacific/Johnston';
+$TZs[]='Pacific/Kiritimati';
+$TZs[]='Pacific/Kosrae';
+$TZs[]='Pacific/Kwajalein';
+$TZs[]='Pacific/Majuro';
+$TZs[]='Pacific/Marquesas';
+$TZs[]='Pacific/Midway';
+$TZs[]='Pacific/Nauru';
+$TZs[]='Pacific/Niue';
+$TZs[]='Pacific/Norfolk';
+$TZs[]='Pacific/Noumea';
+$TZs[]='Pacific/Pago_Pago';
+$TZs[]='Pacific/Palau';
+$TZs[]='Pacific/Pitcairn';
+$TZs[]='Pacific/Ponape';
+$TZs[]='Pacific/Port_Moresby';
+$TZs[]='Pacific/Rarotonga';
+$TZs[]='Pacific/Saipan';
+$TZs[]='Pacific/Samoa';
+$TZs[]='Pacific/Tahiti';
+$TZs[]='Pacific/Tarawa';
+$TZs[]='Pacific/Tongatapu';
+$TZs[]='Pacific/Truk';
+$TZs[]='Pacific/Wake';
+$TZs[]='Pacific/Wallis';
+$TZs[]='Pacific/Yap';
+$TZs[]='Poland';
+$TZs[]='Portugal';
+$TZs[]='PRC';
+$TZs[]='PST8PDT';
+$TZs[]='ROC';
+$TZs[]='ROK';
+$TZs[]='Singapore';
+$TZs[]='Turkey';
+$TZs[]='UCT';
+$TZs[]='Universal';
+$TZs[]='UTC';
+$TZs[]='WET';
+$TZs[]='W-SU';
+$TZs[]='Zulu';
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/utils.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/utils.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/utils.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,570 @@
+<?php
+/**
+ *
+ * utils.php - Misc utils common to all aspects of the site
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+/**
+ * util_check_fileupload() - determines if a filename is appropriate for upload
+ *
+ * @param string The name of the file being uploaded
+ */
+function util_check_fileupload($filename) {
+
+ /* Empty file is a valid file.
+ This is because this function should be called
+ unconditionally at the top of submit action processing
+ and many forms have optional file upload. */
+ if ($filename == 'none' || $filename == '') {
+ return true;
+ }
+
+ /* This should be enough... */
+ if (!is_uploaded_file($filename)) {
+ return false;
+ }
+ /* This should be enough... */
+ if (!is_uploaded_file($filename)) {
+ return false;
+ }
+ /* ... but we'd rather be paranoic */
+ if (strstr($filename, '..')) {
+ return false;
+ }
+ if (!is_file($filename)) {
+ return false;
+ }
+ if (!file_exists($filename)) {
+ return false;
+ }
+ if (dirname($filename) != '/tmp') {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * util_send_mail() - Send email
+ * This function should be used in place of the PHP mail() function
+ *
+ * @param string The email recipients address
+ * @param string The email subject
+ * @param string The body of the email message
+ * @param string The optional email sender address. Defaults to 'noreply@'
+ * @param string The addresses to blind-carbon-copy this message
+ *
+ */
+function util_send_mail($to,$subject,$body,$from='',$BCC='') {
+ if (!$from) {
+ $from='noreply@'.$GLOBALS['sys_default_domain'];
+ }
+ $body = "To: $to".
+ "\nFrom: $from".
+ "\nBCC: $BCC".
+ "\nSubject: $subject".
+ "\n\n$body";
+
+ exec ("/bin/echo \"". util_prep_string_for_sendmail($body) ."\" | /usr/sbin/sendmail -f$from -t -i >& /dev/null &");
+}
+
+/**
+ * util_prep_string_for_sendmail() - Prepares a string to be sent by email
+ *
+ * @param string The text to be prepared
+ * @returns The prepared text
+ *
+ */
+function util_prep_string_for_sendmail($body) {
+ //$body=str_replace("\\","\\\\",$body);
+ $body=str_replace("`","\\`",$body);
+ $body=str_replace("\"","\\\"",$body);
+ $body=str_replace("\$","\\\$",$body);
+ return $body;
+}
+
+/**
+ * util_unconvert_htmlspecialchars() - Unconverts a string converted with htmlspecialchars()
+ * This function requires PHP 4.0.3 or greater
+ *
+ * @param string The string to unconvert
+ * @returns The unconverted string
+ *
+ */
+function util_unconvert_htmlspecialchars($string) {
+ if (strlen($string) < 1) {
+ return '';
+ } else {
+ $trans = get_html_translation_table(HTMLENTITIES, ENT_QUOTES);
+ $trans = array_flip ($trans);
+ $str = strtr ($string, $trans);
+ return $str;
+ }
+}
+
+/**
+ * util_result_columns_to_assoc() - Takes a result set and turns the column pair into an associative array
+ *
+ * @param string The result set ID
+ * @param int The column key
+ * @param int The optional column value
+ * @returns An associative array
+ *
+ */
+function util_result_columns_to_assoc($result, $col_key=0, $col_val=1) {
+ $rows=db_numrows($result);
+
+ if ($rows > 0) {
+ $arr=array();
+ for ($i=0; $i<$rows; $i++) {
+ $arr[db_result($result,$i,$col_key)]=db_result($result,$i,$col_val);
+ }
+ } else {
+ $arr=array();
+ }
+ return $arr;
+}
+
+/**
+ * util_result_column_to_array() - Takes a result set and turns the optional column into an array
+ *
+ * @param int The result set ID
+ * @param int The column
+ * @resturns An array
+ *
+ */
+function util_result_column_to_array($result, $col=0) {
+ /*
+ Takes a result set and turns the optional column into
+ an array
+ */
+ $rows=db_numrows($result);
+
+ if ($rows > 0) {
+ $arr=array();
+ for ($i=0; $i<$rows; $i++) {
+ $arr[$i]=db_result($result,$i,$col);
+ }
+ } else {
+ $arr=array();
+ }
+ return $arr;
+}
+
+/**
+ * resutl_column_to_array() - DEPRECATED; DO NOT USE!
+ *
+ * @param int The result set ID
+ * @param int The column
+ * @see util_result_column_to_array()
+ * @deprecated
+ *
+ */
+function result_column_to_array($result, $col=0) {
+ /*
+ backwards compatibility
+ */
+ return util_result_column_to_array($result, $col);
+}
+
+/**
+ * util_wrap_find_space() - Find the first space in a string
+ *
+ * @param string The string in which to find the space
+ * @param int The number of characters to wrap - Default is 80
+ * @returns The position of the first space
+ *
+ */
+function util_wrap_find_space($string,$wrap) {
+ //echo"\n";
+ $start=$wrap-5;
+ $try=1;
+ $found=false;
+
+ while (!$found) {
+ //find the first space starting at $start
+ $pos=@strpos($string,' ',$start);
+
+ //if that space is too far over, go back and start more to the left
+ if (($pos > ($wrap+5)) || !$pos) {
+ $try++;
+ $start=($wrap-($try*5));
+ //if we've gotten so far left , just truncate the line
+ if ($start<=10) {
+ return $wrap;
+ }
+ $found=false;
+ } else {
+ $found=true;
+ }
+ }
+
+ return $pos;
+}
+
+/**
+ * util_line_wrap() - Automatically linewrap text
+ *
+ * @param string The text to wrap
+ * @param int The number of characters to wrap - Default is 80
+ * @param string The line break to use - Default is '\n'
+ * @returns The wrapped text
+ *
+ */
+function util_line_wrap ($text, $wrap = 80, $break = "\n") {
+ $paras = explode("\n", $text);
+
+ $result = array();
+ $i = 0;
+ while ($i < count($paras)) {
+ if (strlen($paras[$i]) <= $wrap) {
+ $result[] = $paras[$i];
+ $i++;
+ } else {
+ $pos=util_wrap_find_space($paras[$i],$wrap);
+
+ $result[] = substr($paras[$i], 0, $pos);
+
+ $new = trim(substr($paras[$i], $pos, strlen($paras[$i]) - $pos));
+ if ($new != '') {
+ $paras[$i] = $new;
+ $pos=util_wrap_find_space($paras[$i],$wrap);
+ } else {
+ $i++;
+ }
+ }
+ }
+ return implode($break, $result);
+}
+
+/**
+ * util_make_links() - Turn URL's into HREF's.
+ *
+ * @param string The URL
+ * @returns The HREF'ed URL
+ *
+ */
+function util_make_links ($data='') {
+ if(empty($data)) { return $data; }
+
+ $lines = split("\n",$data);
+ while ( list ($key,$line) = each ($lines)) {
+ // When we come here, we usually have form input
+ // encoded in entities. Our aim is to NOT include
+ // angle brackets in the URL
+ // (RFC2396; http://www.w3.org/Addressing/URL/5.1_Wrappers.html)
+ $line = str_replace('>', "\1", $line);
+ $line = eregi_replace("([ \t]|^)www\."," http://www.",$line);
+ $text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "<a href=\"\\1://\\2\\3\" target=\"_blank\" target=\"_new\">\\1://\\2\\3</a>", $line);
+ $text = eregi_replace("(([a-z0-9_]|\\-|\\.)+@([^[:space:]]*)([[:alnum:]-]))", "<a href=\"mailto:\\1\" target=\"_new\">\\1</a>", $text);
+ $text = str_replace("\1", '>', $text);
+ $newText .= $text;
+ }
+ return $newText;
+}
+
+/**
+ * show_priority_colors_key() - Show the priority colors legend
+ *
+ */
+function show_priority_colors_key() {
+
+ echo '<P><B>Priority Colors:</B><BR>
+
+ <TABLE BORDER=0><TR>';
+
+ for ($i=1; $i<10; $i++) {
+ echo '
+ <TD BGCOLOR="'.get_priority_color($i).'">'.$i.'</TD>';
+ }
+ echo '</tr></table>';
+}
+
+/**
+ * utils_buildcheckboxarray() - Build a checkbox array
+ *
+ * @param int Number of options to be in the array
+ * @param string The name of the checkboxes
+ * @param array An array of boxes to be pre-checked
+ *
+ */
+function utils_buildcheckboxarray($options,$name,$checked_array) {
+ $option_count=count($options);
+ $checked_count=count($checked_array);
+
+ for ($i=1; $i<=$option_count; $i++) {
+ echo '
+ <BR><INPUT type="checkbox" name="'.$name.'" value="'.$i.'"';
+ for ($j=0; $j<$checked_count; $j++) {
+ if ($i == $checked_array[$j]) {
+ echo ' CHECKED';
+ }
+ }
+ echo '> '.$options[$i];
+ }
+}
+
+/**
+ * GraphResult() - Takes a database result set and builds a graph.
+ * The first column should be the name, and the second column should be the values
+ * Be sure to include HTL_Graphs.php before using this function
+ *
+ * @author Tim Perdue tperdue at valinux.com
+ * @param int The databse result set ID
+ * @param string The title of the graph
+ *
+ */
+Function GraphResult($result,$title) {
+ $rows=db_numrows($result);
+
+ if ((!$result) || ($rows < 1)) {
+ echo 'None Found.';
+ } else {
+ $names=array();
+ $values=array();
+
+ for ($j=0; $j<db_numrows($result); $j++) {
+ if (db_result($result, $j, 0) != '' && db_result($result, $j, 1) != '' ) {
+ $names[$j]= db_result($result, $j, 0);
+ $values[$j]= db_result($result, $j, 1);
+ }
+ }
+
+ /*
+ This is another function detailed below
+ */
+ GraphIt($names,$values,$title);
+ }
+}
+
+/**
+ * GraphIt() - Build a graph
+ *
+ * @author Tim Perdue tperdue at valinux.com
+ * @param array An array of names
+ * @param array An array of values
+ * @param string The title of the graph
+ *
+ */
+Function GraphIt($name_string,$value_string,$title) {
+ GLOBAL $HTML;
+
+ $counter=count($name_string);
+
+ /*
+ Can choose any color you wish
+ */
+ $bars=array();
+
+ for ($i = 0; $i < $counter; $i++) {
+ $bars[$i]=$HTML->COLOR_LTBACK1;
+ }
+
+ $counter=count($value_string);
+
+ /*
+ Figure the max_value passed in, so scale can be determined
+ */
+
+ $max_value=0;
+
+ for ($i = 0; $i < $counter; $i++) {
+ if ($value_string[$i] > $max_value) {
+ $max_value=$value_string[$i];
+ }
+ }
+
+ if ($max_value < 1) {
+ $max_value=1;
+ }
+
+ /*
+ I want my graphs all to be 800 pixels wide, so that is my divisor
+ */
+
+ $scale=(400/$max_value);
+
+ /*
+ I create a wrapper table around the graph that holds the title
+ */
+
+ $title_arr=array();
+ $title_arr[]=$title;
+
+ echo html_build_list_table_top ($title_arr);
+ echo '<TR><TD>';
+ /*
+ Create an associate array to pass in. I leave most of it blank
+ */
+
+ $vals = array(
+ 'vlabel'=>'',
+ 'hlabel'=>'',
+ 'type'=>'',
+ 'cellpadding'=>'',
+ 'cellspacing'=>'0',
+ 'border'=>'',
+ 'width'=>'',
+ 'background'=>'',
+ 'vfcolor'=>'',
+ 'hfcolor'=>'',
+ 'vbgcolor'=>'',
+ 'hbgcolor'=>'',
+ 'vfstyle'=>'',
+ 'hfstyle'=>'',
+ 'noshowvals'=>'',
+ 'scale'=>$scale,
+ 'namebgcolor'=>'',
+ 'valuebgcolor'=>'',
+ 'namefcolor'=>'',
+ 'valuefcolor'=>'',
+ 'namefstyle'=>'',
+ 'valuefstyle'=>'',
+ 'doublefcolor'=>'');
+
+ /*
+ This is the actual call to the HTML_Graphs class
+ */
+
+ html_graph($name_string,$value_string,$bars,$vals);
+
+ echo '
+ </TD></TR></TABLE>
+ <!-- end outer graph table -->';
+}
+
+/**
+ * ShowResultSet() - Show a generic result set
+ * Very simple, plain way to show a generic result set
+ *
+ * @param int The result set ID
+ * @param string The title of the result set
+ * @param bool The option to turn URL's into links
+ *
+ */
+Function ShowResultSet($result,$title="Untitled",$linkify=false) {
+ global $group_id,$HTML;
+
+ if ($result) {
+ $rows = db_numrows($result);
+ $cols = db_numfields($result);
+
+ echo '
+ <TABLE BORDER="0" WIDTH="100%">';
+
+ /* Create the title */
+
+ echo '
+ <TR BGCOLOR="'.$HTML->COLOR_HTMLBOX_TITLE.'">
+ <TD COLSPAN="'.$cols.'"><B><FONT COLOR="'. $HTML->FONTCOLOR_HTMLBOX_TITLE .'">'.$title.'</B></TD></TR>';
+
+ /* Create the headers */
+ echo '
+ <tr>';
+ for ($i=0; $i < $cols; $i++) {
+ echo '<td><B>'.db_fieldname($result, $i).'</B></TD>';
+ }
+ echo '</tr>';
+
+ /* Create the rows */
+ for ($j = 0; $j < $rows; $j++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($j) .'">';
+ for ($i = 0; $i < $cols; $i++) {
+ if ($linkify && $i == 0) {
+ $link = '<A HREF="'.$PHP_SELF.'?';
+ $linkend = '</A>';
+ if ($linkify == "bug_cat") {
+ $link .= 'group_id='.$group_id.'&bug_cat_mod=y&bug_cat_id='.db_result($result, $j, 'bug_category_id').'">';
+ } else if($linkify == "bug_group") {
+ $link .= 'group_id='.$group_id.'&bug_group_mod=y&bug_group_id='.db_result($result, $j, 'bug_group_id').'">';
+ } else if($linkify == "patch_cat") {
+ $link .= 'group_id='.$group_id.'&patch_cat_mod=y&patch_cat_id='.db_result($result, $j, 'patch_category_id').'">';
+ } else if($linkify == "support_cat") {
+ $link .= 'group_id='.$group_id.'&support_cat_mod=y&support_cat_id='.db_result($result, $j, 'support_category_id').'">';
+ } else if($linkify == "pm_project") {
+ $link .= 'group_id='.$group_id.'&project_cat_mod=y&project_cat_id='.db_result($result, $j, 'group_project_id').'">';
+ } else {
+ $link = $linkend = '';
+ }
+ } else {
+ $link = $linkend = '';
+ }
+ echo '<td>'.$link . db_result($result, $j, $i) . $linkend.'</td>';
+ }
+ echo '</tr>';
+ }
+ echo '</table>';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * validate_email() - Validate an email address
+ *
+ * @param string The address string to validate
+ * @returns true on success/false on error
+ *
+ */
+function validate_email ($address) {
+ return (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address));
+}
+
+/**
+ * util_is_valid_filename() - Verifies whether a file has a valid filename
+ *
+ * @param string The file to verify
+ * @returns true on success/false on error
+ *
+ */
+function util_is_valid_filename ($file) {
+ if (ereg("[]~`! ~@#\"$%^,&*();=|[{}<>?/]",$file)) {
+ return false;
+ } else {
+ if (strstr($file,'..')) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
+
+/**
+ * valid_hostname() - Validates a hostname string to make sure it doesn't contain invalid characters
+ *
+ * @param string The optional hostname string
+ * @returns true on success/false on failur
+ *
+ */
+function valid_hostname ($hostname = "xyz") {
+
+ //bad char test
+ $invalidchars = eregi_replace("[-A-Z0-9\.]","",$hostname);
+
+ if (!empty($invalidchars)) {
+ return false;
+ }
+
+ //double dot, starts with a . or -
+ if (ereg("\.\.",$hostname) || ereg("^\.",$hostname) || ereg("^\-",$hostname)) {
+ return false;
+ }
+
+ $multipoint = explode(".",$hostname);
+
+ if (!(is_array($multipoint)) || ((count($multipoint) - 1) < 1)) {
+ return false;
+ }
+
+ return true;
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/include/vars.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/include/vars.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/include/vars.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ *
+ * Static variable array definitions.
+ * Note that array keys *cannot* be redefined as values are inserted into
+ * database tables.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+// Note that $LICENSE values are identical in content and order to those
+// listed at: http://opensource.org/licenses/. Note that the trove database
+// should match this list.
+//
+$LICENSE = array();
+
+// OSI licenses
+//
+$LICENSE['gpl'] = 'GNU General Public License (GPL)';
+$LICENSE['lgpl'] = 'GNU Library Public License (LGPL)';
+$LICENSE['bsd'] = 'BSD License';
+$LICENSE['mit'] = 'MIT License';
+$LICENSE['artistic'] = 'Artistic License';
+$LICENSE['mpl'] = 'Mozilla Public License 1.0 (MPL)';
+$LICENSE['qpl'] = 'Qt Public License (QPL)';
+$LICENSE['ibm'] = 'IBM Public License';
+$LICENSE['cvw'] = 'MITRE Collaborative Virtual Workspace License (CVW License)';
+$LICENSE['rscpl'] = 'Ricoh Source Code Public License';
+$LICENSE['python'] = 'Python License';
+$LICENSE['zlib'] = 'zlib/libpng License';
+$LICENSE['apache'] = 'Apache Software License';
+$LICENSE['vovida'] = 'Vovida Software License 1.0';
+$LICENSE['sissl'] = 'Sun Internet Standards Source License (SISSL)';
+$LICENSE['iosl'] = 'Intel Open Source License';
+$LICENSE['mpl11'] = 'Mozilla Public License 1.1 (MPL 1.1)';
+$LICENSE['jabber'] = 'Jabber Open Source License';
+$LICENSE['nokia'] = 'Nokia Open Source License';
+$LICENSE['sleepycat'] = 'Sleepycat License';
+$LICENSE['nethack'] = 'Nethack General Public License';
+$LICENSE['ibmcpl'] = 'IBM Common Public License';
+$LICENSE['apsl'] = 'Apple Public Source License';
+
+// non-OSI
+//
+$LICENSE['public'] = 'Public Domain';
+$LICENSE['website'] = 'Website Only';
+$LICENSE['other'] = 'Other/Proprietary License';
+
+// shell binary options
+//
+$SHELLS = array();
+$SHELLS[1] = '/bin/bash';
+$SHELLS[2] = '/bin/sh';
+$SHELLS[3] = '/bin/ksh';
+$SHELLS[4] = '/bin/tcsh';
+$SHELLS[5] = '/bin/csh';
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/pm/pm_data.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/pm/pm_data.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/pm/pm_data.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,616 @@
+<?php
+/**
+ * pm_data.php - Project Manager function library
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: pm_data.php,v 1.5 2001/06/06 21:38:46 dbrogdon Exp $
+ *
+ */
+
+/**
+ * pm_data_get_tasks() - Return a result set of the 100 most recent tasks in this subproject
+ *
+ * @param int The ID of the project group
+ * @returns Database result set
+ *
+ */
+function pm_data_get_tasks ($group_project_id) {
+ global $pm_data_tasks;
+ if (!$pm_data_tasks["$group_project_id"]) {
+ $sql="SELECT project_task_id,summary ".
+ "FROM project_task ".
+ "WHERE group_project_id='$group_project_id' ".
+ "AND status_id <> '3' ORDER BY project_task_id DESC";
+ $pm_data_tasks["$group_project_id"]=db_query($sql,100);
+ }
+ return $pm_data_tasks["$group_project_id"];
+}
+
+/**
+ * pm_data_get_subprojects() - Return a result set of subprojects for this group
+ *
+ * @param int The ID of the group
+ * @returns Database result set
+ *
+ */
+function pm_data_get_subprojects ($group_id) {
+ global $pm_data_subprojects;
+ if (!$pm_data_subprojects["$group_id"]) {
+ $sql="SELECT group_project_id,project_name ".
+ "FROM project_group_list WHERE group_id='$group_id'";
+ $pm_data_subprojects["$group_id"]=db_query($sql);
+ }
+ return $pm_data_subprojects["$group_id"];
+}
+
+/**
+ * pm_data_get_other_tasks() - Return a result set of tasks in this subproject that do not equal
+ * the passed in task_id
+ *
+ * @param int The ID of the project group
+ * @param int The ID of the task
+ * @returns Database result set
+ *
+ */
+function pm_data_get_other_tasks ($group_project_id,$project_task_id) {
+ $sql="SELECT project_task_id,summary ".
+ "FROM project_task ".
+ "WHERE group_project_id='$group_project_id' ".
+ "AND status_id <> '3' ".
+ "AND project_task_id <> '$project_task_id' ORDER BY project_task_id DESC";
+ return db_query($sql,100);
+}
+
+/**
+ * pm_data_get_technicians() - Return a result set of pm technicians in this group
+ *
+ * @param int The ID of the group
+ * @returns Datbase result set
+ *
+ */
+function pm_data_get_technicians ($group_id) {
+ global $pm_data_technicians;
+ if (!$pm_data_technicians["$group_id"]) {
+ $sql="SELECT users.user_id,users.user_name ".
+ "FROM users,user_group ".
+ "WHERE users.user_id=user_group.user_id ".
+ "AND user_group.group_id='$group_id' ".
+ "AND user_group.project_flags IN (1,2) ".
+ "ORDER BY users.user_name";
+ $pm_data_technicians["$group_id"]=db_query($sql);
+ }
+ return $pm_data_technicians["$group_id"];
+}
+
+/**
+ * pm_data_get_dependent_tasks() - Return result set of ids of tasks that are dependent on this task
+ *
+ * @param int The project task ID
+ * @returns Database result set
+ *
+ */
+function pm_data_get_dependent_tasks ($project_task_id) {
+ $sql="SELECT is_dependent_on_task_id ".
+ "FROM project_dependencies ".
+ "WHERE project_task_id='$project_task_id'";
+ return db_query($sql);
+}
+
+/**
+ * pm_data_get_assigned_to() - Return result set of user_ids that are assigned this task
+ *
+ * @param int The project task ID
+ * @returns Database result set
+ *
+ */
+function pm_data_get_assigned_to ($project_task_id) {
+ $sql="SELECT assigned_to_id ".
+ "FROM project_assigned_to ".
+ "WHERE project_task_id='$project_task_id'";
+ return db_query($sql);
+}
+
+/**
+ * pm_data_get_statuses() - Return result set of statuses
+ *
+ * @returns Database result set
+ *
+ */
+function pm_data_get_statuses () {
+ global $pm_data_statuses;
+ if (!$pm_data_statuses) {
+ $sql='SELECT * FROM project_status';
+ $pm_data_statuses=db_query($sql);
+ }
+ return $pm_data_statuses;
+}
+
+/**
+ * pm_data_get_status_name() - Simply return status_name from bug_status
+ *
+ * @param string Status ID
+ * @returns Databse result set on success/Error string on error
+ *
+ */
+function pm_data_get_status_name($string) {
+ $sql="SELECT * FROM project_status WHERE status_id='$string'";
+ $result=db_query($sql);
+ if ($result && db_numrows($result) > 0) {
+ return db_result($result,0,'status_name');
+ } else {
+ return 'Error - Not Found';
+ }
+}
+
+/**
+ * pm_data_get_group_name() - Simply return the resolution name for this id
+ *
+ * @param int The group project ID
+ * @returns Database result set on success/Error string one rror
+ *
+ */
+function pm_data_get_group_name($group_project_id) {
+ $sql="SELECT * FROM project_group_list WHERE group_project_id='$group_project_id'";
+ $result=db_query($sql);
+ if ($result && db_numrows($result) > 0) {
+ return db_result($result,0,'project_name');
+ } else {
+ return 'Error - Not Found';
+ }
+}
+
+/**
+ * pm_data_create_history() - Handle the insertion of history for these parameters
+ *
+ * @param string The field name
+ * @param string The old value
+ * @param int The project task ID
+ * @returns true on success/false on error
+ *
+ */
+function pm_data_create_history ($field_name,$old_value,$project_task_id) {
+ global $feedback;
+
+ $sql="insert into project_history(project_task_id,field_name,old_value,mod_by,date) ".
+ "VALUES ('$project_task_id','$field_name','$old_value','".user_getid()."','".time()."')";
+ $result=db_query($sql);
+ if (!$result) {
+ $feedback .= ' ERROR IN AUDIT TRAIL - '.db_error();
+ return false;
+ } else {
+ return true;
+ }
+}
+
+/**
+ * pm_data_insert_assigned_to() - Insert the people this task is assigned to
+ *
+ * @param array An array of project ID's
+ * @param int The project task ID
+ * @returns true on success/false on error
+ *
+ */
+function pm_data_insert_assigned_to($array,$project_task_id) {
+ global $feedback;
+
+ $user_count=count($array);
+ if ($user_count < 1) {
+ //if no users selected, insert user "none"
+ $sql="INSERT INTO project_assigned_to (project_task_id,assigned_to_id)
+ VALUES ('$project_task_id','100')";
+ $result=db_query($sql);
+ if (!$result) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ for ($i=0; $i<$user_count; $i++) {
+ if (($user_count > 1) && ($array[$i]==100)) {
+ //don't insert the row if there's more
+ //than 1 item selected and this item is the "none user"
+ } else {
+ $sql="INSERT INTO project_assigned_to (project_task_id,assigned_to_id)
+ VALUES ('$project_task_id','$array[$i]')";
+ //echo "\n$sql";
+ $result=db_query($sql);
+ if (!$result) {
+ $feedback .= ' ERROR inserting project_assigned_to '.db_error();
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+}
+
+/**
+ * pm_data_update_assigned_to() - Delete then Insert the people this task is assigned to
+ *
+ * @param array An array of project ID's
+ * @param int The project task ID
+ * @returns Return value of pm_data_insert_assigned_to()
+ * @see pm_data_insert_assigned_do()
+ *
+ */
+function pm_data_update_assigned_to($array,$project_task_id) {
+ $toss=db_query("DELETE FROM project_assigned_to WHERE project_task_id='$project_task_id'");
+ return pm_data_insert_assigned_to($array,$project_task_id);
+}
+
+/**
+ * pm_data_insert_dependent_tasks() - Insert the list of dependencies
+ *
+ * @param array An array of project ID's
+ * @param int The project task ID
+ * @returns true on success/false on error
+ *
+ */
+function pm_data_insert_dependent_tasks($array,$project_task_id) {
+ global $feedback;
+
+ $depend_count=count($array);
+ if ($depend_count < 1) {
+ //if no tasks selected, insert task "none"
+ $sql="INSERT INTO project_dependencies (project_task_id,is_dependent_on_task_id)
+ VALUES ('$project_task_id','100')";
+ $result=db_query($sql);
+ if (!$result) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ for ($i=0; $i<$depend_count; $i++) {
+ if (($depend_count > 1) && ($array[$i]==100)) {
+ //don't insert the row if there's more
+ //than 1 item selected and this item is the "none task"
+ } else {
+ $sql="INSERT INTO project_dependencies (project_task_id,is_dependent_on_task_id)
+ VALUES ('$project_task_id','$array[$i]')";
+ //echo "\n$sql";
+ $result=db_query($sql);
+
+ if (!$result) {
+ $feedback .= ' ERROR inserting dependent_tasks '.db_error();
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+}
+
+/**
+ * pm_data_update_dependend_tasks() - Delete then Insert the list of dependencies
+ *
+ * @param array An array of project ID's
+ * @param int The project task ID
+ * @returns true on success/false on error
+ *
+ */
+function pm_data_update_dependent_tasks($array,$project_task_id) {
+ $toss=db_query("DELETE FROM project_dependencies WHERE project_task_id='$project_task_id'");
+ return pm_data_insert_dependent_tasks($array,$project_task_id);
+}
+
+/**
+ * pm_data_create_task() - Creates a new task in the task mgr
+ * NOTE: Does no handle security!!
+ *
+ * @param int The group project ID
+ * @param int The starting month
+ * @param int The starting day
+ * @param int The ending month
+ * @param int The ending day
+ * @param int The ending year
+ * @param string The task summary
+ * @param string Details of the task
+ * @param int The completed percentage of the task
+ * @param int The task priority
+ * @param int The number of hours exptected to complete this task
+ * @param int The user ID of the person to which this task is assigned
+ * @param int on The task ID on which this task depends
+ * @returns Nnew project_task_id or false and $feedback
+ *
+ */
+function pm_data_create_task ($group_project_id,$start_month,$start_day,$start_year,$end_month,$end_day,
+ $end_year,$summary,$details,$percent_complete,$priority,$hours,$assigned_to,$dependent_on) {
+
+ global $feedback;
+ if (!$group_project_id || !$start_month || !$start_day || !$start_year || !$end_month || !$end_day ||
+ !$end_year || !$summary || !$details || !$priority) {
+ $feedback .= ' ERROR - Missing Required Parameters ';
+ return false;
+ }
+
+ if (mktime(0,0,0,$start_month,$start_day,$start_year) > mktime(0,0,0,$end_month,$end_day,$end_year)) {
+ exit_error('Error','End Date Must Be Greater Than Begin Date');
+ }
+
+ $sql="INSERT INTO project_task (group_project_id,summary,details,percent_complete,".
+ "priority,hours,start_date,end_date,".
+ "created_by,status_id) VALUES ('$group_project_id','".htmlspecialchars($summary)."',".
+ "'".htmlspecialchars($details)."','$percent_complete','$priority','$hours','".
+ mktime(0,0,0,$start_month,$start_day,$start_year)."','".
+ mktime(0,0,0,$end_month,$end_day,$end_year)."','".user_getid()."','1')";
+
+ db_begin();
+
+ $result=db_query($sql);
+ $project_task_id=db_insertid($result,'project_task','project_task_id');
+
+ if (!$result || !$project_task_id) {
+ $feedback .= ' ERROR INSERTING ROW '.db_error();
+ db_rollback();
+ return false;
+ } else {
+ $feedback .= ' Successfully added task ';
+ if (!pm_data_insert_assigned_to($assigned_to,$project_task_id)) {
+ db_rollback();
+ $feedback .= ' ERROR inserting assigned to ';
+ return false;
+ }
+ if (!pm_data_insert_dependent_tasks($dependent_on,$project_task_id)) {
+ db_rollback();
+ $feedback .= ' ERROR inserting assigned to ';
+ return false;
+ }
+ mail_followup($project_task_id,$group_project_id,1);
+ db_commit();
+ return $project_task_id;
+ }
+}
+
+/**
+ * pm_data_update_task() - Update a task
+ * NOTE: Does not handle security at this time!
+ * This assumes that you have verified this $group_project_id truly belongs to this $group_id
+ * AND that this user is a project_task_admin
+ *
+ * @param int The group project ID
+ * @param int The starting month
+ * @param int The starting day
+ * @param int The ending month
+ * @param int The ending day
+ * @param int The ending year
+ * @param string The task summary
+ * @param string Details of the task
+ * @param int The completed percentage of the task
+ * @param int The task priority
+ * @param int The number of hours exptected to complete this task
+ * @param int The user ID of the person to which this task is assigned
+ * @param int The task ID on which this task depends
+ * @returns Nnew project_task_id or false and $feedback
+ * @returns true/false and $feedback string
+ *
+ */
+function pm_data_update_task ($group_project_id,$project_task_id,$start_month,$start_day,$start_year,
+ $end_month,$end_day,$end_year,$summary,$details,$percent_complete,$priority,$hours,
+ $status_id,$assigned_to,$dependent_on,$new_group_project_id,$group_id) {
+
+ global $feedback;
+ if (!$group_project_id || !$project_task_id || !$status_id || !$start_month || !$start_day || !$start_year ||
+ !$end_month || !$end_day || !$end_year || !$summary || !$priority || !$new_group_project_id || !$group_id) {
+ $feedback .= ' ERROR - Missing Parameters ';
+ return false;
+ }
+ $sql="SELECT * FROM project_task WHERE project_task_id='$project_task_id' AND group_project_id='$group_project_id'";
+
+ $result=db_query($sql);
+
+ if (db_numrows($result) < 1) {
+ $feedback .= ' ERROR - Task Doesn\'t Exist In This Subproject ';
+ return false;
+ }
+
+ /*
+ Enforce start date > end date
+ */
+ if (mktime(0,0,0,$start_month,$start_day,$start_year) > mktime(0,0,0,$end_month,$end_day,$end_year)) {
+ $feedback .= ' ERROR - End Date Must Be Greater Than Start Date ';
+ return false;
+ }
+
+ db_begin();
+
+ /*
+ If changing subproject, verify the new subproject belongs to this project
+ */
+ if ($group_project_id != $new_group_project_id) {
+ $sql = "SELECT group_id FROM project_group_list WHERE group_project_id='$new_group_project_id'";
+
+ if (db_result(db_query($sql),0,'group_id') != $group_id) {
+ $feedback .= ' You can not put this task into the subproject of another group. ';
+ db_rollback();
+ return false;
+ } else {
+ pm_data_create_history ('subproject_id',$group_project_id,$project_task_id);
+ }
+ }
+
+ /*
+ See which fields changed during the modification
+ and create audit trail
+ */
+
+ if (db_result($result,0,'status_id') != $status_id)
+ { pm_data_create_history ('status_id',db_result($result,0,'status_id'),$project_task_id); }
+
+ if (db_result($result,0,'priority') != $priority)
+ { pm_data_create_history ('priority',db_result($result,0,'priority'),$project_task_id); }
+
+ if (db_result($result,0,'summary') != htmlspecialchars(stripslashes($summary)))
+ { pm_data_create_history ('summary',addslashes(db_result($result,0,'summary')),$project_task_id); }
+
+ if (db_result($result,0,'percent_complete') != $percent_complete)
+ { pm_data_create_history ('percent_complete',db_result($result,0,'percent_complete'),$project_task_id); }
+
+ if (db_result($result,0,'hours') != $hours)
+ { pm_data_create_history ('hours',db_result($result,0,'hours'),$project_task_id); }
+
+ if (db_result($result,0,'start_date') != mktime(0,0,0,$start_month,$start_day,$start_year))
+ { pm_data_create_history ('start_date',db_result($result,0,'start_date'),$project_task_id); }
+
+ if (db_result($result,0,'end_date') != mktime(0,0,0,$end_month,$end_day,$end_year))
+ { pm_data_create_history ('end_date',db_result($result,0,'end_date'),$project_task_id); }
+
+ /*
+ Details field is handled a little differently
+
+ Details are comments attached to bugs
+ They are still stored in the project_history (audit trail)
+ system, but they are not shown in the regular audit trail
+
+ Someday, these should technically be split into their own table.
+ */
+ if ($details != '')
+ { pm_data_create_history ('details',htmlspecialchars($details),$project_task_id); }
+
+ if (!pm_data_update_dependent_tasks($dependent_on,$project_task_id)) {
+ db_rollback();
+ $feedback .= ' ERROR updating dependent tasks ';
+ return false;
+ }
+ if (!pm_data_update_assigned_to($assigned_to,$project_task_id)) {
+ db_rollback();
+ $feedback .= ' ERROR updating assigned to ';
+ return false;
+ }
+
+ /*
+ Update the actual db record
+ */
+ $sql="UPDATE project_task SET status_id='$status_id', priority='$priority',".
+ "summary='".htmlspecialchars($summary)."',start_date='".
+ mktime(0,0,0,$start_month,$start_day,$start_year)."',end_date='".
+ mktime(0,0,0,$end_month,$end_day,$end_year)."',hours='$hours',".
+ "percent_complete='$percent_complete', ".
+ "group_project_id='$new_group_project_id' ".
+ "WHERE project_task_id='$project_task_id' AND group_project_id='$group_project_id'";
+
+ $result=db_query($sql);
+ if (!$result) {
+ $feedback .= ' ERROR - Database Update Failed '.db_error();
+ db_rollback();
+ return false;
+ } else {
+ $feedback .= ' Successfully Modified Task ';
+ mail_followup($project_task_id,$new_group_project_id);
+ db_commit();
+ return true;
+ }
+
+}
+
+/**
+ * mail_followup() - Send a message to the person who opened this task and the person(s) it is assigned to
+ * Accepts the unique id of a task, its group project id and optionally a list of additional addresses to send to
+ *
+ * @param int The project task ID
+ * @param int The group project ID
+ * @param string The additional addresses to send the followup
+ * @param bool The flag of whether this is a new task or not
+ *
+ */
+function mail_followup($project_task_id,$group_project_id,$more_addresses=false,$new_task=0) {
+ global $sys_datefmt,$feedback;
+
+ $sql="SELECT project_task.*, project_group_list.*, groups.group_name,groups.new_task_address, ".
+ "groups.send_all_tasks,project_status.status_name,users.email, ".
+ "users.user_name AS creator_name ".
+ "FROM project_task,project_group_list,project_status,users,groups ".
+ "WHERE project_task_id='$project_task_id' ".
+ "AND project_task.group_project_id='$group_project_id' ".
+ "AND project_task.status_id=project_status.status_id ".
+ "AND project_task.group_project_id=project_group_list.group_project_id ".
+ "AND groups.group_id=project_group_list.group_id ".
+ "AND project_task.created_by=users.user_id";
+
+ $result=db_query($sql);
+
+ if ($result && db_numrows($result) > 0) {
+
+ // Send a message to the task creator
+ $to = db_result($result,0,'email');
+
+ // Build the list of developers assigned this task
+ $sql="SELECT users.email AS Email,users.user_name ".
+ "FROM users,project_assigned_to ".
+ "WHERE project_assigned_to.project_task_id='$project_task_id' ".
+ "AND users.user_id=project_assigned_to.assigned_to_id";
+
+ $result3=db_query($sql);
+ $rows=db_numrows($result3);
+ if ($result3 && $rows > 0) {
+ $to .= ', ' . implode(result_column_to_array($result3),', ');
+ $assignees = implode(result_column_to_array($result3, 1),', ');
+ }
+
+ $body = "Task #".db_result($result,0,"project_task_id")." has been updated. ".
+ "\n\nProject: ".db_result($result,0,'group_name').
+ "\nSubproject: ".db_result($result,0,'project_name').
+ "\nSummary: ".util_unconvert_htmlspecialchars(db_result($result,0,'summary')).
+ "\nComplete: ".db_result($result,0,'percent_complete')."%".
+ "\nStatus: ".db_result($result,0,'status_name').
+ "\nAuthority : ".db_result($result,0,'creator_name').
+ "\nAssigned to: ".$assignees.
+ "\n\nDescription: ".db_result($result,0,'details');
+
+ /*
+ Now get the followups to this task
+ */
+ $sql="SELECT project_history.field_name,project_history.old_value,project_history.date,users.user_name ".
+ "FROM project_history,users ".
+ "WHERE project_history.mod_by=users.user_id AND project_history.field_name = 'details' ".
+ "AND project_task_id='$project_task_id' ORDER BY project_history.date DESC";
+ $result2=db_query($sql);
+ $rows=db_numrows($result2);
+ if ($result2 && $rows > 0) {
+ $body .= "\n\nFollow-Ups:";
+ for ($i=0; $i<$rows;$i++) {
+ $body .= "\n\n-------------------------------------------------------";
+ $body .= "\nDate: ".date($sys_datefmt,db_result($result2,$i,'date'));
+ $body .= "\nBy: ".db_result($result2,$i,'user_name');
+ $body .= "\n\nComment:\n".util_unconvert_htmlspecialchars(db_result($result2,$i,'old_value'));
+ }
+ }
+ $body .= "\n\n-------------------------------------------------------".
+ "\nFor more info, visit:".
+ "\n\nhttp://$GLOBALS[sys_default_domain]/pm/task.php?func=detailtask&project_task_id=".
+ db_result($result,0,'project_task_id')."&group_id=".
+ db_result($result,0,'group_id')."&group_project_id=".db_result($result,0,'group_project_id');
+
+ $subject="[Task #".db_result($result,0,'project_task_id').'] '.
+ util_unconvert_htmlspecialchars(db_result($result,0,'summary'));
+
+
+ // Append the list of additional receiptients
+ if ($more_addresses) {
+ $to .= ', ' . $more_addresses;
+ }
+
+ // If this is a new task, or if send all tasks == 1,
+ // append the new_task_address for the group
+ if (($new_task && db_result($result,0,'new_task_address')) || db_result($result,0,'send_all_tasks')) {
+ $to .= ', ' . db_result($result,0,'new_task_address');
+ }
+
+ $more='From: noreply@'.$GLOBALS['sys_default_domain'];
+
+ mail($to,$subject,$body,$more);
+
+ $feedback .= " Task Update Sent ";
+
+ } else {
+
+ $feedback .= " Could Not Send Task Update ";
+ echo db_error();
+
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifact.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifact.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifact.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,1026 @@
+<?php
+/**
+ *
+ * Artifact.class - Main Artifact class
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class Artifact extends Error {
+
+ /**
+ * Resource ID
+ *
+ * @var int $status_res
+ */
+ var $status_res;
+
+ /**
+ * Artifact Type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType;
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * Array of ArtifactFile objects
+ *
+ * @var array $files
+ */
+ var $files;
+
+ /**
+ * Artifact() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object The artifact type object
+ * @param integer (primary key from database OR complete assoc array)
+ * ONLY OPTIONAL WHEN YOU PLAN TO IMMEDIATELY CALL ->create()
+ * @return true/false
+ */
+ function Artifact(&$ArtifactType, $data=false) {
+ $this->Error();
+
+ $this->ArtifactType =& $ArtifactType;
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('Artifact: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('Artifact: '.$ArtifactType->getErrorMessage());
+ return false;
+ }
+
+ //
+ // make sure this person has permission to view artifacts
+ //
+ if (!$this->ArtifactType->userCanView()) {
+ $this->setError('Artifact: Only Group Members Can View Private ArtifactTypes');
+ return false;
+ }
+
+ //
+ // set up data structures
+ //
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ } else {
+ $this->setError('No ID Present');
+ }
+ }
+
+
+ /**
+ * create() - construct a new Artifact in the database
+ *
+ * @param int The category ID
+ * @param int The artifact group ID
+ * @param string The artifact summary
+ * @param string Details of the artifact
+ * @param int The ID of the user to which this artifact is to be assigned
+ * @param int The artifacts priority
+ * @return id on success / false on failure
+ */
+ function create($category_id, $artifact_group_id, $summary, $details, $assigned_to=100, $priority=5, $monitor_email=false) {
+
+ //
+ // make sure this person has permission to add artifacts
+ //
+ if (!$this->ArtifactType->isPublic()) {
+ //
+ // Only admins can post/modify private artifacts
+ //
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Artifact: Only Artifact Admins Can Modify Private ArtifactTypes');
+ return false;
+ }
+ }
+
+ //
+ // get the user_id
+ //
+ if (user_isloggedin()) {
+ $user=user_getid();
+ } else {
+ if ($this->ArtifactType->allowsAnon()) {
+ $user=100;
+ } else {
+ $this->setError('Artifact: This ArtifactType Does Not Allow Anonymous Submissions. Please Login.');
+ return false;
+ }
+ }
+
+ //
+ // data validation
+ //
+ if (!$summary) {
+ $this->setError('Artifact: Message Summary Is Required');
+ return false;
+ }
+ if (!$details) {
+ $this->setError('Artifact: Message Body Is Required');
+ return false;
+ }
+ if (!$assigned_to) {
+ if ($category_id == 100) {
+ $assigned_to=100;
+ } else {
+ //create an ArtifactCategory to determine who to auto-assign to
+ $ac=new ArtifactCategory($this->ArtifactType,$category_id);
+ if (!$ac || !is_object($ac) || $ac->isError()) {
+ $assigned_to=100;
+ } else {
+ $assigned_to=$ac->getAssignee();
+ }
+ }
+ }
+ if ($assigned_to==100 && $category_id != 100) {
+ //create an ArtifactCategory to determine who to auto-assign to
+ $ac=new ArtifactCategory($this->ArtifactType,$category_id);
+ if (!$ac || !is_object($ac) || $ac->isError()) {
+ $assigned_to=100;
+ } else {
+ $assigned_to=$ac->getAssignee();
+ }
+ }
+ if (!$priority) {
+ $priority=5;
+ }
+ if (!$category_id) {
+ $category_id=100;
+ }
+ if (!$artifact_group_id) {
+ $artifact_group_id=100;
+ }
+ if (!$resolution_id) {
+ $resolution_id=100;
+ }
+
+ db_begin();
+
+ //
+ // Check to see if this idiot user is trying to double-submit
+ //
+ $res=db_query("SELECT * FROM artifact
+ WHERE summary='$summary'
+ AND submitted_by='$user'
+ AND open_date > '". (time() - 86400) ."'");
+ if ($res && db_numrows($res) > 0) {
+ $this->setError("You Attempted To Double-submit this item. Please avoid double-clicking.");
+ db_rollback();
+ return false;
+ }
+
+ $res=db_query("INSERT INTO artifact
+ (group_artifact_id,status_id,category_id,artifact_group_id,priority,
+ submitted_by,assigned_to,open_date,summary,details,resolution_id)
+ VALUES
+ ('".$this->ArtifactType->getID()."','1','$category_id','$artifact_group_id',
+ '$priority','$user','$assigned_to','". time() ."','".
+ htmlspecialchars($summary)."','". htmlspecialchars($details)."','$resolution_id')");
+
+ $artifact_id=db_insertid($res,'artifact','artifact_id');
+
+ if (!$res || !$artifact_id) {
+ $this->setError('Artifact: '.db_error());
+ db_rollback();
+ return false;
+ } else {
+ //
+ // Now set up our internal data structures
+ //
+ if (!$this->fetchData($artifact_id)) {
+ db_rollback();
+ return false;
+ }
+
+ //
+ // now send an email if appropriate
+ //
+ $this->mailFollowup(1);
+ db_commit();
+ $this->clearError();
+
+ //
+ // Set up monitoring for the user if requested
+ //
+ if ($monitor_email) {
+ $this->setMonitor($monitor_email);
+ }
+ return $artifact_id;
+ }
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this Artifact from the database
+ *
+ * @param int The artifact ID
+ * @return true/false
+ */
+ function fetchData($artifact_id) {
+ $res=db_query("SELECT * FROM artifact_vw
+ WHERE artifact_id='$artifact_id' AND group_artifact_id='".$this->ArtifactType->getID()."'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('Artifact: Invalid ArtifactID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifactType() - get the ArtifactType Object this Artifact is associated with
+ *
+ * @return ArtifactType
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+
+ /**
+ * getID() - get this ArtifactID
+ *
+ * @return the group_artifact_id #
+ */
+ function getID() {
+ return $this->data_array['artifact_id'];
+ }
+
+ /**
+ * getStatusID() - get open/closed/deleted flag
+ *
+ * @return (1) Open, (2) Closed, (3) Deleted
+ */
+ function getStatusID() {
+ return $this->data_array['status_id'];
+ }
+
+ /**
+ * getStatusName() - get open/closed/deleted text
+ *
+ * @return text status name
+ */
+ function getStatusName() {
+ return $this->data_array['status_name'];
+ }
+
+ /**
+ * getResolutionID() - get resolution flag
+ *
+ * @return int
+ */
+ function getResolutionID() {
+ return $this->data_array['resolution_id'];
+ }
+
+ /**
+ * getResolutionName() - get resolution name
+ *
+ * @return text resolution name
+ */
+ function getResolutionName() {
+ return $this->data_array['resolution_name'];
+ }
+
+ /**
+ * getCategoryID() - get category_id flag
+ *
+ * @return int category_id
+ */
+ function getCategoryID() {
+ return $this->data_array['category_id'];
+ }
+
+ /**
+ * getCategoryName() - get category text name
+ *
+ * @return text category name
+ */
+ function getCategoryName() {
+ return $this->data_array['category_name'];
+ }
+
+ /**
+ * getArtifactGroupID() - get artifact_group_id flag
+ *
+ * @return int artifact_group_id
+ */
+ function getArtifactGroupID() {
+ return $this->data_array['artifact_group_id'];
+ }
+
+ /**
+ * getArtifactGroupName() - get artifact_group_name text
+ *
+ * @return text artifact_group name
+ */
+ function getArtifactGroupName() {
+ return $this->data_array['group_name'];
+ }
+
+ /**
+ * getPriority() - get priority flag
+ *
+ * @return int priority
+ */
+ function getPriority() {
+ return $this->data_array['priority'];
+ }
+
+ /**
+ * getSubmittedBy() - get ID of submitter
+ *
+ * @return int user_id of submitter
+ */
+ function getSubmittedBy() {
+ return $this->data_array['submitted_by'];
+ }
+
+ /**
+ * getSubmittedEmail() - get email of submitter
+ *
+ * @return text email of submitter
+ */
+ function getSubmittedEmail() {
+ return $this->data_array['submitted_email'];
+ }
+
+ /**
+ * getSubmittedRealName() - get real name of submitter
+ *
+ * @return text real name of submitter
+ */
+ function getSubmittedRealName() {
+ return $this->data_array['submitted_realname'];
+ }
+
+ /**
+ * getSubmittedUnixName() - get login name of submitter
+ *
+ * @return text unix name of submitter
+ */
+ function getSubmittedUnixName() {
+ return $this->data_array['submitted_unixname'];
+ }
+
+ /**
+ * getAssignedTo() - get ID of assignee
+ *
+ * @return int user_id of assignee
+ */
+ function getAssignedTo() {
+ return $this->data_array['assigned_to'];
+ }
+
+ /**
+ * getAssignedEmail() - get email of assignee
+ *
+ * @return text email of assignee
+ */
+ function getAssignedEmail() {
+ return $this->data_array['assigned_email'];
+ }
+
+ /**
+ * getAssignedRealName() - get real name of assignee
+ *
+ * @return text real name of assignee
+ */
+ function getAssignedRealName() {
+ return $this->data_array['assigned_realname'];
+ }
+
+ /**
+ * getAssignedUnixName() - get login name of assignee
+ *
+ * @return text unix name of assignee
+ */
+ function getAssignedUnixName() {
+ return $this->data_array['assigned_unixname'];
+ }
+
+ /**
+ * getOpenDate() - get unix time of creation
+ *
+ * @return int unix time
+ */
+ function getOpenDate() {
+ return $this->data_array['open_date'];
+ }
+
+ /**
+ * getCloseDate() - get unix time of closure
+ *
+ * @return int unix time
+ */
+ function getCloseDate() {
+ return $this->data_array['close_date'];
+ }
+
+ /**
+ * getSummary() - get text summary of artifact
+ *
+ * @return text summary (subject)
+ */
+ function getSummary() {
+ return $this->data_array['summary'];
+ }
+
+ /**
+ * getDetails() - get text body (message) of artifact
+ *
+ * @return text body (message)
+ */
+ function getDetails() {
+ return $this->data_array['details'];
+ }
+
+ /**
+ * setMonitor() - user can monitor this artifact
+ *
+ * @param string The email address of the user who is monitoring this artifact
+ * @return false - always false - always use the getErrorMessage() for feedback
+ */
+ function setMonitor($email=false) {
+ if (user_isloggedin()) {
+
+ $user_id=user_getid();
+ $user =& user_get_object(user_getid());
+ $email=' ';
+
+ //we don't want to include the "And email=" because
+ //a logged-in user's email may have changed
+ $email_sql='';
+
+ } else {
+
+ if (!$email || !validate_email($email)) {
+ $this->setError('SetMonitor::Valid Email Address Required');
+ return false;
+ }
+ $user_id=100;
+
+ $email_sql="AND email='$email'";
+
+ }
+
+ $email=strtolower($email);
+
+ $res=db_query("SELECT * FROM artifact_monitor
+ WHERE artifact_id='". $this->getID() ."'
+ AND user_id='$user_id' $email_sql");
+
+ if (!$res || db_numrows($res) < 1) {
+ //not yet monitoring
+ $res=db_query("INSERT INTO artifact_monitor (artifact_id,user_id,email)
+ VALUES ('". $this->getID() ."','$user_id','$email')");
+ if (!$res) {
+ $this->setError(db_error());
+ return false;
+ } else {
+ $this->setError('Now Monitoring');
+ return false;
+ }
+ } else {
+ //already monitoring - remove their monitor
+ db_query("DELETE FROM artifact_monitor
+ WHERE artifact_id='". $this->getID() ."'
+ AND user_id='$user_id' $email_sql");
+ $this->setError('Monitoring Deactivated');
+ return false;
+ }
+ }
+
+ /**
+ * getMonitorEmails() -
+ *
+ * @return array of email addresses monitoring this ArtifactType
+ */
+ function &getMonitorEmails() {
+ $res=db_query("SELECT artifact_monitor.user_id,users.email,artifact_monitor.email as email2
+ FROM users,artifact_monitor
+ WHERE users.user_id=artifact_monitor.user_id
+ AND artifact_monitor.artifact_id='". $this->getID() ."'");
+
+ $rows=db_numrows($res);
+ $email=array();
+
+ for ($i=0; $i<$rows; $i++) {
+ //
+ // for monitoring by non-logged-in users,
+ // we grab the email they gave us
+ //
+ // otherwise we use the confirmed one from the users table
+ //
+ $email[]=((db_result($res,$i,'user_id') == 100)?db_result($res,$i,'email2'):db_result($res,$i,'email') );
+ }
+ return $email;
+ }
+
+ /**
+ * getHistory() - returns a result set of audit trail for this support request
+ *
+ * @return result set
+ */
+ function getHistory() {
+ $sql="SELECT * ".
+ "FROM artifact_history_user_vw ".
+ "WHERE artifact_id='". $this->getID() ."' ".
+ "ORDER BY entrydate DESC";
+ return db_query($sql);
+ }
+
+ /**
+ * getMessages() - get the list of messages attached to this artifact
+ *
+ * @return database result set
+ */
+ function getMessages() {
+ $sql="select * ".
+ "FROM artifact_message_user_vw ".
+ "WHERE artifact_id='". $this->getID() ."' ORDER BY adddate DESC";
+ return db_query($sql);
+ }
+
+ /**
+ * getFiles() - get array of ArtifactFile's
+ *
+ * @return array of ArtifactFile's
+ */
+ function &getFiles() {
+ if (!isset($this->files)) {
+ $sql="select * ".
+ "FROM artifact_file_user_vw ".
+ "WHERE artifact_id='". $this->getID() ."'";
+ $res=db_query($sql);
+ $rows=db_numrows($res);
+ if ($rows > 0) {
+ for ($i=0; $i < $rows; $i++) {
+ $this->files[$i]=new ArtifactFile($this,db_fetch_array($res));
+ }
+ } else {
+ $this->files=array();
+ }
+ }
+ return $this->files;
+ }
+
+ /**
+ * addMessage() - attach a text message to this Artifact
+ *
+ * @param string The message being attached
+ * @param string Email address of message creator
+ * @param bool Whether to email out a followup
+ * @access private
+ * @return true/false
+ */
+ function addMessage($body,$by=false,$send_followup=false) {
+ if (!$body) {
+ $this->setError('ERROR - addMessage: Missing Parameters');
+ return false;
+ }
+
+ if (user_isloggedin()) {
+ $user_id=user_getid();
+ $user =& user_get_object($user_id);
+ if (!$user || !is_object($user)) {
+ $this->setError('ERROR - Logged In User Bug Could Not Get User Object');
+ return false;
+ }
+ $body="Logged In: YES \nuser_id=$user_id\n\n".$body;
+
+ // we'll store this email even though it will likely never be used -
+ // since we have their correct user_id, we can join the USERS table to get email
+ $by=$user->getEmail();
+ } else {
+ $body="Logged In: NO \n\n".$body;
+ $user_id=100;
+ if (!$by) {
+ $this->setError('ERROR - addMessage: Missing Email Address');
+ return false;
+ }
+ }
+
+ $sql="insert into artifact_message (artifact_id,submitted_by,from_email,adddate,body) ".
+ "VALUES ('". $this->getID() ."','$user_id','$by','". time() ."','". htmlspecialchars($body). "')";
+ $res = db_query($sql);
+ if ($send_followup) {
+ $this->mailFollowup(2,false);
+ }
+ return $res;
+ }
+
+ /**
+ * addHistory() - add an entry to audit trail
+ *
+ * @param string The name of the field in the database being modified
+ * @param string The former value of this field
+ * @access private
+ * @return true/false
+ */
+ function addHistory($field_name,$old_value) {
+ if (!user_isloggedin()) {
+ $user=100;
+ } else {
+ $user=user_getid();
+ }
+?><?php
+ $sql="insert into artifact_history(artifact_id,field_name,old_value,mod_by,entrydate)
+ VALUES ('". $this->getID() ."','$field_name','$old_value','$user','". time() ."')";
+ return db_query($sql);
+ }
+
+ /**
+ * update() - update the fields in this artifact
+ *
+ * @param int The artifact priority
+ * @param int The artifact status ID
+ * @param int The artifact category ID
+ * @param int The artifact group ID
+ * @param int The artifact resolution ID
+ * @param int The person to which this artifact is to be assigned
+ * @param int The artifact summary
+ * @param int The canned response
+ * @param int Attaching another comment
+ * @param int Allows you to move an artifact to another type
+ * @return true/false
+ */
+ function update($priority,$status_id,$category_id,$artifact_group_id,$resolution_id,
+ $assigned_to,$summary,$canned_response,$details,$new_artifact_type_id) {
+
+ if (!$this->getID()
+ || !$assigned_to
+ || !$status_id
+ || !$category_id
+ || !$artifact_group_id
+ || !$resolution_id
+ || !$canned_response
+ || !$new_artifact_type_id) {
+ $this->setError('Artifact: Missing required parameters to artifact::update()');
+ return false;
+ }
+
+ // If the current status is Pending then auto-reset it to 'Open'
+ // Assumes the status ID for 'Pending' is '4'
+ if ($status_id != '2' && $status_id != '3' && $this->getStatusID() == '4') {
+ $status_id = '1';
+ }
+
+ // original submitter can always modify his/her items now
+ if (!$this->ArtifactType->userIsAdmin() && ($this->getSubmittedBy() != user_getid())) {
+ $this->setError('Artifact: Update Permission Denied');
+ return false;
+ }
+
+ // Array to record which properties were changed
+ $changes = array();
+
+ db_begin();
+
+ //
+ // Get a lock on this row in the database
+ //
+ $lock=db_query("SELECT * FROM artifact WHERE artifact_id='".$this->getID()."' FOR UPDATE");
+
+ $artifact_type_id = $this->ArtifactType->getID();
+
+ //
+ // Attempt to move this Artifact to a new ArtifactType
+ // need to instantiate new ArtifactType obj and test perms
+ //
+ if ($new_artifact_type_id != $artifact_type_id) {
+ $newArtifactType= new ArtifactType($this->ArtifactType->getGroup(), $new_artifact_type_id);
+ if (!is_object($newArtifactType) || $newArtifactType->isError()) {
+ $this->setError('Artifact: Could not move to new ArtifactType'.$newArtifactType->getErrorMessage());
+ return false;
+ }
+ // do they have perms for new ArtifactType?
+ if (!$newArtifactType->userIsAdmin()) {
+ $this->setError('Artifact: Could not move to new ArtifactType: Permission Denied');
+ db_rollback();
+ return false;
+ }
+ //
+ // Now set ArtifactGroup, Category, and Assigned to 100 in the new ArtifactType
+ //
+ $status_id=1;
+ $category_id='100';
+ $artifact_group_id='100';
+ $assigned_to='100';
+ //can't send a canned response when changing ArtifactType
+ $canned_response=100;
+ $this->ArtifactType =& $newArtifactType;
+ $update = true;
+ }
+
+ $sqlu='';
+
+ //
+ // handle audit trail & build SQL statement
+ //
+ if ($this->getStatusID() != $status_id) {
+ $this->addHistory('status_id',$this->getStatusID());
+ $sqlu .= " status_id='$status_id', ";
+ $changes['status'] = 1;
+ $update = true;
+ }
+ if (($this->getResolutionID() != $resolution_id) && ($resolution_id != 100)) {
+ $this->addHistory('resolution_id',$this->getResolutionID());
+ $sqlu .= " resolution_id='$resolution_id', ";
+ $changes['resolution'] = 1;
+ $update = true;
+ }
+ if ($this->getCategoryID() != $category_id) {
+ $this->addHistory('category_id',$this->getCategoryID());
+ $sqlu .= " category_id='$category_id', ";
+ $changes['category'] = 1;
+ $update = true;
+ }
+ if ($this->getArtifactGroupID() != $artifact_group_id) {
+ $this->addHistory('artifact_group_id',$this->getArtifactGroupID());
+ $sqlu .= " artifact_group_id='$artifact_group_id', ";
+ $changes['artifact_group'] = 1;
+ $update = true;
+ }
+ if ($this->getPriority() != $priority) {
+ $this->addHistory('priority',$this->getPriority());
+ $sqlu .= " priority='$priority', ";
+ $changes['priority'] = 1;
+ $update = true;
+ }
+
+ if ($this->getAssignedTo() != $assigned_to) {
+ $this->addHistory('assigned_to',$this->getAssignedTo());
+ $sqlu .= " assigned_to='$assigned_to', ";
+ $changes['assigned_to'] = 1;
+ $update = true;
+ }
+ if ($summary && (addslashes($this->getSummary()) != htmlspecialchars($summary))) {
+ $this->addHistory('summary', addslashes($this->getSummary()));
+ $sqlu .= " summary='". htmlspecialchars($summary) ."', ";
+ $changes['summary'] = 1;
+ $update = true;
+ }
+
+ if ($details) {
+ $this->addMessage($details);
+ $changes['details'] = 1;
+ $send_message=true;
+ }
+
+ //
+ // Enter the timestamp if we are changing to closed
+ //
+ if ($status_id != 1) {
+ $now=time();
+ $sqlu .= " close_date='$now', ";
+ $this->addHistory('close_date',$this->getCloseDate());
+ $update = true;
+ }
+
+ /*
+ Finally, update the artifact itself
+ */
+ if ($update){
+ $sql = "UPDATE artifact
+ SET
+ $sqlu
+ group_artifact_id='$new_artifact_type_id'
+ WHERE
+ artifact_id='". $this->getID() ."'
+ AND group_artifact_id='$artifact_type_id'";
+
+ $result=db_query($sql);
+
+ if (!$result || db_affected_rows($result) < 1) {
+ $this->setError('Error - update failed!');
+ echo db_error();
+ db_rollback();
+ return false;
+ } else {
+ $this->fetchData($this->getID());
+//error check the data fetching??
+ }
+ }
+
+ /*
+ handle canned responses
+
+ Instantiate ArtifactCanned and get the body of the message
+ */
+ if ($canned_response != 100) {
+ //don't care if this response is for this group - could be hacked
+ $acr=new ArtifactCanned($this->ArtifactType,$canned_response);
+ if (!$acr || !is_object($acr)) {
+ $this->setError('Artifact: Could Not Create Canned Response Object');
+ } elseif ($acr->isError()) {
+ $this->setError('Artifact: '.$acr->getErrorMessage());
+ } else {
+ $body = addslashes($acr->getBody());
+ if ($body) {
+ if (!$this->addMessage(util_unconvert_htmlspecialchars($body),user_getname().'@'.$GLOBALS['sys_users_host'])) {
+ db_rollback();
+ return false;
+ } else {
+ $send_message=true;
+ }
+ } else {
+ $this->setError('Artifact: Unable to Use Canned Response');
+ return false;
+ }
+ }
+ }
+
+ if ($update || $send_message){
+ /*
+ now send the email
+ */
+ $this->mailFollowup(2, false, $changes);
+ db_commit();
+ return true;
+ } else {
+ //nothing changed, so cancel the transaction
+ $this->setError('Nothing Changed - Update Cancelled');
+ db_rollback();
+ return false;
+ }
+ }
+
+ // function which returns proper marker for changed properties
+ function marker($prop_name,$changes) {
+ if ($changes[$prop_name]) {
+ return '>';
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * mailFollowup() - send out an email update for this artifact
+ *
+ * @param int (1) initial/creation (2) update
+ * @param array Array of additional addresses to mail to
+ * @param array Array of fields changed in this update
+ * @access private
+ * @return true/false
+ */
+ function mailFollowup($type, $more_addresses=false, $changes='') {
+ global $sys_datefmt;
+
+ if (!$changes) {
+ $changes=array();
+ }
+
+ if ($this->ArtifactType->useResolution()) {
+ $resolution_text = $this->marker('resolution',$changes).
+ "Resolution: ". $this->getResolutionName() ."\n";
+ }
+
+ $body = $this->ArtifactType->getName() ." item #". $this->getID() .", was opened at ". date( $sys_datefmt, $this->getOpenDate() ).
+ "\nYou can respond by visiting: ".
+ "\nhttp://".$GLOBALS['sys_default_domain']."/tracker/?func=detail&atid=". $this->ArtifactType->getID() .
+ "&aid=". $this->getID() .
+ "&group_id=". $this->ArtifactType->Group->getID() .
+ "\n\n".
+ $this->marker('category',$changes).
+ "Category: ". $this->getCategoryName() ."\n".
+ $this->marker('artifact_group',$changes).
+ "Group: ". $this->getArtifactGroupName() ."\n".
+ $this->marker('status',$changes).
+ "Status: ". $this->getStatusName() ."\n".
+ $resolution_text.
+ $this->marker('priority',$changes).
+ "Priority: ". $this->getPriority() ."\n".
+ "Submitted By: ". $this->getSubmittedRealName() .
+ " (". $this->getSubmittedUnixName(). ")"."\n".
+ $this->marker('assigned_to',$changes).
+ "Assigned to: ". $this->getAssignedRealName() .
+ " (". $this->getAssignedUnixName(). ")"."\n".
+ $this->marker('summary',$changes).
+ "Summary: ". util_unconvert_htmlspecialchars( $this->getSummary() );
+
+
+ $subject='[ '. $this->ArtifactType->Group->getUnixName() . '-' . $this->ArtifactType->getName() . '-' . $this->getID() .' ] '. util_unconvert_htmlspecialchars( $this->getSummary() );
+
+ if ($type > 1) {
+ /*
+ get all the email addresses that are monitoring this request
+ */
+ $emails =& $this->getMonitorEmails();
+ }
+
+ if ($more_addresses) {
+ $emails[] = $more_addresses;
+ }
+ //we don't email the current user
+ if ($this->getAssignedTo() != user_getid()) {
+ $emails[] = $this->getAssignedEmail();
+ }
+ if ($this->getSubmittedBy() != user_getid()) {
+ $emails[] = $this->getSubmittedEmail();
+ }
+ //initial submission
+ if ($type==1) {
+ //if an email is set for this ArtifactType
+ //add that address to the BCC: list
+ if ($this->ArtifactType->getEmailAddress()) {
+ $emails[] = $this->ArtifactType->getEmailAddress();
+ }
+ } else {
+ //update
+ if ($this->ArtifactType->emailAll()) {
+ $emails[] = $this->ArtifactType->getEmailAddress();
+ }
+ }
+
+ $body .= "\n\nInitial Comment:".
+ "\n".util_unconvert_htmlspecialchars( $this->getDetails() ) .
+ "\n\n----------------------------------------------------------------------";
+
+ if ($type > 1) {
+ /*
+ Now include the followups
+ */
+ $result2=$this->getMessages();
+
+ $rows=db_numrows($result2);
+
+ if ($result2 && $rows > 0) {
+ for ($i=0; $i<$rows; $i++) {
+ //
+ // for messages posted by non-logged-in users,
+ // we grab the email they gave us
+ //
+ // otherwise we use the confirmed one from the users table
+ //
+ if (db_result($result2,$i,'user_id') == 100) {
+ $emails[] = db_result($result2,$i,'from_email');
+ } else {
+ $emails[] = db_result($result2,$i,'email');
+ }
+
+
+ $body .= "\n\n";
+ if ($i == 0) {
+ $body .= $this->marker('details',$changes);
+ }
+ $body .= "Comment By: ". db_result($result2,$i,'realname') . " (".db_result($result2,$i,'user_name').")".
+ "\nDate: ". date( $sys_datefmt,db_result($result2,$i,'adddate') ).
+ "\n\nMessage:".
+ "\n".util_unconvert_htmlspecialchars( db_result($result2,$i,'body') ).
+ "\n\n----------------------------------------------------------------------";
+ }
+ }
+
+ }
+
+ $body .= "\n\nYou can respond by visiting: ".
+ "\nhttp://$GLOBALS[sys_default_domain]/tracker/?func=detail&atid=". $this->ArtifactType->getID() .
+ "&aid=". $this->getID() .
+ "&group_id=". $this->ArtifactType->Group->getID();
+
+ //only send if some recipients were found
+ if (count($emails) < 1) {
+ return true;
+ }
+
+ //now remove all duplicates from the email list
+ $BCC=implode(',',array_unique($emails));
+
+ /*
+ Send the email
+ */
+ util_send_mail("noreply@$GLOBALS[sys_default_domain]",$subject,$body,"noreply@$GLOBALS[sys_default_domain]",$BCC);
+ return true;
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCanned.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCanned.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCanned.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,199 @@
+<?php
+/**
+ * ArtifactCanned.class - Class to handle canned responses
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactCanned extends Error {
+
+ /**
+ * The artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType;
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactCanned() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object The Artifact Type object
+ * @param array (all fields from artifact_file_user_vw) OR id from database
+ * @return true/false
+ */
+ function ArtifactCanned(&$ArtifactType, $data=false) {
+ $this->Error();
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('ArtifactCanned: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('ArtifactCanned: '.$Artifact->getErrorMessage());
+ return false;
+ }
+ $this->ArtifactType =& $ArtifactType;
+
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ } else {
+ $this->setError('No ID Passed');
+ }
+ }
+
+ /**
+ * create() - create a new item in the database
+ *
+ * @param string The item title
+ * @param string The item body
+ * @return id on success / false on failure
+ */
+ function create($title, $body) {
+ //
+ // data validation
+ //
+ if (!$title || !$body) {
+ $this->setError('ArtifactCanned: name and assignee are Required');
+ return false;
+ }
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+
+ $sql="INSERT INTO artifact_canned_responses (group_artifact_id,title,body)
+ VALUES ('".$this->ArtifactType->getID()."',
+ '". htmlspecialchars($title) ."','". htmlspecialchars($body) ."')";
+
+ $result=db_query($sql);
+
+ if ($result && db_affected_rows($result) > 0) {
+ $this->clearError();
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+
+/*
+ //
+ // Now set up our internal data structures
+ //
+ if (!$this->fetchData($id)) {
+ return false;
+ }
+*/
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactCanned from the database
+ *
+ * @param int Data ID
+ * @return true/false
+ */
+ function fetchData($id) {
+ $res=db_query("SELECT * FROM artifact_canned_responses WHERE id='$id'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactCanned: Invalid ArtifactCanned ID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifactType() - get the ArtifactType Object this ArtifactCanned message is associated with
+ *
+ * @return ArtifactType
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+
+ /**
+ * getID() - get this ArtifactCanned message's ID
+ *
+ * @return the id #
+ */
+ function getID() {
+ return $this->data_array['id'];
+ }
+
+ /**
+ * getTitle() - get the title
+ *
+ * @return text title
+ */
+ function getTitle() {
+ return $this->data_array['title'];
+ }
+
+ /**
+ * getBody() - get the body of this message
+ *
+ * @return text message body
+ */
+ function getBody() {
+ return $this->data_array['body'];
+ }
+
+ /**
+ * update() - update an ArtifactCanned message
+ *
+ * @param string Title of the message
+ * @param string Body of the message
+ * @return true/false
+ */
+ function update($title,$body) {
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$title || !$body) {
+ $this->setError('Missing Params');
+ return false;
+ }
+
+ $sql="UPDATE artifact_canned_responses
+ SET title='". htmlspecialchars($title) ."',body='". htmlspecialchars($body) ."'
+ WHERE group_artifact_id='". $this->ArtifactType->getID() ."' AND id='". $this->getID() ."'";
+
+ $result=db_query($sql);
+
+ if ($result && db_affected_rows($result) > 0) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCategory.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCategory.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactCategory.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,195 @@
+<?php
+/**
+ * ArtifactCategory.class - Class to handle artifact categories
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactCategory extends Error {
+
+ /**
+ * The artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType; //object
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactCategory() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object ArtifactType object
+ * @param array (all fields from artifact_file_user_vw) OR id from database
+ * @return true/false
+ */
+ function ArtifactCategory(&$ArtifactType, $data=false) {
+ $this->Error();
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('ArtifactCategory: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('ArtifactCategory: '.$Artifact->getErrorMessage());
+ return false;
+ }
+ $this->ArtifactType =& $ArtifactType;
+
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ } else {
+ $this->setError('No ID Passed');
+ }
+ }
+
+ /**
+ * create() - create a new item in the database
+ *
+ * @param string Item name
+ * @param int User_id of assignee
+ * @return id on success / false on failure
+ */
+ function create($name, $auto_assign_to) {
+ //
+ // data validation
+ //
+ if (!$name || !$auto_assign_to) {
+ $this->setError('ArtifactCategory: name and assignee are Required');
+ return false;
+ }
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ $sql="INSERT INTO artifact_category (group_artifact_id,category_name,auto_assign_to)
+ VALUES ('".$this->ArtifactType->getID()."','$name','$auto_assign_to')";
+
+ $result=db_query($sql);
+
+ if ($result && db_affected_rows($result) > 0) {
+ $this->clearError();
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+
+/*
+ //
+ // Now set up our internal data structures
+ //
+ if (!$this->fetchData($id)) {
+ return false;
+ }
+*/
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactCategory from the database
+ *
+ * @param int ID of the category
+ * @return true/false
+ */
+ function fetchData($id) {
+ $res=db_query("SELECT * FROM artifact_category WHERE id='$id'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactCategory: Invalid ArtifactCategory ID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifactType() - get the ArtifactType Object this ArtifactCategory is associated with
+ *
+ * @return ArtifactType
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+
+ /**
+ * getID() - get this ArtifactCategory's ID
+ *
+ * @return the id #
+ */
+ function getID() {
+ return $this->data_array['id'];
+ }
+
+ /**
+ * getName() - get the name
+ *
+ * @return text name
+ */
+ function getName() {
+ return $this->data_array['category_name'];
+ }
+
+ /**
+ * getAssignee() - get the user_id of the person to assign this category to
+ *
+ * @return int user_id
+ */
+ function getAssignee() {
+ return $this->data_array['auto_assign_to'];
+ }
+
+ /**
+ * update() - update an ArtifactCategory
+ *
+ * @param string Name of the category
+ * @param int user_id of the person this category should auto-assign to
+ * @return true/false
+ */
+ function update($name,$assign_to) {
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$name || !$assign_to) {
+ $this->setError('Missing Params');
+ return false;
+ }
+ $sql="UPDATE artifact_category
+ SET category_name='$name',auto_assign_to='$assign_to'
+ WHERE id='". $this->getID() ."'
+ AND group_artifact_id='".$this->ArtifactType->getID()."'";
+ $result=db_query($sql);
+ if ($result && db_affected_rows($result) > 0) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactFile.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactFile.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactFile.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,279 @@
+<?php
+/**
+ * ArtifactFile.class - Class to handle files within an artifact
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactFile extends Error {
+
+ /**
+ * The artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $Artifact; //object
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactFile() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object The Artifact object
+ * @param array (all fields from artifact_file_user_vw) OR id from database
+ * @return true/false
+ */
+ function ArtifactFile(&$Artifact, $data=false) {
+ $this->Error();
+
+ //was Artifact legit?
+ if (!$Artifact || !is_object($Artifact)) {
+ $this->setError('ArtifactFile: No Valid Artifact');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($Artifact->isError()) {
+ $this->setError('ArtifactFile: '.$Artifact->getErrorMessage());
+ return false;
+ }
+ $this->Artifact =& $Artifact;
+
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ } else {
+ $this->setError('No ID Passed');
+ }
+ }
+
+ /**
+ * create() - create a new item in the database
+ *
+ * @para string Filename of the item
+ * @param string Item filetype
+ * @param string Item filesize
+ * @param binary Binary item data
+ * @param string Item description
+ * @return id on success / false on failure
+ */
+ function create($filename, $filetype, $filesize, $bin_data, $description='None') {
+
+ // Some browsers don't supply mime type if they don't know it
+ if (!$filetype) {
+ // Let's be on safe side?
+ $filetype = 'application/octet-stream';
+ }
+
+ //
+ // data validation
+ //
+ if (!$filename || !$filetype || !$filesize || !$bin_data) {
+ //echo '<P>|'.$filename.'|'.$filetype.'|'.$filesize.'|'.$bin_data.'|';
+ $this->setError('ArtifactFile: File name, type, size, and data are Required');
+ return false;
+ }
+
+ if (user_isloggedin()) {
+ $userid=user_getid();
+ } else {
+ $userid=100;
+ }
+
+ $res=db_query("INSERT INTO artifact_file
+ (artifact_id,description,bin_data,filename,filesize,filetype,adddate,submitted_by)
+ VALUES
+ ('".$this->Artifact->getID()."','$description','". base64_encode($bin_data) ."','$filename',
+ '$filesize','$filetype','". time() ."','$userid')");
+
+ $id=db_insertid($res,'artifact_file','id');
+
+ if (!$res || !$id) {
+ $this->setError('ArtifactFile: '.db_error());
+ return false;
+ } else {
+/*
+//
+// skip this unless we need it later - save a db query
+//
+ //
+ // Now set up our internal data structures
+ //
+ if (!$this->fetchData($id)) {
+ return false;
+ }
+*/
+ $this->Artifact->addHistory('File Added',$id.': '.$filename);
+ $this->clearError();
+ return $id;
+ }
+ }
+
+ /**
+ * delete() - delete this artifact file from the db
+ *
+ * @return true/false
+ */
+ function delete() {
+ if (!$this->Artifact->ArtifactType->userIsAdmin()) {
+ $this->setError('ArtifactFile: Permission Denied');
+ return false;
+ }
+ $res=db_query("DELETE FROM artifact_file WHERE id='". $this->getID() ."'");
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ArtifactFile: Unable to Delete');
+ return false;
+ } else {
+ $this->Artifact->addHistory('File Deleted',$this->getID().': '.$filename);
+ return true;
+ }
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactFile from the database
+ *
+ * @param int Data ID
+ * @return true/false
+ */
+ function fetchData($id) {
+ $res=db_query("SELECT * FROM artifact_file_user_vw WHERE id='$id'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactFile: Invalid ArtifactFile ID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifact() - get the Artifact Object this ArtifactFile is associated with
+ *
+ * @return Artifact
+ */
+ function &getArtifact() {
+ return $this->Artifact;
+ }
+
+ /**
+ * getID() - get this ArtifactFile's ID
+ *
+ * @return the id #
+ */
+ function getID() {
+ return $this->data_array['id'];
+ }
+
+ /**
+ * getName() - get the filename
+ *
+ * @return text filename
+ */
+ function getName() {
+ return $this->data_array['filename'];
+ }
+
+ /**
+ * getType() - get the type
+ *
+ * @return text type
+ */
+ function getType() {
+ return $this->data_array['filetype'];
+ }
+
+ /**
+ * getData() - get the binary data from the db
+ *
+ * @return binary
+ */
+ function &getData() {
+//
+// sorry - the data conversion for sf.net was incorrect
+// we needed to actually unconvert the htmlspecialchars()
+// before base64_encode()ing the data
+//
+ if (($GLOBALS['sys_default_domain'] == 'sourceforge.net') && ($this->getID() < 3976)) {
+ return util_unconvert_htmlspecialchars(base64_decode($this->data_array['bin_data']));
+ } else {
+ return base64_decode($this->data_array['bin_data']);
+ }
+ }
+
+ /**
+ * getSize() - get the size
+ *
+ * @return int size
+ */
+ function getSize() {
+ return $this->data_array['filesize'];
+ }
+
+ /**
+ * getDescription() - get the description
+ *
+ * @return text description
+ */
+ function getDescription() {
+ return $this->data_array['description'];
+ }
+
+ /**
+ * getDate() - get the date file was added
+ *
+ * @return int unix time
+ */
+ function getDate() {
+ return $this->data_array['adddate'];
+ }
+
+ /**
+ * getSubmittedBy() - get the user_id of the submitter
+ *
+ * @return int user_id
+ */
+ function getSubmittedBy() {
+ return $this->data_array['submitted_by'];
+ }
+
+ /**
+ * getSubmittedRealName() - get the real name of the submitter
+ *
+ * @return text name
+ */
+ function getSubmittedRealName() {
+ return $this->data_array['realname'];
+ }
+
+ /**
+ * getSubmittedUnixName() - get the unix name of the submitter
+ *
+ * @return text unixname
+ */
+ function getSubmittedUnixName() {
+ return $this->data_array['user_name'];
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactGroup.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactGroup.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactGroup.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,182 @@
+<?php
+/**
+ * ArtifactGroup.class - Class to artifact groups
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactGroup extends Error {
+
+ /**
+ * Artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType;
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactGroup() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object Artifact type object
+ * @param array (all fields from artifact_group) OR id from database
+ * @return true/false
+ */
+ function ArtifactGroup(&$ArtifactType, $data=false) {
+ $this->Error();
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('ArtifactGroup: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('ArtifactGroup: '.$Artifact->getErrorMessage());
+ return false;
+ }
+ $this->ArtifactType =& $ArtifactType;
+
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+ }
+
+ /**
+ * create() - create a new item in the database
+ *
+ * @param string Item name
+ * @return id on success / false on failure
+ */
+ function create($name) {
+ //
+ // data validation
+ //
+ if (!$name) {
+ $this->setError('ArtifactGroup: name is Required');
+ return false;
+ }
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ $sql="INSERT INTO artifact_group (group_artifact_id,group_name)
+ VALUES ('".$this->ArtifactType->getID()."','$name')";
+ $result=db_query($sql);
+
+ if ($result && db_affected_rows($result) > 0) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+
+/*
+ //
+ // Now set up our internal data structures
+ //
+ if (!$this->fetchData($id)) {
+ return false;
+ }
+*/
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactGroup from the database
+ *
+ * @param int Data ID
+ * @return true/false
+ */
+ function fetchData($id) {
+ $res=db_query("SELECT * FROM artifact_group WHERE id='$id'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactGroup: Invalid ArtifactGroup ID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifactType() - get the ArtifactType Object this ArtifactGroup is associated with
+ *
+ * @return ArtifactType
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+
+ /**
+ * getID() - get this ArtifactGroup's ID
+ *
+ * @return the id #
+ */
+ function getID() {
+ return $this->data_array['id'];
+ }
+
+ /**
+ * getName() - get the name
+ *
+ * @return text name
+ */
+ function getName() {
+ return $this->data_array['group_name'];
+ }
+
+ /**
+ * update() - update an ArtifactGroup
+ *
+ * @param string Name of the group
+ * @return true/false
+ */
+ function update($name) {
+ if (!$this->ArtifactType->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$name) {
+ $this->setError('Missing Params');
+ return false;
+ }
+ $sql="UPDATE artifact_group
+ SET group_name='$name'
+ WHERE id='". $this->getID() ."'
+ AND group_artifact_id='". $this->ArtifactType->getID() ."'";
+
+ $result=db_query($sql);
+
+ if ($result && db_affected_rows($result) > 0) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactResolution.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactResolution.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactResolution.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,115 @@
+<?php
+/**
+ *
+ * ArtifactResolution.class - Class to artifact resolutions
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactResolution extends Error {
+
+ /**
+ * The artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType; //object
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactResolution() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object Artifact type object
+ * @param array (all fields from artifact_group) OR id from database
+ * @return true/false
+ */
+ function ArtifactResolution(&$ArtifactType, $data=false) {
+ $this->Error();
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('ArtifactResolution: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('ArtifactResolution: '.$Artifact->getErrorMessage());
+ return false;
+ }
+ $this->ArtifactType =& $ArtifactType;
+
+ if ($data) {
+ if (is_array($data)) {
+ $this->data_array =& $data;
+ return true;
+ } else {
+ if (!$this->fetchData($data)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactResolution from the database
+ *
+ * @param int Data ID
+ * @return true/false
+ */
+ function fetchData($id) {
+ $res=db_query("SELECT * FROM artifact_resolution WHERE id='$id'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactResolution: Invalid ArtifactResolution ID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getArtifactType() - get the ArtifactType Object this ArtifactResolution is associated with
+ *
+ * @return ArtifactType
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+
+ /**
+ * getID() - get this ArtifactResolution's ID
+ *
+ * @return the id #
+ */
+ function getID() {
+ return $this->data_array['id'];
+ }
+
+ /**
+ * getName() - get the name
+ *
+ * @return text name
+ */
+ function getName() {
+ return $this->data_array['resolution_name'];
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactType.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactType.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactType.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,662 @@
+<?php
+/**
+ * ArtifactType.class - Class to artifact an type
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+
+class ArtifactType extends Error {
+
+ /**
+ * The Group object
+ *
+ * @var object $Group
+ */
+ var $Group; //group object
+
+ /**
+ * Artifact type ID
+ *
+ * @var int $artifact_type_id
+ */
+ var $artifact_type_id;
+
+ /**
+ * Categories db resource ID
+ *
+ * @var int $categories_res
+ */
+ var $categories_res;
+
+ /**
+ * Resolutions db resource ID
+ *
+ * @var int $resolutions_res
+ */
+ var $resolutions_res;
+
+ /**
+ * Groups db resource ID
+ *
+ * @var int $groups_res
+ */
+ var $groups_res;
+
+ /**
+ * Current user permissions
+ *
+ * @var int $current_user_perm
+ */
+ var $current_user_perm;
+
+ /**
+ * Technicians db resource ID
+ *
+ * @var int $technicians_res
+ */
+ var $technicians_res;
+
+ /**
+ * Status db resource ID
+ *
+ * @var int $status_res
+ */
+ var $status_res;
+
+ /**
+ * Canned responses resource ID
+ *
+ * @var int $cannecresponses_res
+ */
+ var $cannedresponses_res;
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactType() - constructor
+ *
+ * @param object The Group object
+ * @param int The id # assigned to this artifact type in the db
+ * @return true/false
+ */
+ function ArtifactType(&$Group,$artifact_type_id=false) {
+ $this->Error();
+ if (!$Group || !is_object($Group)) {
+ $this->setError('No Valid Group Object');
+ return false;
+ }
+ if ($Group->isError()) {
+ $this->setError('ArtifactType: '.$Group->getErrorMessage());
+ return false;
+ }
+ $this->Group =& $Group;
+ if ($artifact_type_id) {
+ $this->artifact_type_id=$artifact_type_id;
+
+ if (!$this->fetchData($artifact_type_id)) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ $this->setError('No ID Passed');
+ }
+ }
+
+ /**
+ * create() - use this to create a new ArtifactType in the database
+ *
+ * @param string The type name
+ * @param string The type description
+ * @param bool (1) true (0) false - viewable by general public
+ * @param bool (1) true (0) false - whether non-logged-in users can submit
+ * @param bool (1) true (0) false - whether to email on all updates
+ * @param string The address to send new entries and updates to
+ * @param int Days before this item is considered overdue
+ * @param bool (1) trye (0) false - whether the resolution box should be shown
+ * @param string Free-form text that project admins can place on the submit page
+ * @param string Free-form text that project admins can place on the browse page
+ * @param int (1) bug tracker, (2) Support Tracker, (3) Patch Tracker, (4) features (0) other
+ * @return id on success, false on failure
+ */
+ function create($name,$description,$is_public,$allow_anon,$email_all,$email_address,
+ $due_period,$use_resolution,$submit_instructions,$browse_instructions,$datatype=0) {
+
+ $perm =& $this->Group->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
+ $this->setError('ArtifactType: Permission Denied');
+ return false;
+ }
+
+ if (!$name || !$description || !$due_period) {
+ $this->setError('ArtifactType: Name, Description, and Due Period are required');
+ return false;
+ }
+
+ if ($email_address && !validate_email($email_address)) {
+ $email_address='';
+ }
+ if ($email_all && !$email_address) {
+ $email_all=0;
+ }
+
+ $res=db_query("INSERT INTO
+ artifact_group_list
+ (group_id,
+ name,
+ description,
+ is_public,
+ allow_anon,
+ email_all_updates,
+ email_address,
+ due_period,
+ status_timeout,
+ use_resolution,
+ submit_instructions,
+ browse_instructions,
+ datatype)
+ VALUES
+ ('". $this->Group->getID() ."',
+ '". htmlspecialchars($name) ."',
+ '". htmlspecialchars($description) ."',
+ '$is_public',
+ '$allow_anon',
+ '$email_all',
+ '$email_address',
+ '". ($due_period*(60*60*24)) ."',
+ '1209600',
+ '$use_resolution',
+ '$submit_instructions',
+ '$browse_instructions',
+ '$datatype')");
+
+ $this->artifact_type_id = db_insertid($res,'artifact_group_list','group_artifact_id');
+
+ if (!$res || !$this->artifact_type_id) {
+ $this->setError('ArtifactType: '.db_error());
+ return false;
+ } else {
+ if (!$this->fetchData($this->artifact_type_id)) {
+ return false;
+ } else {
+ $this->clearError();
+ return $this->artifact_type_id;
+ }
+ }
+ }
+
+ /**
+ * fetchData() - re-fetch the data for this ArtifactType from the database
+ *
+ * @param int The artifact type ID
+ * @return true/false
+ */
+ function fetchData($artifact_type_id) {
+ $res=db_query("SELECT * FROM artifact_group_list
+ WHERE group_artifact_id='$artifact_type_id'
+ AND group_id='". $this->Group->getID() ."'");
+ if (!$res || db_numrows($res) < 1) {
+ $this->setError('ArtifactType: Invalid ArtifactTypeID');
+ return false;
+ }
+ $this->data_array =& db_fetch_array($res);
+ db_free_result($res);
+ return true;
+ }
+
+ /**
+ * getGroup() - get the Group object this ArtifactType is associated with
+ *
+ * @return the Group object
+ */
+ function &getGroup() {
+ return $this->Group;
+ }
+
+ /**
+ * getID() - get this ArtifactTypeID
+ *
+ * @return the group_artifact_id #
+ */
+ function getID() {
+ return $this->artifact_type_id;
+ }
+
+ /**
+ * allowsAnon() - determine if non-logged-in users can post
+ *
+ * @return true/false
+ */
+ function allowsAnon() {
+ return $this->data_array['allow_anon'];
+ }
+
+ /**
+ * getSubmitInstructions() - get the free-form text strings
+ *
+ * @return text instructions
+ */
+ function getSubmitInstructions() {
+ return $this->data_array['submit_instructions'];
+ }
+
+ /**
+ * getBrowseInstructions() - get the free-form text strings
+ *
+ * @return text instructions
+ */
+ function getBrowseInstructions() {
+ return $this->data_array['browse_instructions'];
+ }
+
+ /**
+ * emailAll() - determine if we're supposed to email on every event
+ *
+ * @return true/false
+ */
+ function emailAll() {
+ return $this->data_array['email_all_updates'];
+ }
+
+ /**
+ * emailAddress() - defined email address to send events to
+ *
+ * @return text email
+ */
+ function getEmailAddress() {
+ return $this->data_array['email_address'];
+ }
+
+ /**
+ * isPublic() - whether non-group-members can view
+ *
+ * @return true/false
+ */
+ function isPublic() {
+ return $this->data_array['is_public'];
+ }
+
+ /**
+ * getName() - the name of this ArtifactType
+ *
+ * @return text name
+ */
+ function getName() {
+ return $this->data_array['name'];
+ }
+
+ /**
+ * getDescription() - the description of this ArtifactType
+ *
+ * @return text description
+ */
+ function getDescription() {
+ return $this->data_array['description'];
+ }
+
+ /**
+ * getDuePeriod() - how many seconds until it's considered overdue?
+ *
+ * @return int seconds
+ */
+ function getDuePeriod() {
+ return $this->data_array['due_period'];
+ }
+
+ /**
+ * getStatusTimeout() - how many seconds until an item is stale?
+ *
+ * @return int seconds
+ */
+ function getStatusTimeout() {
+ return $this->data_array['status_timeout'];
+ }
+
+ /**
+ * useResolution() - whether this ArtifactType uses the resolution feature
+ *
+ * @return true/false
+ */
+ function useResolution() {
+ return $this->data_array['use_resolution'];
+ }
+
+ /**
+ * getDataType() - flag that is generally unused but can mark the difference between bugs, patches, etc
+ *
+ * @return (1) bug (2) support (3) patch (4) feature (0) other
+ */
+ function getDataType() {
+ return $this->data_array['datatype'];
+ }
+
+ /**
+ * getCategories() - List of possible categories set up for this artifact type
+ *
+ * @return result set
+ */
+ function getCategories() {
+ if (!isset($this->categories_res)) {
+ $sql="select id,category_name
+ FROM artifact_category
+ WHERE group_artifact_id='$this->artifact_type_id'";
+ $this->categories_res=db_query($sql);
+ }
+ return $this->categories_res;
+ }
+
+ /**
+ * getGroups() - List of possible groups set up for this artifact type
+ *
+ * @return result set
+ */
+ function getGroups() {
+ if (!isset($this->groups_res)) {
+ $sql="select id,group_name
+ FROM artifact_group
+ WHERE group_artifact_id='$this->artifact_type_id'";
+ $this->groups_res=db_query($sql);
+ }
+ return $this->groups_res;
+ }
+
+ /**
+ * getResolutions() - List of possible resolutions
+ *
+ * @return result set
+ */
+ function getResolutions() {
+ if (!isset($this->resolutions_res)) {
+ $sql="select id,resolution_name
+ FROM artifact_resolution";
+ $this->resolutions_res=db_query($sql);
+ }
+ return $this->resolutions_res;
+ }
+
+ /**
+ * getTechnicians() - returns a result set of technicians
+ *
+ * @return result set
+ */
+ function getTechnicians() {
+ if (!isset($this->technicians_res)) {
+ $sql="SELECT user_id,user_name
+ FROM artifactperm_user_vw
+ WHERE group_artifact_id='$this->artifact_type_id'
+ AND perm_level in (1,2)";
+ $this->technicians_res = db_query($sql);
+ }
+ return $this->technicians_res;
+ }
+
+ /**
+ * getCannedResponses() - returns a result set of canned responses
+ *
+ * @return result set
+ */
+ function getCannedResponses() {
+ if (!isset($this->cannedresponses_res)) {
+ $sql="SELECT id,title
+ FROM artifact_canned_responses
+ WHERE group_artifact_id='$this->artifact_type_id'";
+ $this->cannedresponses_res = db_query($sql);
+ }
+ return $this->cannedresponses_res;
+ }
+
+ /**
+ * getStatuses() - returns a result set of statuses
+ *
+ * @return result set
+ */
+ function getStatuses() {
+ if (!isset($this->status_res)) {
+ $sql="select * from artifact_status";
+ $this->status_res=db_query($sql);
+ }
+ return $this->status_res;
+ }
+
+ /**
+ * getStatusName() - returns the name of this status
+ *
+ * @param int The status ID
+ * @return name
+ */
+ function getStatusName($id) {
+ $sql="select * from artifact_status WHERE id='$id'";
+ $result=db_query($sql);
+ if ($result && db_numrows($result) > 0) {
+ return db_result($result,0,'status_name');
+ } else {
+ return 'Error - Not Found';
+ }
+ }
+
+ /**
+ * addUser() - add a user to this ArtifactType - depends on UNIQUE INDEX preventing duplicates
+ *
+ * @param int user_id of the new user
+ * @return true/false
+ */
+ function addUser($id) {
+ if (!$this->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$id) {
+ $this->setError('Missing Params');
+ return false;
+ }
+ $sql="INSERT INTO artifact_perm (group_artifact_id,user_id,perm_level)
+ VALUES ('".$this->getID()."','$id',0)";
+ $result=db_query($sql);
+ if ($result && db_affected_rows($result) > 0) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+
+ /**
+ * updateUser() - update a user's permissions
+ *
+ * @param int user_id of the user to update
+ * @param int (1) tech only, (2) admin & tech (3) admin only
+ * @return true/false
+ */
+ function updateUser($id,$perm_level) {
+ if (!$this->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$id) {
+ $this->setError('Missing Params: '.$id.'|'.$perm_level);
+ return false;
+ }
+ $sql="UPDATE artifact_perm SET perm_level='$perm_level'
+ WHERE user_id='$id' AND group_artifact_id='".$this->getID()."'";
+ $result=db_query($sql);
+ if ($result) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+
+ /**
+ * deleteUser() - delete a user's permissions
+ *
+ * @param int user_id of the user who's permissions to delete
+ * @return true/false
+ */
+ function deleteUser($id) {
+ if (!$this->userIsAdmin()) {
+ $this->setError('Permission Denied');
+ return false;
+ }
+ if (!$id) {
+ $this->setError('Missing Params');
+ return false;
+ }
+ $sql="DELETE FROM artifact_perm
+ WHERE user_id='$id' AND group_artifact_id='".$this->getID()."'";
+ $result=db_query($sql);
+ if ($result) {
+ return true;
+ } else {
+ $this->setError(db_error());
+ return false;
+ }
+ }
+
+ /*
+
+ USER PERMISSION FUNCTIONS
+
+ */
+
+ /**
+ * userCanView() - determine if the user can view this artifact type
+ *
+ * @return true/false
+ */
+ function userCanView() {
+ if ($this->isPublic()) {
+ return true;
+ } else {
+ if (!user_isloggedin()) {
+ return false;
+ } else {
+ //
+ // For now, we let any member of a project view this ArtifactType
+ // A future change might be to restrict to only those people with
+ // a corresponding entry in artifact_perm table
+ //
+ $perm =& $this->Group->getPermission( session_get_user() );
+ return $perm->isMember();
+ }
+ }
+ }
+
+ /**
+ * userIsAdmin() - see if the logged-in user's perms are >= 2 or Group ArtifactAdmin
+ *
+ * @return true/false
+ */
+ function userIsAdmin() {
+ $perm =& $this->Group->getPermission( session_get_user() );
+
+ if (($this->getCurrentUserPerm() >= 2) || ($perm->isArtifactAdmin())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * getCurrentUserPerm() - get the logged-in user's perms from artifact_perm
+ *
+ * @return int perm level for the logged-in user
+ */
+ function getCurrentUserPerm() {
+ if (!user_isloggedin()) {
+ return 0;
+ } else {
+ if (!isset($this->current_user_perm)) {
+ $sql="select perm_level
+ FROM artifact_perm
+ WHERE group_artifact_id='$this->artifact_type_id'
+ AND user_id='".user_getid()."'";
+ $this->current_user_perm=db_result(db_query($sql),0,0);
+ }
+ return $this->current_user_perm;
+ }
+ }
+
+ /**
+ * update() - use this to update this ArtifactType in the database
+ *
+ * @param string The item name
+ * @param string The item description
+ * @param bool (1) true (0) false - viewable by general public
+ * @param bool (1) true (0) false - whether non-logged-in users can submit
+ * @param bool (1) true (0) false - whether to email on all updates
+ * @param string The address to send new entries and updates to
+ * @param int Days before this item is considered overdue
+ * @param int Days before stale items time out
+ * @param bool (1) trye (0) false - whether the resolution box should be shown
+ * @param string Free-form text that project admins can place on the submit page
+ * @param string Free-form text that project admins can place on the browse page
+ * @return true on success, false on failure
+ */
+ function update($name,$description,$is_public,$allow_anon,$email_all,$email_address,
+ $due_period, $status_timeout,$use_resolution,$submit_instructions,$browse_instructions) {
+
+ $perm =& $this->Group->getPermission(session_get_user());
+
+ if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
+ $this->setError('ArtifactType: Permission Denied');
+ return false;
+ }
+
+ if ($this->getDataType()) {
+ $name=$this->getName();
+ $description=$this->getDescription();
+ }
+
+ if (!$name || !$description || !$due_period || !$status_timeout) {
+ $this->setError('ArtifactType: Name, Description, Due Period, and Status Timeout are required');
+ return false;
+ }
+
+ if ($email_address && !validate_email($email_address)) {
+ $email_address='';
+ }
+ if ($email_all && !$email_address) {
+ $email_all=0;
+ }
+ $sql="UPDATE artifact_group_list SET
+ name='$name',
+ description='". htmlspecialchars($description) ."',
+ is_public='$is_public',
+ allow_anon='$allow_anon',
+ email_all_updates='$email_all',
+ email_address='$email_address',
+ due_period='". ($due_period * (60*60*24)) ."',
+ status_timeout='". ($status_timeout * (60*60*24)) . "',
+ use_resolution='$use_resolution',
+ submit_instructions='$submit_instructions',
+ browse_instructions='$browse_instructions'
+ WHERE
+ group_artifact_id='". $this->getID() ."'
+ AND group_id='". $this->Group->getID() ."'";
+
+ $res=db_query($sql);
+ if (!$res || db_affected_rows($res) < 1) {
+ $this->setError('ArtifactType::Update(): '.db_error());
+ return false;
+ } else {
+ $this->fetchData($this->getID());
+ return true;
+ }
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactTypes.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactTypes.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/ArtifactTypes.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,222 @@
+<?php
+/**
+ * ArtifactTypes.class - Class to handle artifact types
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+require_once('common/include/Error.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('common/tracker/ArtifactGroup.class');
+require_once('common/tracker/ArtifactCategory.class');
+
+class ArtifactTypes extends Error {
+
+ /**
+ * The artifact type object
+ *
+ * @var object $ArtifactType
+ */
+ var $Group; //group object
+
+ /**
+ * Array of artifact data
+ *
+ * @var array $data_array
+ */
+ var $data_array;
+
+ /**
+ * ArtifactTypes() - constructor.
+ *
+ * @param object The Group object
+ * @return true/false
+ */
+ function ArtifactTypes(&$Group) {
+ $this->Error();
+ if (!$Group || !is_object($Group)) {
+ $this->setError('No Valid Group Object');
+ return false;
+ }
+ if ($Group->isError()) {
+ $this->setError('ArtifactType: '.$Group->getErrorMessage());
+ return false;
+ }
+ $this->Group =& $Group;
+ return true;
+ }
+
+ /**
+ * createTrackers() creates all the standard trackers for a given Group.
+ *
+ * @return true/false
+ */
+ function createTrackers() {
+
+ // first, check if trackers already exist
+ $res=db_query("SELECT * FROM artifact_group_list
+ WHERE group_id='".$this->Group->getID()."' AND datatype > 0");
+ if (db_numrows($res) > 0) {
+ return true;
+ }
+
+ db_begin();
+ if (!$this->createBugTracker()) {
+ db_rollback();
+ return false;
+ } elseif (!$this->createSupportTracker()) {
+ db_rollback();
+ return false;
+ } elseif (!$this->createPatchTracker()) {
+ db_rollback();
+ return false;
+ } elseif (!$this->createFeatureTracker()) {
+ db_rollback();
+ return false;
+ } else {
+ db_commit();
+ return true;
+ }
+ }
+
+ /**
+ * createBugTracker() creates bug tracker
+ *
+ * @return true/false
+ * @access private
+ */
+ function createBugTracker() {
+ $at=new ArtifactType($this->Group);
+ if (!$at || !is_object($at)) {
+ $this->setError('Error Creating ArtifactType for Bug Tracker');
+ return false;
+ } else {
+ if ($at->create('Bugs','Bug Tracking System',1,1,0,'',30,1,'','',1)) {
+ //
+ // create a default category
+ //
+ $ac=new ArtifactCategory($at);
+ $ac->create('Interface (example)',100);
+
+ //
+ // create a default group
+ //
+ $ag=new ArtifactGroup($at);
+ $ag->create('v1.0 (example)');
+ return true;
+ } else {
+ $this->setError('Failed to create bug tracker: '.$at->getErrorMessage());
+ return false;
+ }
+ }
+ }
+
+ /**
+ * createSupportTracker() creates support tracker
+ *
+ * @return true/false
+ * @access private
+ */
+ function createSupportTracker() {
+ $at=new ArtifactType($this->Group);
+ if (!$at || !is_object($at)) {
+ $this->setError('Error Creating ArtifactType for support Tracker');
+ return false;
+ } else {
+ if ($at->create('Support Requests','Tech Support Tracking System',1,1,0,'',15,0,'','',2)) {
+ //
+ // create a default category
+ //
+ $ac=new ArtifactCategory($at);
+ $ac->create('Install Problem (example)',100);
+
+ //
+ // create a default group
+ //
+ $ag=new ArtifactGroup($at);
+ $ag->create('v1.0 (example)');
+ return true;
+ } else {
+ $this->setError('Failed to create support tracker: '.$at->getErrorMessage());
+ return false;
+ }
+ }
+ }
+
+ /**
+ * createPatchTracker() creates patch tracker
+ *
+ * @return true/false
+ * @access private
+ */
+ function createPatchTracker() {
+ //
+ // Set up a patch tracker for this group
+ //
+ $at=new ArtifactType($this->Group);
+ if (!$at || !is_object($at)) {
+ $this->setError('Error Creating ArtifactType for patch Tracker');
+ return false;
+ } else {
+ if ($at->create('Patches','Patch Tracking System',1,1,0,'',15,1,'','',3)) {
+ //
+ // create a default category
+ //
+ $ac=new ArtifactCategory($at);
+ $ac->create('Widget (example)',100);
+
+ //
+ // create a default group
+ //
+ $ag=new ArtifactGroup($at);
+ $ag->create('Unstable (example)');
+ return true;
+ } else {
+ $this->setError('Failed to create support tracker: '.$at->getErrorMessage());
+ return false;
+ }
+ }
+ }
+
+ /**
+ * createFeatureTracker() creates feature tracker
+ *
+ * @return true/false
+ * @access private
+ */
+ function createFeatureTracker() {
+ //
+ // Set up a feature request tracker for this group
+ //
+ $at=new ArtifactType($this->Group);
+ if (!$at || !is_object($at)) {
+ $this->setError('Error Creating ArtifactType for feature Tracker');
+ return false;
+ } else {
+ if ($at->create('Feature Requests','Feature Request Tracking System',1,1,0,'',45,0,'','',4)) {
+ //
+ // create a default category
+ //
+ $ac=new ArtifactCategory($at);
+ $ac->create('Interface Improvements (example)',100);
+
+ //
+ // create a default group
+ //
+ $ag=new ArtifactGroup($at);
+ $ag->create('Next Release (example)');
+ return true;
+ } else {
+ $this->setError('Failed to create support tracker: '.$at->getErrorMessage());
+ return false;
+ }
+ }
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifacts.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifacts.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/common/tracker/Artifacts.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Artifacts.class - Class to handle multiple artifacts
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('common/include/Error.class');
+
+//need to include Artifact.class
+require_once('common/tracker/Artifact.class');
+
+class Artifacts extends Error {
+
+ /**
+ * Status db resource ID
+ *
+ * @var int $status_res
+ */
+ var $status_res;
+
+ /**
+ * Artifact Type object
+ *
+ * @var object $ArtifactType
+ */
+ var $ArtifactType;
+
+ /**
+ * Array of Artifact objects
+ *
+ * @var array $artifacts_array
+ */
+ var $artifacts_array;
+
+ /**
+ * Artifacts() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param object Artifact Type object
+ * @param int (primary key from database)
+ * @return true/false
+ */
+ function Artifacts(&$ArtifactType) {
+ $this->Error();
+
+ $this->ArtifactType =& $ArtifactType;
+
+ //was ArtifactType legit?
+ if (!$ArtifactType || !is_object($ArtifactType)) {
+ $this->setError('Artifact: No Valid ArtifactType');
+ return false;
+ }
+ //did ArtifactType have an error?
+ if ($ArtifactType->isError()) {
+ $this->setError('Artifact: '.$ArtifactType->getErrorMessage());
+ return false;
+ }
+
+ }
+
+ /**
+ * getArtifacts() - get an array of artifacts
+ *
+ * Retrieves an array of artifact objects.
+ *
+ * @param bool Database query offset
+ * @return an array of artifact objects on success / false on failure.
+ */
+ function &getArtifacts($offset=false) {
+ if (!$offset) {
+ $offset = 0;
+ }
+
+ $sql = "SELECT
+ *
+ FROM
+ artifact_vw
+ WHERE
+ group_artifact_id='". $this->ArtifactType->getID() ."'";
+
+ $res = db_query($sql,500,$offset);
+
+ if (!$res) {
+ $this->setError('Could not get artifacts: ' . db_error());
+ return false;
+ } else {
+ while ($rows = db_fetch_array($res)) {
+ $this->artifacts_array[] = new Artifact($this->ArtifactType, $rows);
+ }
+
+ return $this->artifacts_array;
+ }
+ }
+
+ /**
+ * getArtifactType() - get the artifact type
+ *
+ */
+ function &getArtifactType() {
+ return $this->ArtifactType;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/check_stale_tracker_items.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/check_stale_tracker_items.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/check_stale_tracker_items.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,40 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ * check_stale_tracker_items.php - Check for stale tracker items.
+ *
+ * This script goes through the database looking for tracker items that have a
+ * status of 'Pending' older than the admin-defined timeout period. The items
+ * that it finds it goes ahead and closes them out.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ * @author Darrell Brogdon dbrogdon at valinux.com
+ # @date 2001-04-20
+ *
+ */
+
+require ('squal_pre.php');
+
+$time = time();
+
+$sql = "UPDATE
+ artifact
+ SET
+ status_id='2'
+ WHERE
+ artifact_id IN (
+ SELECT
+ artifact_id
+ FROM
+ artifact a NATURAL JOIN artifact_group_list agl
+ WHERE
+ (agl.status_timeout+a.close_date) < '$time'
+ AND
+ a.status_id=4);";
+$res = db_query($sql);
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/check_stale_tracker_items.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_foundry_boxes.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/db_foundry_boxes.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/db_foundry_boxes.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,148 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: db_foundry_boxes.php,v 1.8 2001/06/13 18:44:09 pfalcon Exp $
+ *
+ */
+
+require ('squal_pre.php');
+
+/*
+
+ Aggregation script -
+
+ --
+ -- must be run after foundry population and stats
+ --
+
+ Since we cannot crunch down all the data on the fly anymore,
+ we need to crunch it down once daily into a separate table
+
+ DEPENDS ON
+ -download stats
+ -project weekly metric
+
+For the First-Time Run, Issue this SQL:
+
+CREATE TABLE foundry_project_rankings_agg AS
+SELECT
+ DISTINCT ON (fp.foundry_id,pwm.ranking)
+ fp.foundry_id,
+ groups.group_id,
+ groups.group_name,
+ groups.unix_group_name,
+ pwm.ranking,
+ pwm.percentile
+FROM
+ groups,project_weekly_metric pwm, foundry_projects fp
+WHERE
+ groups.group_id=pwm.group_id
+ AND pwm.group_id=fp.project_id
+ AND groups.is_public=1
+ AND groups.type=1
+ ORDER BY
+ foundry_id ASC, ranking ASC;
+
+CREATE INDEX foundryprojectrankingsagg_foundry_ranking ON foundry_project_rankings_agg (foundry_id,ranking);
+
+
+DROP TABLE foundry_project_downloads_agg;
+CREATE TABLE foundry_project_downloads_agg AS
+SELECT
+ DISTINCT ON (fp.foundry_id,frs_dlstats_group_agg.downloads,groups.group_id)
+ fp.foundry_id,
+ frs_dlstats_group_agg.downloads,
+ groups.group_id,
+ groups.group_name,
+ groups.unix_group_name
+FROM
+ frs_dlstats_group_agg,groups, foundry_projects fp
+WHERE
+ frs_dlstats_group_agg.month='200102' AND
+ frs_dlstats_group_agg.day='20'
+ AND frs_dlstats_group_agg.group_id=groups.group_id
+ AND groups.type=1
+ AND groups.is_public=1
+ AND groups.group_id=fp.project_id
+ ORDER BY foundry_id DESC, downloads DESC, group_id DESC;
+
+CREATE INDEX foundryprojdlsagg_foundryid_dls ON foundry_project_downloads_agg (foundry_id,downloads);
+
+*/
+
+
+/*
+ Create an aggregation table that includes foundry member project rankings
+*/
+db_begin(SYS_DB_STATS);
+
+$rel = db_query("DELETE FROM foundry_project_rankings_agg;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO foundry_project_rankings_agg
+SELECT
+ DISTINCT ON (fp.foundry_id,pwm.ranking)
+ fp.foundry_id,
+ groups.group_id,
+ groups.group_name,
+ groups.unix_group_name,
+ pwm.ranking,
+ pwm.percentile
+FROM
+ groups,project_weekly_metric pwm, foundry_projects fp
+WHERE
+ groups.group_id=pwm.group_id
+ AND pwm.group_id=fp.project_id
+ AND groups.is_public=1
+ AND groups.type=1
+ ORDER BY
+ foundry_id ASC, ranking ASC;
+", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+
+/*
+ Now crunch down the top downloads for each foundry
+*/
+
+$month=date('Ym',(time()-(86400*2)));
+$day=date('d',(time()-(86400*2)));
+
+db_begin(SYS_DB_STATS);
+
+$rel = db_query("DELETE FROM foundry_project_downloads_agg;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO foundry_project_downloads_agg
+SELECT
+ DISTINCT ON (fp.foundry_id,frs_dlstats_group_agg.downloads,groups.group_id)
+ fp.foundry_id,
+ frs_dlstats_group_agg.downloads,
+ groups.group_id,
+ groups.group_name,
+ groups.unix_group_name
+FROM
+ frs_dlstats_group_agg,groups, foundry_projects fp
+WHERE
+ frs_dlstats_group_agg.month='$month'
+ AND frs_dlstats_group_agg.day='$day'
+ AND frs_dlstats_group_agg.group_id=groups.group_id
+ AND groups.type=1
+ AND groups.is_public=1
+ AND groups.group_id=fp.project_id
+ ORDER BY foundry_id DESC, downloads DESC, group_id DESC;
+", -1, 0, SYS_DB_STATS);
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_foundry_boxes.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_project_sums.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/db_project_sums.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/db_project_sums.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,151 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require ('squal_pre.php');
+
+/*
+
+ Aggregation script
+
+ Since we cannot crunch down all the data on the fly anymore,
+ we need to crunch it down once daily into a separate table,
+ then join against that table to get counts.
+
+*/
+
+
+/*
+ Create an aggregation table that includes counts of forum messages
+*/
+db_begin();
+
+db_query("LOCK TABLE forum_agg_msg_count IN ACCESS EXCLUSIVE MODE;");
+db_query("LOCK TABLE forum IN ACCESS EXCLUSIVE MODE;");
+db_query("LOCK TABLE forum_group_list IN ACCESS EXCLUSIVE MODE;");
+
+$res = db_query("DELETE FROM forum_agg_msg_count;");
+if (!$res) {
+ echo "DELETE FROM forum_agg_msg_count : ".db_error();
+}
+
+$res = db_query("INSERT INTO forum_agg_msg_count
+SELECT fgl.group_forum_id,count(f.msg_id)
+FROM forum_group_list fgl
+LEFT JOIN forum f USING (group_forum_id)
+GROUP BY fgl.group_forum_id;");
+if (!$res) {
+ echo "INSERT INTO forum_agg_msg_count : ".db_error();
+}
+
+db_commit();
+
+db_query("VACUUM ANALYZE forum_agg_msg_count;");
+
+
+/*
+ Create an aggregation table that includes counts of artifacts
+*/
+db_begin();
+
+db_query("LOCK TABLE artifact_counts_agg IN ACCESS EXCLUSIVE MODE;");
+db_query("LOCK TABLE artifact IN ACCESS EXCLUSIVE MODE;");
+db_query("LOCK TABLE artifact_group_list IN ACCESS EXCLUSIVE MODE;");
+
+$rel = db_query("DELETE FROM artifact_counts_agg;");
+echo db_error();
+
+$rel=db_query("INSERT INTO artifact_counts_agg
+SELECT agl.group_artifact_id,
+(SELECT count(*) FROM artifact WHERE status_id <> 3 AND group_artifact_id=agl.group_artifact_id),
+(SELECT count(*) FROM artifact WHERE status_id=1 AND group_artifact_id=agl.group_artifact_id)
+FROM artifact_group_list agl
+LEFT JOIN artifact a USING (group_artifact_id)
+GROUP BY agl.group_artifact_id;");
+echo db_error();
+
+db_commit();
+
+db_query("VACUUM ANALYZE artifact_counts_agg;");
+
+/*
+
+ Rebuild the project_sums_agg table, which saves us
+ from doing really expensive queries
+ each time the project summary is viewed
+
+*/
+
+db_begin();
+$res=db_query("DELETE FROM project_sums_agg;");
+
+/*
+ Get counts of mailing lists
+*/
+$sql="INSERT INTO project_sums_agg
+ SELECT group_id,'mail'::text AS type,count(*) AS count
+ FROM mail_group_list
+ GROUP BY group_id,type;";
+
+$res=db_query($sql);
+echo db_error();
+
+
+/*
+ Get counts of surveys
+*/
+$sql="INSERT INTO project_sums_agg
+ SELECT group_id,'surv'::text AS type,count(*) AS count
+ FROM surveys
+ WHERE is_active='1'
+ GROUP BY group_id,type;";
+
+$res=db_query($sql);
+echo db_error();
+
+
+/*
+ Forum message count
+*/
+$sql="INSERT INTO project_sums_agg
+ SELECT forum_group_list.group_id,'fmsg'::text AS type, count(forum.msg_id) AS count
+ FROM forum,forum_group_list
+ WHERE forum.group_forum_id=forum_group_list.group_forum_id
+ AND forum_group_list.is_public=1
+ GROUP BY group_id,type;";
+
+$res=db_query($sql);
+echo db_error();
+
+
+/*
+ Forum count
+*/
+$sql="INSERT INTO project_sums_agg
+ SELECT group_id,'fora'::text AS type, count(*) AS count
+ FROM forum_group_list
+ WHERE is_public=1
+ GROUP BY group_id,type;";
+
+$res=db_query($sql);
+echo db_error();
+
+
+db_commit();
+echo db_error();
+
+db_query("VACUUM ANALYZE project_sums_agg;");
+
+if (db_error()) {
+ echo "Error: ".db_error();
+}
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_project_sums.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_stats_agg.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/db_stats_agg.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/db_stats_agg.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,870 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require ('squal_pre.php');
+
+/*
+
+ Aggregation script
+
+ Since we cannot crunch down all the data on the fly anymore,
+ we need to crunch it down once daily into separate tables
+
+*/
+
+
+/*
+ FIRST TIME RUN:
+
+--
+-- Create a table of total downloads by file
+--
+-- NOTE: Builds on stats_sum.pl
+--
+DROP TABLE frs_dlstats_filetotal_agg;
+CREATE TABLE frs_dlstats_filetotal_agg AS
+SELECT file_id,sum(downloads)::int AS downloads
+FROM frs_dlstats_file_agg
+GROUP BY file_id;
+
+CREATE INDEX frsdlfiletotal_fileid on frs_dlstats_filetotal_agg(file_id);
+
+--
+-- Create a table of total downloads by group
+--
+-- NOTE: Builds on prior step (frs_dlstats_filetotal_agg)
+--
+DROP TABLE frs_dlstats_grouptotal_agg;
+CREATE TABLE frs_dlstats_grouptotal_agg AS
+SELECT frs_package.group_id, sum(frs_dlstats_filetotal_agg.downloads)::int AS downloads
+FROM frs_package,frs_release,frs_file,frs_dlstats_filetotal_agg
+WHERE frs_package.package_id=frs_release.package_id
+AND frs_release.release_id=frs_file.release_id
+AND frs_file.file_id=frs_dlstats_filetotal_agg.file_id
+GROUP BY frs_package.group_id;
+
+CREATE INDEX frsdlgrouptotal_groupid ON frs_dlstats_grouptotal_agg(group_id);
+
+--
+-- Create table of total downloads by group/day
+--
+-- NOTE: Builds on frs_dlstats_filetotal_agg
+--
+DROP TABLE frs_dlstats_group_agg;
+CREATE TABLE frs_dlstats_group_agg AS
+SELECT
+frs_package.group_id::int AS group_id,
+fdfa.month::int AS month,
+fdfa.day::int AS day,
+sum(fdfa.downloads)::int AS downloads
+FROM frs_package,frs_release,frs_file,frs_dlstats_file_agg fdfa
+WHERE frs_package.package_id=frs_release.package_id
+AND frs_release.release_id=frs_file.release_id
+AND frs_file.file_id=fdfa.file_id
+GROUP BY frs_package.group_id,fdfa.month, fdfa.day;
+
+CREATE INDEX frsdlgroup_groupid ON frs_dlstats_group_agg(group_id);
+CREATE INDEX frsdlgroup_month_day_groupid ON frs_dlstats_group_agg(month,day,group_id);
+
+--
+-- Create a table containing project_stats grouped by month
+--
+DROP TABLE stats_project_months;
+CREATE TABLE stats_project_months AS
+SELECT spd.month::int AS month,
+ spd.group_id::int AS group_id,
+ spd.developers::int AS developers,
+ spm.group_ranking::int AS group_ranking,
+ spm.group_metric::float AS group_metric,
+ salbg.logo_showings::int AS logo_showings,
+ fdga.downloads::int AS downloads,
+ sasbg.site_views::int AS site_views,
+ ssp.subdomain_views::int AS subdomain_views,
+ (coalesce(sasbg.site_views,0) + coalesce(ssp.subdomain_views,0))::int AS page_views,
+ sp.file_releases::int AS file_releases,
+ sp.msg_posted::int AS msg_posted,
+ sp.msg_uniq_auth::int AS msg_uniq_auth,
+ sp.bugs_opened::int AS bugs_opened,
+ sp.bugs_closed::int AS bugs_closed,
+ sp.support_opened::int AS support_opened,
+ sp.support_closed::int AS support_closed,
+ sp.patches_opened::int AS patches_opened,
+ sp.patches_closed::int AS patches_closed,
+ sp.artifacts_opened::int AS artifacts_opened,
+ sp.artifacts_closed::int AS artifacts_closed,
+ sp.tasks_opened::int AS tasks_opened,
+ sp.tasks_closed::int AS tasks_closed,
+ sp.help_requests::int AS help_requests,
+ scg.cvs_checkouts::int AS cvs_checkouts,
+ scg.cvs_commits::int AS cvs_commits,
+ scg.cvs_adds::int AS cvs_adds
+ FROM (
+ SELECT month,group_id,avg(developers)::int AS developers
+ FROM stats_project_developers GROUP BY month,group_id
+ ) spd
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(file_releases) AS file_releases,
+ sum(msg_posted) AS msg_posted,
+ sum(msg_uniq_auth) AS msg_uniq_auth,
+ sum(bugs_opened) AS bugs_opened,
+ sum(bugs_closed) AS bugs_closed,
+ sum(support_opened) AS support_opened,
+ sum(support_closed) AS support_closed,
+ sum(patches_opened) AS patches_opened,
+ sum(patches_closed) AS patches_closed,
+ sum(artifacts_opened) AS artifacts_opened,
+ sum(artifacts_closed) AS artifacts_closed,
+ sum(tasks_opened) AS tasks_opened,
+ sum(tasks_closed) AS tasks_closed,
+ sum(help_requests) AS help_requests
+ FROM
+ stats_project
+ GROUP BY month,group_id
+ ) sp USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(count) AS logo_showings
+ FROM stats_agg_logo_by_group
+ GROUP BY month,group_id
+ ) salbg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,avg(ranking)::int AS group_ranking,avg(percentile)::float AS group_metric
+ FROM stats_project_metric
+ GROUP BY month,group_id
+ ) spm USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(checkouts) AS cvs_checkouts,sum(commits) AS cvs_commits,sum(adds) AS cvs_adds
+ FROM stats_cvs_group
+ GROUP BY month,group_id
+ ) scg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(count) AS site_views
+ FROM stats_agg_site_by_group
+ GROUP BY month,group_id
+ ) sasbg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(pages) AS subdomain_views
+ FROM stats_subd_pages
+ GROUP BY month,group_id
+ ) ssp USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(downloads) AS downloads
+ FROM frs_dlstats_group_agg
+ GROUP BY month,group_id
+ ) fdga USING (month,group_id);
+
+CREATE INDEX statsprojectmonths_groupid on stats_project_months(group_id);
+CREATE INDEX statsprojectmonths_groupid_month on stats_project_months(group_id,month);
+
+--
+-- Create a table containing project_stats grouped by all time
+--
+-- NOTE: Builds on results in stats_project_months
+--
+DROP TABLE stats_project_all;
+CREATE TABLE stats_project_all AS
+SELECT group_id::int AS group_id,
+ AVG(developers)::int AS developers,
+ AVG(group_ranking)::int AS group_ranking,
+ AVG(group_metric)::float AS group_metric,
+ SUM(logo_showings)::int AS logo_showings,
+ SUM(downloads)::int AS downloads,
+ SUM(site_views)::int AS site_views,
+ SUM(subdomain_views)::int AS subdomain_views,
+ SUM(page_views)::int AS page_views,
+ SUM(msg_posted)::int AS msg_posted,
+ AVG(msg_uniq_auth)::int AS msg_uniq_auth,
+ SUM(bugs_opened)::int AS bugs_opened,
+ SUM(bugs_closed)::int AS bugs_closed,
+ SUM(support_opened)::int AS support_opened,
+ SUM(support_closed)::int AS support_closed,
+ SUM(patches_opened)::int AS patches_opened,
+ SUM(patches_closed)::int AS patches_closed,
+ SUM(artifacts_opened)::int AS artifacts_opened,
+ SUM(artifacts_closed)::int AS artifacts_closed,
+ SUM(tasks_opened)::int AS tasks_opened,
+ SUM(tasks_closed)::int AS tasks_closed,
+ SUM(help_requests)::int AS help_requests,
+ SUM(cvs_checkouts)::int AS cvs_checkouts,
+ SUM(cvs_commits)::int AS cvs_commits,
+ SUM(cvs_adds)::int AS cvs_adds
+ FROM stats_project_months
+ GROUP BY group_id
+ ORDER BY group_id DESC;
+
+CREATE INDEX statsprojectall_groupid on stats_project_all(group_id);
+
+--
+-- We unforunately have to create this temp table as postgres
+-- fails to produce the right results in production (works on webdev)
+--
+DROP TABLE stats_project_developers_last30;
+CREATE TABLE stats_project_developers_last30 AS
+SELECT * FROM stats_project_developers
+WHERE (month = 200104 AND day >= 8 ) OR ( month > 200104 );
+
+--
+-- Build a table with only the last 30 days of data in it
+--
+DROP TABLE stats_project_last_30;
+CREATE TABLE stats_project_last_30 AS
+SELECT spd.month::int AS month,
+spd.day::int AS day,
+spd.group_id::int AS group_id,
+spd.developers::int AS developers,
+spm.ranking::int AS group_ranking,
+spm.percentile::float AS group_metric,
+salbg.count::int AS logo_showings,
+fdga.downloads::int AS downloads,
+sasbg.count::int AS site_views,
+ssp.pages::int AS subdomain_views,
+(coalesce(sasbg.count,0) + coalesce(ssp.pages,0))::int AS page_views,
+sp.file_releases::int AS filereleases,
+sp.msg_posted::int AS msg_posted,
+sp.msg_uniq_auth::int AS msg_uniq_auth,
+sp.bugs_opened::int AS bugs_opened,
+sp.bugs_closed::int AS bugs_closed,
+sp.support_opened::int AS support_opened,
+sp.support_closed::int AS support_closed,
+sp.patches_opened::int AS patches_opened,
+sp.patches_closed::int AS patches_closed,
+sp.artifacts_opened::int AS artifacts_opened,
+sp.artifacts_closed::int AS artifacts_closed,
+sp.tasks_opened::int AS tasks_opened,
+sp.tasks_closed::int AS tasks_closed,
+sp.help_requests::int AS help_requests,
+scg.checkouts::int AS cvs_checkouts,
+scg.commits::int AS cvs_commits,
+scg.adds::int AS cvs_adds
+
+FROM stats_project_developers_last30 spd
+
+LEFT JOIN frs_dlstats_group_agg fdga USING (month,day,group_id)
+LEFT JOIN stats_project sp USING (month,day,group_id)
+LEFT JOIN stats_agg_logo_by_group salbg USING (month,day,group_id)
+LEFT JOIN stats_project_metric spm USING (month,day,group_id)
+LEFT JOIN stats_cvs_group scg USING (month,day,group_id)
+LEFT JOIN stats_agg_site_by_group sasbg USING (month,day,group_id)
+LEFT JOIN stats_subd_pages ssp USING (month,day,group_id)
+;
+
+CREATE INDEX statsproject30_groupid on stats_project_last_30(group_id);
+
+--
+-- create a table containing main site page views grouped by month
+--
+DROP TABLE stats_site_pages_by_month;
+CREATE TABLE stats_site_pages_by_month AS
+select month,sum(site_page_views)::int as site_page_views
+ from stats_site_pages_by_day group by month;
+
+--
+-- Create a table joining stats_site and stats_project
+-- with the last 30 days of data only
+--
+-- NOTE: Builds on results of stats_project_last_30
+--
+DROP TABLE stats_site_last_30;
+CREATE TABLE stats_site_last_30 AS
+SELECT p.month::int AS month,
+ p.day::int AS day,
+ sspbd.site_page_views::int AS site_page_views,
+ SUM(p.downloads)::int AS downloads,
+ SUM(p.subdomain_views)::int AS subdomain_views,
+ SUM(p.msg_posted)::int AS msg_posted,
+ SUM(p.bugs_opened)::int AS bugs_opened,
+ SUM(p.bugs_closed)::int AS bugs_closed,
+ SUM(p.support_opened)::int AS support_opened,
+ SUM(p.support_closed)::int AS support_closed,
+ SUM(p.patches_opened)::int AS patches_opened,
+ SUM(p.patches_closed)::int AS patches_closed,
+ SUM(p.artifacts_opened)::int AS artifacts_opened,
+ SUM(p.artifacts_closed)::int AS artifacts_closed,
+ SUM(p.tasks_opened)::int AS tasks_opened,
+ SUM(p.tasks_closed)::int AS tasks_closed,
+ SUM(p.help_requests)::int AS help_requests,
+ SUM(p.cvs_checkouts)::int AS cvs_checkouts,
+ SUM(p.cvs_commits)::int AS cvs_commits,
+ SUM(p.cvs_adds)::int AS cvs_adds
+ FROM stats_project_last_30 p, stats_site_pages_by_day sspbd
+ WHERE p.month=sspbd.month AND p.day=sspbd.day
+ GROUP BY p.month, p.day, sspbd.site_page_views;
+
+CREATE INDEX statssitelast30_month_day on stats_site_last_30 (month,day);
+
+--
+-- Create a table joining stats_site and stats_project
+-- grouped by month
+--
+-- NOTICE - this builds on the results of stats_project_months
+--
+DROP TABLE stats_site_months;
+CREATE TABLE stats_site_months AS
+SELECT spm.month::int AS month,
+ sspbm.site_page_views::int AS site_page_views,
+ SUM(spm.downloads)::int AS downloads,
+ SUM(spm.subdomain_views)::int AS subdomain_views,
+ SUM(spm.msg_posted)::int AS msg_posted,
+ SUM(spm.bugs_opened)::int AS bugs_opened,
+ SUM(spm.bugs_closed)::int AS bugs_closed,
+ SUM(spm.support_opened)::int AS support_opened,
+ SUM(spm.support_closed)::int AS support_closed,
+ SUM(spm.patches_opened)::int AS patches_opened,
+ SUM(spm.patches_closed)::int AS patches_closed,
+ SUM(spm.artifacts_opened)::int AS artifacts_opened,
+ SUM(spm.artifacts_closed)::int AS artifacts_closed,
+ SUM(spm.tasks_opened)::int AS tasks_opened,
+ SUM(spm.tasks_closed)::int AS tasks_closed,
+ SUM(spm.help_requests)::int AS help_requests,
+ SUM(spm.cvs_checkouts)::int AS cvs_checkouts,
+ SUM(spm.cvs_commits)::int AS cvs_commits,
+ SUM(spm.cvs_adds)::int AS cvs_adds
+ FROM stats_project_months spm, stats_site_pages_by_month sspbm
+ WHERE spm.month=sspbm.month
+ GROUP BY spm.month,sspbm.site_page_views
+ ORDER BY spm.month ASC;
+
+CREATE INDEX statssitemonths_month on stats_site_months(month);
+
+--
+-- Create a table joining stats_site and stats_project
+-- grouped by all to get total
+--
+-- NOTICE - this builds on the results of stats_site_months
+--
+DROP TABLE stats_site_all;
+CREATE TABLE stats_site_all AS
+SELECT
+ SUM(site_page_views)::int AS site_page_views,
+ SUM(downloads)::int AS downloads,
+ SUM(subdomain_views)::int AS subdomain_views,
+ SUM(msg_posted)::int AS msg_posted,
+ SUM(bugs_opened)::int AS bugs_opened,
+ SUM(bugs_closed)::int AS bugs_closed,
+ SUM(support_opened)::int AS support_opened,
+ SUM(support_closed)::int AS support_closed,
+ SUM(patches_opened)::int AS patches_opened,
+ SUM(patches_closed)::int AS patches_closed,
+ SUM(artifacts_opened)::int AS artifacts_opened,
+ SUM(artifacts_closed)::int AS artifacts_closed,
+ SUM(tasks_opened)::int AS tasks_opened,
+ SUM(tasks_closed)::int AS tasks_closed,
+ SUM(help_requests)::int AS help_requests,
+ SUM(cvs_checkouts)::int AS cvs_checkouts,
+ SUM(cvs_commits)::int AS cvs_commits,
+ SUM(cvs_adds)::int AS cvs_adds
+ FROM stats_site_months;
+
+*/
+
+
+
+//
+// total file downloads by file
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning frs_dlstats_filetotal_agg: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM frs_dlstats_filetotal_agg;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO frs_dlstats_filetotal_agg
+SELECT file_id,sum(downloads) AS downloads
+FROM frs_dlstats_file_agg
+GROUP BY file_id
+;", -1, 0, SYS_DB_STATS);
+
+if (!$rel) {
+ echo "ERROR IN frs_dlstats_filetotal_agg";
+}
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE frs_dlstats_filetotal_agg;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// total downloads by group
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning frs_dlstats_grouptotal_agg: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM frs_dlstats_grouptotal_agg;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO frs_dlstats_grouptotal_agg
+SELECT frs_package.group_id, sum(frs_dlstats_filetotal_agg.downloads) AS downloads
+FROM frs_package,frs_release,frs_file,frs_dlstats_filetotal_agg
+WHERE frs_package.package_id=frs_release.package_id
+AND frs_release.release_id=frs_file.release_id
+AND frs_file.file_id=frs_dlstats_filetotal_agg.file_id
+GROUP BY frs_package.group_id
+;", -1, 0, SYS_DB_STATS);
+
+if (!$rel) {
+ echo "ERROR IN frs_dlstats_grouptotal_agg";
+}
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE frs_dlstats_grouptotal_agg;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// total downloads by group
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning frs_dlstats_group_agg: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM frs_dlstats_group_agg;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO frs_dlstats_group_agg
+SELECT frs_package.group_id, fdfa.month, fdfa.day, sum(fdfa.downloads) AS downloads
+FROM frs_package,frs_release,frs_file,frs_dlstats_file_agg fdfa
+WHERE frs_package.package_id=frs_release.package_id
+AND frs_release.release_id=frs_file.release_id
+AND frs_file.file_id=fdfa.file_id
+GROUP BY frs_package.group_id,fdfa.month, fdfa.day
+;", -1, 0, SYS_DB_STATS);
+
+if (!$rel) {
+ echo "ERROR IN frs_dlstats_group_agg";
+}
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE frs_dlstats_group_agg;", -1, 0, SYS_DB_STATS);
+
+?><?php
+
+
+//
+// project stats by month
+//
+db_begin(SYS_DB_STATS);
+echo "\n\nBeginning stats_project_months: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_project_months;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_project_months
+SELECT spd.month,
+ spd.group_id,
+ spd.developers,
+ spm.group_ranking,
+ spm.group_metric,
+ salbg.logo_showings,
+ fdga.downloads,
+ sasbg.site_views,
+ ssp.subdomain_views,
+ (sasbg.site_views + ssp.subdomain_views) AS page_views,
+ sp.file_releases,
+ sp.msg_posted,
+ sp.msg_uniq_auth,
+ sp.bugs_opened,
+ sp.bugs_closed,
+ sp.support_opened,
+ sp.support_closed,
+ sp.patches_opened,
+ sp.patches_closed,
+ sp.artifacts_opened,
+ sp.artifacts_closed,
+ sp.tasks_opened,
+ sp.tasks_closed,
+ sp.help_requests,
+ scg.cvs_checkouts,
+ scg.cvs_commits,
+ scg.cvs_adds
+ FROM (
+ SELECT month,group_id,avg(developers)::int AS developers
+ FROM stats_project_developers GROUP BY month,group_id
+ ) spd
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(file_releases) AS file_releases,
+ sum(msg_posted) AS msg_posted,
+ sum(msg_uniq_auth) AS msg_uniq_auth,
+ sum(bugs_opened) AS bugs_opened,
+ sum(bugs_closed) AS bugs_closed,
+ sum(support_opened) AS support_opened,
+ sum(support_closed) AS support_closed,
+ sum(patches_opened) AS patches_opened,
+ sum(patches_closed) AS patches_closed,
+ sum(artifacts_opened) AS artifacts_opened,
+ sum(artifacts_closed) AS artifacts_closed,
+ sum(tasks_opened) AS tasks_opened,
+ sum(tasks_closed) AS tasks_closed,
+ sum(help_requests) AS help_requests
+ FROM
+ stats_project
+ GROUP BY month,group_id
+ ) sp USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(count) AS logo_showings
+ FROM stats_agg_logo_by_group
+ GROUP BY month,group_id
+ ) salbg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,avg(ranking)::int AS group_ranking,avg(percentile)::float AS group_metric
+ FROM stats_project_metric
+ GROUP BY month,group_id
+ ) spm USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(checkouts) AS cvs_checkouts,sum(commits) AS cvs_commits,sum(adds) AS cvs_adds
+ FROM stats_cvs_group
+ GROUP BY month,group_id
+ ) scg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(count) AS site_views
+ FROM stats_agg_site_by_group
+ GROUP BY month,group_id
+ ) sasbg USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(pages) AS subdomain_views
+ FROM stats_subd_pages
+ GROUP BY month,group_id
+ ) ssp USING (month,group_id)
+
+ LEFT JOIN (
+ SELECT month,group_id,sum(downloads) AS downloads
+ FROM frs_dlstats_group_agg
+ GROUP BY month,group_id
+ ) fdga USING (month,group_id);
+", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_project_months;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// All-time stats by group_id
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_project_all: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_project_all;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_project_all
+SELECT group_id,
+ AVG(developers)::int AS developers,
+ AVG(group_ranking)::int AS group_ranking,
+ AVG(group_metric) AS group_metric,
+ SUM(logo_showings) AS logo_showings,
+ SUM(downloads) AS downloads,
+ SUM(site_views) AS site_views,
+ SUM(subdomain_views) AS subdomain_views,
+ SUM(page_views) AS page_views,
+ SUM(msg_posted) AS msg_posted,
+ AVG(msg_uniq_auth)::int AS msg_uniq_auth,
+ SUM(bugs_opened) AS bugs_opened,
+ SUM(bugs_closed) AS bugs_closed,
+ SUM(support_opened) AS support_opened,
+ SUM(support_closed) AS support_closed,
+ SUM(patches_opened) AS patches_opened,
+ SUM(patches_closed) AS patches_closed,
+ SUM(artifacts_opened) AS artifacts_opened,
+ SUM(artifacts_closed) AS artifacts_closed,
+ SUM(tasks_opened) AS tasks_opened,
+ SUM(tasks_closed) AS tasks_closed,
+ SUM(help_requests) AS help_requests,
+ SUM(cvs_checkouts) AS cvs_checkouts,
+ SUM(cvs_commits) AS cvs_commits,
+ SUM(cvs_adds) AS cvs_adds
+ FROM stats_project_months
+ GROUP BY group_id
+ ORDER BY group_id DESC
+;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_project_all;", -1, 0, SYS_DB_STATS);
+
+
+$beg_year=date('Y',mktime(0,0,0,(date('m')-1),date('d'),date('Y')));
+$beg_month=date('m',mktime(0,0,0,(date('m')-1),date('d'),date('Y')));
+$beg_day=date('d',mktime(0,0,0,(date('m')-1),date('d'),date('Y')));
+
+echo "\n$beg_year$beg_month$beg_day";
+
+$year=date('Y');
+$month=date('m');
+
+//
+// Table with just the last 30 days data sorted out
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_project_developers_last30: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_project_developers_last30;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_project_developers_last30
+SELECT * FROM stats_project_developers
+WHERE ( month = '$beg_year$beg_month' AND day >= '$beg_day' ) OR ( month > '$beg_year$beg_month' );
+", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_project_developers_last30;", -1, 0, SYS_DB_STATS);
+
+?><?php
+
+
+//
+// Table with just the last 30 days data sorted out
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_project_last_30: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_project_last_30;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_project_last_30
+SELECT spd.month,
+spd.day,
+spd.group_id,
+spd.developers,
+spm.ranking AS group_ranking,
+spm.percentile AS group_metric,
+salbg.count AS logo_showings,
+fdga.downloads,
+sasbg.count AS site_views,
+ssp.pages AS subdomain_views,
+sasbg.count+ssp.pages AS page_views,
+sp.file_releases,
+sp.msg_posted,
+sp.msg_uniq_auth,
+sp.bugs_opened,
+sp.bugs_closed,
+sp.support_opened,
+sp.support_closed,
+sp.patches_opened,
+sp.patches_closed,
+sp.artifacts_opened,
+sp.artifacts_closed,
+sp.tasks_opened,
+sp.tasks_closed,
+sp.help_requests,
+scg.checkouts AS cvs_checkouts,
+scg.commits AS cvs_commits,
+scg.adds AS cvs_adds
+
+FROM stats_project_developers_last30 spd
+
+LEFT JOIN frs_dlstats_group_agg fdga USING (month,day,group_id)
+LEFT JOIN stats_project sp USING (month,day,group_id)
+LEFT JOIN stats_agg_logo_by_group salbg USING (month,day,group_id)
+LEFT JOIN stats_project_metric spm USING (month,day,group_id)
+LEFT JOIN stats_cvs_group scg USING (month,day,group_id)
+LEFT JOIN stats_agg_site_by_group sasbg USING (month,day,group_id)
+LEFT JOIN stats_subd_pages ssp USING (month,day,group_id)
+;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_project_last_30;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// main site page views by month
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_site_pages_by_month: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_site_pages_by_month;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_site_pages_by_month
+select month,sum(site_page_views) as site_page_views
+ from stats_site_pages_by_day group by month;
+", -1, 0, SYS_DB_STATS);
+
+if (!$rel) {
+ echo "ERROR IN stats_site_pages_by_month";
+}
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_site_pages_by_month;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// sitewide stats in last 30 days
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_site_last_30: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_site_last_30;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_site_last_30
+SELECT p.month,
+ p.day,
+ sspbd.site_page_views,
+ SUM(p.downloads) AS downloads,
+ SUM(p.subdomain_views) AS subdomain_views,
+ SUM(p.msg_posted) AS msg_posted,
+ SUM(p.bugs_opened) AS bugs_opened,
+ SUM(p.bugs_closed) AS bugs_closed,
+ SUM(p.support_opened) AS support_opened,
+ SUM(p.support_closed) AS support_closed,
+ SUM(p.patches_opened) AS patches_opened,
+ SUM(p.patches_closed) AS patches_closed,
+ SUM(artifacts_opened) AS artifacts_opened,
+ SUM(artifacts_closed) AS artifacts_closed,
+ SUM(p.tasks_opened) AS tasks_opened,
+ SUM(p.tasks_closed) AS tasks_closed,
+ SUM(p.help_requests) AS help_requests,
+ SUM(p.cvs_checkouts) AS cvs_checkouts,
+ SUM(p.cvs_commits) AS cvs_commits,
+ SUM(p.cvs_adds) AS cvs_adds
+ FROM stats_project_last_30 p, stats_site_pages_by_day sspbd
+ WHERE p.month=sspbd.month AND p.day=sspbd.day
+ GROUP BY p.month, p.day, sspbd.site_page_views;
+", -1, 0, SYS_DB_STATS);
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_site_last_30;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// sitewide stats in last 30 days
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_site_months: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_site_months;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_site_months
+SELECT spm.month,
+ sspbm.site_page_views,
+ SUM(spm.downloads) AS downloads,
+ SUM(spm.subdomain_views) AS subdomain_views,
+ SUM(spm.msg_posted) AS msg_posted,
+ SUM(spm.bugs_opened) AS bugs_opened,
+ SUM(spm.bugs_closed) AS bugs_closed,
+ SUM(spm.support_opened) AS support_opened,
+ SUM(spm.support_closed) AS support_closed,
+ SUM(spm.patches_opened) AS patches_opened,
+ SUM(spm.patches_closed) AS patches_closed,
+ SUM(spm.artifacts_opened) AS artifacts_opened,
+ SUM(spm.artifacts_closed) AS artifacts_closed,
+ SUM(spm.tasks_opened) AS tasks_opened,
+ SUM(spm.tasks_closed) AS tasks_closed,
+ SUM(spm.help_requests) AS help_requests,
+ SUM(spm.cvs_checkouts) AS cvs_checkouts,
+ SUM(spm.cvs_commits) AS cvs_commits,
+ SUM(spm.cvs_adds) AS cvs_adds
+ FROM stats_project_months spm, stats_site_pages_by_month sspbm
+ WHERE spm.month=sspbm.month
+ GROUP BY spm.month,sspbm.site_page_views
+ ORDER BY spm.month ASC;
+", -1, 0, SYS_DB_STATS);
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_site_months;", -1, 0, SYS_DB_STATS);
+
+
+
+//
+// sitewide stats all time
+//
+db_begin(SYS_DB_STATS);
+
+echo "\n\nBeginning stats_site_all: ".date('Y-m-d H:i:s',time());
+
+$rel = db_query("DELETE FROM stats_site_all;", -1, 0, SYS_DB_STATS);
+echo db_error(SYS_DB_STATS);
+
+$rel=db_query("INSERT INTO stats_site_all
+SELECT
+ SUM(site_page_views) AS site_page_views,
+ SUM(downloads) AS downloads,
+ SUM(subdomain_views) AS subdomain_views,
+ SUM(msg_posted) AS msg_posted,
+ SUM(bugs_opened) AS bugs_opened,
+ SUM(bugs_closed) AS bugs_closed,
+ SUM(support_opened) AS support_opened,
+ SUM(support_closed) AS support_closed,
+ SUM(patches_opened) AS patches_opened,
+ SUM(patches_closed) AS patches_closed,
+ SUM(artifacts_opened) AS artifacts_opened,
+ SUM(artifacts_closed) AS artifacts_closed,
+ SUM(tasks_opened) AS tasks_opened,
+ SUM(tasks_closed) AS tasks_closed,
+ SUM(help_requests) AS help_requests,
+ SUM(cvs_checkouts) AS cvs_checkouts,
+ SUM(cvs_commits) AS cvs_commits,
+ SUM(cvs_adds) AS cvs_adds
+ FROM stats_site_months;
+", -1, 0, SYS_DB_STATS);
+
+echo db_error(SYS_DB_STATS);
+
+db_commit(SYS_DB_STATS);
+
+db_query("VACUUM ANALYZE stats_site_all;", -1, 0, SYS_DB_STATS);
+
+
+if (db_error(SYS_DB_STATS)) {
+ echo "Error: ".db_error(SYS_DB_STATS);
+}
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/db_stats_agg.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/kt_dump.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/kt_dump.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/kt_dump.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,82 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * kt_dump.php - Retreive the Kernel Traffic page
+ *
+ * This script retrieves the main Kernel Traffic page and stores it
+ * in the database.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: kt_dump.php,v 1.4 2001/06/13 18:44:09 pfalcon Exp $
+ * @author: Darrell Brogdon <dbrogdon at valinux.com>
+ *
+ */
+
+require ('squal_pre.php');
+set_time_limit(60);
+
+$url = 'http://kt.zork.net/kernel-traffic/latest.html';
+
+// Retrieve the file and store the contents in an array.
+$data =@ file($url);
+if (!sizeof($data)){
+ $errors = 'Could not open link: \'' . $url . "'\n";
+}
+
+$capt_flag = false;
+// Walk through the array looking for elements that indicate the start
+// of the page body.
+foreach ($data as $key => $fileline) {
+ // If this element is the start of the page body then
+ // Start saving data
+ if( ereg("Kernel Traffic \#", $fileline) ) {
+ $capt_flag = true;
+ }
+
+ if( eregi('<li><a href="latest_print.epl">Printer-Friendly Format</a>',$fileline) ) {
+ $data[$key] = '<li><a href="' . $url . 'latest_print.epl">Printer-Friendly Format</a>';
+ }
+
+ if( eregi('<li><a href="latest.epl#stats">Mailing List Stats For This Week</a>',$fileline) ) {
+ $data[$key] = '<li><a href="#stats">Mailing List Stats For This Week</a>';
+ }
+
+ // Stop saving data
+ if( eregi('<hr', $fileline) ) {
+ $capt_flag = false;
+ }
+
+ if (!$capt_flag) {
+ // Remove the current line from the array
+ unset($data[$key]);
+ }
+}
+
+if(!count($data)) {
+ $errors .= "Data size is too small.\n";
+} else {
+ db_begin();
+
+ $sql = 'DELETE FROM kernel_traffic';
+ db_query($sql);
+
+ $sql = 'INSERT INTO kernel_traffic (kt_data) VALUES(\'' . addslashes(implode("", $data)) . '\')';
+ $res = db_query($sql);
+
+ if( !$res || db_affected_rows($res) < 1 ) {
+ db_rollback();
+ $errors .= 'SQL ERROR: ' . db_error();
+ } else {
+ db_commit();
+ }
+}
+
+if ($errors) {
+ $msg = "The following errors ocurred with kt_dump.php:\n - " . $errors;
+ mail('alexandria-staff at lists.sourceforge.net','kt_dump Failed',$msg);
+}
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/kt_dump.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/massmail.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/massmail.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/massmail.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,280 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * Massmail backend cron script
+ * This is mass mailing backend script which actually sends messages
+ * of the mailings scheduled via the web frontend. It does so by
+ * spooling messages directly to mail server via SMTP protocol.
+ * Mailing types, for which this is applicable, have trailer
+ * appended with individual URL for unsubscription from future
+ * mailings.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require ('squal_pre.php');
+
+// SMTP server to connect to
+$MAILSERVER = "sf-list1";
+//$MAILSERVER = "localhost";
+// Whether to feed batch on its entirety and ignore responces or
+// *talk* with server. I decided against using pipelining.
+$PIPELINE = 0;
+// Number of users to mail during single run
+$CHUNK = 2000;
+// Size of SMTP batch (so many messages are sent in one connection)
+$BATCH = 20;
+// Pause between batches, sec
+$SLEEP = 10;
+// Dump batches to file instead sending them over socket
+$TEST = 0;
+
+// This tables maps mailing types to tables which required to perform it
+$table_mapping = array(
+ 'ALL' => "users",
+ 'SITE' => "users",
+ 'COMMNTY' => "users",
+ 'DVLPR' => "users,user_group",
+ 'ADMIN' => "users,user_group",
+ 'SFDVLPR' => "users,user_group",
+);
+
+// This tables maps mailing types to WHERE subclauses which select
+// appropriate users
+$cond_mapping = array(
+ 'ALL' => "",
+ 'SITE' => "AND mail_siteupdates=1",
+ 'COMMNTY' => "AND mail_va=1",
+ 'DVLPR' => "AND users.user_id=user_group.user_id",
+ 'ADMIN' => "AND users.user_id=user_group.user_id AND user_group.admin_flags='A'",
+ 'SFDVLPR' => "AND users.user_id=user_group.user_id AND user_group.group_id=1"
+);
+
+/*if (!strstr($REMOTE_ADDR,$sys_internal_network)) {
+ exit_permission_denied();
+}*/
+
+$mail_res = db_query("
+ SELECT *
+ FROM massmail_queue
+ WHERE finished_date=0
+ ORDER BY queued_date
+", 1);
+
+/* If there was error, notify admins, but don't be pesky */
+if (!$mail_res) {
+ print "cannot execute quesry to select pending mailings\n";
+ $hrs = time()/(60*60);
+ // Send reminder every second day at 11am
+ if (($hrs%24)==11 && (($hrs/24)%2)==1) {
+ global $sys_default_domain;
+ mail(
+ "admin@$sys_default_domain",
+ "ATT: Problems with massmail cron script",
+ "This is automatically generated message from\n"
+ ."the mass mailing cron script of SourceForge\n"
+ ."installation. There was error querying massmail_queue\n"
+ ."database table. Please take appropriate actions.\n",
+ "From: noreply@$sys_default_domain"
+ );
+ }
+
+ exit(1);
+}
+
+// print "Got ".db_numrows($mail_res)." rows\n";
+
+if (db_numrows($mail_res)<1) {
+ // Nothing to send
+ exit();
+}
+
+$type = db_result($mail_res, 0, 'type');
+if (!$table_mapping[$type]) {
+ print "Unknown mailing type\n";
+ exit(1);
+}
+
+$subj = db_result($mail_res, 0, 'subject');
+$mail_id = db_result($mail_res, 0, 'id');
+
+//print "Got mail to send: ".$subj."\n";
+
+$sql = "
+ SELECT users.user_id,user_name,realname,email,confirm_hash
+ FROM ".$table_mapping[$type]."
+ WHERE users.user_id>".db_result($mail_res, 0, 'last_userid')."
+ AND status='A'
+ ".$cond_mapping[$type]."
+ ORDER BY users.user_id
+";
+
+//echo $sql;
+
+// Get next chunk of users to mail
+$users_res = db_query($sql, $CHUNK);
+
+print "Mailing ".db_numrows($users_res)." users.\n";
+
+// If no more users left, we've finished with this mailing
+if ($users_res && db_numrows($users_res)==0) {
+ db_query("
+ UPDATE massmail_queue
+ SET failed_date=0,finished_date='".time()."'
+ WHERE id=$mail_id
+ ");
+ exit();
+}
+
+$batch_no = 0;
+$count = 0;
+$last_userid = 0;
+
+// These mailing types should include unsubscription info
+if ($type=='SITE' || $type=='COMMNTY') {
+ $tail = "\r\n==================================================================\r\n"
+ ."You receive this message because you subscribed to SourceForge\r\n"
+ ."site mailing(s). You may opt out from some of them selectively\r\n"
+ ."by logging in to SourceForge and visiting your Account Maintenance\r\n"
+ ."page (http://$sys_default_domain/account/), or disable them altogether\r\n"
+ ."by visiting following link:\r\n"
+ ."<http://$sys_default_domain/account/unsubscribe.php?ch=_%s>\r\n";
+}
+$body = db_result($mail_res, 0, 'message');
+//$lines = explode("\n", $body);
+//$crlf_body = implode("\r\n", $lines);
+
+// Get SMTP response
+function get_resp() {
+ global $out;
+ global $response;
+
+ $response = fgets($out, 500);
+// print ">$response";
+ return substr($response, 0, 3);
+}
+
+// Expect given response, fail with $diag otherwise
+function expect($diag, $resp) {
+ global $PIPELINE;
+ global $response;
+
+ if (!$PIPELINE) {
+ if (get_resp()!=$resp) {
+ print "Error: $diag: $response";
+ exit(1);
+ }
+ }
+}
+
+// Start new batch
+function start_batch() {
+ global $out;
+ global $batch_no;
+ global $sys_default_domain;
+ global $MAILSERVER;
+ global $TEST;
+
+ if ($TEST) {
+ $out = fopen("!batch.$batch_no","wb");
+ } else {
+ $out = fsockopen($MAILSERVER, 25, $errno, $errstr);
+ }
+
+ if (!$out) {
+ print "Error connecting to SMTP: $errstr\n";
+ exit(1);
+ }
+ if (!$TEST) {
+ $resp = fgets($out,200);
+ if (substr($resp,0,3)!="220") {
+ print "Server is not ready to receive messages\n";
+ exit(1);
+ }
+ }
+ fputs($out,"HELO $sys_default_domain\r\n");
+ expect("HELO", "250");
+}
+
+// Finish new batch
+function flush_batch() {
+ global $out;
+ global $count;
+ global $last_userid;
+ global $mail_id;
+ global $TEST;
+
+ if ($count) {
+ fputs($out,"QUIT\r\n");
+ if (!$TEST) {
+// fpassthru($out);
+ while (!feof($out)) fgets($out, 200);
+ fclose($out);
+ } else {
+ fclose($out);
+ }
+ $count = 0;
+
+ $sql="
+ UPDATE massmail_queue
+ SET failed_date=0,
+ last_userid=$last_userid
+ WHERE id=$mail_id
+ ";
+// print $sql;
+ db_query($sql);
+
+ sleep($SLEEP);
+ }
+}
+
+
+// Actual mailing loop
+while ($row = db_fetch_array($users_res)) {
+
+ if (!$count) {
+ $batch_no++;
+ start_batch();
+ }
+
+// print "Sending for: ".$row['user_id']."\n";
+
+// $row['email'] = 'test at email';
+
+ fputs($out,"MAIL FROM: noreply@$sys_default_domain\r\n");
+ expect("MAIL", "250");
+ fputs($out,"RCPT TO: ".$row['email']."\r\n");
+ expect("RCPT", "250");
+ fputs($out,"DATA\r\n");
+ expect("DATA", "354");
+ fputs(
+ $out,
+ "From: Mailer <noreply@$sys_default_domain>\r\n"
+ ."To: \"".strtr($row['realname'],'"',"'")."\" <".$row['email'].">\r\n"
+ ."Subject: ".$subj."\r\n"
+ ."\r\n"
+ .$body
+ ."\r\n"
+ .sprintf($tail,$row['confirm_hash'] )
+ ."\r\n.\r\n"
+ );
+ expect("DATA end", "250");
+
+ $last_userid = $row['user_id'];
+
+ if (++$count == $BATCH) {
+ flush_batch();
+ }
+}
+
+flush_batch();
+
+// print "end\n";
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/massmail.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/project_weekly_metric-backfill.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/project_weekly_metric-backfill.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/project_weekly_metric-backfill.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,233 @@
+#!/usr/local/bin/php -q
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require ('squal_pre.php');
+
+for ($i=0; $i<510; $i++) {
+
+$time = time()-(86400 * $i);
+
+$last_week= ( $time - (86400 * 7) );
+$this_week = ( $time );
+
+$last_year=date('Y',$last_week);
+$last_month=date('m',$last_week);
+$last_day=date('d',$last_week);
+
+$this_year=date('Y',$this_week);
+$this_month=date('m',$this_week);
+$this_day=date('d',$this_week);
+
+print "\nlast_week: $last_week $last_year $last_month $last_day ";
+
+#create a table to put the aggregates in
+$sql="CREATE TABLE project_counts_weekly_tmp (
+group_id int,
+type text,
+count float(8))";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+
+#forum messages
+$sql="INSERT INTO project_counts_weekly_tmp
+SELECT forum_group_list.group_id,'forum',log(3 * count(forum.msg_id)::float) AS count
+FROM forum,forum_group_list
+WHERE forum.group_forum_id=forum_group_list.group_forum_id
+AND date > '$last_week'
+AND date < '$this_week'
+GROUP BY group_id";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+#project manager tasks
+$sql="INSERT INTO project_counts_weekly_tmp
+SELECT project_group_list.group_id,'tasks',log(4 * count(project_task.project_task_id)::float) AS count
+FROM project_task,project_group_list
+WHERE project_task.group_project_id=project_group_list.group_project_id
+AND end_date > '$last_week'
+AND end_date < '$this_week'
+GROUP BY group_id";
+
+#print "\n\n".$sql;
+
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+#bugs
+$sql="INSERT INTO project_counts_weekly_tmp
+SELECT agl.group_id,'bugs',log(3 * count(*)::float) AS count
+FROM artifact_group_list agl,artifact a
+WHERE a.open_date > '$last_week'
+AND a.open_date < '$this_week'
+AND a.group_artifact_id=agl.group_artifact_id
+AND agl.datatype='1'
+GROUP BY agl.group_id";
+
+#print "\n\n".$sql;
+
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+#patches
+$sql="INSERT INTO project_counts_weekly_tmp
+SELECT agl.group_id,'patches',log(10 * count(*)::float) AS count
+FROM artifact_group_list agl,artifact a
+WHERE a.open_date > '$last_week'
+AND a.open_date < '$this_week'
+AND a.group_artifact_id=agl.group_artifact_id
+AND agl.datatype='3'
+GROUP BY agl.group_id";
+
+#print "\n\n".$sql;
+
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+#support
+$sql="INSERT INTO project_counts_weekly_tmp
+SELECT agl.group_id,'support',log(5 * count(*)::float) AS count
+FROM artifact_group_list agl,artifact a
+WHERE a.open_date > '$last_week'
+AND a.open_date < '$this_week'
+AND a.group_artifact_id=agl.group_artifact_id
+AND agl.datatype='2'
+GROUP BY agl.group_id";
+
+#print "\n\n".$sql;
+
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+#file releases
+$sql="INSERT INTO project_counts_weekly_tmp
+select frs_package.group_id,'filereleases',log(5 * count(*)::float)
+FROM frs_release,frs_package
+WHERE
+ frs_package.package_id = frs_release.package_id
+ AND frs_release.release_date > '$last_week'
+ AND frs_release.release_date < '$this_week'
+GROUP BY frs_package.group_id";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+#create a new table to insert the final records into
+$sql="CREATE TABLE project_metric_weekly_tmp1 (
+ranking serial primary key,
+group_id int not null,
+value float (10))";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+
+#insert the rows into the table in order, adding a sequential rank #
+$sql="INSERT INTO project_metric_weekly_tmp1 (group_id,value)
+SELECT project_counts_weekly_tmp.group_id,sum(project_counts_weekly_tmp.count) AS value
+FROM project_counts_weekly_tmp
+WHERE
+project_counts_weekly_tmp.count > 0
+GROUP BY group_id ORDER BY value DESC";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+#numrows in the set
+$sql="SELECT count(*) FROM project_metric_weekly_tmp1";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+$counts = db_result($rel,0,0);
+print "\n\nCounts: ".$counts;
+
+db_begin();
+
+#drop the old metrics table
+$sql="DELETE FROM project_weekly_metric";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+
+$sql="INSERT INTO project_weekly_metric (ranking,percentile,group_id)
+SELECT ranking,to_char((100-(100*((ranking::float-1)/$counts))), '999D9999'),group_id
+FROM project_metric_weekly_tmp1
+ORDER BY ranking ASC";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+//
+// Now archive the metric
+//
+db_query("DELETE FROM stats_project_metric WHERE month='$this_year$this_month' AND day='$this_day'");
+
+$sql="INSERT INTO stats_project_metric (month,day,group_id,ranking,percentile)
+SELECT '$this_year$this_month'::int, '$this_day'::int,group_id,ranking,percentile
+FROM project_weekly_metric";
+$rel = db_query($sql);
+if (!$rel) {
+ echo "<P>$sql<P>".db_error();
+ echo db_error();
+}
+
+db_commit();
+echo db_error();
+
+
+$rel=db_query("DROP TABLE project_counts_weekly_tmp;");
+$rel=db_query("DROP TABLE project_metric_weekly_tmp1;");
+$rel=db_query("DROP SEQUENCE project_metric_week_ranking_seq;");
+
+}
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/project_weekly_metric-backfill.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects-backfill.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects-backfill.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects-backfill.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,41 @@
+#!/usr/local/bin/php
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('squal_pre.php');
+include_once('cronjobs/stats_projects.inc');
+
+$i=0;
+
+while($i < 515) {
+
+ $i++;
+
+ $how_far_back=(86400 * $i);
+
+ $time=time()-$how_far_back;
+
+ $year=date('Y',$time);
+ $month=date('m',$time);
+ $day=date('d',$time);
+
+ $datetime="$year$month$day";
+
+ if ($datetime < 19991117) {
+ $i=1000;
+ echo 'done';
+ break;
+ }
+
+ project_stats_day($year,$month,$day);
+}
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects-backfill.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects.inc
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects.inc (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects.inc 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,271 @@
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+//
+//
+// POPULATES stats_project table - included in site_stats.php
+//
+//
+
+function project_stats_day($year,$month,$day) {
+
+ db_begin();
+
+ $day_begin=mktime(0,0,0,$month,$day,$year);
+ $day_end=($day_begin + 86400);
+
+ echo "Stats_project: $datetime::$day_begin::$day_end::".date('Ymd',$day_begin)."::".date('Ymd',$day_end)."--> $i\n";
+
+ db_query("DELETE FROM stats_project WHERE month='$year$month' AND day='$day'");
+
+$sql="INSERT INTO stats_project
+
+SELECT
+'$year$month'::int AS month,
+'$day'::int AS day,
+* FROM (
+
+SELECT
+ groups.group_id,
+ r.count AS release_count,
+ fmcount.count AS msg_posted,
+ fucount.count AS msg_uniq_auth,
+ obug.count AS bugs_opened,
+ cbug.count AS bugs_closed,
+ osupport.count AS support_opened,
+ csupport.count AS support_closed,
+ opatches.count AS patches_opened,
+ cpatches.count AS patches_closed,
+ oartifact.count AS artifacts_opened,
+ cartifact.count AS artifacts_closed,
+ otask.count AS tasks_opened,
+ ctask.count AS tasks_closed,
+ helpr.count AS help_requests
+
+FROM groups
+
+--
+-- Create tmp table of groups that made any releases
+--
+LEFT JOIN (
+ SELECT group_id,COUNT(release_id) AS count
+ FROM frs_release,frs_package
+ WHERE
+ frs_release.release_date > '$day_begin'
+ AND frs_release.release_date < '$day_end'
+ AND frs_release.package_id = frs_package.package_id
+ GROUP BY group_id
+ ) r USING (group_id)
+
+--
+-- Create tmp table of groups that had any forum posts
+--
+LEFT JOIN (
+ SELECT forum_group_list.group_id,COUNT(forum.msg_id) AS count
+ FROM forum_group_list, forum
+ WHERE
+ forum_group_list.group_forum_id = forum.group_forum_id
+ AND forum.date > '$day_begin'
+ AND forum.date < '$day_end'
+ GROUP BY forum_group_list.group_id
+ ) fmcount USING (group_id)
+
+--
+-- Create tmp table of groups and unique posters to forums
+--
+LEFT JOIN (
+ SELECT forum_group_list.group_id,COUNT( DISTINCT(forum.posted_by) ) AS count
+ FROM forum_group_list, forum
+ WHERE
+ forum_group_list.group_forum_id = forum.group_forum_id
+ AND forum.date > '$day_begin'
+ AND forum.date < '$day_end'
+ GROUP BY group_id
+ ) fucount USING (group_id)
+
+--
+-- Create tmp table of groups and opened bugs
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.open_date > '$day_begin'
+ AND a.open_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='1'
+ GROUP BY agl.group_id
+ ) obug USING (group_id)
+
+--
+-- Create tmp table of groups and closed bugs
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.close_date > '$day_begin'
+ AND a.close_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='1'
+ GROUP BY agl.group_id
+ ) cbug USING (group_id)
+
+--
+-- Create tmp table of groups and opened support
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.open_date > '$day_begin'
+ AND a.open_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='2'
+ GROUP BY agl.group_id
+ ) osupport USING (group_id)
+
+--
+-- Create tmp table of groups and closed support
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.close_date > '$day_begin'
+ AND a.close_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='2'
+ GROUP BY agl.group_id
+ ) csupport USING (group_id)
+
+--
+-- Create tmp table of groups and opened patches
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.open_date > '$day_begin'
+ AND a.open_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='3'
+ GROUP BY agl.group_id
+ ) opatches USING (group_id)
+
+--
+-- Create tmp table of groups and closed patches
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.close_date > '$day_begin'
+ AND a.close_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ AND agl.datatype='3'
+ GROUP BY agl.group_id
+ ) cpatches USING (group_id)
+
+--
+-- Create tmp table of groups and opened total artifacts
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.open_date > '$day_begin'
+ AND a.open_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ GROUP BY agl.group_id
+ ) oartifact USING (group_id)
+
+--
+-- Create tmp table of groups and closed total artifacts
+--
+LEFT JOIN (
+ SELECT agl.group_id,count(*) AS count
+ FROM artifact_group_list agl,artifact a
+ WHERE
+ a.close_date > '$day_begin'
+ AND a.close_date < '$day_end'
+ AND a.group_artifact_id=agl.group_artifact_id
+ GROUP BY agl.group_id
+ ) cartifact USING (group_id)
+
+--
+-- Create tmp table of groups that opened tasks
+--
+LEFT JOIN (
+ SELECT pgl.group_id,count(pt.project_task_id) AS count
+ FROM project_group_list pgl, project_task pt
+ WHERE
+ pgl.group_project_id=pt.group_project_id
+ AND pt.start_date > '$day_begin'
+ AND pt.start_date < '$day_end'
+ GROUP BY pgl.group_id
+ ) otask USING (group_id)
+
+--
+-- Create tmp table of groups that closed tasks
+--
+LEFT JOIN (
+ SELECT pgl.group_id,count(pt.project_task_id) AS count
+ FROM project_group_list pgl, project_task pt
+ WHERE
+ pgl.group_project_id=pt.group_project_id
+ AND pt.end_date > '$day_begin'
+ AND pt.end_date < '$day_end'
+ GROUP BY pgl.group_id
+ ) ctask USING (group_id)
+
+--
+-- Create tmp table of groups that closed tasks
+--
+LEFT JOIN (
+ SELECT group_id,COUNT(job_id) AS count
+ FROM people_job
+ WHERE
+ date > '$day_begin'
+ AND date < '$day_end'
+ GROUP BY group_id
+ ) helpr USING (group_id)
+
+) mess
+
+--
+-- We really only want the rows that have any content
+--
+WHERE
+release_count > 0
+OR msg_posted > 0
+OR msg_uniq_auth > 0
+OR bugs_opened > 0
+OR bugs_closed > 0
+OR support_opened > 0
+OR support_closed > 0
+OR patches_opened > 0
+OR patches_closed > 0
+OR artifacts_opened > 0
+OR artifacts_closed > 0
+OR tasks_opened > 0
+OR tasks_closed > 0
+OR help_requests > 0;";
+
+ db_query($sql);
+ //echo $sql;
+ echo db_error();
+
+ db_commit();
+
+}
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_projects.inc
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_site.inc
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_site.inc (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/cronjobs/stats_site.inc 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,42 @@
+<?php
+/**
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+function site_stats_day($year,$month,$day) {
+
+ db_begin();
+
+ $day_begin=mktime(0,0,0,$month,$day,$year);
+ $day_end=($day_begin + 86400);
+
+ echo "Stats_site: $datetime::$day_begin::$day_end::".date('Ymd',$day_begin)."::".date('Ymd',$day_end)."--> $i\n";
+
+ //
+ // build row for stats_site
+ //
+ $rel=db_query("DELETE FROM stats_site WHERE month='$year$month' AND day='$day'");
+
+ $sql="INSERT INTO stats_site (month,day,uniq_users,sessions,total_users,new_users,new_projects)
+ VALUES ('$year$month',
+ '$day',
+ (SELECT COUNT(DISTINCT(user_id)) FROM session WHERE (time < '$day_end' AND time > '$day_begin')),
+ (SELECT COUNT(session_hash) FROM session WHERE (time < '$day_end' AND time > $day_begin)),
+ (SELECT COUNT(user_id) FROM users WHERE ( add_date < '$day_end' AND status='A' )),
+ (SELECT COUNT(user_id) FROM users WHERE ( add_date < '$day_end' AND add_date > '$day_begin' )),
+ (SELECT COUNT(group_id) FROM groups WHERE ( register_time < '$day_end' AND register_time > '$day_begin' )))";
+
+ $rel=db_query($sql);
+ echo db_error();
+
+ db_commit();
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/README
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/README (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/README 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,26 @@
+
+Apologies in advance for the difficulty in converting from 2.5 to 2.6.
+
+As always, SourceForge is undergoing radical changes, rewrites, feature
+and scalability enhancements. This means a large number of SQL and
+database changes need to occur in sequence over time.
+
+The 2.5 codebase was a radical change because it moved from MySQL to PostgreSQL.
+2.6 is radical because it takes full advantage of Postgres' advanced features
+and MySQL is no longer usable as it was for 2.5
+
+The process of upgrading from 2.5 to 2.6 involves running these clearly dated
+sql diff files IN ORDER.
+
+If you encounter difficulties, please report them in the SF Offsite Discussion board:
+https://sourceforge.net/forum/forum.php?forum_id=21304
+
+Please do not submit bugs to SourceForge.net.
+
+************************************************************************************
+
+IMPORTANT!!! Read and understand EACH AND EVERY sql command before running it.
+These commands were issued on SourceForge.net and may cause problems on your system.
+
+************************************************************************************
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-conversion.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,375 @@
+--
+--
+-- database conversion
+--
+-- The general idea is to move data from the 2
+--
+
+--
+--
+-- Bug TRACKER
+--
+--
+BEGIN;
+
+--
+-- set up bug ArtifactTypes for each group
+--
+
+UPDATE groups SET bug_due_period='2592000' WHERE bug_due_period is null;
+INSERT INTO artifact_group_list
+(group_artifact_id,group_id,name,description,is_public,
+allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype)
+SELECT group_id+100000,group_id,'Bugs','Bug Tracking System',use_bugs,
+1,send_all_bugs,new_bug_address,bug_due_period,1,1
+FROM groups
+WHERE status != 'I' AND status != 'P'
+ORDER BY group_id ASC;
+
+--
+-- permissions
+--
+INSERT INTO artifact_perm
+(group_artifact_id,user_id,perm_level)
+SELECT group_id+100000,user_id,bug_flags
+FROM user_group;
+
+--
+-- bug groups conversion
+--
+INSERT INTO artifact_group (id,group_artifact_id,group_name)
+SELECT bug_group_id+100000,group_id+100000,group_name FROM bug_group;
+
+--
+-- bug category conversion
+--
+INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to)
+SELECT bug_category_id+100000,group_id+100000,category_name,100 FROM bug_category;
+
+--
+-- bug
+--
+-- bug tracker had status_id of 100 (None) and status_id=3 (closed)
+--
+UPDATE bug SET status_id=1 WHERE status_id=100;
+INSERT INTO bug_status (status_id,status_name) VALUES (2,'Open');
+UPDATE bug SET status_id=2 WHERE status_id=3;
+DELETE FROM bug_status WHERE status_id=3;
+
+UPDATE bug SET close_date=0 WHERE close_date is NULL;
+
+INSERT INTO artifact
+(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority,
+submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id)
+SELECT
+bug_id+100000,group_id+100000,status_id,category_id+100000,bug_group_id+100000,priority,
+submitted_by,assigned_to,date,close_date,summary,details,resolution_id
+FROM bug
+ORDER BY group_id ASC;
+
+--
+-- bug_history
+--
+--UPDATE bug_history SET old_value=1 WHERE old_value='100' AND field_name='status_id';
+UPDATE bug_history SET old_value=2 WHERE old_value='3' AND field_name='status_id';
+
+--BEGIN;
+--SELECT * from bug_history
+--WHERE NOT EXISTS (select bug_id FROM bug
+--where bug.bug_id=bug_history.bug_id);
+--COMMIT;
+
+--DELETE FROM bug_history WHERE bug_id=0;
+
+--DELETE FROM bug_history
+--WHERE bug_id+100000 NOT IN (SELECT artifact_id FROM artifact);
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+bug_id+100000,field_name,old_value,mod_by,date
+FROM bug_history
+WHERE field_name IN ('summary','resolution_id','priority','group_id','close_date','assigned_to','status_id');
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+bug_id+100000,'artifact_group_id',(old_value::int)+100000,mod_by,date
+FROM bug_history
+WHERE field_name='bug_group_id';
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+bug_id+100000,field_name,(old_value::int)+100000,mod_by,date
+FROM bug_history
+WHERE field_name='category_id';
+
+--
+-- bug messages
+--
+INSERT INTO artifact_message
+(artifact_id,submitted_by,from_email,adddate,body)
+SELECT
+bh.bug_id+100000,bh.mod_by,users.email,bh.date,bh.old_value
+FROM bug_history bh, users
+WHERE bh.mod_by=users.user_id
+AND bh.field_name='details';
+
+--
+-- bug canned responses
+--
+delete from bug_canned_responses where title is null;
+
+INSERT INTO artifact_canned_responses
+(group_artifact_id,title,body)
+SELECT
+group_id+100000,title,body
+FROM bug_canned_responses
+WHERE group_id > 0;
+
+COMMIT;
+
+--
+--
+-- SUPPORT
+--
+--
+
+--
+-- set up support ArtifactTypes for each group
+--
+BEGIN;
+
+UPDATE groups SET support_due_period='2592000' WHERE support_due_period is null;
+
+INSERT INTO artifact_group_list
+(group_artifact_id,group_id,name,description,is_public,
+allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype)
+SELECT group_id+200000,group_id,'Support Requests','Tech Support Tracking System',use_support,
+1,send_all_support,new_support_address,support_due_period,0,2
+FROM groups
+WHERE status != 'I' AND status != 'P'
+ORDER BY group_id ASC;
+
+--
+-- permissions
+--
+INSERT INTO artifact_perm
+(group_artifact_id,user_id,perm_level)
+SELECT group_id+200000,user_id,support_flags
+FROM user_group;
+
+--
+-- support category conversion
+--
+INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to)
+SELECT support_category_id+200000,group_id+200000,category_name,100 FROM support_category;
+
+--
+-- support
+--
+DELETE FROM support WHERE NOT EXISTS
+(SELECT group_id FROM groups WHERE support.group_id=groups.group_id);
+
+INSERT INTO artifact
+(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority,
+submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id)
+SELECT
+support_id+200000,group_id+200000,support_status_id,support_category_id+200000,100,priority,
+submitted_by,assigned_to,open_date,close_date,summary,'',100
+FROM support
+ORDER BY group_id ASC;
+
+--
+-- support_history
+--
+DELETE FROM support_history WHERE support_id=0;
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+support_id+200000,field_name,old_value,mod_by,date
+FROM support_history
+WHERE
+field_name IN ('summary','priority','close_date','assigned_to');
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+support_id+200000,'category_id',(old_value::int)+200000,mod_by,date
+FROM support_history
+WHERE
+field_name='support_category_id';
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+support_id+200000,'status_id',old_value,mod_by,date
+FROM support_history
+WHERE
+field_name='support_status_id';
+
+--
+-- messages
+--
+DELETE FROM support_messages WHERE NOT EXISTS
+(SELECT support_id FROM support WHERE support.support_id=support_messages.support_id);
+
+INSERT INTO artifact_message
+(artifact_id,submitted_by,from_email,adddate,body)
+SELECT
+support_id+200000,100,from_email,date,body
+FROM support_messages;
+
+--
+-- canned messages
+--
+INSERT INTO artifact_canned_responses
+(group_artifact_id,title,body)
+SELECT
+group_id+200000,title,body
+FROM support_canned_responses
+WHERE group_id > 0;
+
+COMMIT;
+
+
+--
+--
+-- Patch Manager
+--
+--
+--BEGIN;
+
+--
+-- set up patch ArtifactTypes for each group
+--
+UPDATE groups SET patch_due_period='2592000' WHERE patch_due_period is null;
+
+INSERT INTO artifact_group_list
+(group_artifact_id,group_id,name,description,is_public,
+allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype)
+SELECT group_id+300000,group_id,'Patches','Patch Tracking System',use_patch,
+1,send_all_patches,new_patch_address,patch_due_period,1,3
+FROM groups
+WHERE status != 'I' AND status != 'P'
+ORDER BY group_id ASC;
+
+--
+-- permissions
+--
+INSERT INTO artifact_perm
+(group_artifact_id,user_id,perm_level)
+SELECT group_id+300000,user_id,patch_flags
+FROM user_group;
+
+--
+-- patch category conversion
+--
+INSERT INTO artifact_category (id,group_artifact_id,category_name,auto_assign_to)
+SELECT patch_category_id+300000,group_id+300000,category_name,100 FROM patch_category;
+
+--
+-- patch table
+--
+-- moving the odd patch statuses to resolutions
+--
+ALTER TABLE patch ADD COLUMN resolution_id INT NOT NULL DEFAULT 100;
+UPDATE patch SET resolution_id=patch_status_id;
+vacuum analyze patch;
+update patch set patch_status_id=2 where patch_status_id > 3;
+update patch set resolution_id=100 WHERE resolution_id < 4;
+INSERT INTO artifact_resolution VALUES (102,'Accepted');
+INSERT INTO artifact_resolution VALUES (103,'Out of Date');
+INSERT INTO artifact_resolution VALUES (104,'Postponed');
+INSERT INTO artifact_resolution VALUES (105,'Rejected');
+update patch set resolution_id=104 WHERE resolution_id=4;
+update patch set resolution_id=105 WHERE resolution_id=101;
+
+delete from patch where patch_id=100000;
+UPDATE patch SET details=' ' WHERE details is null;
+
+INSERT INTO artifact
+(artifact_id,group_artifact_id,status_id,category_id,artifact_group_id,priority,
+submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id)
+SELECT
+patch_id+300000,group_id+300000,patch_status_id,patch_category_id+300000,100,5,
+submitted_by,assigned_to,open_date,close_date,summary,details,resolution_id
+FROM patch
+ORDER BY group_id ASC;
+
+--
+-- patch history
+--
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+patch_id+300000,field_name,old_value,mod_by,date
+FROM patch_history
+WHERE field_name IN ('summary','close_date','assigned_to','Patch Code');
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+patch_id+300000,'status_id',old_value,mod_by,date
+FROM patch_history
+WHERE field_name='patch_status_id';
+
+INSERT INTO artifact_history
+(artifact_id,field_name,old_value,mod_by,entrydate)
+SELECT
+patch_id+300000,'category_id',(old_value::int)+300000,mod_by,date
+FROM patch_history
+WHERE field_name='patch_category_id';
+
+--
+-- patch messages
+--
+INSERT INTO artifact_message
+(artifact_id,submitted_by,from_email,adddate,body)
+SELECT
+ph.patch_id+300000,ph.mod_by,users.email,ph.date,ph.old_value
+FROM patch_history ph, users
+WHERE ph.mod_by=users.user_id
+AND ph.field_name='details';
+
+--
+-- patch code
+--
+INSERT INTO artifact_file
+(artifact_id,description,bin_data,filename,filesize,filetype,adddate,submitted_by)
+SELECT patch_id+300000,'None',code,'None',length(code),'text/plain',open_date,submitted_by
+FROM patch
+WHERE code IS NOT NULL;
+
+--COMMIT;
+
+INSERT INTO artifact_counts_agg
+SELECT group_artifact_id,count(*)
+FROM artifact
+WHERE status_id <> 3
+GROUP BY group_artifact_id;
+
+--
+--
+-- Feature Requests
+--
+--
+INSERT INTO artifact_group_list
+(group_artifact_id,group_id,name,description,is_public,
+allow_anon,email_all_updates,email_address,due_period,use_resolution,datatype)
+SELECT group_id+350000,group_id,'Feature Requests','Feature Request Tracking System',1,
+1,0,'',45*24*60*60,0,4
+FROM groups
+WHERE status != 'I' AND status != 'P'
+ORDER BY group_id ASC;
+
+vacuum analyze artifact_perm;
+vacuum analyze artifact_group_list;
+vacuum analyze artifact;
+vacuum analyze artifact_history;
+vacuum analyze artifact_category;
+vacuum analyze artifact_group;
+vacuum analyze artifact_file;
+vacuum analyze artifact_message;
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,29 @@
+#!/usr/local/bin/php
+<?php
+
+require ('squal_pre.php');
+
+db_begin();
+
+$rel = db_query("SELECT id,bin_data FROM artifact_file ORDER BY id ASC;");
+echo db_error();
+
+$rows=db_numrows($rel);
+
+for ($i=0; $i<$rows; $i++) {
+
+ $res=db_query("UPDATE artifact_file
+ SET bin_data='". base64_encode( util_unconvert_htmlspecialchars( db_result($rel,$i,'bin_data') ) ) ."'
+ WHERE id='". db_result($rel,$i,'id') ."'");
+
+ echo db_error();
+ echo "<BR>Num: $i | id: ".db_result($rel,$i,'id');
+
+}
+
+db_commit();
+echo "Done: ".db_error();
+
+db_query("vacuum analyze;");
+
+?>
Property changes on: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-convert-files.php
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-fkeys.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,66 @@
+ALTER TABLE artifact_group_list ADD CONSTRAINT artifactgroup_groupid_fk
+ FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL;
+
+ALTER TABLE artifact_perm ADD CONSTRAINT artifactperm_userid_fk
+ FOREIGN KEY (user_id) REFERENCES users(user_id) MATCH FULL;
+DELETE from artifact_perm
+ where not exists (select group_artifact_id
+ from artifact_group_list
+ where artifact_perm.group_artifact_id=artifact_group_list.group_artifact_id);
+ALTER TABLE artifact_perm ADD CONSTRAINT artifactperm_groupartifactid_fk
+ FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL;
+
+ALTER TABLE artifact_category ADD CONSTRAINT artifactcategory_groupartifactid_fk
+ FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL;
+ALTER TABLE artifact_category ADD CONSTRAINT artifactcategory_autoassignto_fk
+ FOREIGN KEY (auto_assign_to) REFERENCES users(user_id) MATCH FULL;
+
+ALTER TABLE artifact_group ADD CONSTRAINT artifactgroup_groupartifactid_fk
+ FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL;
+
+ALTER TABLE artifact ADD CONSTRAINT artifact_groupartifactid_fk
+ FOREIGN KEY (group_artifact_id) REFERENCES artifact_group_list(group_artifact_id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_statusid_fk
+ FOREIGN KEY (status_id) REFERENCES artifact_status(id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_categoryid_fk
+ FOREIGN KEY (category_id) REFERENCES artifact_category(id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_artifactgroupid_fk
+ FOREIGN KEY (artifact_group_id) REFERENCES artifact_group(id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_submittedby_fk
+ FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_assignedto_fk
+ FOREIGN KEY (assigned_to) REFERENCES users(user_id) MATCH FULL;
+ALTER TABLE artifact ADD CONSTRAINT artifact_resolutionid_fk
+ FOREIGN KEY (resolution_id) REFERENCES artifact_resolution(id) MATCH FULL;
+
+DELETE FROM artifact_history WHERE NOT EXISTS
+ (SELECT artifact_id FROM artifact WHERE artifact.artifact_id=artifact_history.artifact_id);
+ALTER TABLE artifact_history ADD CONSTRAINT artifacthistory_artifactid_fk
+ FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL;
+ALTER TABLE artifact_history ADD CONSTRAINT artifacthistory_modby_fk
+ FOREIGN KEY (mod_by) REFERENCES users(user_id) MATCH FULL;
+
+ALTER TABLE artifact_file ADD CONSTRAINT artifactfile_artifactid_fk
+ FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL;
+ALTER TABLE artifact_file ADD CONSTRAINT artifactfile_submittedby_fk
+ FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL;
+
+ALTER TABLE artifact_message ADD CONSTRAINT artifactmessage_artifactid_fk
+ FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL;
+ALTER TABLE artifact_message ADD CONSTRAINT artifactmessage_submittedby_fk
+ FOREIGN KEY (submitted_by) REFERENCES users(user_id) MATCH FULL;
+
+ALTER TABLE artifact_monitor ADD CONSTRAINT artifactmonitor_artifactid_fk
+ FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL;
+
+SELECT setval('artifact_grou_group_artifac_seq',(SELECT max(group_artifact_id) FROM artifact_group_list));
+--SELECT setval('artifact_perm_id_seq',(SELECT max(id) FROM artifact_perm));
+SELECT setval('artifact_category_id_seq',(SELECT max(id) FROM artifact_category));
+SELECT setval('artifact_group_id_seq',(SELECT max(id) FROM artifact_group));
+--SELECT setval('artifact_status_id_seq',(SELECT max(id) FROM artifact_status));
+SELECT setval('artifact_artifact_id_seq',(SELECT max(artifact_id) FROM artifact));
+--SELECT setval('artifact_history_id_seq',(SELECT max(id) FROM artifact_history));
+--SELECT setval('artifact_file_id_seq',(SELECT max(id) FROM artifact_file));
+--SELECT setval('artifact_message_id_seq',(SELECT max(id) FROM artifact_message));
+--SELECT setval('artifact_monitor_id_seq',(SELECT max(id) FROM artifact_monitor));
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/artifact-man.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,271 @@
+--
+-- need to widen the preference column in user_preferences
+-- postgres isn't as slick as MySQL in this respect
+--
+BEGIN;
+ALTER TABLE user_preferences RENAME COLUMN preference_value TO dead1;
+ALTER TABLE user_preferences ADD COLUMN preference_value TEXT;
+UPDATE user_preferences SET preference_value=dead1;
+UPDATE user_preferences SET dead1='';
+COMMIT;
+--
+-- user_group permissions flag
+--
+ALTER TABLE user_group ADD COLUMN artifact_flags INT NOT NULL DEFAULT 0;
+UPDATE user_group SET artifact_flags=0;
+
+--
+-- each group can have multiple artifact types
+--
+create table artifact_group_list (
+group_artifact_id serial primary key,
+group_id int not null,
+name text,
+description text,
+is_public int not null default 0,
+allow_anon int not null default 0,
+email_all_updates int not null default 0,
+email_address text not null,
+due_period int not null default 2592000,
+use_resolution int not null default 0,
+submit_instructions text,
+browse_instructions text,
+datatype int not null default 0
+);
+
+CREATE INDEX artgrouplist_groupid on artifact_group_list (group_id);
+CREATE INDEX artgrouplist_groupid_public on artifact_group_list (group_id,is_public);
+
+create table artifact_resolution (
+id serial primary key,
+resolution_name text
+);
+
+INSERT INTO artifact_resolution SELECT * FROM bug_resolution;
+
+--
+-- new permissions model required
+--
+create table artifact_perm (
+id serial primary key,
+group_artifact_id int not null,
+user_id int not null,
+perm_level int not null DEFAULT 0
+);
+
+CREATE INDEX artperm_groupartifactid on artifact_perm (group_artifact_id);
+CREATE UNIQUE INDEX artperm_groupartifactid_userid on artifact_perm (group_artifact_id,user_id);
+
+--
+-- create a view to make selecting all perms for a user_id/group_id easier
+--
+
+CREATE VIEW artifactperm_user_vw AS
+SELECT ap.id, ap.group_artifact_id, ap.user_id, ap.perm_level, users.user_name, users.realname
+ FROM artifact_perm ap, users
+ WHERE users.user_id=ap.user_id;
+
+CREATE VIEW artifactperm_artgrouplist_vw AS
+SELECT agl.group_artifact_id,agl.name,agl.description,agl.group_id,ap.user_id, ap.perm_level
+FROM artifact_perm ap, artifact_group_list agl
+WHERE ap.group_artifact_id=agl.group_artifact_id;
+
+--
+-- similar to bug_category
+--
+CREATE TABLE artifact_category (
+ id serial primary key,
+ group_artifact_id int NOT NULL,
+ category_name text NOT NULL,
+ auto_assign_to int not null DEFAULT 100
+);
+
+CREATE INDEX artcategory_groupartifactid on artifact_category (group_artifact_id);
+
+--
+-- similar to bug_group
+--
+CREATE TABLE artifact_group (
+ id serial primary key,
+ group_artifact_id int NOT NULL,
+ group_name text NOT NULL
+);
+
+CREATE INDEX artgroup_groupartifactid on artifact_group (group_artifact_id);
+
+--
+-- similar to bug_status
+--
+CREATE TABLE artifact_status (
+ id serial primary key,
+ status_name text NOT NULL
+);
+
+--
+-- similar to bug table
+--
+CREATE TABLE artifact (
+ artifact_id serial primary key,
+ group_artifact_id int NOT NULL,
+ status_id int DEFAULT '1' NOT NULL,
+ category_id int DEFAULT '100' NOT NULL,
+ artifact_group_id int DEFAULT '0' NOT NULL,
+ resolution_id int not null default '100',
+ priority int DEFAULT '5' NOT NULL,
+ submitted_by int DEFAULT '100' NOT NULL,
+ assigned_to int DEFAULT '100' NOT NULL,
+ open_date int DEFAULT '0' NOT NULL,
+ close_date int DEFAULT '0' NOT NULL,
+ summary text NOT NULL,
+ details text NOT NULL
+);
+
+CREATE INDEX art_groupartid ON artifact (group_artifact_id);
+CREATE INDEX art_groupartid_statusid ON artifact (group_artifact_id,status_id);
+CREATE INDEX art_groupartid_assign ON artifact (group_artifact_id,assigned_to);
+CREATE INDEX art_groupartid_submit ON artifact (group_artifact_id,submitted_by);
+create index art_submit_status ON artifact(submitted_by,status_id);
+create index art_assign_status ON artifact(assigned_to,status_id);
+create index art_groupartid_artifactid on artifact (group_artifact_id,artifact_id);
+
+
+
+CREATE VIEW artifact_vw AS
+SELECT
+artifact.*,
+u.user_name AS assigned_unixname,
+u.realname AS assigned_realname,
+u.email AS assigned_email,
+u2.user_name AS submitted_unixname,
+u2.realname AS submitted_realname,
+u2.email AS submitted_email,
+artifact_status.status_name,
+artifact_category.category_name,
+artifact_group.group_name,
+artifact_resolution.resolution_name
+FROM
+users u, users u2, artifact, artifact_status, artifact_category, artifact_group, artifact_resolution
+WHERE
+artifact.assigned_to=u.user_id
+AND artifact.submitted_by=u2.user_id
+AND artifact.status_id=artifact_status.id
+AND artifact.category_id=artifact_category.id
+AND artifact.artifact_group_id=artifact_group.id
+AND artifact.resolution_id=artifact_resolution.id;
+
+
+--
+-- audit trail table
+--
+CREATE TABLE artifact_history (
+ id serial primary key,
+ artifact_id int DEFAULT '0' NOT NULL,
+ field_name text DEFAULT '' NOT NULL,
+ old_value text DEFAULT '' NOT NULL,
+ mod_by int DEFAULT '0' NOT NULL,
+ entrydate int DEFAULT '0' NOT NULL
+);
+
+CREATE INDEX arthistory_artid on artifact_history(artifact_id);
+CREATE INDEX arthistory_artid_entrydate on artifact_history(artifact_id,entrydate);
+
+--
+-- create a view from the audit trail which joins the user table and history table
+--
+CREATE VIEW artifact_history_user_vw AS
+SELECT ah.id, ah.artifact_id, ah.field_name, ah.old_value, ah.entrydate, users.user_name
+FROM artifact_history ah, users
+WHERE ah.mod_by=users.user_id;
+
+--
+-- files attached to a given artifact
+--
+CREATE TABLE artifact_file (
+ id serial primary key,
+ artifact_id int NOT NULL,
+ description text NOT NULL,
+ bin_data text NOT NULL,
+ filename text NOT NULL,
+ filesize int NOT NULL,
+ filetype text NOT NULL,
+ adddate int not null DEFAULT '0',
+ submitted_by int not null
+);
+
+CREATE INDEX artfile_artid on artifact_file(artifact_id);
+CREATE INDEX artfile_artid_adddate on artifact_file(artifact_id,adddate);
+
+--
+-- create a view from the files which joins the user table and files table
+--
+CREATE VIEW artifact_file_user_vw AS
+SELECT af.id, af.artifact_id, af.description, af.bin_data, af.filename, af.filesize, af.filetype,
+ af.adddate, af.submitted_by, users.user_name, users.realname
+FROM artifact_file af,users
+WHERE af.submitted_by=users.user_id;
+
+--
+-- messages and comments attached to an artifact
+--
+CREATE TABLE artifact_message (
+ id serial primary key,
+ artifact_id int NOT NULL,
+ submitted_by int not null,
+ from_email text NOT NULL,
+ adddate int DEFAULT '0' NOT NULL,
+ body text NOT NULL
+);
+
+CREATE INDEX artmessage_artid on artifact_message(artifact_id);
+CREATE INDEX artmessage_artid_adddate on artifact_message(artifact_id,adddate);
+
+--
+-- create a view from the messages which joins the user table and messages table
+--
+CREATE VIEW artifact_message_user_vw AS
+SELECT am.id, am.artifact_id, am.from_email, am.body, am.adddate,
+users.user_id, users.email, users.user_name, users.realname
+FROM artifact_message am,users
+WHERE am.submitted_by=users.user_id;
+
+--
+-- table containing list of people monitoring each artifact
+--
+CREATE TABLE artifact_monitor (
+id serial primary key,
+artifact_id int NOT NULL,
+user_id int not null,
+email text
+);
+
+CREATE INDEX artmonitor_artifactid on artifact_monitor(artifact_id);
+
+ALTER TABLE artifact_monitor ADD CONSTRAINT artifactmonitor_artifactid_fk
+ FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id) MATCH FULL;
+
+INSERT INTO artifact_group_list VALUES (100,1,'Default','Default Data - Dont Edit',3,0,0,'0',0);
+INSERT INTO artifact_category VALUES (100,100,'None',100);
+INSERT INTO artifact_group VALUES (100,100,'None');
+INSERT INTO artifact_status VALUES (1,'Open');
+INSERT INTO artifact_status VALUES (2,'Closed');
+INSERT INTO artifact_status VALUES (3,'Deleted');
+
+CREATE TABLE artifact_canned_responses (
+ id serial primary key,
+ group_artifact_id int NOT NULL,
+ title text NOT NULL,
+ body text NOT NULL
+);
+
+CREATE INDEX artifactcannedresponses_groupid ON artifact_canned_responses (group_artifact_id);
+
+CREATE TABLE artifact_counts_agg (
+group_artifact_id int not null,
+count int not null
+);
+CREATE INDEX artifactcountsagg_groupartid ON artifact_counts_agg(group_artifact_id);
+
+GRANT SELECT ON
+artifact,
+artifact_group_list
+TO stats;
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001209.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,20 @@
+drop index downloads_idx;
+create index frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg (day,downloads);
+create index projectweeklymetric_ranking on project_weekly_metric(ranking);
+create index users_status on users(status);
+drop index news_date;
+create index support_groupid_assignedto_status on support(group_id,assigned_to,support_status_id);
+create index support_groupid_assignedto on support(group_id,assigned_to);
+create index support_groupid_status on support(group_id,support_status_id);
+
+create index patch_groupid_assignedto_status on patch(group_id,assigned_to,patch_status_id);
+create index patch_groupid_assignedto on patch(group_id,assigned_to);
+create index patch_groupid_status on patch(group_id,patch_status_id);
+
+create index projecttask_projid_status on project_task(group_project_id,status_id);
+
+create index forummonitoredforums_user on forum_monitored_forums(user_id);
+
+create index filemodulemonitor_userid on filemodule_monitor(user_id);
+create index support_status_assignedto on support(support_status_id,assigned_to);
+create index bug_status_assignedto on bug(status_id,assigned_to);
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001214.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,15 @@
+alter table filemodule_monitor add column id int not null default 0 primary key auto_increment first;
+alter table frs_dlstats_filetotal_agg change column file_id file_id int not null default 0 primary key;
+alter table group_cvs_history add column id int not null default 0 primary key auto_increment first;
+
+DROP TABLE system_news;
+DROP TABLE system_history;
+DROP TABLE system_status;
+DROP TABLE system_services;
+DROP TABLE system_machines;
+
+
+create index foundrynews_foundry_date_approved on foundry_news(foundry_id,approve_date,is_approved);
+create index news_group_date on news_bytes(group_id,date);
+create index news_date on news_bytes(date);
+create index news_approved_date on news_bytes(is_approved,date);
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20001220.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,2 @@
+ALTER TABLE patch ADD COLUMN details text;
+INSERT INTO themes VALUES (3,'ultralite','Ultra Lite');
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010109.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,7 @@
+create table project_sums_agg (
+group_id int not null default 0,
+type char(4),
+count int not null default 0
+);
+
+CREATE INDEX projectsumsagg_groupid ON project_sums_agg (group_id);
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010112.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,9 @@
+-- by: pfalcon
+-- purpose: add default due periods (in sec) for tools
+--30*24*60*60,
+--0*24*60*60,
+--15*24*60*60
+
+ALTER TABLE groups ADD COLUMN bug_due_period int NOT NULL DEFAULT 2592000;
+ALTER TABLE groups ADD COLUMN patch_due_period int NOT NULL DEFAULT 5184000;
+ALTER TABLE groups ADD COLUMN support_due_period int NOT NULL DEFAULT 1296000;
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010126.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,51 @@
+-- by: apzen
+-- purpose: stuff for project database and vhost maintanance
+
+ CREATE TABLE prdb_dbs (
+ dbid SERIAL PRIMARY KEY,
+ group_id INT NOT NULL,
+ dbname TEXT NOT NULL,
+ dbusername TEXT NOT NULL,
+ dbuserpass TEXT NOT NULL,
+ requestdate INT NOT NULL,
+ dbtype INT NOT NULL,
+ created_by INT NOT NULL,
+ state INT NOT NULL
+ );
+
+ CREATE TABLE prdb_states (
+
+ stateid INT NOT NULL,
+ statename TEXT
+ );
+
+ CREATE UNIQUE INDEX idx_prdb_dbname ON prdb_dbs (dbname);
+
+ INSERT INTO prdb_states VALUES ('1', 'Active');
+ INSERT INTO prdb_states VALUES ('2', 'Pending Create');
+ INSERT INTO prdb_states VALUES ('3', 'Pending Delete');
+ INSERT INTO prdb_states VALUES ('4', 'Pending Update');
+ INSERT INTO prdb_states VALUES ('5', 'Failed Create');
+ INSERT INTO prdb_states VALUES ('6', 'Failed Delete');
+ INSERT INTO prdb_states VALUES ('7', 'Failed Update');
+
+ CREATE TABLE prdb_types (
+ dbtypeid INT PRIMARY KEY,
+ dbservername TEXT NOT NULL,
+ dbsoftware TEXT NOT NULL
+ );
+
+ INSERT INTO prdb_types VALUES ('1','pr-db1','mysql');
+
+ CREATE TABLE prweb_vhost (
+ vhostid SERIAL PRIMARY KEY,
+ vhost_name TEXT,
+ docdir TEXT,
+ cgidir TEXT,
+ group_id INT NOT NULL
+ );
+
+ CREATE INDEX idx_vhost_groups ON prweb_vhost (group_id);
+
+ CREATE UNIQUE INDEX idx_vhost_hostnames ON prweb_vhost(vhost_name);
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010206.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,9 @@
+-- by: pfalcon
+-- purpose: add timestamp/version for stored multimedia files
+
+ALTER TABLE db_images ADD COLUMN upload_date int NOT NULL;
+ALTER TABLE db_images ADD COLUMN version int NOT NULL;
+
+CREATE UNIQUE INDEX usergroup_uniq_groupid_userid ON
+user_group(group_id,user_id);
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010301.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,16 @@
+--
+-- Selected TOC Entries:
+--
+\connect - www
+--
+-- TOC Entry ID 2 (OID 29407739)
+--
+-- Name: kernel_traffic Type: TABLE Owner: www
+--
+
+CREATE TABLE "kernel_traffic" (
+ "kt_id" serial primary key,
+ "kt_data" text,
+ CONSTRAINT "kernel_traffic_pkey" PRIMARY KEY ("kt_id")
+);
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010304.NOTE 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,12 @@
+IMPORTANT NOTE!
+-------------------
+
+At this point, the artifact manager was rolled live to production.
+
+This involved stopping the website, then applying several scripts to the database in order:
+
+artifact-man.sql -- Create the new tracker tables in production
+artifact-conversion.sql -- Convert data from the old structures (bug, patch, support)
+artifact-fkeys.sql -- Apply foreign key constraints to new tables
+
+artifact-convert-files.php -- PHP command line script that reformats old patches
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010305.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,69 @@
+-- r/w of prdb_dbs || r/o prweb_vhost
+
+--
+-- All these changes were applied 3/8/2001
+--
+
+CREATE USER backend WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER;
+
+GRANT SELECT ON prweb_vhost TO backend;
+GRANT SELECT,UPDATE ON prdb_dbs TO backend;
+
+DROP SEQUENCE bug_bug_dependencies_pk_seq;--
+DROP SEQUENCE bug_canned_responses_pk_seq;-- | sequence | tperdue
+DROP SEQUENCE bug_category_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_filter_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_group_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_history_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_resolution_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_status_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE bug_task_dependencies_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE patch_category_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE patch_history_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE patch_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE patch_status_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE support_canned_responses_pk_seq;-- | sequence | tperdue
+DROP SEQUENCE support_category_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE support_history_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE support_messages_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE support_pk_seq ;-- | sequence | tperdue
+DROP SEQUENCE support_status_pk_seq ;-- | sequence | tperdue
+
+DROP TABLE bug ;-- | table | tperdue
+DROP TABLE bug_bug_dependencies ;-- | table | tperdue
+DROP TABLE bug_canned_responses ;-- | table | tperdue
+DROP TABLE bug_category ;-- | table | tperdue
+DROP TABLE bug_filter ;-- | table | tperdue
+DROP TABLE bug_group ;-- | table | tperdue
+DROP TABLE bug_history ;-- | table | tperdue
+DROP TABLE bug_resolution ;-- | table | tperdue
+DROP TABLE bug_status ;-- | table | tperdue
+DROP TABLE bug_task_dependencies ;-- | table | tperdue
+DROP TABLE patch ;-- | table | tperdue
+DROP TABLE patch_category ;-- | table | tperdue
+DROP TABLE patch_history ;-- | table | tperdue
+DROP TABLE patch_status ;-- | table | tperdue
+DROP TABLE support ;-- | table | tperdue
+DROP TABLE support_canned_responses ;-- | table | tperdue
+DROP TABLE support_category ;-- | table | tperdue
+DROP TABLE support_history ;-- | table | tperdue
+DROP TABLE support_messages ;-- | table | tperdue
+DROP TABLE support_status ;-- | table | tperdue
+
+alter table groups rename column use_bugs to dead1;
+alter table groups rename column use_patch to dead2;
+alter table groups rename column use_support to dead3;
+alter table groups rename column new_bug_address to dead4;
+alter table groups rename column new_patch_address to dead5;
+alter table groups rename column new_support_address to dead6;
+alter table groups rename column send_all_bugs to dead7;
+alter table groups rename column send_all_patches to dead8;
+alter table groups rename column send_all_support to dead9;
+alter table groups rename column use_bug_depend_box to dead10;
+alter table groups rename column bug_due_period to dead11;
+alter table groups rename column patch_due_period to dead12;
+alter table groups rename column support_due_period to dead13;
+
+drop index groups_unix;
+create unique index group_unix_uniq on groups (unix_group_name);
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010313.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,143 @@
+--
+-- Enforce unique user names
+--
+
+create unique index users_namename_uniq on users(user_name);
+DROP INDEX user_user;
+DROP INDEX idx_users_username;
+
+--
+-- INSTALL PL/pgSQL
+--
+CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS
+ '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';
+
+CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
+ HANDLER plpgsql_call_handler
+ LANCOMPILER 'PL/pgSQL';
+
+--
+-- Define a trigger so when you create a new ArtifactType
+-- You automatically create a related row over in the counters table
+--
+CREATE FUNCTION forumgrouplist_insert_agg () RETURNS OPAQUE AS '
+BEGIN
+ INSERT INTO forum_agg_msg_count (group_forum_id,count) \
+ VALUES (NEW.group_forum_id,0);
+ RETURN NEW;
+END;
+' LANGUAGE 'plpgsql';
+
+CREATE TRIGGER forumgrouplist_insert_trig AFTER INSERT ON forum_group_list
+ FOR EACH ROW EXECUTE PROCEDURE forumgrouplist_insert_agg();
+
+--
+-- Define a rule so that when new forum messages are submitted,
+-- the counters increment
+--
+CREATE RULE forum_insert_agg AS
+ ON INSERT TO forum
+ DO UPDATE forum_agg_msg_count SET count=count+1
+ WHERE group_forum_id=new.group_forum_id;
+
+CREATE RULE forum_delete_agg AS
+ ON DELETE TO forum
+ DO UPDATE forum_agg_msg_count SET count=count-1
+ WHERE group_forum_id=old.group_forum_id;
+
+
+--
+-- People want the open counts added to the artifact counts
+--
+ALTER TABLE artifact_counts_agg ADD COLUMN open_count int;
+
+--
+-- Define a trigger so when you create a new ArtifactType
+-- You automatically create a related row over in the counters table
+--
+CREATE FUNCTION artifactgrouplist_insert_agg () RETURNS OPAQUE AS '
+BEGIN
+ INSERT INTO artifact_counts_agg (group_artifact_id,count,open_count) \
+ VALUES (NEW.group_artifact_id,0,0);
+ RETURN NEW;
+END;
+' LANGUAGE 'plpgsql';
+
+CREATE TRIGGER artifactgrouplist_insert_trig AFTER INSERT ON artifact_group_list
+ FOR EACH ROW EXECUTE PROCEDURE artifactgrouplist_insert_agg();
+
+--
+-- Define a rule so that when new artifacts are submitted,
+-- the counters increment
+--
+CREATE RULE artifact_insert_agg AS
+ ON INSERT TO artifact
+ DO UPDATE artifact_counts_agg SET count=count+1,open_count=open_count+1
+ WHERE group_artifact_id=new.group_artifact_id;
+
+--
+--
+--
+drop TRIGGER artifactgroup_update_trig ON artifact;
+drop function artifactgroup_update_agg();
+
+CREATE FUNCTION artifactgroup_update_agg () RETURNS OPAQUE AS '
+BEGIN
+ --
+ -- see if they are moving to a new artifacttype
+ -- if so, its a more complex operation
+ --
+ IF NEW.group_artifact_id <> OLD.group_artifact_id THEN
+ --
+ -- transferred artifacts always have a status of 1
+ -- so we will increment the new artifacttypes sums
+ --
+ UPDATE artifact_counts_agg SET count=count+1, open_count=open_count+1 \
+ WHERE group_artifact_id=NEW.group_artifact_id;
+
+ --
+ -- now see how to increment/decrement the old types sums
+ --
+ IF NEW.status_id <> OLD.status_id THEN
+ IF OLD.status_id = 2 THEN
+ UPDATE artifact_counts_agg SET count=count-1 \
+ WHERE group_artifact_id=OLD.group_artifact_id;
+ --
+ -- no need to do anything if it was in deleted status
+ --
+ END IF;
+ ELSE
+ --
+ -- Was already in open status before
+ --
+ UPDATE artifact_counts_agg SET count=count-1, open_count=open_count-1 \
+ WHERE group_artifact_id=OLD.group_artifact_id;
+ END IF;
+ ELSE
+ --
+ -- just need to evaluate the status flag and
+ -- increment/decrement the counter as necessary
+ --
+ IF NEW.status_id <> OLD.status_id THEN
+ IF new.status_id = 1 THEN
+ UPDATE artifact_counts_agg SET open_count=open_count+1 \
+ WHERE group_artifact_id=new.group_artifact_id;
+ ELSE
+ IF new.status_id = 2 THEN
+ UPDATE artifact_counts_agg SET open_count=open_count-1 \
+ WHERE group_artifact_id=new.group_artifact_id;
+ ELSE
+ IF new.status_id = 3 THEN
+ UPDATE artifact_counts_agg SET open_count=open_count-1,count=count-1 \
+ WHERE group_artifact_id=new.group_artifact_id;
+ END IF;
+ END IF;
+ END IF;
+ END IF;
+ END IF;
+ RETURN NEW;
+END;
+' LANGUAGE 'plpgsql';
+
+CREATE TRIGGER artifactgroup_update_trig AFTER UPDATE ON artifact
+ FOR EACH ROW EXECUTE PROCEDURE artifactgroup_update_agg();
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010317.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,13 @@
+-- by: pfalcon
+-- purpose: table to store pending mass mailings
+
+CREATE TABLE massmail_queue (
+id serial primary key,
+type varchar(8) not null,
+subject text not null,
+message text not null,
+queued_date int not null,
+last_userid int not null default 0,
+failed_date int not null default 0,
+finished_date int not null default 0
+);
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010409.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,227 @@
+--
+-- Stats structure and process changes
+--
+
+drop table stats_project_build_tmp;
+drop table tmp_projs_releases_tmp;
+begin; delete from stats_project where day is null or week is null; commit;
+drop table stats_project_tmp;
+drop table topproj_admins;
+DROP TABLE frs_dlstats_agg;
+DROP TABLE frs_dlstats_filetotal_agg_old;
+DROP TABLE stats_agg_pages_by_browser;
+DROP TABLE stats_agg_pages_by_day_old;
+DROP TABLE stats_agr_filerelease;
+DROP TABLE stats_agr_project;
+drop table group_cvs_history;
+drop table project_counts_tmp;
+
+
+--
+-- Change the date format of stats_agg_site_by_group
+--
+-- Populated daily by site_stats.php
+--
+CREATE TABLE frs_dlstats_file_agg_tmp AS
+SELECT
+ substring(day::text from 1 for 6)::int AS month,
+ substring(day::text from 7 for 2)::int AS day,
+ file_id,
+ downloads
+ from frs_dlstats_file_agg;
+
+DROP TABLE frs_dlstats_file_agg;
+ALTER TABLE frs_dlstats_file_agg_tmp RENAME TO frs_dlstats_file_agg;
+
+CREATE UNIQUE INDEX frsdlfileagg_month_day_file ON frs_dlstats_file_agg(month,day,file_id);
+
+
+drop index httpdl_fid;
+drop index httpdl_group_id;
+create index statshttpdl_day_fileid ON stats_http_downloads(day,filerelease_id);
+drop index ftpdl_fid;
+drop index ftpdl_group_id;
+create index statsftpdl_day_fileid ON stats_ftp_downloads(day,filerelease_id);
+
+--
+-- Create an archive table of project_weekly_metric
+--
+-- Populated by project_weekly_metric.php
+--
+CREATE TABLE stats_project_metric (
+month int not null default 0,
+day int not null default 0,
+ranking int not null default 0,
+precentile float not null default 0,
+group_id int not null default 0
+);
+
+copy stats_project_metric from '/tmp/stats_project_metric.dump';
+
+CREATE UNIQUE INDEX statsprojectmetric_month_day_group ON stats_project_metric(month,day,group_id);
+
+
+--
+-- Change the date format of stats_agg_site_by_group
+--
+-- Populated daily by site_stats.php
+--
+CREATE TABLE stats_agg_site_by_group_tmp AS
+SELECT
+ substring(day::text from 1 for 6)::int AS month,
+ substring(day::text from 7 for 2)::int AS day,
+ group_id,
+ count
+ from stats_agg_site_by_group ;
+
+DROP TABLE stats_agg_site_by_group;
+ALTER TABLE stats_agg_site_by_group_tmp RENAME TO stats_agg_site_by_group;
+
+DROP TABLE stats_agg_site_by_day;
+
+CREATE UNIQUE INDEX statssitebygroup_month_day_group ON stats_agg_site_by_group(month,day,group_id);
+
+
+--
+-- Change the date format of stats_agg_logo_by_group
+--
+-- Populated daily by site_stats.php
+--
+CREATE TABLE stats_agg_logo_by_group_tmp AS
+SELECT
+ substring(day::text from 1 for 6)::int AS month,
+ substring(day::text from 7 for 2)::int AS day,
+ group_id,
+ count
+ from stats_agg_logo_by_group ;
+
+DROP TABLE stats_agg_logo_by_group;
+ALTER TABLE stats_agg_logo_by_group_tmp RENAME TO stats_agg_logo_by_group;
+
+CREATE UNIQUE INDEX statslogobygroup_month_day_group ON stats_agg_logo_by_group(month,day,group_id);
+
+
+--
+-- Subdomain pages
+--
+create table stats_subd_pages (
+month INT NOT NULL DEFAULT 0,
+day INT NOT NULL DEFAULT 0,
+group_id INT NOT NULL DEFAULT 0,
+pages INT NOT NULL DEFAULT 0
+);
+
+--
+-- Migrate data from old stats_project table
+--
+INSERT INTO stats_subd_pages
+SELECT month,day,group_id,subdomain_views
+FROM stats_project WHERE subdomain_views > 0;
+
+CREATE UNIQUE INDEX statssubdpages_month_day_group ON stats_subd_pages(month,day,group_id);
+
+
+create table stats_cvs_user (
+month INT NOT NULL DEFAULT 0,
+day INT NOT NULL DEFAULT 0,
+group_id INT NOT NULL DEFAULT 0,
+user_id INT NOT NULL DEFAULT 0,
+checkouts INT NOT NULL DEFAULT 0,
+commits INT NOT NULL DEFAULT 0,
+adds INT NOT NULL DEFAULT 0
+);
+
+create table stats_cvs_group (
+month INT NOT NULL DEFAULT 0,
+day INT NOT NULL DEFAULT 0,
+group_id INT NOT NULL DEFAULT 0,
+checkouts INT NOT NULL DEFAULT 0,
+commits INT NOT NULL DEFAULT 0,
+adds INT NOT NULL DEFAULT 0
+);
+
+--
+-- Migrate data from old stats_project table
+--
+INSERT INTO stats_cvs_group
+SELECT month,day,group_id,cvs_checkouts,cvs_commits,cvs_adds
+FROM stats_project
+WHERE cvs_checkouts > 0
+OR cvs_commits > 0
+OR cvs_adds > 0;
+
+CREATE UNIQUE INDEX statscvsgroup_month_day_group ON stats_cvs_group(month,day,group_id);
+
+
+DROP INDEX archive_project_day;
+DROP INDEX archive_project_month;
+DROP INDEX archive_project_monthday;
+DROP INDEX archive_project_week;
+DROP INDEX project_log_group;
+
+--
+-- Populated daily by site_stats.php
+--
+create table stats_project_developers (
+month INT NOT NULL DEFAULT 0,
+day INT NOT NULL DEFAULT 0,
+group_id INT NOT NULL DEFAULT 0,
+developers INT NOT NULL DEFAULT 0
+);
+
+--
+-- Migrate data from old stats_project table
+--
+COPY stats_project_developers from '/tmp/stats_project_developers';
+CREATE UNIQUE INDEX statsprojectdev_month_day_group ON stats_project_developers(month,day,group_id);
+
+
+--
+-- Reorg and normalize stats_project as much as feasible
+--
+-- Populated daily by site_stats.php
+--
+DROP TABLE stats_project;
+
+create table stats_project (
+month INT NOT NULL DEFAULT 0,
+day INT NOT NULL DEFAULT 0,
+group_id INT NOT NULL DEFAULT 0,
+file_releases INT DEFAULT 0,
+msg_posted INT DEFAULT 0,
+msg_uniq_auth INT DEFAULT 0,
+bugs_opened INT DEFAULT 0,
+bugs_closed INT DEFAULT 0,
+support_opened INT DEFAULT 0,
+support_closed INT DEFAULT 0,
+patches_opened INT DEFAULT 0,
+patches_closed INT DEFAULT 0,
+artifacts_opened INT DEFAULT 0,
+artifacts_closed INT DEFAULT 0,
+tasks_opened INT DEFAULT 0,
+tasks_closed INT DEFAULT 0,
+help_requests INT DEFAULT 0
+);
+
+copy stats_project from '/tmp/stats_project.dump';
+
+CREATE UNIQUE INDEX statsproject_month_day_group ON stats_project(month,day,group_id);
+
+
+--
+-- Reorg and normalize the stats_site table
+--
+-- Populated daily by site_stats.php
+--
+create table stats_site_tmp AS
+select month,day,uniq_users,sessions,total_users,new_users,new_projects
+from stats_site;
+
+DROP TABLE stats_site;
+ALTER TABLE stats_site_tmp RENAME TO stats_site;
+
+CREATE UNIQUE INDEX statssite_month_day on stats_site(month,day);
+
+grant all on stats_cvs_group to stats;
+grant all on stats_project to stats;
+grant all on stats_subd_pages to stats;
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010412.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5 @@
+-- by: pfalcon
+-- purpose: add logo image support for any group
+
+ALTER TABLE groups ADD COLUMN logo_image_id int NOT NULL DEFAULT 100;
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010507.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5 @@
+-- by: pfalcon
+-- purpose: add field to allow ratings opt-out
+
+ALTER TABLE users ADD COLUMN block_ratings int NOT NULL DEFAULT 0;
+
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010509.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,61 @@
+-- by: pfalcon
+-- purpose: Referential integrity constraints for FRS schema
+
+BEGIN;
+
+INSERT INTO frs_filetype VALUES (100,'None');
+INSERT INTO frs_processor VALUES (100,'None');
+
+-- if file is not attched to a release, it can't be seen anyway
+DELETE FROM frs_file
+WHERE NOT EXISTS(
+ SELECT release_id
+ FROM frs_release
+ WHERE frs_file.release_id=frs_release.release_id
+)
+;
+
+UPDATE frs_file
+SET type_id=100
+WHERE NOT EXISTS(
+ SELECT type_id
+ FROM frs_filetype
+ WHERE frs_file.type_id=frs_filetype.type_id
+)
+;
+
+UPDATE frs_file
+SET processor_id=100
+WHERE NOT EXISTS(
+ SELECT processor_id
+ FROM frs_processor
+ WHERE frs_file.processor_id=frs_processor.processor_id
+)
+;
+
+COMMIT;
+
+ALTER TABLE frs_file ADD CONSTRAINT frsfile_releaseid_fk
+ FOREIGN KEY (release_id) REFERENCES frs_release(release_id) MATCH FULL;
+ALTER TABLE frs_file ADD CONSTRAINT frsfile_typeid_fk
+ FOREIGN KEY (type_id) REFERENCES frs_filetype(type_id) MATCH FULL;
+ALTER TABLE frs_file ADD CONSTRAINT frsfile_processorid_fk
+ FOREIGN KEY (processor_id) REFERENCES frs_processor(processor_id) MATCH FULL;
+
+ALTER TABLE frs_package ADD CONSTRAINT frspackage_groupid_fk
+ FOREIGN KEY (group_id) REFERENCES groups(group_id) MATCH FULL;
+ALTER TABLE frs_package ADD CONSTRAINT frspackage_statusid_fk
+ FOREIGN KEY (status_id) REFERENCES frs_status(status_id) MATCH FULL;
+
+ALTER TABLE frs_release ADD CONSTRAINT frsrelease_packageid_fk
+ FOREIGN KEY (package_id) REFERENCES frs_package(package_id) MATCH FULL;
+ALTER TABLE frs_release ADD CONSTRAINT frsrelease_statusid_fk
+ FOREIGN KEY (status_id) REFERENCES frs_status(status_id) MATCH FULL;
+ALTER TABLE frs_release ADD CONSTRAINT frsrelease_releasedby_fk
+ FOREIGN KEY (released_by) REFERENCES users(user_id) MATCH FULL;
+
+-- Tracker 'Pending' patch sql changes
+-- by: zelphyr
+ALTER TABLE artifact_group_list ADD COLUMN status_timeout integer;
+UPDATE artifact_group_list SET status_timeout='1209600' WHERE status_timeout=NULL;
+INSERT INTO artifact_status VALUES('4','Pending');
Added: trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/SQL_migrate-2.5-to-2.6/sqlchanges20010511.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,12 @@
+-- by: pfalcon
+-- purpose: table with history of users' rating, for tracking changes/graphing
+
+CREATE TABLE user_metric_history(
+month int not null,
+day int not null,
+user_id int not null,
+ranking int not null,
+metric float not null);
+
+CREATE UNIQUE INDEX user_metric_history_date_userid
+ON user_metric_history(month,day,user_id);
Added: trunk/gforge_base/evolvisforge/gforge/db/dbusers.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/dbusers.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/dbusers.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,32 @@
+--
+-- SourceForge: Breaking Down the Barriers to Open Source Development
+-- Copyright 1999-2001 (c) VA Linux Systems
+-- http://sourceforge.net
+--
+-- $Id: dbusers.sql,v 1.3 2001/06/19 16:50:06 jbyers Exp $
+--
+
+CREATE USER backend WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER;
+
+GRANT SELECT ON prweb_vhost,users,mail_group_list TO backend;
+GRANT SELECT,UPDATE ON prdb_dbs TO backend;
+
+
+CREATE USER stats WITH PASSWORD 'xxxxx' NOCREATEDB NOCREATEUSER;
+
+GRANT SELECT ON
+groups,
+frs_file,
+frs_package,
+frs_release
+TO stats;
+
+GRANT ALL ON
+frs_dlstats_file_agg,
+stats_ftp_downloads,
+stats_http_downloads,
+stats_cvs_group,
+stats_subd_pages
+TO stats;
+
+grant all on _rserv_log_ to stats;
Added: trunk/gforge_base/evolvisforge/gforge/db/languages.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/languages.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/languages.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,23 @@
+1 English English.class English en
+2 Japanese Japanese.class Japanese ja
+3 Hebrew Hebrew.class Hebrew iw
+4 Spanish Spanish.class Spanish es
+5 Thai Thai.class Thai th
+6 German German.class German de
+7 French French.class French fr
+8 Italian Italian.class Italian it
+9 Norwegian Norwegian.class Norwegian no
+10 Swedish Swedish.class Swedish sv
+12 Dutch Dutch.class Dutch nl
+13 Esperanto Esperanto.class Esperanto eo
+14 Catalan Catalan.class Catalan ca
+15 Polish Polish.class Polish pl
+11 Trad.Chinese Chinese.class Chinese zh
+17 Russian Russian.class Russian ru
+18 Portuguese Portuguese.class Portuguese pt
+19 Greek Greek.class Greek el
+20 Bulgarian Bulgarian.class Bulgarian bg
+21 Indonesian Indonesian.class Indonesian id
+16 Pt. Brazillian PortugueseBrazillian.class PortugueseBrazillian pt
+22 Korean Korean.class Korean ko
+23 Smpl.Chinese SimplifiedChinese.class SimplifiedChinese zn
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/DefaultValues.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/DefaultValues.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/DefaultValues.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,195 @@
+--
+-- SourceForge: Breaking Down the Barriers to Open Source Development
+-- Copyright 1999-2000 (c) The SourceForge Crew
+-- http://sourceforge.net
+--
+-- The values in this file must be inserted in order
+-- and must be complete or you will have referential integrity problems
+--
+
+--
+-- Default Data for 'groups'
+--
+INSERT INTO groups (group_id) VALUES (1);
+
+--
+-- Default Data for 'users'
+--
+INSERT INTO users (user_id, user_name, email, user_pw)
+VALUES (100,'None','noreply','*********34343');
+
+--
+-- Default data for table 'bug_resolution'
+--
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (1,'Fixed');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (2,'Invalid');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (3,'Wont Fix');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (4,'Later');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (5,'Remind');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (6,'Works For Me');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (100,'None');
+INSERT INTO bug_resolution (resolution_id, resolution_name) VALUES (101,'Duplicate');
+
+--
+-- Default data for table 'bug_status'
+--
+INSERT INTO bug_status (status_id, status_name) VALUES (1,'Open');
+INSERT INTO bug_status (status_id, status_name) VALUES (3,'Closed');
+INSERT INTO bug_status (status_id, status_name) VALUES (100,'None');
+
+--
+-- Default data for bug_category
+--
+INSERT INTO bug_category (bug_category_id, group_id, category_name) VALUES (100,1,'None');
+
+--
+-- Default data for bug_group
+--
+INSERT INTO bug_group (bug_group_id, group_id, group_name) VALUES (100,1,'None');
+
+--
+-- Default data for bug - required for dependent tasks/bugs
+--
+INSERT INTO bug (bug_id,group_id,status_id,category_id,bug_group_id,submitted_by,assigned_to,resolution_id)
+ VALUES (100,1,100,100,100,100,100,100);
+--NOTE - if using sequences, you may have to update the bug_id sequence here
+
+--
+-- Default data for table 'patch_category'
+--
+INSERT INTO patch_category (patch_category_id, group_id, category_name) VALUES (100,1,'None');
+
+--
+-- Default data for table 'patch_status'
+--
+INSERT INTO patch_status (patch_status_id, status_name) VALUES (1,'Open');
+INSERT INTO patch_status (patch_status_id, status_name) VALUES (2,'Closed');
+INSERT INTO patch_status (patch_status_id, status_name) VALUES (3,'Deleted');
+INSERT INTO patch_status (patch_status_id, status_name) VALUES (4,'Postponed');
+INSERT INTO patch_status (patch_status_id, status_name) VALUES (100,'None');
+
+--
+-- Default values for patch
+--
+INSERT INTO patch (group_id,patch_status_id,patch_category_id,submitted_by,assigned_to)
+ VALUES (1,100,100,100,100);
+
+--
+-- Default data for table 'project_status'
+--
+INSERT INTO project_status (status_id, status_name) VALUES (1,'Open');
+INSERT INTO project_status (status_id, status_name) VALUES (2,'Closed');
+INSERT INTO project_status (status_id, status_name) VALUES (100,'None');
+INSERT INTO project_status (status_id, status_name) VALUES (3,'Deleted');
+
+--
+-- Default data for project_group_list
+--
+INSERT INTO project_group_list (group_project_id,group_id) VALUES (1,1);
+--NOTE - if using sequences, you may have to update the group_project_id sequence here
+
+--
+-- Default data for project_task
+--
+INSERT INTO project_task (group_project_id,created_by,status_id)
+ VALUES (1,100,100);
+
+--
+-- Default Data for 'survey_question_types'
+--
+INSERT INTO survey_question_types (id, type) VALUES (1,'Radio Buttons 1-5');
+INSERT INTO survey_question_types (id, type) VALUES (2,'Text Area');
+INSERT INTO survey_question_types (id, type) VALUES (3,'Radio Buttons Yes/No');
+INSERT INTO survey_question_types (id, type) VALUES (4,'Comment Only');
+INSERT INTO survey_question_types (id, type) VALUES (5,'Text Field');
+INSERT INTO survey_question_types (id, type) VALUES (100,'None');
+
+--
+-- Default data for Support System
+--
+insert into support_status values('1','Open');
+insert into support_status values('2','Closed');
+insert into support_status values('3','Deleted');
+
+--
+-- Default data for 'support_category'
+--
+insert into support_category VALUES ('100','1','None');
+
+--
+-- Default data for Help Wanted System
+--
+INSERT INTO people_skill_year VALUES ('','< 6 Months');
+INSERT INTO people_skill_year VALUES ('','6 Mo - 2 yr');
+INSERT INTO people_skill_year VALUES ('','2 yr - 5 yr');
+INSERT INTO people_skill_year VALUES ('','5 yr - 10 yr');
+INSERT INTO people_skill_year VALUES ('','> 10 years');
+
+INSERT INTO people_skill_level VALUES ('','Want to Learn');
+INSERT INTO people_skill_level VALUES ('','Competent');
+INSERT INTO people_skill_level VALUES ('','Wizard');
+INSERT INTO people_skill_level VALUES ('','Wrote The Book');
+INSERT INTO people_skill_level VALUES ('','Wrote It');
+
+INSERT INTO people_job_category (category_id,name) VALUES ('','Developer');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Project Manager');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Unix Admin');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Doc Writer');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Tester');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Support Manager');
+INSERT INTO people_job_category (category_id,name) VALUES ('','Graphic/Other Designer');
+
+INSERT INTO people_job_status VALUES ('1','Open');
+INSERT INTO people_job_status VALUES ('2','Filled');
+INSERT INTO people_job_status VALUES ('3','Deleted');
+
+--
+-- Default data for group_type
+--
+INSERT INTO group_type VALUES ('1','Project');
+INSERT INTO group_type VALUES ('2','Foundry');
+
+--
+-- Default data for new filerelease system
+--
+INSERT INTO frs_filetype VALUES ('1000','.deb');
+INSERT INTO frs_filetype VALUES ('2000','.rpm');
+INSERT INTO frs_filetype VALUES ('3000','.zip');
+INSERT INTO frs_filetype VALUES ('','.bz2');
+INSERT INTO frs_filetype VALUES ('','.gz');
+INSERT INTO frs_filetype VALUES ('5000','Source .zip');
+INSERT INTO frs_filetype VALUES ('','Source .bz2');
+INSERT INTO frs_filetype VALUES ('','Source .gz');
+INSERT INTO frs_filetype VALUES ('5100','Source .rpm');
+INSERT INTO frs_filetype VALUES ('5900','Other Source File');
+INSERT INTO frs_filetype VALUES ('8000','.jpg');
+INSERT INTO frs_filetype VALUES ('','text');
+INSERT INTO frs_filetype VALUES ('','html');
+INSERT INTO frs_filetype VALUES ('','pdf');
+INSERT INTO frs_filetype VALUES ('9999','Other');
+
+INSERT INTO frs_status VALUES ('1','Active');
+INSERT INTO frs_status VALUES ('3','Hidden');
+
+INSERT INTO frs_processor VALUES ('1000','i386');
+INSERT INTO frs_processor VALUES ('6000','IA64');
+INSERT INTO frs_processor VALUES ('7000','Alpha');
+INSERT INTO frs_processor VALUES ('8000','Any');
+INSERT INTO frs_processor VALUES ('2000','PPC');
+INSERT INTO frs_processor VALUES ('3000','MIPS');
+INSERT INTO frs_processor VALUES ('4000','Sparc');
+INSERT INTO frs_processor VALUES ('5000','UltraSparc');
+INSERT INTO frs_processor VALUES ('9999','Other');
+
+--
+-- Default data for themes
+--
+INSERT INTO themes VALUES (1,'forged','Forged Metal');
+INSERT INTO themes VALUES (2,'classic','Classic SourceForge');
+
+--
+-- Default data for user_group
+--
+INSERT INTO user_group (user_id, group_id, admin_flags) VALUES (101,1,'A');
+
+
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/Languages.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/Languages.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/Languages.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,42 @@
+INSERT INTO supported_languages
+VALUES (1,'English','English.class','English','en');
+INSERT INTO supported_languages
+VALUES (2,'Japanese','Japanese.class','Japanese','ja');
+INSERT INTO supported_languages
+VALUES (3,'Hebrew','Hebrew.class','Hebrew','iw');
+INSERT INTO supported_languages
+VALUES (4,'Spanish','Spanish.class','Spanish','es');
+INSERT INTO supported_languages
+VALUES (5,'Thai','Thai.class','Thai','th');
+INSERT INTO supported_languages
+VALUES (6,'German','German.class','German','de');
+INSERT INTO supported_languages
+VALUES (7,'French','French.class','French','fr');
+INSERT INTO supported_languages
+VALUES (8,'Italian','Italian.class','Italian','it');
+INSERT INTO supported_languages
+VALUES (9,'Norwegian','Norwegian.class','Norwegian','no');
+INSERT INTO supported_languages
+VALUES (10,'Swedish','Swedish.class','Swedish','sv');
+INSERT INTO supported_languages
+VALUES (11,'Chinese','Chinese.class','Chinese','zh');
+INSERT INTO supported_languages
+VALUES (12,'Dutch','Dutch.class','Dutch','nl');
+INSERT INTO supported_languages
+VALUES (13,'Esperanto','Esperanto.class','Esperanto','eo');
+INSERT INTO supported_languages
+VALUES (14,'Catalan','Catalan.class','Catalan','ca');
+INSERT INTO supported_languages
+VALUES (15,'Polish','Polish.class','Polish','pl');
+INSERT INTO supported_languages
+VALUES (16,'Portuguese (Brazillian)','PortugueseBrazillian.class','PortugueseBrazillian','pt');
+INSERT INTO supported_languages
+VALUES (17,'Russian','Russian.class','Russian','ru');
+INSERT INTO supported_languages
+VALUES (18,'Portuguese','Portuguese.class','Portuguese','pt');
+INSERT INTO supported_languages
+VALUES (19,'Greek','Greek.class','Greek','el');
+INSERT INTO supported_languages
+VALUES (20,'Bulgarian','Bulgarian.class','Bulgarian','bg');
+INSERT INTO supported_languages
+VALUES (21,'Indonesian','Indonesian.class','Indonesian','id');
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/SourceForge.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/SourceForge.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/SourceForge.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,6141 @@
+-- ORACLE SCRIPT
+-- Changes were renaming the "session" table to sf_session
+-- renaming "date" columns to sf_date
+-- commenting out the create trigger constraints
+-- commenting out the select setval statements
+
+--
+-- Selected TOC Entries:
+--
+--\connect - tperdue
+--
+-- TOC Entry ID 2 (OID 18138427)
+--
+-- Name: bug_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 182 (OID 18138445)
+--
+-- Name: bug Type: TABLE
+--
+
+CREATE TABLE bug (
+ bug_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ status_id integer DEFAULT '0' NOT NULL,
+ priority integer DEFAULT '0' NOT NULL,
+ category_id integer DEFAULT '0' NOT NULL,
+ submitted_by integer DEFAULT '0' NOT NULL,
+ assigned_to integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL,
+ summary varchar2(255),
+ details varchar2(255),
+ close_date integer,
+ bug_group_id integer DEFAULT '0' NOT NULL,
+ resolution_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_ID BEFORE
+ INSERT
+ ON bug REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_pk_seq.nextval into :new.bug_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 4 (OID 18138495)
+--
+-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_bug_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 183 (OID 18138513)
+--
+-- Name: bug_bug_dependencies Type: TABLE
+--
+
+CREATE TABLE bug_bug_dependencies (
+ bug_depend_id integer DEFAULT '0' NOT NULL,
+ bug_id integer DEFAULT '0' NOT NULL,
+ is_dependent_on_bug_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_depend_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_DEPEND_ID BEFORE
+ INSERT
+ ON bug_bug_dependencies REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_bug_dependencies_pk_seq.nextval into :new.bug_depend_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 6 (OID 18138531)
+--
+-- Name: bug_canned_responses_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_canned_responses_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 184 (OID 18138549)
+--
+-- Name: bug_canned_responses Type: TABLE
+--
+
+CREATE TABLE bug_canned_responses (
+ bug_canned_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ title varchar2(255),
+ body varchar2(255),
+ PRIMARY KEY (bug_canned_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_CANNED_ID BEFORE
+ INSERT
+ ON bug_canned_responses REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_canned_responses_pk_seq.nextval into :new.bug_canned_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 8 (OID 18138582)
+--
+-- Name: bug_category_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 185 (OID 18138600)
+--
+-- Name: bug_category Type: TABLE
+--
+
+CREATE TABLE bug_category (
+ bug_category_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ category_name varchar2(255),
+ PRIMARY KEY (bug_category_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_CATEGORY_ID BEFORE
+ INSERT
+ ON bug_category REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_category_pk_seq.nextval into :new.bug_category_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 10 (OID 18138632)
+--
+-- Name: bug_filter_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_filter_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 186 (OID 18138650)
+--
+-- Name: bug_filter Type: TABLE
+--
+
+CREATE TABLE bug_filter (
+ filter_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ sql_clause varchar2(255) DEFAULT '',
+ is_active integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (filter_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_FILTER_ID BEFORE
+ INSERT
+ ON bug_filter REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_filter_pk_seq.nextval into :new.filter_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 12 (OID 18138687)
+--
+-- Name: bug_group_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_group_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 187 (OID 18138705)
+--
+-- Name: bug_group Type: TABLE
+--
+
+CREATE TABLE bug_group (
+ bug_group_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ group_name varchar2(255) DEFAULT '',
+ PRIMARY KEY (bug_group_id)
+);
+
+CREATE TRIGGER DEFAULT_BUG_GROUP_ID BEFORE
+ INSERT
+ ON bug_group REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_group_pk_seq.nextval into :new.bug_group_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 14 (OID 18138738)
+--
+-- Name: bug_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 188 (OID 18138756)
+--
+-- Name: bug_history Type: TABLE
+--
+
+CREATE TABLE bug_history (
+ bug_history_id integer DEFAULT '0' NOT NULL,
+ bug_id integer DEFAULT '0' NOT NULL,
+ field_name varchar2(255) DEFAULT '',
+ old_value varchar2(255) DEFAULT '',
+ mod_by integer DEFAULT '0' NOT NULL,
+ sf_date integer,
+ PRIMARY KEY (bug_history_id)
+);
+
+--nextval('bug_history_pk_seq'::text)
+CREATE TRIGGER DEFAULT_BUG_HISTORY_ID BEFORE
+ INSERT
+ ON bug_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_history_pk_seq.nextval into :new.bug_history_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 16 (OID 18138794)
+--
+-- Name: bug_resolution_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_resolution_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 189 (OID 18138812)
+--
+-- Name: bug_resolution Type: TABLE
+--
+
+CREATE TABLE bug_resolution (
+ resolution_id integer DEFAULT '0' NOT NULL,
+ resolution_name varchar2(255) DEFAULT '',
+ PRIMARY KEY (resolution_id)
+);
+
+--nextval('bug_resolution_pk_seq'::text)
+CREATE TRIGGER DEFAULT_BUG_RESOLUTION_ID BEFORE
+ INSERT
+ ON bug_resolution REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_resolution_pk_seq.nextval into :new.resolution_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 18 (OID 18138843)
+--
+-- Name: bug_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 190 (OID 18138861)
+--
+-- Name: bug_status Type: TABLE
+--
+
+CREATE TABLE bug_status (
+ status_id integer DEFAULT '0' NOT NULL,
+ status_name varchar2(255),
+ PRIMARY KEY (status_id)
+);
+
+--nextval('bug_status_pk_seq'::text)
+CREATE TRIGGER DEFAULT_BUG_STATUS_ID BEFORE
+ INSERT
+ ON bug_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_status_pk_seq.nextval into :new.status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 20 (OID 18138891)
+--
+-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE bug_task_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 191 (OID 18138909)
+--
+-- Name: bug_task_dependencies Type: TABLE
+--
+
+CREATE TABLE bug_task_dependencies (
+ bug_depend_id integer DEFAULT '0' NOT NULL,
+ bug_id integer DEFAULT '0' NOT NULL,
+ is_dependent_on_task_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_depend_id)
+);
+
+--nextval('bug_task_dependencies_pk_seq'::text)
+CREATE TRIGGER DEFAULT_BUG_TASK_ID BEFORE
+ INSERT
+ ON bug_task_dependencies REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select bug_task_dependencies_pk_seq.nextval into :new.bug_depend_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 22 (OID 18138927)
+--
+-- Name: canned_responses_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE canned_responses_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 192 (OID 18138946)
+--
+-- Name: canned_responses Type: TABLE
+--
+
+CREATE TABLE canned_responses (
+ response_id integer DEFAULT '0' NOT NULL,
+ response_title character varying(25),
+ response_text varchar2(255),
+ PRIMARY KEY (response_id)
+);
+
+--nextval('canned_responses_pk_seq'::text)
+CREATE TRIGGER DEFAULT_CANNED_RESPONSE_ID BEFORE
+ INSERT
+ ON canned_responses REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select canned_responses_pk_seq.nextval into :new.response_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 24 (OID 18138977)
+--
+-- Name: db_images_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE db_images_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 193 (OID 18138995)
+--
+-- Name: db_images Type: TABLE
+--
+
+CREATE TABLE db_images (
+ id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ description varchar2(255) DEFAULT '',
+ bin_data varchar2(255) DEFAULT '',
+ filename varchar2(255) DEFAULT '',
+ filesize integer DEFAULT '0' NOT NULL,
+ filetype varchar2(255) DEFAULT '',
+ width integer DEFAULT '0' NOT NULL,
+ height integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--nextval('db_images_pk_seq'::text)
+CREATE TRIGGER DEFAULT_DB_IMAGES_ID BEFORE
+ INSERT
+ ON db_images REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select db_images_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 26 (OID 18139040)
+--
+-- Name: doc_data_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE doc_data_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 194 (OID 18139058)
+--
+-- Name: doc_data Type: TABLE
+--
+
+CREATE TABLE doc_data (
+ docid integer DEFAULT '0' NOT NULL,
+ stateid integer DEFAULT '0' NOT NULL,
+ title character varying(255) DEFAULT '',
+ data varchar2(255) DEFAULT '',
+ updatedate integer DEFAULT '0' NOT NULL,
+ createdate integer DEFAULT '0' NOT NULL,
+ created_by integer DEFAULT '0' NOT NULL,
+ doc_group integer DEFAULT '0' NOT NULL,
+ description varchar2(255),
+ language_id integer DEFAULT '1' NOT NULL,
+ PRIMARY KEY (docid)
+);
+
+--nextval('doc_data_pk_seq'::text)
+CREATE TRIGGER DEFAULT_DOC_DATA_ID BEFORE
+ INSERT
+ ON doc_data REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select doc_data_pk_seq.nextval into :new.docid from dual;
+END;
+/
+
+--
+-- TOC Entry ID 28 (OID 18139104)
+--
+-- Name: doc_groups_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE doc_groups_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 195 (OID 18139122)
+--
+-- Name: doc_groups Type: TABLE
+--
+
+CREATE TABLE doc_groups (
+ doc_group integer DEFAULT '0' NOT NULL,
+ groupname character varying(255) DEFAULT '',
+ group_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (doc_group)
+);
+
+--nextval('doc_groups_pk_seq'::text)
+CREATE TRIGGER DEFAULT_DOC_GROUP BEFORE
+ INSERT
+ ON doc_groups REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select doc_groups_pk_seq.nextval into :new.doc_group from dual;
+END;
+/
+
+--
+-- TOC Entry ID 30 (OID 18139140)
+--
+-- Name: doc_states_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE doc_states_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 196 (OID 18139158)
+--
+-- Name: doc_states Type: TABLE
+--
+
+CREATE TABLE doc_states (
+ stateid integer DEFAULT '0' NOT NULL,
+ name character varying(255) DEFAULT '',
+ PRIMARY KEY (stateid)
+);
+
+--nextval('doc_states_pk_seq'::text)
+CREATE TRIGGER DEFAULT_DOC_STATES_ID BEFORE
+ INSERT
+ ON doc_states REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select doc_states_pk_seq.nextval into :new.stateid from dual;
+END;
+/
+
+--
+-- TOC Entry ID 32 (OID 18139174)
+--
+-- Name: filemodule_monitor_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE filemodule_monitor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 197 (OID 18139192)
+--
+-- Name: filemodule_monitor Type: TABLE
+--
+
+CREATE TABLE filemodule_monitor (
+ id integer DEFAULT '0' NOT NULL,
+ filemodule_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--nextval('filemodule_monitor_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FILEMODULE_MONITOR_ID BEFORE
+ INSERT
+ ON filemodule_monitor REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select filemodule_monitor_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 34 (OID 18139210)
+--
+-- Name: forum_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE forum_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 198 (OID 18139228)
+--
+-- Name: forum Type: TABLE
+--
+
+CREATE TABLE forum (
+ msg_id integer DEFAULT '0' NOT NULL,
+ group_forum_id integer DEFAULT '0' NOT NULL,
+ posted_by integer DEFAULT '0' NOT NULL,
+ subject varchar2(255) DEFAULT '',
+ body varchar2(255) DEFAULT '',
+ sf_date integer DEFAULT '0' NOT NULL,
+ is_followup_to integer DEFAULT '0' NOT NULL,
+ thread_id integer DEFAULT '0' NOT NULL,
+ has_followups integer DEFAULT '0',
+ most_recent_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (msg_id)
+);
+
+--nextval('forum_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FORUM_MSG_ID BEFORE
+ INSERT
+ ON forum REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select forum_pk_seq.nextval into :new.msg_id from dual;
+END;
+/
+
+
+--
+-- TOC Entry ID 199 (OID 18139275)
+--
+-- Name: forum_agg_msg_count Type: TABLE
+--
+
+CREATE TABLE forum_agg_msg_count (
+ group_forum_id integer DEFAULT '0' NOT NULL,
+ count integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (group_forum_id)
+);
+
+--
+-- TOC Entry ID 36 (OID 18139291)
+--
+-- Name: forum_group_list_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE forum_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 200 (OID 18139309)
+--
+-- Name: forum_group_list Type: TABLE
+--
+
+CREATE TABLE forum_group_list (
+ group_forum_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ forum_name varchar2(255) DEFAULT '',
+ is_public integer DEFAULT '0' NOT NULL,
+ description varchar2(255),
+ allow_anonymous integer DEFAULT '0' NOT NULL,
+ send_all_posts_to varchar2(255),
+ PRIMARY KEY (group_forum_id)
+);
+
+--nextval('forum_group_list_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FORUM_GROUP_ID BEFORE
+ INSERT
+ ON forum_group_list REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select forum_group_list_pk_seq.nextval into :new.group_forum_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 38 (OID 18139348)
+--
+-- Name: forum_monitored_forums_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE forum_monitored_forums_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 201 (OID 18139366)
+--
+-- Name: forum_monitored_forums Type: TABLE
+--
+
+CREATE TABLE forum_monitored_forums (
+ monitor_id integer DEFAULT '0' NOT NULL,
+ forum_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (monitor_id)
+);
+
+--nextval('forum_monitored_forums_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FORUM_MON_FORUMS_ID BEFORE
+ INSERT
+ ON forum_monitored_forums REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select forum_monitored_forums_pk_seq.nextval into :new.monitor_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 40 (OID 18139384)
+--
+-- Name: forum_saved_place_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE forum_saved_place_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 202 (OID 18139402)
+--
+-- Name: forum_saved_place Type: TABLE
+--
+
+CREATE TABLE forum_saved_place (
+ saved_place_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ forum_id integer DEFAULT '0' NOT NULL,
+ save_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (saved_place_id)
+);
+
+--nextval('forum_saved_place_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FORUM_SAVED_PLACES_ID BEFORE
+ INSERT
+ ON forum_saved_place REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select forum_saved_place_pk_seq.nextval into :new.saved_place_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 203 (OID 18139454)
+--
+-- Name: foundry_data Type: TABLE
+--
+
+CREATE TABLE foundry_data (
+ foundry_id integer DEFAULT '0' NOT NULL,
+ freeform1_html varchar2(255),
+ freeform2_html varchar2(255),
+ sponsor1_html varchar2(255),
+ sponsor2_html varchar2(255),
+ guide_image_id integer DEFAULT '0' NOT NULL,
+ logo_image_id integer DEFAULT '0' NOT NULL,
+ trove_categories varchar2(255),
+ PRIMARY KEY (foundry_id)
+);
+
+--
+-- TOC Entry ID 42 (OID 18139492)
+--
+-- Name: foundry_news_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE foundry_news_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 204 (OID 18139510)
+--
+-- Name: foundry_news Type: TABLE
+--
+
+CREATE TABLE foundry_news (
+ foundry_news_id integer DEFAULT '0' NOT NULL,
+ foundry_id integer DEFAULT '0' NOT NULL,
+ news_id integer DEFAULT '0' NOT NULL,
+ approve_date integer DEFAULT '0' NOT NULL,
+ is_approved integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (foundry_news_id)
+);
+
+--nextval('foundry_news_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FOUNDRY_NEWS_ID BEFORE
+ INSERT
+ ON foundry_news REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select foundry_news_pk_seq.nextval into :new.foundry_news_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 44 (OID 18139532)
+--
+-- Name: foundry_preferred_projec_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE foundry_preferred_proj_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 205 (OID 18139550)
+--
+-- Name: foundry_preferred_projects Type: TABLE
+--
+
+CREATE TABLE foundry_preferred_projects (
+ foundry_project_id integer DEFAULT '0' NOT NULL,
+ foundry_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ rank integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (foundry_project_id)
+);
+
+--nextval('foundry_preferred_projec_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FOUNDRY_PREF_PROJS_ID BEFORE
+ INSERT
+ ON foundry_preferred_projects REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select foundry_preferred_proj_pk_seq.nextval into :new.foundry_project_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 46 (OID 18139570)
+--
+-- Name: foundry_projects_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE foundry_projects_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 206 (OID 18139588)
+--
+-- Name: foundry_projects Type: TABLE
+--
+
+CREATE TABLE foundry_projects (
+ id integer DEFAULT '0' NOT NULL,
+ foundry_id integer DEFAULT '0' NOT NULL,
+ project_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--nextval('foundry_projects_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FOUNDRY_PROJS_ID BEFORE
+ INSERT
+ ON foundry_projects REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select foundry_projects_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 207 (OID 18139606)
+--
+-- Name: frs_dlstats_agg Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_agg (
+ file_id integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ downloads_http integer DEFAULT '0' NOT NULL,
+ downloads_ftp integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 208 (OID 18139623)
+--
+-- Name: frs_dlstats_file_agg Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_file_agg (
+ file_id integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 209 (OID 18139638)
+--
+-- Name: frs_dlstats_filetotal_agg Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_filetotal_agg (
+ file_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (file_id)
+);
+
+--
+-- TOC Entry ID 210 (OID 18139654)
+--
+-- Name: frs_dlstats_filetotal_agg_old Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_filetotal_agg_old (
+ file_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 211 (OID 18139667)
+--
+-- Name: frs_dlstats_group_agg Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_group_agg (
+ group_id integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 212 (OID 18139682)
+--
+-- Name: frs_dlstats_grouptotal_agg Type: TABLE
+--
+
+CREATE TABLE frs_dlstats_grouptotal_agg (
+ group_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 48 (OID 18139695)
+--
+-- Name: frs_file_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_file_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 213 (OID 18139714)
+--
+-- Name: frs_file Type: TABLE
+--
+
+CREATE TABLE frs_file (
+ file_id integer DEFAULT '0' NOT NULL,
+ filename varchar2(255),
+ release_id integer DEFAULT '0' NOT NULL,
+ type_id integer DEFAULT '0' NOT NULL,
+ processor_id integer DEFAULT '0' NOT NULL,
+ release_time integer DEFAULT '0' NOT NULL,
+ file_size integer DEFAULT '0' NOT NULL,
+ post_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (file_id)
+);
+
+--nextval('frs_file_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_FILE_ID BEFORE
+ INSERT
+ ON frs_file REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_file_pk_seq.nextval into :new.file_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 50 (OID 18139756)
+--
+-- Name: frs_filetype_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_filetype_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 214 (OID 18139774)
+--
+-- Name: frs_filetype Type: TABLE
+--
+
+CREATE TABLE frs_filetype (
+ type_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (type_id)
+);
+
+--nextval('frs_filetype_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_FILETYPE_ID BEFORE
+ INSERT
+ ON frs_filetype REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_filetype_pk_seq.nextval into :new.type_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 52 (OID 18139804)
+--
+-- Name: frs_package_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_package_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 215 (OID 18139822)
+--
+-- Name: frs_package Type: TABLE
+--
+
+CREATE TABLE frs_package (
+ package_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ status_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (package_id)
+);
+
+--nextval('frs_package_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_PACKAGE_ID BEFORE
+ INSERT
+ ON frs_package REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_package_pk_seq.nextval into :new.package_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 54 (OID 18139856)
+--
+-- Name: frs_processor_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_processor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 216 (OID 18139874)
+--
+-- Name: frs_processor Type: TABLE
+--
+
+CREATE TABLE frs_processor (
+ processor_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (processor_id)
+);
+
+--nextval('frs_processor_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_PROCESSOR_ID BEFORE
+ INSERT
+ ON frs_processor REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_processor_pk_seq.nextval into :new.processor_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 56 (OID 18139904)
+--
+-- Name: frs_release_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_release_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 217 (OID 18139922)
+--
+-- Name: frs_release Type: TABLE
+--
+
+CREATE TABLE frs_release (
+ release_id integer DEFAULT '0' NOT NULL,
+ package_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ notes varchar2(255),
+ changes varchar2(255),
+ status_id integer DEFAULT '0' NOT NULL,
+ preformatted integer DEFAULT '0' NOT NULL,
+ release_date integer DEFAULT '0' NOT NULL,
+ released_by integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (release_id)
+);
+
+--nextval('frs_release_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_RELEASE_ID BEFORE
+ INSERT
+ ON frs_release REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_release_pk_seq.nextval into :new.release_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 58 (OID 18139964)
+--
+-- Name: frs_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE frs_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 218 (OID 18139982)
+--
+-- Name: frs_status Type: TABLE
+--
+
+CREATE TABLE frs_status (
+ status_id integer DEFAULT '0' NULL,
+ name varchar2(255),
+ PRIMARY KEY (status_id)
+);
+
+--nextval('frs_status_pk_seq'::text)
+CREATE TRIGGER DEFAULT_FRS_STATUS_ID BEFORE
+ INSERT
+ ON frs_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select frs_status_pk_seq.nextval into :new.status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 60 (OID 18140012)
+--
+-- Name: group_cvs_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE group_cvs_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 219 (OID 18140030)
+--
+-- Name: group_cvs_history Type: TABLE
+--
+
+CREATE TABLE group_cvs_history (
+ id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ user_name character varying(80) DEFAULT '',
+ cvs_commits integer DEFAULT '0' NOT NULL,
+ cvs_commits_wk integer DEFAULT '0' NOT NULL,
+ cvs_adds integer DEFAULT '0' NOT NULL,
+ cvs_adds_wk integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--nextval('group_cvs_history_pk_seq'::text)
+CREATE TRIGGER DEFAULT_GROUP_CVS_HISTORY_ID BEFORE
+ INSERT
+ ON group_cvs_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select group_cvs_history_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 62 (OID 18140056)
+--
+-- Name: group_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE group_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 220 (OID 18140074)
+--
+-- Name: group_history Type: TABLE
+--
+
+CREATE TABLE group_history (
+ group_history_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ field_name varchar2(255) DEFAULT '',
+ old_value varchar2(255) DEFAULT '',
+ mod_by integer DEFAULT '0' NOT NULL,
+ sf_date integer,
+ PRIMARY KEY (group_history_id)
+);
+
+--nextval('group_history_pk_seq'::text)
+CREATE TRIGGER DEFAULT_GROUP_HISTORY_ID BEFORE
+ INSERT
+ ON group_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select group_history_pk_seq.nextval into :new.group_history_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 64 (OID 18140112)
+--
+-- Name: group_type_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE group_type_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 221 (OID 18140130)
+--
+-- Name: group_type Type: TABLE
+--
+
+CREATE TABLE group_type (
+ type_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (type_id)
+);
+
+--nextval('group_type_pk_seq'::text)
+CREATE TRIGGER DEFAULT_GROUP_TYPE_ID BEFORE
+ INSERT
+ ON group_type REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select group_type_pk_seq.nextval into :new.type_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 66 (OID 18140160)
+--
+-- Name: groups_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE groups_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 222 (OID 18140178)
+--
+-- Name: groups Type: TABLE
+--
+
+CREATE TABLE groups (
+ group_id integer DEFAULT '0' NOT NULL,
+ group_name character varying(40),
+ homepage character varying(128),
+ is_public integer DEFAULT '0' NOT NULL,
+ status character(1) DEFAULT 'A' NOT NULL,
+ unix_group_name character varying(30) DEFAULT '',
+ unix_box character varying(20) DEFAULT 'shell1' NOT NULL,
+ http_domain character varying(80),
+ short_description character varying(255),
+ cvs_box character varying(20) DEFAULT 'cvs1' NOT NULL,
+ license character varying(16),
+ register_purpose varchar2(2000),
+ license_other varchar2(255),
+ register_time integer DEFAULT '0' NOT NULL,
+ use_bugs integer DEFAULT '1' NOT NULL,
+ rand_hash varchar2(255),
+ use_mail integer DEFAULT '1' NOT NULL,
+ use_survey integer DEFAULT '1' NOT NULL,
+ use_patch integer DEFAULT '1' NOT NULL,
+ use_forum integer DEFAULT '1' NOT NULL,
+ use_pm integer DEFAULT '1' NOT NULL,
+ use_cvs integer DEFAULT '1' NOT NULL,
+ use_news integer DEFAULT '1' NOT NULL,
+ use_support integer DEFAULT '1' NOT NULL,
+ new_bug_address varchar2(255) DEFAULT '',
+ new_patch_address varchar2(255) DEFAULT '',
+ new_support_address varchar2(255) DEFAULT '',
+ type integer DEFAULT '1' NOT NULL,
+ use_docman integer DEFAULT '1' NOT NULL,
+ send_all_bugs integer DEFAULT '0' NOT NULL,
+ send_all_patches integer DEFAULT '0' NOT NULL,
+ send_all_support integer DEFAULT '0' NOT NULL,
+ new_task_address varchar2(255) DEFAULT '',
+ send_all_tasks integer DEFAULT '0' NOT NULL,
+ use_bug_depend_box integer DEFAULT '1' NOT NULL,
+ use_pm_depend_box integer DEFAULT '1' NOT NULL,
+ PRIMARY KEY (group_id)
+);
+
+--nextval('groups_pk_seq'::text)
+CREATE TRIGGER DEFAULT_GROUP_ID BEFORE
+ INSERT
+ ON groups REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select groups_pk_seq.nextval into :new.group_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 223 (OID 18140269)
+--
+-- Name: intel_agreement Type: TABLE
+--
+
+CREATE TABLE intel_agreement (
+ user_id integer DEFAULT '0' NOT NULL,
+ message varchar2(255),
+ is_approved integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (user_id)
+);
+
+--
+-- TOC Entry ID 68 (OID 18140301)
+--
+-- Name: mail_group_list_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE mail_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 224 (OID 18140319)
+--
+-- Name: mail_group_list Type: TABLE
+--
+
+CREATE TABLE mail_group_list (
+ group_list_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ list_name varchar2(255),
+ is_public integer DEFAULT '0' NOT NULL,
+ password character varying(16),
+ list_admin integer DEFAULT '0' NOT NULL,
+ status integer DEFAULT '0' NOT NULL,
+ description varchar2(255),
+ PRIMARY KEY (group_list_id)
+);
+
+--nextval('mail_group_list_pk_seq'::text)
+CREATE TRIGGER DEFAULT_MAIL_GROUP_LIST_ID BEFORE
+ INSERT
+ ON mail_group_list REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select mail_group_list_pk_seq.nextval into :new.group_list_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 70 (OID 18140359)
+--
+-- Name: news_bytes_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE news_bytes_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 225 (OID 18140377)
+--
+-- Name: news_bytes Type: TABLE
+--
+
+CREATE TABLE news_bytes (
+ id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ submitted_by integer DEFAULT '0' NOT NULL,
+ is_approved integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL,
+ forum_id integer DEFAULT '0' NOT NULL,
+ summary varchar2(255),
+ details varchar2(255),
+ PRIMARY KEY (id)
+);
+
+--nextval('news_bytes_pk_seq'::text)
+CREATE TRIGGER DEFAULT_NEWS_BYTES_ID BEFORE
+ INSERT
+ ON news_bytes REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select news_bytes_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 72 (OID 18140419)
+--
+-- Name: patch_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE patch_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 226 (OID 18140437)
+--
+-- Name: patch Type: TABLE
+--
+
+CREATE TABLE patch (
+ patch_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ patch_status_id integer DEFAULT '0' NOT NULL,
+ patch_category_id integer DEFAULT '0' NOT NULL,
+ submitted_by integer DEFAULT '0' NOT NULL,
+ assigned_to integer DEFAULT '0' NOT NULL,
+ open_date integer DEFAULT '0' NOT NULL,
+ summary varchar2(255),
+ code varchar2(255),
+ close_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (patch_id)
+);
+
+--nextval('patch_pk_seq'::text)
+CREATE TRIGGER DEFAULT_PATCH_ID BEFORE
+ INSERT
+ ON patch REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select patch_pk_seq.nextval into :new.patch_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 74 (OID 18140483)
+--
+-- Name: patch_category_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE patch_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 227 (OID 18140501)
+--
+-- Name: patch_category Type: TABLE
+--
+
+CREATE TABLE patch_category (
+ patch_category_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ category_name varchar2(255) DEFAULT '',
+ PRIMARY KEY (patch_category_id)
+);
+
+--nextval('patch_category_pk_seq'::text)
+CREATE TRIGGER DEFAULT_PATCH_CATEGORY_ID BEFORE
+ INSERT
+ ON patch_category REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select patch_category_pk_seq.nextval into :new.patch_category_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 76 (OID 18140534)
+--
+-- Name: patch_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE patch_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 228 (OID 18140552)
+--
+-- Name: patch_history Type: TABLE
+--
+
+CREATE TABLE patch_history (
+ patch_history_id integer DEFAULT '0' NOT NULL,
+ patch_id integer DEFAULT '0' NOT NULL,
+ field_name varchar2(255) DEFAULT '',
+ old_value varchar2(255) DEFAULT '',
+ mod_by integer DEFAULT '0' NOT NULL,
+ sf_date integer,
+ PRIMARY KEY (patch_history_id)
+);
+
+--nextval('patch_history_pk_seq'::text)
+CREATE TRIGGER DEFAULT_PATCH_HISTORY BEFORE
+ INSERT
+ ON patch_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select patch_history_pk_seq.nextval into :new.patch_history_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 78 (OID 18140590)
+--
+-- Name: patch_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE patch_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 229 (OID 18140608)
+--
+-- Name: patch_status Type: TABLE
+--
+
+CREATE TABLE patch_status (
+ patch_status_id integer DEFAULT '0' NOT NULL,
+ status_name varchar2(255),
+ PRIMARY KEY (patch_status_id)
+);
+
+--nextval('patch_status_pk_seq'::text)
+CREATE TRIGGER DEFAULT_PATCH_STATUS BEFORE
+ INSERT
+ ON patch_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select patch_status_pk_seq.nextval into :new.patch_status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 80 (OID 18140638)
+--
+-- Name: people_job_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_job_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 230 (OID 18140656)
+--
+-- Name: people_job Type: TABLE
+--
+
+CREATE TABLE people_job (
+ job_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ created_by integer DEFAULT '0' NOT NULL,
+ title varchar2(255),
+ description varchar2(255),
+ sf_date integer DEFAULT '0' NOT NULL,
+ status_id integer DEFAULT '0' NOT NULL,
+ category_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (job_id)
+);
+
+--nextval('people_job_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_job BEFORE
+ INSERT
+ ON people_job REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_job_pk_seq.nextval into :new.job_id from dual;
+END;
+/
+
+
+--
+-- TOC Entry ID 82 (OID 18140697)
+--
+-- Name: people_job_category_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_job_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 231 (OID 18140715)
+--
+-- Name: people_job_category Type: TABLE
+--
+
+CREATE TABLE people_job_category (
+ category_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ private_flag integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (category_id)
+);
+
+--nextval('people_job_category_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_job_category BEFORE
+ INSERT
+ ON people_job_category REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_job_category_pk_seq.nextval into :new.category_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 84 (OID 18140747)
+--
+-- Name: people_job_inventory_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_job_inventory_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 232 (OID 18140765)
+--
+-- Name: people_job_inventory Type: TABLE
+--
+
+CREATE TABLE people_job_inventory (
+ job_inventory_id integer DEFAULT '0' NOT NULL,
+ job_id integer DEFAULT '0' NOT NULL,
+ skill_id integer DEFAULT '0' NOT NULL,
+ skill_level_id integer DEFAULT '0' NOT NULL,
+ skill_year_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (job_inventory_id)
+);
+
+--nextval('people_job_inventory_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_job_inventory BEFORE
+ INSERT
+ ON people_job_inventory REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_job_inventory_pk_seq.nextval into :new.job_inventory_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 86 (OID 18140787)
+--
+-- Name: people_job_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_job_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 233 (OID 18140805)
+--
+-- Name: people_job_status Type: TABLE
+--
+
+CREATE TABLE people_job_status (
+ status_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (status_id)
+);
+
+--nextval('people_job_status_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_job_status BEFORE
+ INSERT
+ ON people_job_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_job_status_pk_seq.nextval into :new.status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 88 (OID 18140835)
+--
+-- Name: people_skill_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_skill_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 234 (OID 18140853)
+--
+-- Name: people_skill Type: TABLE
+--
+
+CREATE TABLE people_skill (
+ skill_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (skill_id)
+);
+
+--nextval('people_skill_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_skill BEFORE
+ INSERT
+ ON people_skill REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_skill_pk_seq.nextval into :new.skill_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 90 (OID 18140884)
+--
+-- Name: people_skill_inventory_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_skill_inventory_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 235 (OID 18140902)
+--
+-- Name: people_skill_inventory Type: TABLE
+--
+
+CREATE TABLE people_skill_inventory (
+ skill_inventory_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ skill_id integer DEFAULT '0' NOT NULL,
+ skill_level_id integer DEFAULT '0' NOT NULL,
+ skill_year_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (skill_inventory_id)
+);
+
+--nextval('people_skill_inventory_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_inventory BEFORE
+ INSERT
+ ON people_skill_inventory REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_skill_inventory_pk_seq.nextval into :new.skill_inventory_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 92 (OID 18140924)
+--
+-- Name: people_skill_level_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_skill_level_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 236 (OID 18140942)
+--
+-- Name: people_skill_level Type: TABLE
+--
+
+CREATE TABLE people_skill_level (
+ skill_level_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (skill_level_id)
+);
+
+--nextval('people_skill_level_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_skill_level BEFORE
+ INSERT
+ ON people_skill_level REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_skill_level_pk_seq.nextval into :new.skill_level_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 94 (OID 18140972)
+--
+-- Name: people_skill_year_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE people_skill_year_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 237 (OID 18140990)
+--
+-- Name: people_skill_year Type: TABLE
+--
+
+CREATE TABLE people_skill_year (
+ skill_year_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ PRIMARY KEY (skill_year_id)
+);
+
+--nextval('people_skill_year_pk_seq'::text)
+CREATE TRIGGER DEFAULT_people_skill_year BEFORE
+ INSERT
+ ON people_skill_year REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select people_skill_year_pk_seq.nextval into :new.skill_year_id from dual;
+END;
+/
+
+
+--
+-- TOC Entry ID 96 (OID 18141020)
+--
+-- Name: project_assigned_to_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_assigned_to_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 238 (OID 18141038)
+--
+-- Name: project_assigned_to Type: TABLE
+--
+
+CREATE TABLE project_assigned_to (
+ project_assigned_id integer DEFAULT '0' NOT NULL,
+ project_task_id integer DEFAULT '0' NOT NULL,
+ assigned_to_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_assigned_id)
+);
+
+--nextval('project_assigned_to_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_assigned_to BEFORE
+ INSERT
+ ON project_assigned_to REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_assigned_to_pk_seq.nextval into :new.project_assigned_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 239 (OID 18141056)
+--
+-- Name: project_counts_tmp Type: TABLE
+--
+
+CREATE TABLE project_counts_tmp (
+ group_id integer,
+ type varchar2(255),
+ count double precision
+);
+
+--
+-- TOC Entry ID 240 (OID 18141083)
+--
+-- Name: project_counts_weekly_tmp Type: TABLE
+--
+
+CREATE TABLE project_counts_weekly_tmp (
+ group_id integer,
+ type varchar2(255),
+ count double precision
+);
+
+--
+-- TOC Entry ID 98 (OID 18141110)
+--
+-- Name: project_dependencies_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_dependencies_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 241 (OID 18141128)
+--
+-- Name: project_dependencies Type: TABLE
+--
+
+CREATE TABLE project_dependencies (
+ project_depend_id integer DEFAULT '0' NOT NULL,
+ project_task_id integer DEFAULT '0' NOT NULL,
+ is_dependent_on_task_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_depend_id)
+);
+
+--nextval('project_dependencies_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_dependencies BEFORE
+ INSERT
+ ON project_dependencies REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_dependencies_pk_seq.nextval into :new.project_depend_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 100 (OID 18141146)
+--
+-- Name: project_group_list_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_group_list_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 242 (OID 18141164)
+--
+-- Name: project_group_list Type: TABLE
+--
+
+CREATE TABLE project_group_list (
+ group_project_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ project_name varchar2(255) DEFAULT '',
+ is_public integer DEFAULT '0' NOT NULL,
+ description varchar2(255),
+ PRIMARY KEY (group_project_id)
+);
+
+--nextval('project_group_list_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_group_list BEFORE
+ INSERT
+ ON project_group_list REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_group_list_pk_seq.nextval into :new.group_project_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 102 (OID 18141200)
+--
+-- Name: project_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 243 (OID 18141218)
+--
+-- Name: project_history Type: TABLE
+--
+
+CREATE TABLE project_history (
+ project_history_id integer DEFAULT '0' NOT NULL,
+ project_task_id integer DEFAULT '0' NOT NULL,
+ field_name varchar2(255) DEFAULT '',
+ old_value varchar2(255) DEFAULT '',
+ mod_by integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_history_id)
+);
+
+--nextval('project_history_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_history BEFORE
+ INSERT
+ ON project_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_history_pk_seq.nextval into :new.project_history_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 104 (OID 18141257)
+--
+-- Name: project_metric_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 244 (OID 18141275)
+--
+-- Name: project_metric Type: TABLE
+--
+
+CREATE TABLE project_metric (
+ ranking integer DEFAULT '0' NOT NULL,
+ percentile double precision,
+ group_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--nextval('project_metric_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_metric BEFORE
+ INSERT
+ ON project_metric REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_metric_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 106 (OID 18141292)
+--
+-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_metric_tmp1_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 245 (OID 18141310)
+--
+-- Name: project_metric_tmp1 Type: TABLE
+--
+
+CREATE TABLE project_metric_tmp1 (
+ ranking integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ value double precision,
+ PRIMARY KEY (ranking)
+);
+
+--nextval('project_metric_tmp1_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_metric_tmp1 BEFORE
+ INSERT
+ ON project_metric_tmp1 REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_metric_tmp1_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 108 (OID 18141327)
+--
+-- Name: project_metric_weekly_tm_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_metric_week_tm_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 246 (OID 18141346)
+--
+-- Name: project_metric_weekly_tmp1 Type: TABLE
+--
+
+CREATE TABLE project_metric_weekly_tmp1 (
+ ranking integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ value double precision,
+ PRIMARY KEY (ranking)
+);
+
+--nextval('project_metric_week_tm_pk_seq'::text)
+CREATE TRIGGER DEFAULT_proj_metric_week_tmp1 BEFORE
+ INSERT
+ ON project_metric_weekly_tmp1 REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_metric_week_tm_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 110 (OID 18141363)
+--
+-- Name: project_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 247 (OID 18141381)
+--
+-- Name: project_status Type: TABLE
+--
+
+CREATE TABLE project_status (
+ status_id integer DEFAULT '0' NOT NULL,
+ status_name varchar2(255) DEFAULT '',
+ PRIMARY KEY (status_id)
+);
+
+--nextval('project_status_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_status BEFORE
+ INSERT
+ ON project_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_status_pk_seq.nextval into :new.status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 112 (OID 18141412)
+--
+-- Name: project_task_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_task_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 248 (OID 18141430)
+--
+-- Name: project_task Type: TABLE
+--
+
+CREATE TABLE project_task (
+ project_task_id integer DEFAULT '0' NOT NULL,
+ group_project_id integer DEFAULT '0' NOT NULL,
+ summary varchar2(255) DEFAULT '',
+ details varchar2(255) DEFAULT '',
+ percent_complete integer DEFAULT '0' NOT NULL,
+ priority integer DEFAULT '0' NOT NULL,
+ hours double precision DEFAULT '0.00' NOT NULL,
+ start_date integer DEFAULT '0' NOT NULL,
+ end_date integer DEFAULT '0' NOT NULL,
+ created_by integer DEFAULT '0' NOT NULL,
+ status_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_task_id)
+);
+
+--nextval('project_task_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_task BEFORE
+ INSERT
+ ON project_task REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_task_pk_seq.nextval into :new.project_task_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 114 (OID 18141479)
+--
+-- Name: project_weekly_metric_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE project_weekly_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 249 (OID 18141497)
+--
+-- Name: project_weekly_metric Type: TABLE
+--
+
+CREATE TABLE project_weekly_metric (
+ ranking integer DEFAULT '0' NOT NULL,
+ percentile double precision,
+ group_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--nextval('project_weekly_metric_pk_seq'::text)
+CREATE TRIGGER DEFAULT_project_weekly_metric BEFORE
+ INSERT
+ ON project_weekly_metric REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select project_weekly_metric_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 250 (OID 18141514)
+--
+-- Name: sf_session Type: TABLE
+--
+
+CREATE TABLE sf_session (
+ user_id integer DEFAULT '0' NOT NULL,
+ session_hash character(32) DEFAULT '',
+ ip_addr character(15) DEFAULT '',
+ time integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (session_hash)
+);
+
+--
+-- TOC Entry ID 116 (OID 18141534)
+--
+-- Name: snippet_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE snippet_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 251 (OID 18141552)
+--
+-- Name: snippet Type: TABLE
+--
+
+CREATE TABLE snippet (
+ snippet_id integer DEFAULT '0' NOT NULL,
+ created_by integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ description varchar2(255),
+ type integer DEFAULT '0' NOT NULL,
+ language integer DEFAULT '0' NOT NULL,
+ license varchar2(255) DEFAULT '',
+ category integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_id)
+);
+
+--nextval('snippet_pk_seq'::text)
+CREATE TRIGGER DEFAULT_snippet BEFORE
+ INSERT
+ ON snippet REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select snippet_pk_seq.nextval into :new.snippet_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 118 (OID 18141593)
+--
+-- Name: snippet_package_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE snippet_package_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 252 (OID 18141611)
+--
+-- Name: snippet_package Type: TABLE
+--
+
+CREATE TABLE snippet_package (
+ snippet_package_id integer DEFAULT '0' NOT NULL,
+ created_by integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ description varchar2(255),
+ category integer DEFAULT '0' NOT NULL,
+ language integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_id)
+);
+
+--nextval('snippet_package_pk_seq'::text)
+CREATE TRIGGER DEFAULT_snippet_package BEFORE
+ INSERT
+ ON snippet_package REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select snippet_package_pk_seq.nextval into :new.snippet_package_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 120 (OID 18141648)
+--
+-- Name: snippet_package_item_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE snippet_package_item_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 253 (OID 18141666)
+--
+-- Name: snippet_package_item Type: TABLE
+--
+
+CREATE TABLE snippet_package_item (
+ snippet_package_item_id integer DEFAULT '0' NOT NULL,
+ snippet_package_version_id integer DEFAULT '0' NOT NULL,
+ snippet_version_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_item_id)
+);
+
+--nextval('snippet_package_item_pk_seq'::text)
+CREATE TRIGGER DEFAULT_snippet_package_item BEFORE
+ INSERT
+ ON snippet_package_item REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select snippet_package_item_pk_seq.nextval into :new.snippet_package_item_id from dual;
+END;
+/
+
+
+--
+-- TOC Entry ID 122 (OID 18141684)
+--
+-- Name: snippet_package_version_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE snippet_package_version_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 254 (OID 18141702)
+--
+-- Name: snippet_package_version Type: TABLE
+--
+
+CREATE TABLE snippet_package_version (
+ snippet_package_version_id integer DEFAULT '0' NOT NULL,
+ snippet_package_id integer DEFAULT '0' NOT NULL,
+ changes varchar2(255),
+ version varchar2(255),
+ submitted_by integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_version_id)
+);
+
+--nextval('snippet_package_version_pk_seq'::text)
+CREATE TRIGGER DEFAULT_snippet_package_ver BEFORE
+ INSERT
+ ON snippet_package_version REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select snippet_package_version_pk_seq.nextval into :new.snippet_package_version_id from dual;
+END;
+/
+
+
+--
+-- TOC Entry ID 124 (OID 18141739)
+--
+-- Name: snippet_version_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE snippet_version_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 255 (OID 18141757)
+--
+-- Name: snippet_version Type: TABLE
+--
+
+CREATE TABLE snippet_version (
+ snippet_version_id integer DEFAULT '0' NOT NULL,
+ snippet_id integer DEFAULT '0' NOT NULL,
+ changes varchar2(255),
+ version varchar2(255),
+ submitted_by integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL,
+ code varchar2(255),
+ PRIMARY KEY (snippet_version_id)
+);
+
+--nextval('snippet_version_pk_seq'::text)
+CREATE TRIGGER DEFAULT_snippet_version BEFORE
+ INSERT
+ ON snippet_version REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select snippet_version_pk_seq.nextval into :new.snippet_version_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 256 (OID 18141795)
+--
+-- Name: stats_agg_logo_by_day Type: TABLE
+--
+
+CREATE TABLE stats_agg_logo_by_day (
+ day integer,
+ count integer
+);
+
+--
+-- TOC Entry ID 257 (OID 18141806)
+--
+-- Name: stats_agg_logo_by_group Type: TABLE
+--
+
+CREATE TABLE stats_agg_logo_by_group (
+ day integer,
+ group_id integer,
+ count integer
+);
+
+--
+-- TOC Entry ID 258 (OID 18141818)
+--
+-- Name: stats_agg_pages_by_browser Type: TABLE
+--
+
+CREATE TABLE stats_agg_pages_by_browser (
+ browser character varying(8),
+ count integer
+);
+
+--
+-- TOC Entry ID 259 (OID 18141829)
+--
+-- Name: stats_agg_pages_by_day Type: TABLE
+--
+
+CREATE TABLE stats_agg_pages_by_day (
+ day integer DEFAULT '0' NOT NULL,
+ count integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 260 (OID 18141842)
+--
+-- Name: stats_agg_pages_by_day_old Type: TABLE
+--
+
+CREATE TABLE stats_agg_pages_by_day_old (
+ day integer,
+ count integer
+);
+
+--
+-- TOC Entry ID 261 (OID 18141853)
+--
+-- Name: stats_agg_site_by_day Type: TABLE
+--
+
+CREATE TABLE stats_agg_site_by_day (
+ day integer DEFAULT '0' NOT NULL,
+ count integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 262 (OID 18141866)
+--
+-- Name: stats_agg_site_by_group Type: TABLE
+--
+
+CREATE TABLE stats_agg_site_by_group (
+ day integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ count integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 263 (OID 18141881)
+--
+-- Name: stats_agr_filerelease Type: TABLE
+--
+
+CREATE TABLE stats_agr_filerelease (
+ filerelease_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 264 (OID 18141896)
+--
+-- Name: stats_agr_project Type: TABLE
+--
+
+CREATE TABLE stats_agr_project (
+ group_id integer DEFAULT '0' NOT NULL,
+ group_ranking integer DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers integer DEFAULT '0' NOT NULL,
+ file_releases integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL,
+ site_views integer DEFAULT '0' NOT NULL,
+ logo_views integer DEFAULT '0' NOT NULL,
+ msg_posted integer DEFAULT '0' NOT NULL,
+ msg_uniq_auth integer DEFAULT '0' NOT NULL,
+ bugs_opened integer DEFAULT '0' NOT NULL,
+ bugs_closed integer DEFAULT '0' NOT NULL,
+ support_opened integer DEFAULT '0' NOT NULL,
+ support_closed integer DEFAULT '0' NOT NULL,
+ patches_opened integer DEFAULT '0' NOT NULL,
+ patches_closed integer DEFAULT '0' NOT NULL,
+ tasks_opened integer DEFAULT '0' NOT NULL,
+ tasks_closed integer DEFAULT '0' NOT NULL,
+ help_requests integer DEFAULT '0' NOT NULL,
+ cvs_checkouts integer DEFAULT '0' NOT NULL,
+ cvs_commits integer DEFAULT '0' NOT NULL,
+ cvs_adds integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 265 (OID 18141949)
+--
+-- Name: stats_ftp_downloads Type: TABLE
+--
+
+CREATE TABLE stats_ftp_downloads (
+ day integer DEFAULT '0' NOT NULL,
+ filerelease_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 266 (OID 18141966)
+--
+-- Name: stats_http_downloads Type: TABLE
+--
+
+CREATE TABLE stats_http_downloads (
+ day integer DEFAULT '0' NOT NULL,
+ filerelease_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 267 (OID 18141983)
+--
+-- Name: stats_project Type: TABLE
+--
+
+CREATE TABLE stats_project (
+ month integer DEFAULT '0' NOT NULL,
+ week integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ group_ranking integer DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers integer DEFAULT '0' NOT NULL,
+ file_releases integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL,
+ site_views integer DEFAULT '0' NOT NULL,
+ subdomain_views integer DEFAULT '0' NOT NULL,
+ msg_posted integer DEFAULT '0' NOT NULL,
+ msg_uniq_auth integer DEFAULT '0' NOT NULL,
+ bugs_opened integer DEFAULT '0' NOT NULL,
+ bugs_closed integer DEFAULT '0' NOT NULL,
+ support_opened integer DEFAULT '0' NOT NULL,
+ support_closed integer DEFAULT '0' NOT NULL,
+ patches_opened integer DEFAULT '0' NOT NULL,
+ patches_closed integer DEFAULT '0' NOT NULL,
+ tasks_opened integer DEFAULT '0' NOT NULL,
+ tasks_closed integer DEFAULT '0' NOT NULL,
+ help_requests integer DEFAULT '0' NOT NULL,
+ cvs_checkouts integer DEFAULT '0' NOT NULL,
+ cvs_commits integer DEFAULT '0' NOT NULL,
+ cvs_adds integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 268 (OID 18142042)
+--
+-- Name: stats_project_tmp Type: TABLE
+--
+
+CREATE TABLE stats_project_tmp (
+ month integer DEFAULT '0' NOT NULL,
+ week integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ group_ranking integer DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers integer DEFAULT '0' NOT NULL,
+ file_releases integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL,
+ site_views integer DEFAULT '0' NOT NULL,
+ subdomain_views integer DEFAULT '0' NOT NULL,
+ msg_posted integer DEFAULT '0' NOT NULL,
+ msg_uniq_auth integer DEFAULT '0' NOT NULL,
+ bugs_opened integer DEFAULT '0' NOT NULL,
+ bugs_closed integer DEFAULT '0' NOT NULL,
+ support_opened integer DEFAULT '0' NOT NULL,
+ support_closed integer DEFAULT '0' NOT NULL,
+ patches_opened integer DEFAULT '0' NOT NULL,
+ patches_closed integer DEFAULT '0' NOT NULL,
+ tasks_opened integer DEFAULT '0' NOT NULL,
+ tasks_closed integer DEFAULT '0' NOT NULL,
+ help_requests integer DEFAULT '0' NOT NULL,
+ cvs_checkouts integer DEFAULT '0' NOT NULL,
+ cvs_commits integer DEFAULT '0' NOT NULL,
+ cvs_adds integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 269 (OID 18142101)
+--
+-- Name: stats_site Type: TABLE
+--
+
+CREATE TABLE stats_site (
+ month integer DEFAULT '0' NOT NULL,
+ week integer DEFAULT '0' NOT NULL,
+ day integer DEFAULT '0' NOT NULL,
+ site_views integer DEFAULT '0' NOT NULL,
+ subdomain_views integer DEFAULT '0' NOT NULL,
+ downloads integer DEFAULT '0' NOT NULL,
+ uniq_users integer DEFAULT '0' NOT NULL,
+ sessions integer DEFAULT '0' NOT NULL,
+ total_users integer DEFAULT '0' NOT NULL,
+ new_users integer DEFAULT '0' NOT NULL,
+ new_projects integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 126 (OID 18142132)
+--
+-- Name: support_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 270 (OID 18142150)
+--
+-- Name: support Type: TABLE
+--
+
+CREATE TABLE support (
+ support_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ support_status_id integer DEFAULT '0' NOT NULL,
+ support_category_id integer DEFAULT '0' NOT NULL,
+ priority integer DEFAULT '0' NOT NULL,
+ submitted_by integer DEFAULT '0' NOT NULL,
+ assigned_to integer DEFAULT '0' NOT NULL,
+ open_date integer DEFAULT '0' NOT NULL,
+ summary varchar2(255),
+ close_date integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (support_id)
+);
+
+--nextval('support_pk_seq'::text)
+CREATE TRIGGER DEFAULT_support BEFORE
+ INSERT
+ ON support REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_pk_seq.nextval into :new.support_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 128 (OID 18142196)
+--
+-- Name: support_canned_responses_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_canned_resp_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 271 (OID 18142214)
+--
+-- Name: support_canned_responses Type: TABLE
+--
+
+CREATE TABLE support_canned_responses (
+ support_canned_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ title varchar2(255),
+ body varchar2(255),
+ PRIMARY KEY (support_canned_id)
+);
+
+CREATE TRIGGER DEFAULT_support_canned_resp BEFORE
+ INSERT
+ ON support_canned_responses REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_canned_resp_pk_seq.nextval into :new.support_canned_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 130 (OID 18142247)
+--
+-- Name: support_category_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_category_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 272 (OID 18142265)
+--
+-- Name: support_category Type: TABLE
+--
+
+CREATE TABLE support_category (
+ support_category_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ category_name varchar2(255) DEFAULT '',
+ PRIMARY KEY (support_category_id)
+);
+
+CREATE TRIGGER DEFAULT_support_category BEFORE
+ INSERT
+ ON support_category REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_category_pk_seq.nextval into :new.support_category_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 132 (OID 18142298)
+--
+-- Name: support_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 273 (OID 18142316)
+--
+-- Name: support_history Type: TABLE
+--
+
+CREATE TABLE support_history (
+ support_history_id integer DEFAULT '0' NOT NULL,
+ support_id integer DEFAULT '0' NOT NULL,
+ field_name varchar2(255) DEFAULT '',
+ old_value varchar2(255) DEFAULT '',
+ mod_by integer DEFAULT '0' NOT NULL,
+ sf_date integer,
+ PRIMARY KEY (support_history_id)
+);
+
+CREATE TRIGGER DEFAULT_support_history BEFORE
+ INSERT
+ ON support_history REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_history_pk_seq.nextval into :new.support_history_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 134 (OID 18142354)
+--
+-- Name: support_messages_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_messages_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 274 (OID 18142372)
+--
+-- Name: support_messages Type: TABLE
+--
+
+CREATE TABLE support_messages (
+ support_message_id integer DEFAULT '0' NOT NULL,
+ support_id integer DEFAULT '0' NOT NULL,
+ from_email varchar2(255),
+ sf_date integer DEFAULT '0' NOT NULL,
+ body varchar2(255),
+ PRIMARY KEY (support_message_id)
+);
+
+CREATE TRIGGER DEFAULT_support_messages BEFORE
+ INSERT
+ ON support_messages REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_messages_pk_seq.nextval into :new.support_message_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 136 (OID 18142407)
+--
+-- Name: support_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE support_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 275 (OID 18142425)
+--
+-- Name: support_status Type: TABLE
+--
+
+CREATE TABLE support_status (
+ support_status_id integer DEFAULT '0' NOT NULL,
+ status_name varchar2(255),
+ PRIMARY KEY (support_status_id)
+);
+
+CREATE TRIGGER DEFAULT_support_status BEFORE
+ INSERT
+ ON support_status REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select support_status_pk_seq.nextval into :new.support_status_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 138 (OID 18142455)
+--
+-- Name: supported_languages_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE supported_languages_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 276 (OID 18142473)
+--
+-- Name: supported_languages Type: TABLE
+--
+
+CREATE TABLE supported_languages (
+ language_id integer DEFAULT '0' NOT NULL,
+ name varchar2(255),
+ filename varchar2(255),
+ classname varchar2(255),
+ language_code character(2),
+ PRIMARY KEY (language_id)
+);
+
+CREATE TRIGGER DEFAULT_supported_languages BEFORE
+ INSERT
+ ON supported_languages REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select supported_languages_pk_seq.nextval into :new.language_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 140 (OID 18142506)
+--
+-- Name: survey_question_types_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE survey_question_types_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 277 (OID 18142524)
+--
+-- Name: survey_question_types Type: TABLE
+--
+
+CREATE TABLE survey_question_types (
+ id integer DEFAULT '0' NOT NULL,
+ type varchar2(255) DEFAULT '',
+ PRIMARY KEY (id)
+);
+
+CREATE TRIGGER DEFAULT_survey_question_types BEFORE
+ INSERT
+ ON survey_question_types REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select survey_question_types_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 142 (OID 18142555)
+--
+-- Name: survey_questions_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE survey_questions_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 278 (OID 18142573)
+--
+-- Name: survey_questions Type: TABLE
+--
+
+CREATE TABLE survey_questions (
+ question_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ question varchar2(255) DEFAULT '',
+ question_type integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (question_id)
+);
+
+CREATE TRIGGER DEFAULT_survey_question BEFORE
+ INSERT
+ ON survey_questions REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select survey_questions_pk_seq.nextval into :new.question_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 279 (OID 18142608)
+--
+-- Name: survey_rating_aggregate Type: TABLE
+--
+
+CREATE TABLE survey_rating_aggregate (
+ type integer DEFAULT '0' NOT NULL,
+ id integer DEFAULT '0' NOT NULL,
+ response double precision DEFAULT '0' NOT NULL,
+ count integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 280 (OID 18142625)
+--
+-- Name: survey_rating_response Type: TABLE
+--
+
+CREATE TABLE survey_rating_response (
+ user_id integer DEFAULT '0' NOT NULL,
+ type integer DEFAULT '0' NOT NULL,
+ id integer DEFAULT '0' NOT NULL,
+ response integer DEFAULT '0' NOT NULL,
+ sf_date integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 281 (OID 18142644)
+--
+-- Name: survey_responses Type: TABLE
+--
+
+CREATE TABLE survey_responses (
+ user_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ survey_id integer DEFAULT '0' NOT NULL,
+ question_id integer DEFAULT '0' NOT NULL,
+ response varchar2(255) DEFAULT '',
+ sf_date integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 144 (OID 18142680)
+--
+-- Name: surveys_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE surveys_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 282 (OID 18142698)
+--
+-- Name: surveys Type: TABLE
+--
+
+CREATE TABLE surveys (
+ survey_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ survey_title varchar2(255) DEFAULT '',
+ survey_questions varchar2(255) DEFAULT '',
+ is_active integer DEFAULT '1' NOT NULL,
+ PRIMARY KEY (survey_id)
+);
+
+
+CREATE TRIGGER DEFAULT_surveys BEFORE
+ INSERT
+ ON surveys REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select surveys_pk_seq.nextval into :new.survey_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 146 (OID 18142735)
+--
+-- Name: system_history_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE system_history_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 148 (OID 18142787)
+--
+-- Name: system_machines_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE system_machines_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 150 (OID 18142836)
+--
+-- Name: system_news_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE system_news_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 152 (OID 18142895)
+--
+-- Name: system_services_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE system_services_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 154 (OID 18142944)
+--
+-- Name: system_status_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE system_status_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 283 (OID 18142992)
+--
+-- Name: theme_prefs Type: TABLE
+--
+
+CREATE TABLE theme_prefs (
+ user_id integer DEFAULT '0' NOT NULL,
+ user_theme integer DEFAULT '0' NOT NULL,
+ body_font character(80) DEFAULT '',
+ body_size character(5) DEFAULT '',
+ titlebar_font character(80) DEFAULT '',
+ titlebar_size character(5) DEFAULT '',
+ color_titlebar_back character(7) DEFAULT '',
+ color_ltback1 character(7) DEFAULT '',
+ PRIMARY KEY (user_id)
+);
+
+--
+-- TOC Entry ID 156 (OID 18143020)
+--
+-- Name: themes_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE themes_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 284 (OID 18143038)
+--
+-- Name: themes Type: TABLE
+--
+
+CREATE TABLE themes (
+ theme_id integer DEFAULT '0' NOT NULL,
+ dirname character varying(80),
+ fullname character varying(80),
+ PRIMARY KEY (theme_id)
+);
+
+CREATE TRIGGER DEFAULT_themes BEFORE
+ INSERT
+ ON themes REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select themes_pk_seq.nextval into :new.theme_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 285 (OID 18143054)
+--
+-- Name: tmp_projs_releases_tmp Type: TABLE
+--
+
+CREATE TABLE tmp_projs_releases_tmp (
+ year integer DEFAULT '0' NOT NULL,
+ month integer DEFAULT '0' NOT NULL,
+ total_proj integer DEFAULT '0' NOT NULL,
+ total_releases integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 286 (OID 18143071)
+--
+-- Name: top_group Type: TABLE
+--
+
+CREATE TABLE top_group (
+ group_id integer DEFAULT '0' NOT NULL,
+ group_name character varying(40),
+ downloads_all integer DEFAULT '0' NOT NULL,
+ rank_downloads_all integer DEFAULT '0' NOT NULL,
+ rank_downloads_all_old integer DEFAULT '0' NOT NULL,
+ downloads_week integer DEFAULT '0' NOT NULL,
+ rank_downloads_week integer DEFAULT '0' NOT NULL,
+ rank_downloads_week_old integer DEFAULT '0' NOT NULL,
+ userrank integer DEFAULT '0' NOT NULL,
+ rank_userrank integer DEFAULT '0' NOT NULL,
+ rank_userrank_old integer DEFAULT '0' NOT NULL,
+ forumposts_week integer DEFAULT '0' NOT NULL,
+ rank_forumposts_week integer DEFAULT '0' NOT NULL,
+ rank_forumposts_week_old integer DEFAULT '0' NOT NULL,
+ pageviews_proj integer DEFAULT '0' NOT NULL,
+ rank_pageviews_proj integer DEFAULT '0' NOT NULL,
+ rank_pageviews_proj_old integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 158 (OID 18143113)
+--
+-- Name: trove_cat_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE trove_cat_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 287 (OID 18143131)
+--
+-- Name: trove_cat Type: TABLE
+--
+
+CREATE TABLE trove_cat (
+ trove_cat_id integer DEFAULT '0' NOT NULL,
+ version integer DEFAULT '0' NOT NULL,
+ parent integer DEFAULT '0' NOT NULL,
+ root_parent integer DEFAULT '0' NOT NULL,
+ shortname character varying(80),
+ fullname character varying(80),
+ description character varying(255),
+ count_subcat integer DEFAULT '0' NOT NULL,
+ count_subproj integer DEFAULT '0' NOT NULL,
+ fullpath varchar2(255) DEFAULT '',
+ fullpath_ids varchar2(255),
+ PRIMARY KEY (trove_cat_id)
+);
+
+CREATE TRIGGER DEFAULT_trove_cat BEFORE
+ INSERT
+ ON trove_cat REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select trove_cat_pk_seq.nextval into :new.trove_cat_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 160 (OID 18143176)
+--
+-- Name: trove_group_link_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE trove_group_link_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 288 (OID 18143194)
+--
+-- Name: trove_group_link Type: TABLE
+--
+
+CREATE TABLE trove_group_link (
+ trove_group_id integer DEFAULT '0' NOT NULL,
+ trove_cat_id integer DEFAULT '0' NOT NULL,
+ trove_cat_version integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ trove_cat_root integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (trove_group_id)
+);
+
+CREATE TRIGGER DEFAULT_trove_group_link BEFORE
+ INSERT
+ ON trove_group_link REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select trove_group_link_pk_seq.nextval into :new.trove_group_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 162 (OID 18143216)
+--
+-- Name: trove_treesums_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE trove_treesums_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 289 (OID 18143234)
+--
+-- Name: trove_treesums Type: TABLE
+--
+
+CREATE TABLE trove_treesums (
+ trove_treesums_id integer DEFAULT '0' NOT NULL,
+ trove_cat_id integer DEFAULT '0' NOT NULL,
+ limit_1 integer DEFAULT '0' NOT NULL,
+ subprojects integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (trove_treesums_id)
+);
+
+CREATE TRIGGER DEFAULT_trove_treesums BEFORE
+ INSERT
+ ON trove_treesums REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select trove_treesums_pk_seq.nextval into :new.trove_treesums_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 164 (OID 18143286)
+--
+-- Name: user_bookmarks_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_bookmarks_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 290 (OID 18143304)
+--
+-- Name: user_bookmarks Type: TABLE
+--
+
+CREATE TABLE user_bookmarks (
+ bookmark_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ bookmark_url varchar2(255),
+ bookmark_title varchar2(255),
+ PRIMARY KEY (bookmark_id)
+);
+
+CREATE TRIGGER DEFAULT_user_bookmarks BEFORE
+ INSERT
+ ON user_bookmarks REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_bookmarks_pk_seq.nextval into :new.bookmark_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 166 (OID 18143337)
+--
+-- Name: user_diary_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_diary_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 291 (OID 18143355)
+--
+-- Name: user_diary Type: TABLE
+--
+
+CREATE TABLE user_diary (
+ id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ date_posted integer DEFAULT '0' NOT NULL,
+ summary varchar2(255),
+ details varchar2(255),
+ is_public integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+CREATE TRIGGER DEFAULT_user_diary BEFORE
+ INSERT
+ ON user_diary REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_diary_pk_seq.nextval into :new.id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 168 (OID 18143392)
+--
+-- Name: user_diary_monitor_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_diary_monitor_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 292 (OID 18143410)
+--
+-- Name: user_diary_monitor Type: TABLE
+--
+
+CREATE TABLE user_diary_monitor (
+ monitor_id integer DEFAULT '0' NOT NULL,
+ monitored_user integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (monitor_id)
+);
+
+CREATE TRIGGER DEFAULT_user_diary_monitor BEFORE
+ INSERT
+ ON user_diary_monitor REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_diary_monitor_pk_seq.nextval into :new.monitor_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 170 (OID 18143428)
+--
+-- Name: user_group_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_group_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 293 (OID 18143446)
+--
+-- Name: user_group Type: TABLE
+--
+
+CREATE TABLE user_group (
+ user_group_id integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ admin_flags character(16) DEFAULT '',
+ bug_flags integer DEFAULT '0' NOT NULL,
+ forum_flags integer DEFAULT '0' NOT NULL,
+ project_flags integer DEFAULT '2' NOT NULL,
+ patch_flags integer DEFAULT '1' NOT NULL,
+ support_flags integer DEFAULT '1' NOT NULL,
+ doc_flags integer DEFAULT '0' NOT NULL,
+ cvs_flags integer DEFAULT '1' NOT NULL,
+ member_role integer DEFAULT '100' NOT NULL,
+ release_flags integer DEFAULT '0' NOT NULL,
+ PRIMARY KEY (user_group_id)
+);
+
+CREATE TRIGGER DEFAULT_user_group BEFORE
+ INSERT
+ ON user_group REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_group_pk_seq.nextval into :new.user_group_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 172 (OID 18143484)
+--
+-- Name: user_metric_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_metric_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 294 (OID 18143502)
+--
+-- Name: user_metric Type: TABLE
+--
+
+CREATE TABLE user_metric (
+ ranking integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ times_ranked integer DEFAULT '0' NOT NULL,
+ avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL,
+ avg_rating double precision DEFAULT '0.00000000' NOT NULL,
+ metric double precision DEFAULT '0.00000000' NOT NULL,
+ percentile double precision DEFAULT '0.00000000' NOT NULL,
+ importance_factor double precision DEFAULT '0.00000000' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+CREATE TRIGGER DEFAULT_user_metric BEFORE
+ INSERT
+ ON user_metric REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_metric_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 174 (OID 18143530)
+--
+-- Name: user_metric0_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE user_metric0_pk_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 295 (OID 18143548)
+--
+-- Name: user_metric0 Type: TABLE
+--
+
+CREATE TABLE user_metric0 (
+ ranking integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ times_ranked integer DEFAULT '0' NOT NULL,
+ avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL,
+ avg_rating double precision DEFAULT '0.00000000' NOT NULL,
+ metric double precision DEFAULT '0.00000000' NOT NULL,
+ percentile double precision DEFAULT '0.00000000' NOT NULL,
+ importance_factor double precision DEFAULT '0.00000000' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+CREATE TRIGGER DEFAULT_user_metric0 BEFORE
+ INSERT
+ ON user_metric0 REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select user_metric0_pk_seq.nextval into :new.ranking from dual;
+END;
+/
+
+--
+-- TOC Entry ID 296 (OID 18143576)
+--
+-- Name: user_preferences Type: TABLE
+--
+
+CREATE TABLE user_preferences (
+ user_id integer DEFAULT '0' NOT NULL,
+ preference_name character varying(20),
+ preference_value character varying(20),
+ set_date integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 297 (OID 18143591)
+--
+-- Name: user_ratings Type: TABLE
+--
+
+CREATE TABLE user_ratings (
+ rated_by integer DEFAULT '0' NOT NULL,
+ user_id integer DEFAULT '0' NOT NULL,
+ rate_field integer DEFAULT '0' NOT NULL,
+ rating integer DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 176 (OID 18143608)
+--
+-- Name: users_pk_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE users_pk_seq start with 100 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 298 (OID 18143626)
+--
+-- Name: users Type: TABLE
+--
+
+CREATE TABLE users (
+ user_id integer DEFAULT '0' NOT NULL,
+ user_name varchar2(255) DEFAULT '',
+ email varchar2(255) DEFAULT '',
+ user_pw character varying(32) DEFAULT '',
+ realname character varying(32) DEFAULT '',
+ status character(1) DEFAULT 'A' NOT NULL,
+ shell character varying(20) DEFAULT '/bin/bash' NOT NULL,
+ unix_pw character varying(40) DEFAULT '',
+ unix_status character(1) DEFAULT 'N' NOT NULL,
+ unix_uid integer DEFAULT '0' NOT NULL,
+ unix_box character varying(10) DEFAULT 'shell1' NOT NULL,
+ add_date integer DEFAULT '0' NOT NULL,
+ confirm_hash character varying(32),
+ mail_siteupdates integer DEFAULT '0' NOT NULL,
+ mail_va integer DEFAULT '0' NOT NULL,
+ authorized_keys varchar2(255),
+ email_new varchar2(255),
+ people_view_skills integer DEFAULT '0' NOT NULL,
+ people_resume varchar2(255) DEFAULT '',
+ timezone character varying(64) DEFAULT 'GMT',
+ language integer DEFAULT '1' NOT NULL,
+ PRIMARY KEY (user_id)
+);
+
+CREATE TRIGGER DEFAULT_users BEFORE
+ INSERT
+ ON users REFERENCING OLD AS old NEW AS new
+ FOR EACH ROW
+BEGIN
+ select users_pk_seq.nextval into :new.user_id from dual;
+END;
+/
+
+--
+-- TOC Entry ID 178 (OID 27311232)
+--
+-- Name: unix_uid_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE unix_uid_seq start with 600 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 180 (OID 27311250)
+--
+-- Name: forum_thread_seq Type: SEQUENCE
+--
+
+CREATE SEQUENCE forum_thread_seq start with 1 increment by 1 maxvalue 2147483647 minvalue 1 ;
+
+--
+-- TOC Entry ID 299 (OID 27311451)
+--
+-- Name: trove_agg Type: TABLE
+--
+
+CREATE TABLE trove_agg (
+ trove_cat_id integer,
+ group_id integer,
+ group_name character varying(40),
+ unix_group_name character varying(30),
+ status character(1),
+ register_time integer,
+ short_description character varying(255),
+ percentile double precision,
+ ranking integer
+);
+
+--
+-- TOC Entry ID 302 (OID 30136736)
+--
+-- Name: activity_log Type: TABLE Owner: www
+--
+
+CREATE TABLE activity_log (
+ day integer DEFAULT '0' NOT NULL,
+ hour integer DEFAULT '0' NOT NULL,
+ group_id integer DEFAULT '0' NOT NULL,
+ browser character varying(8) DEFAULT 'OTHER' NOT NULL,
+ ver double precision DEFAULT '0.00' NOT NULL,
+ platform character varying(8) DEFAULT 'OTHER' NOT NULL,
+ time integer DEFAULT '0' NOT NULL,
+ page varchar2(255),
+ type integer DEFAULT '0' NOT NULL
+);
+
+--\connect - tperdue
+--
+-- TOC Entry ID 316 (OID 18138445)
+--
+-- Name: bug_group_id Type: INDEX
+--
+
+CREATE INDEX bug_group_id on bug ( group_id );
+
+--
+-- TOC Entry ID 466 (OID 18138445)
+--
+-- Name: bug_groupid_statusid Type: INDEX
+--
+
+CREATE INDEX bug_groupid_statusid on bug ( group_id , status_id );
+
+--
+-- TOC Entry ID 467 (OID 18138445)
+--
+-- Name: bug_groupid_assignedto_statusid Type: INDEX
+--
+
+CREATE INDEX bug_groupid_assngto_stsid on bug ( group_id , assigned_to , status_id );
+
+--
+-- TOC Entry ID 317 (OID 18138513)
+--
+-- Name: bug_bug_dependencies_bug_id Type: INDEX
+--
+
+CREATE INDEX bug_bug_dependencies_bug_id on bug_bug_dependencies ( bug_id );
+
+--
+-- TOC Entry ID 318 (OID 18138513)
+--
+-- Name: bug_bug_is_dependent_on_task_id Type: INDEX
+--
+
+CREATE INDEX bug_bug_is_dpnd_on_tsk_id on bug_bug_dependencies ( is_dependent_on_bug_id );
+
+--
+-- TOC Entry ID 319 (OID 18138549)
+--
+-- Name: bug_canned_response_group_id Type: INDEX
+--
+
+CREATE INDEX bug_canned_response_group_id on bug_canned_responses ( group_id );
+
+--
+-- TOC Entry ID 320 (OID 18138600)
+--
+-- Name: bug_category_group_id Type: INDEX
+--
+
+CREATE INDEX bug_category_group_id on bug_category ( group_id );
+
+--
+-- TOC Entry ID 321 (OID 18138705)
+--
+-- Name: bug_group_group_id Type: INDEX
+--
+
+CREATE INDEX bug_group_group_id on bug_group ( group_id );
+
+--
+-- TOC Entry ID 322 (OID 18138756)
+--
+-- Name: bug_history_bug_id Type: INDEX
+--
+
+CREATE INDEX bug_history_bug_id on bug_history ( bug_id );
+
+--
+-- TOC Entry ID 323 (OID 18138909)
+--
+-- Name: bug_task_dependencies_bug_id Type: INDEX
+--
+
+CREATE INDEX bug_task_dependencies_bug_id on bug_task_dependencies ( bug_id );
+
+--
+-- TOC Entry ID 324 (OID 18138909)
+--
+-- Name: bug_task_is_dpndnt_on_tsk_i Type: INDEX
+--
+
+CREATE INDEX bug_task_is_dpndnt_on_tsk_i on bug_task_dependencies ( is_dependent_on_task_id );
+
+--
+-- TOC Entry ID 325 (OID 18138995)
+--
+-- Name: db_images_group Type: INDEX
+--
+
+CREATE INDEX db_images_group on db_images ( group_id );
+
+--
+-- TOC Entry ID 326 (OID 18139058)
+--
+-- Name: doc_group_doc_group Type: INDEX
+--
+
+CREATE INDEX doc_group_doc_group on doc_data ( doc_group );
+
+--
+-- TOC Entry ID 327 (OID 18139122)
+--
+-- Name: doc_groups_group Type: INDEX
+--
+
+CREATE INDEX doc_groups_group on doc_groups ( group_id );
+
+--
+-- TOC Entry ID 328 (OID 18139192)
+--
+-- Name: filemodule_monitor_id Type: INDEX
+--
+
+CREATE INDEX filemodule_monitor_id on filemodule_monitor ( filemodule_id );
+
+--
+-- TOC Entry ID 329 (OID 18139228)
+--
+-- Name: forum_forumid_msgid Type: INDEX
+--
+
+CREATE INDEX forum_forumid_msgid on forum ( group_forum_id , msg_id );
+
+--
+-- TOC Entry ID 330 (OID 18139228)
+--
+-- Name: forum_group_forum_id Type: INDEX
+--
+
+CREATE INDEX forum_group_forum_id on forum ( group_forum_id );
+
+--
+-- TOC Entry ID 331 (OID 18139228)
+--
+-- Name: forum_forumid_isfollowupto Type: INDEX
+--
+
+CREATE INDEX forum_forumid_isfollowupto on forum ( group_forum_id , is_followup_to );
+
+--
+-- TOC Entry ID 332 (OID 18139228)
+--
+-- Name: forum_forumid_threadid_mostrece Type: INDEX
+--
+
+CREATE INDEX forum_formid_thrdid_mstrc on forum ( group_forum_id , thread_id , most_recent_date );
+
+--
+-- TOC Entry ID 333 (OID 18139228)
+--
+-- Name: forum_threadid_isfollowupto Type: INDEX
+--
+
+CREATE INDEX forum_threadid_isfollowupto on forum ( thread_id , is_followup_to );
+
+--
+-- TOC Entry ID 334 (OID 18139228)
+--
+-- Name: forum_forumid_isfollto_mostrece Type: INDEX
+--
+
+CREATE INDEX forum_forumid_isfollto_mstrc on forum ( group_forum_id , is_followup_to , most_recent_date );
+
+--
+-- TOC Entry ID 335 (OID 18139309)
+--
+-- Name: forum_group_list_group_id Type: INDEX
+--
+
+CREATE INDEX forum_group_list_group_id on forum_group_list ( group_id );
+
+--
+-- TOC Entry ID 336 (OID 18139366)
+--
+-- Name: forum_monitor_combo_id Type: INDEX
+--
+
+CREATE INDEX forum_monitor_combo_id on forum_monitored_forums ( forum_id , user_id );
+
+--
+-- TOC Entry ID 337 (OID 18139366)
+--
+-- Name: forum_monitor_thread_id Type: INDEX
+--
+
+CREATE INDEX forum_monitor_thread_id on forum_monitored_forums ( forum_id );
+
+--
+-- TOC Entry ID 338 (OID 18139510)
+--
+-- Name: foundry_news_foundry_approved_d Type: INDEX
+--
+
+CREATE INDEX foundry_news_fndry_apprvd_d on foundry_news ( foundry_id , is_approved , approve_date );
+
+--
+-- TOC Entry ID 339 (OID 18139510)
+--
+-- Name: foundry_news_foundry_approved Type: INDEX
+--
+
+CREATE INDEX foundry_news_foundry_approved on foundry_news ( foundry_id , is_approved );
+
+--
+-- TOC Entry ID 340 (OID 18139510)
+--
+-- Name: foundry_news_foundry Type: INDEX
+--
+
+CREATE INDEX foundry_news_foundry on foundry_news ( foundry_id );
+
+--
+-- TOC Entry ID 463 (OID 18139510)
+--
+-- Name: foundrynews_foundry_dt_apprv Type: INDEX
+--
+
+CREATE INDEX foundrynews_foundry_dt_apprv on foundry_news ( foundry_id , approve_date , is_approved );
+
+--
+-- TOC Entry ID 341 (OID 18139550)
+--
+-- Name: foundry_project_group_rank Type: INDEX
+--
+
+CREATE INDEX foundry_project_group_rank on foundry_preferred_projects ( group_id , rank );
+
+--
+-- TOC Entry ID 342 (OID 18139550)
+--
+-- Name: foundry_project_group Type: INDEX
+--
+
+CREATE INDEX foundry_project_group on foundry_preferred_projects ( group_id );
+
+--
+-- TOC Entry ID 343 (OID 18139588)
+--
+-- Name: foundry_projects_foundry Type: INDEX
+--
+
+CREATE INDEX foundry_projects_foundry on foundry_projects ( foundry_id );
+
+--
+-- TOC Entry ID 344 (OID 18139606)
+--
+-- Name: downloads_http_idx Type: INDEX
+--
+
+CREATE INDEX downloads_http_idx on frs_dlstats_agg ( downloads_http );
+
+--
+-- TOC Entry ID 345 (OID 18139606)
+--
+-- Name: downloads_ftp_idx Type: INDEX
+--
+
+CREATE INDEX downloads_ftp_idx on frs_dlstats_agg ( downloads_ftp );
+
+--
+-- TOC Entry ID 346 (OID 18139606)
+--
+-- Name: file_id_idx Type: INDEX
+--
+
+CREATE INDEX file_id_idx on frs_dlstats_agg ( file_id );
+
+--
+-- TOC Entry ID 347 (OID 18139606)
+--
+-- Name: day_idx Type: INDEX
+--
+
+CREATE INDEX day_idx on frs_dlstats_agg ( day );
+
+--
+-- TOC Entry ID 348 (OID 18139623)
+--
+-- Name: dlstats_file_down Type: INDEX
+--
+
+CREATE INDEX dlstats_file_down on frs_dlstats_file_agg ( downloads );
+
+--
+-- TOC Entry ID 349 (OID 18139623)
+--
+-- Name: dlstats_file_file_id Type: INDEX
+--
+
+CREATE INDEX dlstats_file_file_id on frs_dlstats_file_agg ( file_id );
+
+--
+-- TOC Entry ID 350 (OID 18139623)
+--
+-- Name: dlstats_file_day Type: INDEX
+--
+
+CREATE INDEX dlstats_file_day on frs_dlstats_file_agg ( day );
+
+--
+-- TOC Entry ID 351 (OID 18139638)
+--
+-- Name: stats_agr_tmp_fid Type: INDEX
+--
+
+-- Removed because is not needed because is created in table definition
+-- CREATE INDEX stats_agr_tmp_fid on frs_dlstats_filetotal_agg ( file_id );
+
+--
+-- TOC Entry ID 352 (OID 18139654)
+--
+-- Name: frs_dlstats_filetotal_agg_old_f Type: INDEX
+--
+
+CREATE INDEX frs_dlstats_filettl_agg_old_f on frs_dlstats_filetotal_agg_old ( file_id );
+
+--
+-- TOC Entry ID 303 (OID 18139667)
+--
+-- Name: frsdlstatsgroupagg_day_dls Type: INDEX
+--
+
+CREATE INDEX frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg ( day , downloads );
+
+--
+-- TOC Entry ID 353 (OID 18139667)
+--
+-- Name: group_id_idx Type: INDEX
+--
+
+CREATE INDEX group_id_idx on frs_dlstats_group_agg ( group_id );
+
+--
+-- TOC Entry ID 355 (OID 18139667)
+--
+-- Name: frs_dlstats_group_agg_day Type: INDEX
+--
+
+CREATE INDEX frs_dlstats_group_agg_day on frs_dlstats_group_agg ( day );
+
+--
+-- TOC Entry ID 356 (OID 18139682)
+--
+-- Name: stats_agr_tmp_gid Type: INDEX
+--
+
+CREATE INDEX stats_agr_tmp_gid on frs_dlstats_grouptotal_agg ( group_id );
+
+--
+-- TOC Entry ID 357 (OID 18139714)
+--
+-- Name: frs_file_name Type: INDEX
+--
+
+CREATE INDEX frs_file_name on frs_file ( filename );
+
+--
+-- TOC Entry ID 358 (OID 18139714)
+--
+-- Name: frs_file_date Type: INDEX
+--
+
+CREATE INDEX frs_file_date on frs_file ( post_date );
+
+--
+-- TOC Entry ID 359 (OID 18139714)
+--
+-- Name: frs_file_processor Type: INDEX
+--
+
+CREATE INDEX frs_file_processor on frs_file ( processor_id );
+
+--
+-- TOC Entry ID 360 (OID 18139714)
+--
+-- Name: frs_file_release_id Type: INDEX
+--
+
+CREATE INDEX frs_file_release_id on frs_file ( release_id );
+
+--
+-- TOC Entry ID 361 (OID 18139714)
+--
+-- Name: frs_file_type Type: INDEX
+--
+
+CREATE INDEX frs_file_type on frs_file ( type_id );
+
+--
+-- TOC Entry ID 362 (OID 18139822)
+--
+-- Name: package_group_id Type: INDEX
+--
+
+CREATE INDEX package_group_id on frs_package ( group_id );
+
+--
+-- TOC Entry ID 363 (OID 18139922)
+--
+-- Name: frs_release_package Type: INDEX
+--
+
+CREATE INDEX frs_release_package on frs_release ( package_id );
+
+--
+-- TOC Entry ID 364 (OID 18139922)
+--
+-- Name: frs_release_date Type: INDEX
+--
+
+CREATE INDEX frs_release_date on frs_release ( release_date );
+
+--
+-- TOC Entry ID 365 (OID 18139922)
+--
+-- Name: frs_release_by Type: INDEX
+--
+
+CREATE INDEX frs_release_by on frs_release ( released_by );
+
+--
+-- TOC Entry ID 366 (OID 18140030)
+--
+-- Name: group_cvs_history_group_id Type: INDEX
+--
+
+CREATE INDEX group_cvs_history_group_id on group_cvs_history ( group_id );
+
+--
+-- TOC Entry ID 367 (OID 18140030)
+--
+-- Name: user_name_idx Type: INDEX
+--
+
+CREATE INDEX user_name_idx on group_cvs_history ( user_name );
+
+--
+-- TOC Entry ID 368 (OID 18140074)
+--
+-- Name: group_history_group_id Type: INDEX
+--
+
+CREATE INDEX group_history_group_id on group_history ( group_id );
+
+--
+-- TOC Entry ID 369 (OID 18140178)
+--
+-- Name: groups_unix Type: INDEX
+--
+
+CREATE INDEX groups_unix on groups ( unix_group_name );
+
+--
+-- TOC Entry ID 370 (OID 18140178)
+--
+-- Name: groups_type Type: INDEX
+--
+
+CREATE INDEX groups_type on groups ( type );
+
+--
+-- TOC Entry ID 371 (OID 18140178)
+--
+-- Name: groups_public Type: INDEX
+--
+
+CREATE INDEX groups_public on groups ( is_public );
+
+--
+-- TOC Entry ID 372 (OID 18140178)
+--
+-- Name: groups_status Type: INDEX
+--
+
+CREATE INDEX groups_status on groups ( status );
+
+--
+-- TOC Entry ID 373 (OID 18140319)
+--
+-- Name: mail_group_list_group Type: INDEX
+--
+
+CREATE INDEX mail_group_list_group on mail_group_list ( group_id );
+
+--
+-- TOC Entry ID 374 (OID 18140377)
+--
+-- Name: news_bytes_group Type: INDEX
+--
+
+CREATE INDEX news_bytes_group on news_bytes ( group_id );
+
+--
+-- TOC Entry ID 375 (OID 18140377)
+--
+-- Name: news_bytes_approved Type: INDEX
+--
+
+CREATE INDEX news_bytes_approved on news_bytes ( is_approved );
+
+--
+-- TOC Entry ID 376 (OID 18140377)
+--
+-- Name: news_bytes_forum Type: INDEX
+--
+
+CREATE INDEX news_bytes_forum on news_bytes ( forum_id );
+
+--
+-- TOC Entry ID 464 (OID 18140377)
+--
+-- Name: news_group_date Type: INDEX
+--
+
+CREATE INDEX news_group_date on news_bytes ( group_id , sf_date );
+
+--
+-- TOC Entry ID 465 (OID 18140377)
+--
+-- Name: news_approved_date Type: INDEX
+--
+
+CREATE INDEX news_approved_date on news_bytes ( is_approved , sf_date );
+
+--
+-- TOC Entry ID 377 (OID 18140437)
+--
+-- Name: patch_group_id Type: INDEX
+--
+
+CREATE INDEX patch_group_id on patch ( group_id );
+
+--
+-- TOC Entry ID 451 (OID 18140437)
+--
+-- Name: patch_groupid_assignedto_status Type: INDEX
+--
+
+CREATE INDEX patch_groupid_assgndto_sts on patch ( group_id , assigned_to , patch_status_id );
+
+--
+-- TOC Entry ID 452 (OID 18140437)
+--
+-- Name: patch_groupid_assignedto Type: INDEX
+--
+
+CREATE INDEX patch_groupid_assignedto on patch ( group_id , assigned_to );
+
+--
+-- TOC Entry ID 453 (OID 18140437)
+--
+-- Name: patch_groupid_status Type: INDEX
+--
+
+CREATE INDEX patch_groupid_status on patch ( group_id , patch_status_id );
+
+--
+-- TOC Entry ID 378 (OID 18140501)
+--
+-- Name: patch_group_group_id Type: INDEX
+--
+
+CREATE INDEX patch_group_group_id on patch_category ( group_id );
+
+--
+-- TOC Entry ID 379 (OID 18140552)
+--
+-- Name: patch_history_patch_id Type: INDEX
+--
+
+CREATE INDEX patch_history_patch_id on patch_history ( patch_id );
+
+--
+-- TOC Entry ID 461 (OID 18140656)
+--
+-- Name: people_job_group_id Type: INDEX
+--
+
+CREATE INDEX people_job_group_id on people_job ( group_id );
+
+--
+-- TOC Entry ID 380 (OID 18141038)
+--
+-- Name: project_assgnd_to_assgnd_to Type: INDEX
+--
+
+CREATE INDEX project_assgnd_to_assgnd_to on project_assigned_to ( assigned_to_id );
+
+--
+-- TOC Entry ID 381 (OID 18141038)
+--
+-- Name: project_assigned_to_task_id Type: INDEX
+--
+
+CREATE INDEX project_assigned_to_task_id on project_assigned_to ( project_task_id );
+
+--
+-- TOC Entry ID 382 (OID 18141128)
+--
+-- Name: project_is_depndnt_on_tsk_id Type: INDEX
+--
+
+CREATE INDEX project_is_depndnt_on_tsk_id on project_dependencies ( is_dependent_on_task_id );
+
+--
+-- TOC Entry ID 383 (OID 18141128)
+--
+-- Name: project_dependencies_task_id Type: INDEX
+--
+
+CREATE INDEX project_dependencies_task_id on project_dependencies ( project_task_id );
+
+--
+-- TOC Entry ID 384 (OID 18141164)
+--
+-- Name: project_group_list_group_id Type: INDEX
+--
+
+CREATE INDEX project_group_list_group_id on project_group_list ( group_id );
+
+--
+-- TOC Entry ID 385 (OID 18141218)
+--
+-- Name: project_history_task_id Type: INDEX
+--
+
+CREATE INDEX project_history_task_id on project_history ( project_task_id );
+
+--
+-- TOC Entry ID 386 (OID 18141275)
+--
+-- Name: project_metric_group Type: INDEX
+--
+
+CREATE INDEX project_metric_group on project_metric ( group_id );
+
+--
+-- TOC Entry ID 387 (OID 18141430)
+--
+-- Name: project_task_group_project_id Type: INDEX
+--
+
+CREATE INDEX project_task_group_project_id on project_task ( group_project_id );
+
+--
+-- TOC Entry ID 454 (OID 18141430)
+--
+-- Name: projecttask_projid_status Type: INDEX
+--
+
+CREATE INDEX projecttask_projid_status on project_task ( group_project_id , status_id );
+
+--
+-- TOC Entry ID 354 (OID 18141497)
+--
+-- Name: projectweeklymetric_ranking Type: INDEX
+--
+
+-- Removed because is not needed because is created in table definition
+-- CREATE INDEX projectweeklymetric_ranking on project_weekly_metric ( ranking );
+
+--
+-- TOC Entry ID 388 (OID 18141497)
+--
+-- Name: project_metric_weekly_group Type: INDEX
+--
+
+CREATE INDEX project_metric_weekly_group on project_weekly_metric ( group_id );
+
+--
+-- TOC Entry ID 389 (OID 18141514)
+--
+-- Name: sf_session_user_id Type: INDEX
+--
+
+CREATE INDEX sf_session_user_id on sf_session ( user_id );
+
+--
+-- TOC Entry ID 390 (OID 18141514)
+--
+-- Name: sf_session_time Type: INDEX
+--
+
+CREATE INDEX sf_session_time on sf_session ( time );
+
+--
+-- TOC Entry ID 391 (OID 18141552)
+--
+-- Name: snippet_language Type: INDEX
+--
+
+CREATE INDEX snippet_language on snippet ( language );
+
+--
+-- TOC Entry ID 392 (OID 18141552)
+--
+-- Name: snippet_category Type: INDEX
+--
+
+CREATE INDEX snippet_category on snippet ( category );
+
+--
+-- TOC Entry ID 393 (OID 18141611)
+--
+-- Name: snippet_package_language Type: INDEX
+--
+
+CREATE INDEX snippet_package_language on snippet_package ( language );
+
+--
+-- TOC Entry ID 394 (OID 18141611)
+--
+-- Name: snippet_package_category Type: INDEX
+--
+
+CREATE INDEX snippet_package_category on snippet_package ( category );
+
+--
+-- TOC Entry ID 395 (OID 18141666)
+--
+-- Name: snippet_package_item_pkg_ver Type: INDEX
+--
+
+CREATE INDEX snippet_package_item_pkg_ver on snippet_package_item ( snippet_package_version_id );
+
+--
+-- TOC Entry ID 396 (OID 18141702)
+--
+-- Name: snippet_package_version_pkg_id Type: INDEX
+--
+
+CREATE INDEX snippet_package_version_pkg_id on snippet_package_version ( snippet_package_id );
+
+--
+-- TOC Entry ID 397 (OID 18141757)
+--
+-- Name: snippet_version_snippet_id Type: INDEX
+--
+
+CREATE INDEX snippet_version_snippet_id on snippet_version ( snippet_id );
+
+--
+-- TOC Entry ID 398 (OID 18141829)
+--
+-- Name: pages_by_day_day Type: INDEX
+--
+
+CREATE INDEX pages_by_day_day on stats_agg_pages_by_day ( day );
+
+--
+-- TOC Entry ID 399 (OID 18141881)
+--
+-- Name: stats_agr_filerelease_group_id Type: INDEX
+--
+
+CREATE INDEX stats_agr_filerelease_group_id on stats_agr_filerelease ( group_id );
+
+--
+-- TOC Entry ID 400 (OID 18141881)
+--
+-- Name: stats_agr_filerelease_filerelea Type: INDEX
+--
+
+CREATE INDEX stats_agr_filerelease_flrl on stats_agr_filerelease ( filerelease_id );
+
+--
+-- TOC Entry ID 401 (OID 18141896)
+--
+-- Name: project_agr_log_group Type: INDEX
+--
+
+CREATE INDEX project_agr_log_group on stats_agr_project ( group_id );
+
+--
+-- TOC Entry ID 402 (OID 18141949)
+--
+-- Name: ftpdl_group_id Type: INDEX
+--
+
+CREATE INDEX ftpdl_group_id on stats_ftp_downloads ( group_id );
+
+--
+-- TOC Entry ID 403 (OID 18141949)
+--
+-- Name: ftpdl_fid Type: INDEX
+--
+
+CREATE INDEX ftpdl_fid on stats_ftp_downloads ( filerelease_id );
+
+--
+-- TOC Entry ID 404 (OID 18141949)
+--
+-- Name: ftpdl_day Type: INDEX
+--
+
+CREATE INDEX ftpdl_day on stats_ftp_downloads ( day );
+
+--
+-- TOC Entry ID 405 (OID 18141966)
+--
+-- Name: httpdl_group_id Type: INDEX
+--
+
+CREATE INDEX httpdl_group_id on stats_http_downloads ( group_id );
+
+--
+-- TOC Entry ID 406 (OID 18141966)
+--
+-- Name: httpdl_fid Type: INDEX
+--
+
+CREATE INDEX httpdl_fid on stats_http_downloads ( filerelease_id );
+
+--
+-- TOC Entry ID 407 (OID 18141966)
+--
+-- Name: httpdl_day Type: INDEX
+--
+
+CREATE INDEX httpdl_day on stats_http_downloads ( day );
+
+--
+-- TOC Entry ID 408 (OID 18141983)
+--
+-- Name: archive_project_monthday Type: INDEX
+--
+
+CREATE INDEX archive_project_monthday on stats_project ( month , day );
+
+--
+-- TOC Entry ID 409 (OID 18141983)
+--
+-- Name: project_log_group Type: INDEX
+--
+
+CREATE INDEX project_log_group on stats_project ( group_id );
+
+--
+-- TOC Entry ID 410 (OID 18141983)
+--
+-- Name: archive_project_week Type: INDEX
+--
+
+CREATE INDEX archive_project_week on stats_project ( week );
+
+--
+-- TOC Entry ID 411 (OID 18141983)
+--
+-- Name: archive_project_day Type: INDEX
+--
+
+CREATE INDEX archive_project_day on stats_project ( day );
+
+--
+-- TOC Entry ID 412 (OID 18141983)
+--
+-- Name: archive_project_month Type: INDEX
+--
+
+CREATE INDEX archive_project_month on stats_project ( month );
+
+--
+-- TOC Entry ID 413 (OID 18142042)
+--
+-- Name: stats_project_tmp_group_id Type: INDEX
+--
+
+CREATE INDEX stats_project_tmp_group_id on stats_project_tmp ( group_id );
+
+--
+-- TOC Entry ID 414 (OID 18142042)
+--
+-- Name: project_stats_week Type: INDEX
+--
+
+CREATE INDEX project_stats_week on stats_project_tmp ( week );
+
+--
+-- TOC Entry ID 415 (OID 18142042)
+--
+-- Name: project_stats_month Type: INDEX
+--
+
+CREATE INDEX project_stats_month on stats_project_tmp ( month );
+
+--
+-- TOC Entry ID 416 (OID 18142042)
+--
+-- Name: project_stats_day Type: INDEX
+--
+
+CREATE INDEX project_stats_day on stats_project_tmp ( day );
+
+--
+-- TOC Entry ID 417 (OID 18142101)
+--
+-- Name: stats_site_monthday Type: INDEX
+--
+
+CREATE INDEX stats_site_monthday on stats_site ( month , day );
+
+--
+-- TOC Entry ID 418 (OID 18142101)
+--
+-- Name: stats_site_week Type: INDEX
+--
+
+CREATE INDEX stats_site_week on stats_site ( week );
+
+--
+-- TOC Entry ID 419 (OID 18142101)
+--
+-- Name: stats_site_day Type: INDEX
+--
+
+CREATE INDEX stats_site_day on stats_site ( day );
+
+--
+-- TOC Entry ID 420 (OID 18142101)
+--
+-- Name: stats_site_month Type: INDEX
+--
+
+CREATE INDEX stats_site_month on stats_site ( month );
+
+--
+-- TOC Entry ID 421 (OID 18142150)
+--
+-- Name: support_group_id Type: INDEX
+--
+
+CREATE INDEX support_group_id on support ( group_id );
+
+--
+-- TOC Entry ID 448 (OID 18142150)
+--
+-- Name: support_groupid_assignedto Type: INDEX
+--
+
+CREATE INDEX support_groupid_assignedto on support ( group_id , assigned_to );
+
+--
+-- TOC Entry ID 449 (OID 18142150)
+--
+-- Name: support_groupid_assignedto_stat Type: INDEX
+--
+
+CREATE INDEX support_groupid_assgndto_stt on support ( group_id , assigned_to , support_status_id );
+
+--
+-- TOC Entry ID 450 (OID 18142150)
+--
+-- Name: support_groupid_status Type: INDEX
+--
+
+CREATE INDEX support_groupid_status on support ( group_id , support_status_id );
+
+--
+-- TOC Entry ID 422 (OID 18142214)
+--
+-- Name: support_canned_response_group_i Type: INDEX
+--
+
+CREATE INDEX support_canned_rspns_grp_i on support_canned_responses ( group_id );
+
+--
+-- TOC Entry ID 423 (OID 18142265)
+--
+-- Name: support_group_group_id Type: INDEX
+--
+
+CREATE INDEX support_group_group_id on support_category ( group_id );
+
+--
+-- TOC Entry ID 424 (OID 18142316)
+--
+-- Name: support_history_support_id Type: INDEX
+--
+
+CREATE INDEX support_history_support_id on support_history ( support_id );
+
+--
+-- TOC Entry ID 425 (OID 18142372)
+--
+-- Name: support_messages_support_id Type: INDEX
+--
+
+CREATE INDEX support_messages_support_id on support_messages ( support_id );
+
+--
+-- TOC Entry ID 426 (OID 18142473)
+--
+-- Name: supported_languages_code Type: INDEX
+--
+
+CREATE INDEX supported_languages_code on supported_languages ( language_code );
+
+--
+-- TOC Entry ID 427 (OID 18142573)
+--
+-- Name: survey_questions_group Type: INDEX
+--
+
+CREATE INDEX survey_questions_group on survey_questions ( group_id );
+
+--
+-- TOC Entry ID 428 (OID 18142608)
+--
+-- Name: survey_rating_aggregate_type_id Type: INDEX
+--
+
+CREATE INDEX survey_rating_aggrgt_typ_id on survey_rating_aggregate ( type , id );
+
+--
+-- TOC Entry ID 429 (OID 18142625)
+--
+-- Name: survey_rating_responses_user_ty Type: INDEX
+--
+
+CREATE INDEX survey_rating_rspns_usr_ty on survey_rating_response ( user_id , type , id );
+
+--
+-- TOC Entry ID 430 (OID 18142625)
+--
+-- Name: survey_rating_responses_type_id Type: INDEX
+--
+
+CREATE INDEX survey_rating_rspns_typ_id on survey_rating_response ( type , id );
+
+--
+-- TOC Entry ID 431 (OID 18142644)
+--
+-- Name: survey_responses_group_id Type: INDEX
+--
+
+CREATE INDEX survey_responses_group_id on survey_responses ( group_id );
+
+--
+-- TOC Entry ID 432 (OID 18142644)
+--
+-- Name: survey_responses_user_survey_qu Type: INDEX
+--
+
+CREATE INDEX survey_rspns_usr_srvy_qu on survey_responses ( user_id , survey_id , question_id );
+
+--
+-- TOC Entry ID 433 (OID 18142644)
+--
+-- Name: survey_responses_user_survey Type: INDEX
+--
+
+CREATE INDEX survey_responses_user_survey on survey_responses ( user_id , survey_id );
+
+--
+-- TOC Entry ID 434 (OID 18142644)
+--
+-- Name: survey_responses_survey_questio Type: INDEX
+--
+
+CREATE INDEX survey_rspns_srvy_quest on survey_responses ( survey_id , question_id );
+
+--
+-- TOC Entry ID 435 (OID 18142698)
+--
+-- Name: surveys_group Type: INDEX
+--
+
+CREATE INDEX surveys_group on surveys ( group_id );
+
+--
+-- TOC Entry ID 436 (OID 18143071)
+--
+-- Name: rank_forumposts_week_idx Type: INDEX
+--
+
+CREATE INDEX rank_forumposts_week_idx on top_group ( rank_forumposts_week );
+
+--
+-- TOC Entry ID 437 (OID 18143071)
+--
+-- Name: rank_downloads_week_idx Type: INDEX
+--
+
+CREATE INDEX rank_downloads_week_idx on top_group ( rank_downloads_week );
+
+--
+-- TOC Entry ID 438 (OID 18143071)
+--
+-- Name: pageviews_proj_idx Type: INDEX
+--
+
+CREATE INDEX pageviews_proj_idx on top_group ( pageviews_proj );
+
+--
+-- TOC Entry ID 439 (OID 18143071)
+--
+-- Name: rank_userrank_idx Type: INDEX
+--
+
+CREATE INDEX rank_userrank_idx on top_group ( rank_userrank );
+
+--
+-- TOC Entry ID 440 (OID 18143071)
+--
+-- Name: rank_downloads_all_idx Type: INDEX
+--
+
+CREATE INDEX rank_downloads_all_idx on top_group ( rank_downloads_all );
+
+--
+-- TOC Entry ID 441 (OID 18143131)
+--
+-- Name: parent_idx Type: INDEX
+--
+
+CREATE INDEX parent_idx on trove_cat ( parent );
+
+--
+-- TOC Entry ID 442 (OID 18143131)
+--
+-- Name: root_parent_idx Type: INDEX
+--
+
+CREATE INDEX root_parent_idx on trove_cat ( root_parent );
+
+--
+-- TOC Entry ID 443 (OID 18143131)
+--
+-- Name: version_idx Type: INDEX
+--
+
+CREATE INDEX version_idx on trove_cat ( version );
+
+--
+-- TOC Entry ID 444 (OID 18143194)
+--
+-- Name: trove_group_link_group_id Type: INDEX
+--
+
+CREATE INDEX trove_group_link_group_id on trove_group_link ( group_id );
+
+--
+-- TOC Entry ID 445 (OID 18143194)
+--
+-- Name: trove_group_link_cat_id Type: INDEX
+--
+
+CREATE INDEX trove_group_link_cat_id on trove_group_link ( trove_cat_id );
+
+--
+-- TOC Entry ID 446 (OID 18143304)
+--
+-- Name: user_bookmark_user_id Type: INDEX
+--
+
+CREATE INDEX user_bookmark_user_id on user_bookmarks ( user_id );
+
+--
+-- TOC Entry ID 304 (OID 18143355)
+--
+-- Name: user_diary_user Type: INDEX
+--
+
+CREATE INDEX user_diary_user on user_diary ( user_id );
+
+--
+-- TOC Entry ID 305 (OID 18143355)
+--
+-- Name: user_diary_user_date Type: INDEX
+--
+
+CREATE INDEX user_diary_user_date on user_diary ( user_id , date_posted );
+
+--
+-- TOC Entry ID 306 (OID 18143355)
+--
+-- Name: user_diary_date Type: INDEX
+--
+
+CREATE INDEX user_diary_date on user_diary ( date_posted );
+
+--
+-- TOC Entry ID 307 (OID 18143410)
+--
+-- Name: user_diary_monitor_user Type: INDEX
+--
+
+CREATE INDEX user_diary_monitor_user on user_diary_monitor ( user_id );
+
+--
+-- TOC Entry ID 308 (OID 18143410)
+--
+-- Name: user_diary_monitor_monitored_us Type: INDEX
+--
+
+CREATE INDEX user_diary_monitor_mntrd_us on user_diary_monitor ( monitored_user );
+
+--
+-- TOC Entry ID 309 (OID 18143446)
+--
+-- Name: user_group_group_id Type: INDEX
+--
+
+CREATE INDEX user_group_group_id on user_group ( group_id );
+
+--
+-- TOC Entry ID 310 (OID 18143446)
+--
+-- Name: bug_flags_idx Type: INDEX
+--
+
+CREATE INDEX bug_flags_idx on user_group ( bug_flags );
+
+--
+-- TOC Entry ID 311 (OID 18143446)
+--
+-- Name: project_flags_idx Type: INDEX
+--
+
+CREATE INDEX project_flags_idx on user_group ( project_flags );
+
+--
+-- TOC Entry ID 312 (OID 18143446)
+--
+-- Name: user_group_user_id Type: INDEX
+--
+
+CREATE INDEX user_group_user_id on user_group ( user_id );
+
+--
+-- TOC Entry ID 313 (OID 18143446)
+--
+-- Name: admin_flags_idx Type: INDEX
+--
+
+CREATE INDEX admin_flags_idx on user_group ( admin_flags );
+
+--
+-- TOC Entry ID 314 (OID 18143446)
+--
+-- Name: forum_flags_idx Type: INDEX
+--
+
+CREATE INDEX forum_flags_idx on user_group ( forum_flags );
+
+--
+-- TOC Entry ID 315 (OID 18143548)
+--
+-- Name: user_metric0_user_id Type: INDEX
+--
+
+CREATE INDEX user_metric0_user_id on user_metric0 ( user_id );
+
+--
+-- TOC Entry ID 455 (OID 18143576)
+--
+-- Name: user_pref_user_id Type: INDEX
+--
+
+CREATE INDEX user_pref_user_id on user_preferences ( user_id );
+
+--
+-- TOC Entry ID 456 (OID 18143591)
+--
+-- Name: user_ratings_rated_by Type: INDEX
+--
+
+CREATE INDEX user_ratings_rated_by on user_ratings ( rated_by );
+
+--
+-- TOC Entry ID 457 (OID 18143591)
+--
+-- Name: user_ratings_user_id Type: INDEX
+--
+
+CREATE INDEX user_ratings_user_id on user_ratings ( user_id );
+
+--
+-- TOC Entry ID 447 (OID 18143626)
+--
+-- Name: users_status Type: INDEX
+--
+
+CREATE INDEX users_status on users ( status );
+
+--
+-- TOC Entry ID 458 (OID 18143626)
+--
+-- Name: user_user Type: INDEX
+--
+
+-- Removed because is not needed because is created in table definition
+-- CREATE INDEX user_user on users ( status );
+
+--
+-- TOC Entry ID 459 (OID 18143626)
+--
+-- Name: idx_users_username Type: INDEX
+--
+
+CREATE INDEX idx_users_username on users ( user_name );
+
+--
+-- TOC Entry ID 462 (OID 18143626)
+--
+-- Name: users_user_pw Type: INDEX
+--
+
+CREATE INDEX users_user_pw on users ( user_pw );
+
+--
+-- TOC Entry ID 460 (OID 27311451)
+--
+-- Name: troveagg_trovecatid Type: INDEX
+--
+
+CREATE INDEX troveagg_trovecatid on trove_agg ( trove_cat_id );
+
+--
+-- TOC Entry ID 536 (OID 27311269)
+--
+-- Name: RI_ConstraintTrigger_27311268 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER INSERT OR UPdate ON user_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id');
+
+--
+-- TOC Entry ID 537 (OID 27311271)
+--
+-- Name: RI_ConstraintTrigger_27311270 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id');
+
+--
+-- TOC Entry ID 538 (OID 27311273)
+--
+-- Name: RI_ConstraintTrigger_27311272 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_user_id_fk AFTER UPdate ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('user_group_user_id_fk', 'user_group', 'users', 'FULL', 'user_id', 'user_id');
+
+--
+-- TOC Entry ID 535 (OID 27311275)
+--
+-- Name: RI_ConstraintTrigger_27311274 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER INSERT OR UPDATE ON user_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 506 (OID 27311277)
+--
+-- Name: RI_ConstraintTrigger_27311276 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 505 (OID 27311279)
+--
+-- Name: RI_ConstraintTrigger_27311278 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER user_group_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('user_group_group_id_fk', 'user_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 487 (OID 27311281)
+--
+-- Name: RI_ConstraintTrigger_27311280 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 539 (OID 27311283)
+--
+-- Name: RI_ConstraintTrigger_27311282 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 540 (OID 27311285)
+--
+-- Name: RI_ConstraintTrigger_27311284 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 486 (OID 27311287)
+--
+-- Name: RI_ConstraintTrigger_27311286 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 492 (OID 27311289)
+--
+-- Name: RI_ConstraintTrigger_27311288 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER DELETE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 491 (OID 27311291)
+--
+-- Name: RI_ConstraintTrigger_27311290 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 490 (OID 27311293)
+--
+-- Name: RI_ConstraintTrigger_27311292 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER INSERT OR UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 504 (OID 27311295)
+--
+-- Name: RI_ConstraintTrigger_27311294 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 503 (OID 27311297)
+--
+-- Name: RI_ConstraintTrigger_27311296 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_list_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_list_group_id_fk', 'forum_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 479 (OID 27311299)
+--
+-- Name: RI_ConstraintTrigger_27311298 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER INSERT OR UPDATE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 502 (OID 27311301)
+--
+-- Name: RI_ConstraintTrigger_27311300 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 501 (OID 27311303)
+--
+-- Name: RI_ConstraintTrigger_27311302 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_group_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_group_group_fk', 'bug_group', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 476 (OID 27311305)
+--
+-- Name: RI_ConstraintTrigger_27311304 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER INSERT OR UPDATE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 500 (OID 27311307)
+--
+-- Name: RI_ConstraintTrigger_27311306 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 499 (OID 27311309)
+--
+-- Name: RI_ConstraintTrigger_27311308 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_group_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_category_group_fk', 'bug_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 473 (OID 27311311)
+--
+-- Name: RI_ConstraintTrigger_27311310 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 541 (OID 27311313)
+--
+-- Name: RI_ConstraintTrigger_27311312 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 542 (OID 27311315)
+--
+-- Name: RI_ConstraintTrigger_27311314 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_submitted_by_fk', 'bug', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 472 (OID 27311317)
+--
+-- Name: RI_ConstraintTrigger_27311316 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 543 (OID 27311319)
+--
+-- Name: RI_ConstraintTrigger_27311318 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 544 (OID 27311321)
+--
+-- Name: RI_ConstraintTrigger_27311320 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_assigned_to_fk', 'bug', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 471 (OID 27311323)
+--
+-- Name: RI_ConstraintTrigger_27311322 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 483 (OID 27311325)
+--
+-- Name: RI_ConstraintTrigger_27311324 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER DELETE ON bug_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 482 (OID 27311327)
+--
+-- Name: RI_ConstraintTrigger_27311326 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_status_fk AFTER UPDATE ON bug_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_status_fk', 'bug', 'bug_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 470 (OID 27311329)
+--
+-- Name: RI_ConstraintTrigger_27311328 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id');
+
+--
+-- TOC Entry ID 475 (OID 27311331)
+--
+-- Name: RI_ConstraintTrigger_27311330 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER DELETE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id');
+
+--
+-- TOC Entry ID 474 (OID 27311333)
+--
+-- Name: RI_ConstraintTrigger_27311332 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_category_fk AFTER UPDATE ON bug_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_category_fk', 'bug', 'bug_category', 'FULL', 'category_id', 'bug_category_id');
+
+--
+-- TOC Entry ID 469 (OID 27311335)
+--
+-- Name: RI_ConstraintTrigger_27311334 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id');
+
+--
+-- TOC Entry ID 481 (OID 27311337)
+--
+-- Name: RI_ConstraintTrigger_27311336 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER DELETE ON bug_resolution NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id');
+
+--
+-- TOC Entry ID 480 (OID 27311339)
+--
+-- Name: RI_ConstraintTrigger_27311338 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_resolution_fk AFTER UPDATE ON bug_resolution NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_resolution_fk', 'bug', 'bug_resolution', 'FULL', 'resolution_id', 'resolution_id');
+
+--
+-- TOC Entry ID 468 (OID 27311341)
+--
+-- Name: RI_ConstraintTrigger_27311340 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER INSERT OR UPDATE ON bug NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id');
+
+--
+-- TOC Entry ID 478 (OID 27311343)
+--
+-- Name: RI_ConstraintTrigger_27311342 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER DELETE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id');
+
+--
+-- TOC Entry ID 477 (OID 27311345)
+--
+-- Name: RI_ConstraintTrigger_27311344 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER bug_group_fk AFTER UPDATE ON bug_group NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('bug_group_fk', 'bug', 'bug_group', 'FULL', 'bug_group_id', 'bug_group_id');
+
+--
+-- TOC Entry ID 485 (OID 27311347)
+--
+-- Name: RI_ConstraintTrigger_27311346 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 545 (OID 27311349)
+--
+-- Name: RI_ConstraintTrigger_27311348 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 546 (OID 27311351)
+--
+-- Name: RI_ConstraintTrigger_27311350 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_posted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_posted_by_fk', 'forum', 'users', 'FULL', 'posted_by', 'user_id');
+
+--
+-- TOC Entry ID 484 (OID 27311353)
+--
+-- Name: RI_ConstraintTrigger_27311352 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER INSERT OR UPDATE ON forum NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 489 (OID 27311355)
+--
+-- Name: RI_ConstraintTrigger_27311354 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER DELETE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 488 (OID 27311357)
+--
+-- Name: RI_ConstraintTrigger_27311356 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER forum_group_forum_id_fk AFTER UPDATE ON forum_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('forum_group_forum_id_fk', 'forum', 'forum_group_list', 'FULL', 'group_forum_id', 'group_forum_id');
+
+--
+-- TOC Entry ID 518 (OID 27311359)
+--
+-- Name: RI_ConstraintTrigger_27311358 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER INSERT OR UPDATE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 498 (OID 27311361)
+--
+-- Name: RI_ConstraintTrigger_27311360 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 497 (OID 27311363)
+--
+-- Name: RI_ConstraintTrigger_27311362 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_group_list_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_group_list_group_id_fk', 'project_group_list', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 523 (OID 27311365)
+--
+-- Name: RI_ConstraintTrigger_27311364 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id');
+
+--
+-- TOC Entry ID 517 (OID 27311367)
+--
+-- Name: RI_ConstraintTrigger_27311366 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER DELETE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id');
+
+--
+-- TOC Entry ID 516 (OID 27311369)
+--
+-- Name: RI_ConstraintTrigger_27311368 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_group_project_id_f AFTER UPDATE ON project_group_list NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_group_project_id_f', 'project_task', 'project_group_list', 'FULL', 'group_project_id', 'group_project_id');
+
+--
+-- TOC Entry ID 522 (OID 27311371)
+--
+-- Name: RI_ConstraintTrigger_27311370 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id');
+
+--
+-- TOC Entry ID 547 (OID 27311373)
+--
+-- Name: RI_ConstraintTrigger_27311372 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id');
+
+--
+-- TOC Entry ID 548 (OID 27311375)
+--
+-- Name: RI_ConstraintTrigger_27311374 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_created_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_created_by_fk', 'project_task', 'users', 'FULL', 'created_by', 'user_id');
+
+--
+-- TOC Entry ID 521 (OID 27311377)
+--
+-- Name: RI_ConstraintTrigger_27311376 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER INSERT OR UPDATE ON project_task NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 520 (OID 27311379)
+--
+-- Name: RI_ConstraintTrigger_27311378 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER DELETE ON project_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 519 (OID 27311381)
+--
+-- Name: RI_ConstraintTrigger_27311380 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER project_task_status_id_fk AFTER UPDATE ON project_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('project_task_status_id_fk', 'project_task', 'project_status', 'FULL', 'status_id', 'status_id');
+
+--
+-- TOC Entry ID 510 (OID 27311383)
+--
+-- Name: RI_ConstraintTrigger_27311382 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id');
+
+--
+-- TOC Entry ID 515 (OID 27311385)
+--
+-- Name: RI_ConstraintTrigger_27311384 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER DELETE ON patch_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id');
+
+--
+-- TOC Entry ID 514 (OID 27311387)
+--
+-- Name: RI_ConstraintTrigger_27311386 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_status_id_fk AFTER UPDATE ON patch_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_status_id_fk', 'patch', 'patch_status', 'FULL', 'patch_status_id', 'patch_status_id');
+
+--
+-- TOC Entry ID 509 (OID 27311389)
+--
+-- Name: RI_ConstraintTrigger_27311388 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id');
+
+--
+-- TOC Entry ID 513 (OID 27311391)
+--
+-- Name: RI_ConstraintTrigger_27311390 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER DELETE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id');
+
+--
+-- TOC Entry ID 512 (OID 27311393)
+--
+-- Name: RI_ConstraintTrigger_27311392 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_id_fk AFTER UPDATE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_category_id_fk', 'patch', 'patch_category', 'FULL', 'patch_category_id', 'patch_category_id');
+
+--
+-- TOC Entry ID 508 (OID 27311395)
+--
+-- Name: RI_ConstraintTrigger_27311394 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 549 (OID 27311397)
+--
+-- Name: RI_ConstraintTrigger_27311396 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 550 (OID 27311399)
+--
+-- Name: RI_ConstraintTrigger_27311398 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_submitted_by_fk', 'patch', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 507 (OID 27311401)
+--
+-- Name: RI_ConstraintTrigger_27311400 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER INSERT OR UPDATE ON patch NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 551 (OID 27311403)
+--
+-- Name: RI_ConstraintTrigger_27311402 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 552 (OID 27311405)
+--
+-- Name: RI_ConstraintTrigger_27311404 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_assigned_to_fk', 'patch', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 511 (OID 27311407)
+--
+-- Name: RI_ConstraintTrigger_27311406 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER INSERT OR UPDATE ON patch_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 496 (OID 27311409)
+--
+-- Name: RI_ConstraintTrigger_27311408 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 495 (OID 27311411)
+--
+-- Name: RI_ConstraintTrigger_27311410 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER patch_category_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('patch_category_group_id_fk', 'patch_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 527 (OID 27311413)
+--
+-- Name: RI_ConstraintTrigger_27311412 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id');
+
+--
+-- TOC Entry ID 532 (OID 27311415)
+--
+-- Name: RI_ConstraintTrigger_27311414 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER DELETE ON support_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id');
+
+--
+-- TOC Entry ID 531 (OID 27311417)
+--
+-- Name: RI_ConstraintTrigger_27311416 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_status_id_fk AFTER UPDATE ON support_status NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_status_id_fk', 'support', 'support_status', 'FULL', 'support_status_id', 'support_status_id');
+
+--
+-- TOC Entry ID 526 (OID 27311419)
+--
+-- Name: RI_ConstraintTrigger_27311418 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id');
+
+--
+-- TOC Entry ID 530 (OID 27311421)
+--
+-- Name: RI_ConstraintTrigger_27311420 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER DELETE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id');
+
+--
+-- TOC Entry ID 529 (OID 27311423)
+--
+-- Name: RI_ConstraintTrigger_27311422 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_id_fk AFTER UPDATE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_category_id_fk', 'support', 'support_category', 'FULL', 'support_category_id', 'support_category_id');
+
+--
+-- TOC Entry ID 525 (OID 27311425)
+--
+-- Name: RI_ConstraintTrigger_27311424 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 553 (OID 27311427)
+--
+-- Name: RI_ConstraintTrigger_27311426 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 554 (OID 27311429)
+--
+-- Name: RI_ConstraintTrigger_27311428 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_submitted_by_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_submitted_by_fk', 'support', 'users', 'FULL', 'submitted_by', 'user_id');
+
+--
+-- TOC Entry ID 524 (OID 27311431)
+--
+-- Name: RI_ConstraintTrigger_27311430 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER INSERT OR UPDATE ON support NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 555 (OID 27311433)
+--
+-- Name: RI_ConstraintTrigger_27311432 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER DELETE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 556 (OID 27311435)
+--
+-- Name: RI_ConstraintTrigger_27311434 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_assigned_to_fk AFTER UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_assigned_to_fk', 'support', 'users', 'FULL', 'assigned_to', 'user_id');
+
+--
+-- TOC Entry ID 528 (OID 27311437)
+--
+-- Name: RI_ConstraintTrigger_27311436 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER INSERT OR UPDATE ON support_category NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 494 (OID 27311439)
+--
+-- Name: RI_ConstraintTrigger_27311438 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER DELETE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 493 (OID 27311441)
+--
+-- Name: RI_ConstraintTrigger_27311440 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER support_category_group_id_fk AFTER UPDATE ON groups NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('support_category_group_id_fk', 'support_category', 'groups', 'FULL', 'group_id', 'group_id');
+
+--
+-- TOC Entry ID 557 (OID 27311443)
+--
+-- Name: RI_ConstraintTrigger_27311442 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER INSERT OR UPDATE ON users NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_check_ins ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id');
+
+--
+-- TOC Entry ID 534 (OID 27311445)
+--
+-- Name: RI_ConstraintTrigger_27311444 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER DELETE ON supported_languages NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_del ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id');
+
+--
+-- TOC Entry ID 533 (OID 27311447)
+--
+-- Name: RI_ConstraintTrigger_27311446 Type: TRIGGER
+--
+
+-- CREATE CONSTRAINT TRIGGER users_languageid_fk AFTER UPDATE ON supported_languages NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE RI_FKey_noaction_upd ('users_languageid_fk', 'users', 'supported_languages', 'FULL', 'language', 'language_id');
+
+--
+-- TOC Entry ID 3 (OID 18138427)
+--
+-- Name: bug_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_pk_seq', 125359, 't');
+
+--
+-- TOC Entry ID 5 (OID 18138495)
+--
+-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_bug_dependencies_pk_seq', 44691, 't');
+
+--
+-- TOC Entry ID 7 (OID 18138531)
+--
+-- Name: bug_canned_responses_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_canned_responses_pk_seq', 100204, 't');
+
+--
+-- TOC Entry ID 9 (OID 18138582)
+--
+-- Name: bug_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_category_pk_seq', 5053, 't');
+
+--
+-- TOC Entry ID 11 (OID 18138632)
+--
+-- Name: bug_filter_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_filter_pk_seq', 140, 't');
+
+--
+-- TOC Entry ID 13 (OID 18138687)
+--
+-- Name: bug_group_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_group_pk_seq', 2780, 't');
+
+--
+-- TOC Entry ID 15 (OID 18138738)
+--
+-- Name: bug_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_history_pk_seq', 106196, 't');
+
+--
+-- TOC Entry ID 17 (OID 18138794)
+--
+-- Name: bug_resolution_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_resolution_pk_seq', 101, 't');
+
+--
+-- TOC Entry ID 19 (OID 18138843)
+--
+-- Name: bug_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_status_pk_seq', 100, 't');
+
+--
+-- TOC Entry ID 21 (OID 18138891)
+--
+-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('bug_task_dependencies_pk_seq', 44583, 't');
+
+--
+-- TOC Entry ID 23 (OID 18138927)
+--
+-- Name: canned_responses_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('canned_responses_pk_seq', 5, 't');
+
+--
+-- TOC Entry ID 25 (OID 18138977)
+--
+-- Name: db_images_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('db_images_pk_seq', 1128, 't');
+
+--
+-- TOC Entry ID 27 (OID 18139040)
+--
+-- Name: doc_data_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('doc_data_pk_seq', 2124, 't');
+
+--
+-- TOC Entry ID 29 (OID 18139104)
+--
+-- Name: doc_groups_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('doc_groups_pk_seq', 1815, 't');
+
+--
+-- TOC Entry ID 31 (OID 18139140)
+--
+-- Name: doc_states_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('doc_states_pk_seq', 5, 't');
+
+--
+-- TOC Entry ID 33 (OID 18139174)
+--
+-- Name: filemodule_monitor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('filemodule_monitor_pk_seq', 312, 't');
+
+--
+-- TOC Entry ID 35 (OID 18139210)
+--
+-- Name: forum_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('forum_pk_seq', 84486, 't');
+
+--
+-- TOC Entry ID 37 (OID 18139291)
+--
+-- Name: forum_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('forum_group_list_pk_seq', 51981, 't');
+
+--
+-- TOC Entry ID 39 (OID 18139348)
+--
+-- Name: forum_monitored_forums_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('forum_monitored_forums_pk_seq', 14831, 't');
+
+--
+-- TOC Entry ID 41 (OID 18139384)
+--
+-- Name: forum_saved_place_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('forum_saved_place_pk_seq', 1835, 't');
+
+--
+-- TOC Entry ID 43 (OID 18139492)
+--
+-- Name: foundry_news_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('foundry_news_pk_seq', 1973, 't');
+
+--
+-- TOC Entry ID 45 (OID 18139532)
+--
+-- Name: foundry_preferred_projec_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('foundry_preferred_projec_pk_seq', 165, 't');
+
+--
+-- TOC Entry ID 47 (OID 18139570)
+--
+-- Name: foundry_projects_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('foundry_projects_pk_seq', 320807, 't');
+
+--
+-- TOC Entry ID 49 (OID 18139695)
+--
+-- Name: frs_file_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_file_pk_seq', 29214, 't');
+
+--
+-- TOC Entry ID 51 (OID 18139756)
+--
+-- Name: frs_filetype_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_filetype_pk_seq', 9999, 't');
+
+--
+-- TOC Entry ID 53 (OID 18139804)
+--
+-- Name: frs_package_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_package_pk_seq', 12688, 't');
+
+--
+-- TOC Entry ID 55 (OID 18139856)
+--
+-- Name: frs_processor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_processor_pk_seq', 9999, 't');
+
+--
+-- TOC Entry ID 57 (OID 18139904)
+--
+-- Name: frs_release_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_release_pk_seq', 17983, 't');
+
+--
+-- TOC Entry ID 59 (OID 18139964)
+--
+-- Name: frs_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('frs_status_pk_seq', 3, 't');
+
+--
+-- TOC Entry ID 61 (OID 18140012)
+--
+-- Name: group_cvs_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('group_cvs_history_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 63 (OID 18140056)
+--
+-- Name: group_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('group_history_pk_seq', 29283, 't');
+
+--
+-- TOC Entry ID 65 (OID 18140112)
+--
+-- Name: group_type_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('group_type_pk_seq', 2, 't');
+
+--
+-- TOC Entry ID 67 (OID 18140160)
+--
+-- Name: groups_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('groups_pk_seq', 16379, 't');
+
+--
+-- TOC Entry ID 69 (OID 18140301)
+--
+-- Name: mail_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('mail_group_list_pk_seq', 7581, 't');
+
+--
+-- TOC Entry ID 71 (OID 18140359)
+--
+-- Name: news_bytes_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('news_bytes_pk_seq', 10299, 't');
+
+--
+-- TOC Entry ID 73 (OID 18140419)
+--
+-- Name: patch_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('patch_pk_seq', 102785, 't');
+
+--
+-- TOC Entry ID 75 (OID 18140483)
+--
+-- Name: patch_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('patch_category_pk_seq', 10607, 't');
+
+--
+-- TOC Entry ID 77 (OID 18140534)
+--
+-- Name: patch_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('patch_history_pk_seq', 9813, 't');
+
+--
+-- TOC Entry ID 79 (OID 18140590)
+--
+-- Name: patch_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('patch_status_pk_seq', 103, 't');
+
+--
+-- TOC Entry ID 81 (OID 18140638)
+--
+-- Name: people_job_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_job_pk_seq', 1641, 't');
+
+--
+-- TOC Entry ID 83 (OID 18140697)
+--
+-- Name: people_job_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_job_category_pk_seq', 102, 't');
+
+--
+-- TOC Entry ID 85 (OID 18140747)
+--
+-- Name: people_job_inventory_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_job_inventory_pk_seq', 1970, 't');
+
+--
+-- TOC Entry ID 87 (OID 18140787)
+--
+-- Name: people_job_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_job_status_pk_seq', 3, 't');
+
+--
+-- TOC Entry ID 89 (OID 18140835)
+--
+-- Name: people_skill_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_skill_pk_seq', 33, 't');
+
+--
+-- TOC Entry ID 91 (OID 18140884)
+--
+-- Name: people_skill_inventory_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_skill_inventory_pk_seq', 60179, 't');
+
+--
+-- TOC Entry ID 93 (OID 18140924)
+--
+-- Name: people_skill_level_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_skill_level_pk_seq', 5, 't');
+
+--
+-- TOC Entry ID 95 (OID 18140972)
+--
+-- Name: people_skill_year_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('people_skill_year_pk_seq', 5, 't');
+
+--
+-- TOC Entry ID 97 (OID 18141020)
+--
+-- Name: project_assigned_to_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_assigned_to_pk_seq', 30257, 't');
+
+--
+-- TOC Entry ID 99 (OID 18141110)
+--
+-- Name: project_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_dependencies_pk_seq', 25231, 't');
+
+--
+-- TOC Entry ID 101 (OID 18141146)
+--
+-- Name: project_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_group_list_pk_seq', 6360, 't');
+
+--
+-- TOC Entry ID 103 (OID 18141200)
+--
+-- Name: project_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_history_pk_seq', 27347, 't');
+
+--
+-- TOC Entry ID 105 (OID 18141257)
+--
+-- Name: project_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_metric_pk_seq', 13274, 't');
+
+--
+-- TOC Entry ID 107 (OID 18141292)
+--
+-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_metric_tmp1_pk_seq', 13274, 't');
+
+--
+-- TOC Entry ID 109 (OID 18141327)
+--
+-- Name: project_metric_weekly_tm_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_metric_weekly_tm_pk_seq', 2213, 't');
+
+--
+-- TOC Entry ID 111 (OID 18141363)
+--
+-- Name: project_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_status_pk_seq', 100, 't');
+
+--
+-- TOC Entry ID 113 (OID 18141412)
+--
+-- Name: project_task_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_task_pk_seq', 23295, 't');
+
+--
+-- TOC Entry ID 115 (OID 18141479)
+--
+-- Name: project_weekly_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('project_weekly_metric_pk_seq', 2213, 't');
+
+--
+-- TOC Entry ID 117 (OID 18141534)
+--
+-- Name: snippet_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('snippet_pk_seq', 100501, 't');
+
+--
+-- TOC Entry ID 119 (OID 18141593)
+--
+-- Name: snippet_package_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('snippet_package_pk_seq', 100035, 't');
+
+--
+-- TOC Entry ID 121 (OID 18141648)
+--
+-- Name: snippet_package_item_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('snippet_package_item_pk_seq', 100100, 't');
+
+--
+-- TOC Entry ID 123 (OID 18141684)
+--
+-- Name: snippet_package_version_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('snippet_package_version_pk_seq', 100035, 't');
+
+--
+-- TOC Entry ID 125 (OID 18141739)
+--
+-- Name: snippet_version_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('snippet_version_pk_seq', 100662, 't');
+
+--
+-- TOC Entry ID 127 (OID 18142132)
+--
+-- Name: support_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_pk_seq', 109672, 't');
+
+--
+-- TOC Entry ID 129 (OID 18142196)
+--
+-- Name: support_canned_responses_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_canned_responses_pk_seq', 100088, 't');
+
+--
+-- TOC Entry ID 131 (OID 18142247)
+--
+-- Name: support_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_category_pk_seq', 10699, 't');
+
+--
+-- TOC Entry ID 133 (OID 18142298)
+--
+-- Name: support_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_history_pk_seq', 24027, 't');
+
+--
+-- TOC Entry ID 135 (OID 18142354)
+--
+-- Name: support_messages_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_messages_pk_seq', 122077, 't');
+
+--
+-- TOC Entry ID 137 (OID 18142407)
+--
+-- Name: support_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('support_status_pk_seq', 3, 't');
+
+--
+-- TOC Entry ID 139 (OID 18142455)
+--
+-- Name: supported_languages_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('supported_languages_pk_seq', 21, 't');
+
+--
+-- TOC Entry ID 141 (OID 18142506)
+--
+-- Name: survey_question_types_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('survey_question_types_pk_seq', 100, 't');
+
+--
+-- TOC Entry ID 143 (OID 18142555)
+--
+-- Name: survey_questions_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('survey_questions_pk_seq', 14662, 't');
+
+--
+-- TOC Entry ID 145 (OID 18142680)
+--
+-- Name: surveys_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('surveys_pk_seq', 11185, 't');
+
+--
+-- TOC Entry ID 147 (OID 18142735)
+--
+-- Name: system_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('system_history_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 149 (OID 18142787)
+--
+-- Name: system_machines_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('system_machines_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 151 (OID 18142836)
+--
+-- Name: system_news_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('system_news_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 153 (OID 18142895)
+--
+-- Name: system_services_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('system_services_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 155 (OID 18142944)
+--
+-- Name: system_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('system_status_pk_seq', 1, 'f');
+
+--
+-- TOC Entry ID 157 (OID 18143020)
+--
+-- Name: themes_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('themes_pk_seq', 2, 't');
+
+--
+-- TOC Entry ID 159 (OID 18143113)
+--
+-- Name: trove_cat_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('trove_cat_pk_seq', 281, 't');
+
+--
+-- TOC Entry ID 161 (OID 18143176)
+--
+-- Name: trove_group_link_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('trove_group_link_pk_seq', 111628, 't');
+
+--
+-- TOC Entry ID 163 (OID 18143216)
+--
+-- Name: trove_treesums_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('trove_treesums_pk_seq', 765, 't');
+
+--
+-- TOC Entry ID 165 (OID 18143286)
+--
+-- Name: user_bookmarks_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_bookmarks_pk_seq', 23482, 't');
+
+--
+-- TOC Entry ID 167 (OID 18143337)
+--
+-- Name: user_diary_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_diary_pk_seq', 892, 't');
+
+--
+-- TOC Entry ID 169 (OID 18143392)
+--
+-- Name: user_diary_monitor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_diary_monitor_pk_seq', 521, 't');
+
+--
+-- TOC Entry ID 171 (OID 18143428)
+--
+-- Name: user_group_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_group_pk_seq', 27204, 't');
+
+--
+-- TOC Entry ID 173 (OID 18143484)
+--
+-- Name: user_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_metric_pk_seq', 115, 't');
+
+--
+-- TOC Entry ID 175 (OID 18143530)
+--
+-- Name: user_metric0_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('user_metric0_pk_seq', 5, 't');
+
+--
+-- TOC Entry ID 177 (OID 18143608)
+--
+-- Name: users_pk_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('users_pk_seq', 120800, 't');
+
+--
+-- TOC Entry ID 179 (OID 27311232)
+--
+-- Name: unix_uid_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('unix_uid_seq', 21044, 't');
+
+--
+-- TOC Entry ID 181 (OID 27311250)
+--
+-- Name: forum_thread_seq Type: SEQUENCE SET Owner:
+--
+
+-- SELECT setval ('forum_thread_seq', 59698, 't');
+
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/database-oci8.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/database-oci8.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/database-oci8.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,509 @@
+<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id$
+//
+
+/*
+
+ This is the Oracle 8 version of our
+ database connection/querying layer.
+
+ It has been seriously overhauled and tested to create
+ this working version by our friends at http://www.pssonline.com.
+
+*/
+
+
+$sys_db_oci_commit_mode=OCI_COMMIT_ON_SUCCESS;
+
+/**
+ *
+ * Connect to the database
+ * Notice the global vars that must be set up
+ * Sets up a global $conn variable which is used
+ * in other functions in this library
+ *
+ */
+
+function db_connect() {
+ global $sys_dbhost,$sys_dbuser,$sys_dbpasswd,$conn,$sys_dbname;
+ $conn = ocilogon($sys_dbuser,$sys_dbpasswd,$sys_dbname);
+}
+
+/**
+ *
+ * Does any preprocessing require on the sql to convert to ORACLE sql syntax
+ *
+ */
+
+function db_query_preprocess($qstring) {
+ $qstring = db_replace_words($qstring);
+ $qstring = db_convert_outer_joins($qstring);
+ $qstring = db_convert_nextvals($qstring);
+ return $qstring;
+}
+
+/**
+ *
+ * Replaces oracle reserved words with sf_[reserved_word]
+ *
+ */
+
+function db_replace_words($qstring) {
+ /* replace oracle reserved words in $qstring with sf_[reserved_word] */
+ $qstring = str_replace('session ','sf_session ',$qstring);
+ $qstring = str_replace('session.','sf_session.',$qstring);
+ $qstring = str_replace('session,','sf_session,',$qstring);
+ $qstring = str_replace('.date','.sf_date',$qstring);
+ $qstring = str_replace(',date ',',sf_date ',$qstring);
+ $qstring = str_replace(',date,',',sf_date,',$qstring);
+ $qstring = str_replace(' date ',' sf_date ',$qstring);
+ $qstring = str_replace(';','',$qstring); // a semicolon at end of oci sql causes errors
+ return $qstring;
+}
+
+
+/**
+ *
+ * Replaces "SELECT nexval('sequence_name')" with "SELECT sequence_name.nextval FROM dual"
+ *
+ */
+
+function db_convert_nextvals($qstring) {
+ if (stristr($qstring,'nextval')) {
+ $seq_array = explode("'",$qstring);
+ $qstring = "SELECT " . $seq_array[1] . ".nextval FROM dual";
+ }
+ return $qstring;
+}
+
+/*
+How are ANSI SQL outer joins migrated to Oracle outer joins?
+Outer joins may not be converted correctly.
+
+Convert an ANSI SQL inner join to an Oracle join as illustrated in the following code example:
+select * from a inner join b on a.col1=b.col2;
+select * from a , b where a.col1=b.col2;
+Convert a left join and right join in ANSI SQL to Oracle as indicated below:
+select * from a left join b on a.col1=b.col2;
+// remember the table to the right of left join and add (+) to it's columns.
+select * from a, b where a.col1=b.col2(+);
+select * from a right join b on a.col1=b.col2;
+// remember the table to the left of right join and add (+) to it's columns.
+select * from a, b where a.col1(+)=b.col2;
+
+How can I convert full outer joins from ANSI SQL Server to Oracle?
+There are several ways to express a full outer join within Oracle.
+For example, in the following query the predicate a.col1 (+) = b.col1 (+)
+is pseudo-Oracle notation for a full outer join although this predicate
+is not currently supported in Oracle:
+
+select a.col2 acol2, a.col1 acol1, b.col1 bcol1, b.col2 bcol2
+from a,b where a.col1 (+) = b.col1 (+);
+The most efficient way of executing this query is to use a UNION ALL of
+a left outer join and a right outer join, with an additional predicate,
+as illustrated below:
+select a.col2 acol2, a.col1 acol1, b.col1 bcol1, b.col2 bcol2
+from a,b where a.col1=b.col1(+)
+union all
+select a.col2 acol2, a.col1 acol1, b.col1 bcol1, b.col2 bcol2
+from a,b where a.col1(+)=b.col1 and a.col1 is null;
+*/
+
+/*
+ Right now, only "LEFT JOIN" and "RIGHT JOIN" syntax are converted.
+ And it has only been tested on the sql statements found in
+ SourceForge version 2.5. It may need to be modified for future
+ syntax variances.
+*/
+
+function db_convert_outer_joins($qstring) {
+ if ( stristr($qstring,"SELECT") && stristr($qstring,"JOIN") ) {
+ $select = substr($qstring,0,strpos(strtoupper($qstring),"FROM")-1);
+ $from = stristr($qstring,"FROM");
+ $from = substr($from,0,strpos(strtoupper($from),"WHERE")-1);
+ if (stristr($qstring,"GROUP BY")) {
+ $where = stristr($qstring,"WHERE");
+ $where = substr($where,0,strpos(strtoupper($where),"GROUP BY")-1);
+ $group_order = stristr($qstring,"GROUP BY");
+ }
+ else if (stristr($qstring,"ORDER BY")) {
+ $where = stristr($qstring,"WHERE");
+ $where = substr($where,0,strpos(strtoupper($where),"ORDER BY")-1);
+ $group_order = stristr($qstring,"ORDER BY");
+ }
+ else {
+ $where = stristr($qstring,"WHERE");
+ }
+ // loop through each TABLE [ALIAS] in the from clause
+ $from_array = explode(",",substr($from,strlen("FROM ")));
+ $from = "FROM ";
+ for ($i=0; $i<count($from_array); $i++) {
+ if ( stristr($from_array[$i],"JOIN") ) {
+ if ( stristr($from_array[$i],"LEFT") ) {
+ $join_str = "LEFT JOIN";
+ $left_join = true;
+ }
+ else if ( stristr($from_array[$i],"RIGHT") ) {
+ $join_str = "RIGHT JOIN";
+ $left_join = false;
+ }
+ $left_table = trim(substr($from_array[$i],0,strpos(strtoupper($from_array[$i]),$join_str)));
+ $right_table = substr(stristr($from_array[$i],$join_str),strlen($join_str));
+ $right_table = trim(substr($right_table,0,strpos(strtoupper($right_table),"USING")));
+ $from = $from . $left_table . ', ' . $right_table;
+ $left_table_alias = strrchr(trim($left_table),' ');
+ $right_table_alias = strrchr(trim($right_table),' ');
+ if ( strlen($left_table_alias) == 0 ) {
+ $left_table_alias = $left_table;
+ }
+ else {
+ $left_table = strchr(trim($left_table),' ');
+ }
+ if ( strlen($right_table_alias) == 0 ) {
+ $right_table_alias = $right_table;
+ }
+ else {
+ $right_table = strrchr(trim($right_table),' ');
+ }
+ $using_column = trim(substr(stristr($from_array[$i],"USING"),strlen("USING")));
+ $using_column = substr($using_column,1,-1); // strip parens
+ if ( $left_join ) {
+ $where = $where . "\nAND " .
+ $left_table_alias . '.' . $using_column . ' = ' .
+ $right_table_alias . '.' . $using_column . ' (+) ';
+ }
+ else {
+ $where = $where . "\nAND " .
+ $left_table_alias . '.' . $using_column . ' (+) = ' .
+ $right_table_alias . '.' . $using_column . ' ';
+ }
+ }
+ else {
+ $from = $from . $from_array[$i] . ' ';
+ }
+ }
+ return $select.' '.$from.' '.$where.' '.$group_order;
+ }
+ else {
+ return $qstring;
+ }
+
+}
+
+/**
+ *
+ * Query the database
+ *
+ * @param qstring - SQL statement
+ * @param limit - how many rows do you want returned
+ * @param offset - of matching rows, return only rows starting here
+ *
+ *
+ * NOTE - the oci version of this may be somewhat inefficient
+ * for large result sets (hundreds or thousands of rows selected)
+ * However - most queries are returning 25-50 rows
+ *
+ */
+
+function db_query($qstring,$limit='-1',$offset=0) {
+
+ global $QUERY_COUNT,$conn,$sys_db_oci_commit_mode,
+ $sys_db_results,$sys_db_row_pointer,$sys_db_fieldnames;
+
+ $QUERY_COUNT++;
+
+ $qstring = db_query_preprocess($qstring);
+
+ $stmt=ociparse($conn,$qstring);
+
+ if (!$stmt) {
+ echo $qstring.'<br>';
+ return 0;
+ } else {
+
+ if ($limit > 0) {
+ if (!$offset || $offset < 0) {
+ $offset=0;
+ }
+ }
+
+ $res = ociexecute($stmt,$sys_db_oci_commit_mode);
+
+ if ( !$res ) {
+ echo $qstring.'<br>';
+ return 0;
+ }
+ else if ( strcmp(ocistatementtype($stmt),"SELECT")==0 ) {
+
+ //store fieldnames for use in db_fieldname and db_numfields
+ for ($i=0;$i<ocinumcols($stmt);$i++) {
+ $sys_db_fieldnames[$stmt][$i] = ocicolumnname($stmt,$i+1);
+ }
+
+ //if offset, seek to starting point
+ //potentially expensive if large offset
+ //however there is no data_seek feature AFAICT
+ $more_data=true;
+ if ($offset > 0) {
+ for ($i=0; $i<$offset; $i++) {
+ //burn them off
+ if (!ocifetchinto($stmt,$res)) {
+ //if no data be returned
+ //get out of loop
+ $more_data=false;
+ break;
+ }
+ }
+ }
+
+ //store the data into $sys_db_results[$stmt]
+ //this is needed since there is the possiblity of calling
+ //db_result($qhandle,$row,$field) with any $row value
+ //db_result and db_fetch_array could be rewritten to
+ //eliminate the need for fetching all of the data up front
+ $row=0;
+ while ($more_data) {
+ $more = ocifetchinto($stmt,$res,OCI_RETURN_NULLS+OCI_RETURN_LOBS);
+
+ //see if data is being returned && we are
+ //still within the requested $limit
+ if ( !$more || (($limit >= 0) && ($row >= $limit))) {
+ $more_data=false;
+ }
+ else {
+ //populate sys_db_results with an array that can be indexed
+ //by field number or field name
+ for ($col=0;$col<db_numfields($stmt);$col++) {
+ $sys_db_results[$stmt][$row][$col] = $res[$col];
+ $fieldname = strtolower($sys_db_fieldnames[$stmt][$col]);
+ $sys_db_results[$stmt][$row][$fieldname] = $res[$col];
+ }
+ }
+ $row++;
+ }
+ $sys_db_row_pointer[$stmt]=0;
+ return $stmt;
+
+ }
+ else {
+ return $stmt;
+ }
+ }
+}
+
+/**
+ * db_begin()
+ *
+ * begin a transaction
+ */
+function db_begin() {
+ global $sys_db_oci_commit_mode;
+ $sys_db_oci_commit_mode=OCI_DEFAULT;
+}
+
+/**
+ * db_commit()
+ *
+ * commit a transaction
+ */
+function db_commit() {
+ global $sys_db_oci_commit_mode,$conn;
+ $sys_db_oci_commit_mode=OCI_COMMIT_ON_SUCCESS;
+ return ocicommit($conn);
+}
+
+/**
+ * db_rollback()
+ *
+ * rollback a transaction
+ */
+function db_rollback() {
+ global $sys_db_oci_commit_mode,$conn;
+ $sys_db_oci_commit_mode=OCI_COMMIT_ON_SUCCESS;
+ return ocirollback($conn);
+}
+
+/**
+ *
+ * Returns the number of rows in this result set
+ *
+ * param qhandle query result set handle
+ *
+ */
+function db_numrows($qhandle) {
+ global $sys_db_results;
+ // return only if qhandle exists, otherwise 0
+ if ($qhandle) {
+ return count($sys_db_results[$qhandle]);
+ } else {
+ return 0;
+ }
+}
+
+/**
+ *
+ * Frees a database result properly
+ *
+ * param qhandle query result set handle
+ *
+ */
+
+function db_free_result($qhandle) {
+ global $sys_db_results;
+ if ($qhandle) {
+ unset($sys_db_results[$qhandle]);
+ unset($sys_db_row_pointer[$qhandle]);
+ unset($sys_db_fieldnames[$qhandle]);
+ return ocifreestatement($qhandle);
+ }
+ else {
+ return true;
+ }
+}
+
+/**
+ *
+ * Reset is useful for db_fetch_array
+ * sometimes you need to start over
+ *
+ * param qhandle query result set handle
+ * param row - integer row number
+ *
+ */
+
+function db_reset_result($qhandle,$row=0) {
+ global $sys_db_row_pointer;
+ return $sys_db_row_pointer[$qhandle]=$row;
+}
+
+/**
+ *
+ * Returns a field from a result set
+ *
+ * param qhandle query result set handle
+ * param row - integer row number
+ * param field - text field name
+ *
+ */
+
+function db_result($qhandle,$row,$field) {
+ global $sys_db_results;
+ return $sys_db_results[$qhandle][$row][$field];
+}
+
+/**
+ *
+ * Returns the number of fields in this result set
+ *
+ * param qhandle query result set handle
+ *
+ */
+
+function db_numfields($qhandle) {
+ global $sys_db_fieldnames;
+ // return only if qhandle exists, otherwise 0
+ if ( $qhandle ) {
+ return count($sys_db_fieldnames[$qhandle]);
+ } else {
+ return 0;
+ }
+}
+
+/**
+ *
+ * Returns the number of rows changed in the last query
+ *
+ * param qhandle - query result set handle
+ * param fnumber - column number
+ *
+ */
+
+function db_fieldname($lhandle,$fnumber) {
+ global $sys_db_fieldnames;
+ return $sys_db_fieldnames[$lhandle][$fnumber];
+}
+
+/**
+ *
+ * Returns the number of rows changed in the last query
+ *
+ * param qhandle query result set handle
+ *
+ */
+
+function db_affected_rows($qhandle) {
+ return ocirowcount($qhandle);
+}
+
+/**
+ *
+ * Returns an associative array from
+ * the current row of this database result
+ * Use db_reset_result to seek a particular row
+ *
+ * param qhandle query result set handle
+ *
+ */
+
+function db_fetch_array($qhandle) {
+ global $sys_db_results,$sys_db_row_pointer;
+ if ($sys_db_row_pointer[$qhandle] < db_numrows($qhandle)) {
+ $result = $sys_db_results[$qhandle][$sys_db_row_pointer[$qhandle]];
+ $sys_db_row_pointer[$qhandle]++;
+ return $result;
+ }
+ else {
+ return false;
+ }
+}
+
+/**
+ *
+ * Returns the last primary key from an insert
+ *
+ * param qhandle query result set handle
+ * param table_name is the name of the table you inserted into
+ * param pkey_field_name is the field name of the primary key
+ *
+ */
+
+function db_insertid($qhandle,$table_name,$pkey_field_name) {
+ $qstring = db_query_preprocess("SELECT max($pkey_field_name) AS id FROM $table_name");
+ $res=db_query($qstring);
+ if ($res && (db_numrows($res) > 0) ) {
+ return db_result($res,0,0);
+ } else {
+ return 0;
+ }
+}
+
+/**
+ *
+ * Returns the last error from the database
+ *
+ */
+
+function db_error() {
+ global $conn,$stmt;
+ if ($stmt) {
+ $err= ocierror($stmt);
+ }
+ else if ($conn) {
+ $err= ocierror($conn);
+ }
+ else {
+ $err= ocierror();
+ }
+ if ($err) {
+ return $err['message'];
+ } else {
+ return false;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/trove_defaults.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/trove_defaults.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/pssonline/trove_defaults.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,280 @@
+# MySQL dump 8.8
+#
+# Host: localhost Database: alexandria
+#--------------------------------------------------------
+# Server version 3.23.22-beta
+
+#
+# Dumping data for table 'trove_cat'
+#
+
+INSERT INTO trove_cat VALUES (1,2000031601,0,0,'audience','Intended Audience','The main class of people likely to be interested in this resource.',0,0,'Intended Audience','1');
+INSERT INTO trove_cat VALUES (2,2000032401,1,1,'endusers','End Users/Desktop','Programs and resources for software end users. Software for the desktop.',0,0,'Intended Audience :: End Users/Desktop','1 :: 2');
+INSERT INTO trove_cat VALUES (3,2000041101,1,1,'developers','Developers','Programs and resources for software developers, to include libraries.',0,0,'Intended Audience :: Developers','1 :: 3');
+INSERT INTO trove_cat VALUES (4,2000031601,1,1,'sysadmins','System Administrators','Programs and resources for people who administer computers and networks.',0,0,'Intended Audience :: System Administrators','1 :: 4');
+INSERT INTO trove_cat VALUES (5,2000040701,1,1,'other','Other Audience','Programs and resources for an unlisted audience.',0,0,'Intended Audience :: Other Audience','1 :: 5');
+INSERT INTO trove_cat VALUES (6,2000031601,0,0,'developmentstatus','Development Status','An indication of the development status of the software or resource.',0,0,'Development Status','6');
+INSERT INTO trove_cat VALUES (7,2000040701,6,6,'planning','1 - Planning','This resource is in the planning stages only. There is no code.',0,0,'Development Status :: 1 - Planning','6 :: 7');
+INSERT INTO trove_cat VALUES (8,2000040701,6,6,'prealpha','2 - Pre-Alpha','There is code for this project, but it is not usable except for further development.',0,0,'Development Status :: 2 - Pre-Alpha','6 :: 8');
+INSERT INTO trove_cat VALUES (9,2000041101,6,6,'alpha','3 - Alpha','Resource is in early development, and probably incomplete and/or extremely buggy.',0,0,'Development Status :: 3 - Alpha','6 :: 9');
+INSERT INTO trove_cat VALUES (10,2000040701,6,6,'beta','4 - Beta','Resource is in late phases of development. Deliverables are essentially complete, but may still have significant bugs.',0,0,'Development Status :: 4 - Beta','6 :: 10');
+INSERT INTO trove_cat VALUES (11,2000040701,6,6,'production','5 - Production/Stable','Deliverables are complete and usable by the intended audience.',0,0,'Development Status :: 5 - Production/Stable','6 :: 11');
+INSERT INTO trove_cat VALUES (12,2000040701,6,6,'mature','6 - Mature','This resource has an extensive history of successful use and has probably undergone several stable revisions.',0,0,'Development Status :: 6 - Mature','6 :: 12');
+INSERT INTO trove_cat VALUES (13,2000031601,0,0,'license','License','License terms under which the resource is distributed.',0,0,'License','13');
+INSERT INTO trove_cat VALUES (14,2000032401,13,13,'osi','OSI Approved','Licenses that have been approved by OSI as approved',0,0,'License :: OSI Approved','13 :: 14');
+INSERT INTO trove_cat VALUES (15,2000032001,14,13,'gpl','GNU General Public License (GPL)','GNU General Public License.',0,0,'License :: OSI Approved :: GNU General Public License (GPL)','13 :: 14 :: 15');
+INSERT INTO trove_cat VALUES (16,2000050801,14,13,'lgpl','GNU Lesser General Public License (LGPL)','GNU Lesser General Public License',0,0,'License :: OSI Approved :: GNU Lesser General Public License (LGPL)','13 :: 14 :: 16');
+INSERT INTO trove_cat VALUES (17,2000032001,14,13,'artistic','Artistic License','The Perl Artistic License',0,0,'License :: OSI Approved :: Artistic License','13 :: 14 :: 17');
+INSERT INTO trove_cat VALUES (18,2000031601,0,0,'topic','Topic','Topic categorization.',0,0,'Topic','18');
+INSERT INTO trove_cat VALUES (19,2000032001,136,18,'archiving','Archiving','Tools for maintaining and searching software or document archives.',0,0,'Topic :: System :: Archiving','18 :: 136 :: 19');
+INSERT INTO trove_cat VALUES (20,2000032401,18,18,'communications','Communications','Programs intended to facilitate communication between people.',0,0,'Topic :: Communications','18 :: 20');
+INSERT INTO trove_cat VALUES (21,2000031601,20,18,'bbs','BBS','Bulletin Board systems.',0,0,'Topic :: Communications :: BBS','18 :: 20 :: 21');
+INSERT INTO trove_cat VALUES (22,2000031601,20,18,'chat','Chat','Programs to support real-time communication over the Internet.',0,0,'Topic :: Communications :: Chat','18 :: 20 :: 22');
+INSERT INTO trove_cat VALUES (23,2000031601,22,18,'icq','ICQ','Programs to support ICQ.',0,0,'Topic :: Communications :: Chat :: ICQ','18 :: 20 :: 22 :: 23');
+INSERT INTO trove_cat VALUES (24,2000041101,22,18,'irc','Internet Relay Chat','Programs to support Internet Relay Chat.',0,0,'Topic :: Communications :: Chat :: Internet Relay Chat','18 :: 20 :: 22 :: 24');
+INSERT INTO trove_cat VALUES (25,2000031601,22,18,'talk','Unix Talk','Programs to support Unix Talk protocol.',0,0,'Topic :: Communications :: Chat :: Unix Talk','18 :: 20 :: 22 :: 25');
+INSERT INTO trove_cat VALUES (26,2000031601,22,18,'aim','AOL Instant Messanger','Programs to support AOL Instant Messanger.',0,0,'Topic :: Communications :: Chat :: AOL Instant Messanger','18 :: 20 :: 22 :: 26');
+INSERT INTO trove_cat VALUES (27,2000031601,20,18,'conferencing','Conferencing','Software to support real-time conferencing over the Internet.',0,0,'Topic :: Communications :: Conferencing','18 :: 20 :: 27');
+INSERT INTO trove_cat VALUES (28,2000031601,20,18,'email','Email','Programs for sending, processing, and handling electronic mail.',0,0,'Topic :: Communications :: Email','18 :: 20 :: 28');
+INSERT INTO trove_cat VALUES (29,2000031601,28,18,'filters','Filters','Content-driven filters and dispatchers for Email.',0,0,'Topic :: Communications :: Email :: Filters','18 :: 20 :: 28 :: 29');
+INSERT INTO trove_cat VALUES (30,2000031601,28,18,'listservers','Mailing List Servers','Tools for managing electronic mailing lists.',0,0,'Topic :: Communications :: Email :: Mailing List Servers','18 :: 20 :: 28 :: 30');
+INSERT INTO trove_cat VALUES (31,2000031601,28,18,'mua','Email Clients (MUA)','Programs for interactively reading and sending Email.',0,0,'Topic :: Communications :: Email :: Email Clients (MUA)','18 :: 20 :: 28 :: 31');
+INSERT INTO trove_cat VALUES (32,2000031601,28,18,'mta','Mail Transport Agents','Email transport and gatewaying software.',0,0,'Topic :: Communications :: Email :: Mail Transport Agents','18 :: 20 :: 28 :: 32');
+INSERT INTO trove_cat VALUES (33,2000031601,28,18,'postoffice','Post-Office','Programs to support post-office protocols, including POP and IMAP.',0,0,'Topic :: Communications :: Email :: Post-Office','18 :: 20 :: 28 :: 33');
+INSERT INTO trove_cat VALUES (34,2000031601,33,18,'pop3','POP3','Programs to support POP3 (Post-Office Protocol, version 3).',0,0,'Topic :: Communications :: Email :: Post-Office :: POP3','18 :: 20 :: 28 :: 33 :: 34');
+INSERT INTO trove_cat VALUES (35,2000031601,33,18,'imap','IMAP','Programs to support IMAP protocol (Internet Message Access Protocol).',0,0,'Topic :: Communications :: Email :: Post-Office :: IMAP','18 :: 20 :: 28 :: 33 :: 35');
+INSERT INTO trove_cat VALUES (36,2000031601,20,18,'fax','Fax','Tools for sending and receiving facsimile messages.',0,0,'Topic :: Communications :: Fax','18 :: 20 :: 36');
+INSERT INTO trove_cat VALUES (37,2000031601,20,18,'fido','FIDO','Tools for FIDOnet mail and echoes.',0,0,'Topic :: Communications :: FIDO','18 :: 20 :: 37');
+INSERT INTO trove_cat VALUES (38,2000031601,20,18,'hamradio','Ham Radio','Tools and resources for amateur radio.',0,0,'Topic :: Communications :: Ham Radio','18 :: 20 :: 38');
+INSERT INTO trove_cat VALUES (39,2000031601,20,18,'usenet','Usenet News','Software to support USENET news.',0,0,'Topic :: Communications :: Usenet News','18 :: 20 :: 39');
+INSERT INTO trove_cat VALUES (40,2000031601,20,18,'internetphone','Internet Phone','Software to support real-time speech communication over the Internet.',0,0,'Topic :: Communications :: Internet Phone','18 :: 20 :: 40');
+INSERT INTO trove_cat VALUES (41,2000031601,19,18,'packaging','Packaging','Tools for packing and unpacking multi-file formats. Includes data-only formats and software package systems.',0,0,'Topic :: System :: Archiving :: Packaging','18 :: 136 :: 19 :: 41');
+INSERT INTO trove_cat VALUES (42,2000031601,19,18,'compression','Compression','Tools and libraries for data compression.',0,0,'Topic :: System :: Archiving :: Compression','18 :: 136 :: 19 :: 42');
+INSERT INTO trove_cat VALUES (43,2000031601,18,18,'security','Security','Security-related software, to include system administration and cryptography.',0,0,'Topic :: Security','18 :: 43');
+INSERT INTO trove_cat VALUES (44,2000031601,43,18,'cryptography','Cryptography','Cryptography programs, algorithms, and libraries.',0,0,'Topic :: Security :: Cryptography','18 :: 43 :: 44');
+INSERT INTO trove_cat VALUES (45,2000031601,18,18,'development','Software Development','Software used to aid software development.',0,0,'Topic :: Software Development','18 :: 45');
+INSERT INTO trove_cat VALUES (46,2000031601,45,18,'build','Build Tools','Software for the build process.',0,0,'Topic :: Software Development :: Build Tools','18 :: 45 :: 46');
+INSERT INTO trove_cat VALUES (47,2000031601,45,18,'debuggers','Debuggers','Programs for controlling and monitoring the execution of compiled binaries.',0,0,'Topic :: Software Development :: Debuggers','18 :: 45 :: 47');
+INSERT INTO trove_cat VALUES (48,2000031601,45,18,'compilers','Compilers','Programs for compiling high-level languges into machine code.',0,0,'Topic :: Software Development :: Compilers','18 :: 45 :: 48');
+INSERT INTO trove_cat VALUES (49,2000031601,45,18,'interpreters','Interpreters','Programs for interpreting and executing high-level languages directly.',0,0,'Topic :: Software Development :: Interpreters','18 :: 45 :: 49');
+INSERT INTO trove_cat VALUES (50,2000031601,45,18,'objectbrokering','Object Brokering','Object brokering libraries and tools.',0,0,'Topic :: Software Development :: Object Brokering','18 :: 45 :: 50');
+INSERT INTO trove_cat VALUES (51,2000031601,50,18,'corba','CORBA','Tools for implementation and use of CORBA.',0,0,'Topic :: Software Development :: Object Brokering :: CORBA','18 :: 45 :: 50 :: 51');
+INSERT INTO trove_cat VALUES (52,2000031601,45,18,'versioncontrol','Version Control','Tools for managing multiple versions of evolving sources or documents.',0,0,'Topic :: Software Development :: Version Control','18 :: 45 :: 52');
+INSERT INTO trove_cat VALUES (53,2000031601,52,18,'cvs','CVS','Tools for CVS (Concurrent Versioning System).',0,0,'Topic :: Software Development :: Version Control :: CVS','18 :: 45 :: 52 :: 53');
+INSERT INTO trove_cat VALUES (54,2000031601,52,18,'rcs','RCS','Tools for RCS (Revision Control System).',0,0,'Topic :: Software Development :: Version Control :: RCS','18 :: 45 :: 52 :: 54');
+INSERT INTO trove_cat VALUES (55,2000031601,18,18,'desktop','Desktop Environment','Accessories, managers, and utilities for your GUI desktop.',0,0,'Topic :: Desktop Environment','18 :: 55');
+INSERT INTO trove_cat VALUES (56,2000031601,55,18,'windowmanagers','Window Managers','Programs that provide window control and application launching.',0,0,'Topic :: Desktop Environment :: Window Managers','18 :: 55 :: 56');
+INSERT INTO trove_cat VALUES (57,2000031601,55,18,'kde','K Desktop Environment (KDE)','Software for the KDE desktop.',0,0,'Topic :: Desktop Environment :: K Desktop Environment (KDE)','18 :: 55 :: 57');
+INSERT INTO trove_cat VALUES (58,2000031601,55,18,'gnome','Gnome','Software for the Gnome desktop.',0,0,'Topic :: Desktop Environment :: Gnome','18 :: 55 :: 58');
+INSERT INTO trove_cat VALUES (59,2000031601,56,18,'enlightenment','Enlightenment','Software for the Enlightenment window manager.',0,0,'Topic :: Desktop Environment :: Window Managers :: Enlightenment','18 :: 55 :: 56 :: 59');
+INSERT INTO trove_cat VALUES (60,2000031601,59,18,'themes','Themes','Themes for the Enlightenment window manager.',0,0,'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes','18 :: 55 :: 56 :: 59 :: 60');
+INSERT INTO trove_cat VALUES (61,2000031601,57,18,'themes','Themes','Themes for KDE.',0,0,'Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes','18 :: 55 :: 57 :: 61');
+INSERT INTO trove_cat VALUES (62,2000031601,55,18,'screensavers','Screen Savers','Screen savers and lockers.',0,0,'Topic :: Desktop Environment :: Screen Savers','18 :: 55 :: 62');
+INSERT INTO trove_cat VALUES (63,2000032001,18,18,'editors','Text Editors','Programs for editing code and documents.',0,0,'Topic :: Text Editors','18 :: 63');
+INSERT INTO trove_cat VALUES (64,2000031601,63,18,'emacs','Emacs','GNU Emacs and its imitators and tools.',0,0,'Topic :: Text Editors :: Emacs','18 :: 63 :: 64');
+INSERT INTO trove_cat VALUES (65,2000031601,63,18,'ide','Integrated Development Environments (IDE)','Complete editing environments for code, including cababilities such as compilation and code building assistance.',0,0,'Topic :: Text Editors :: Integrated Development Environments (IDE)','18 :: 63 :: 65');
+INSERT INTO trove_cat VALUES (66,2000031601,18,18,'database','Database','Front ends, engines, and tools for database work.',0,0,'Topic :: Database','18 :: 66');
+INSERT INTO trove_cat VALUES (67,2000031601,66,18,'engines','Database Engines/Servers','Programs that manage data and provide control via some query language.',0,0,'Topic :: Database :: Database Engines/Servers','18 :: 66 :: 67');
+INSERT INTO trove_cat VALUES (68,2000031601,66,18,'frontends','Front-Ends','Clients and front-ends for generating queries to database engines.',0,0,'Topic :: Database :: Front-Ends','18 :: 66 :: 68');
+INSERT INTO trove_cat VALUES (69,2000031601,63,18,'documentation','Documentation','Tools for the creation and use of documentation.',0,0,'Topic :: Text Editors :: Documentation','18 :: 63 :: 69');
+INSERT INTO trove_cat VALUES (70,2000031601,63,18,'wordprocessors','Word Processors','WYSIWYG word processors.',0,0,'Topic :: Text Editors :: Word Processors','18 :: 63 :: 70');
+INSERT INTO trove_cat VALUES (71,2000031601,18,18,'education','Education','Programs and tools for educating yourself or others.',0,0,'Topic :: Education','18 :: 71');
+INSERT INTO trove_cat VALUES (72,2000031601,71,18,'cai','Computer Aided Instruction (CAI)','Programs for authoring or using Computer Aided Instrution courses.',0,0,'Topic :: Education :: Computer Aided Instruction (CAI)','18 :: 71 :: 72');
+INSERT INTO trove_cat VALUES (73,2000031601,71,18,'testing','Testing','Tools for testing someone''s knowledge on a subject.',0,0,'Topic :: Education :: Testing','18 :: 71 :: 73');
+INSERT INTO trove_cat VALUES (74,2000042701,136,18,'emulators','Emulators','Emulations of foreign operating systme and machines.',0,0,'Topic :: System :: Emulators','18 :: 136 :: 74');
+INSERT INTO trove_cat VALUES (75,2000031701,129,18,'financial','Financial','Programs related to finance.',0,0,'Topic :: Office/Business :: Financial','18 :: 129 :: 75');
+INSERT INTO trove_cat VALUES (76,2000031601,75,18,'accounting','Accounting','Checkbook balancers and accounting programs.',0,0,'Topic :: Office/Business :: Financial :: Accounting','18 :: 129 :: 75 :: 76');
+INSERT INTO trove_cat VALUES (77,2000031601,75,18,'investment','Investment','Programs for assisting in financial investment.',0,0,'Topic :: Office/Business :: Financial :: Investment','18 :: 129 :: 75 :: 77');
+INSERT INTO trove_cat VALUES (78,2000031601,75,18,'spreadsheet','Spreadsheet','Spreadsheet applications.',0,0,'Topic :: Office/Business :: Financial :: Spreadsheet','18 :: 129 :: 75 :: 78');
+INSERT INTO trove_cat VALUES (79,2000031601,75,18,'pointofsale','Point-Of-Sale','Point-Of-Sale applications.',0,0,'Topic :: Office/Business :: Financial :: Point-Of-Sale','18 :: 129 :: 75 :: 79');
+INSERT INTO trove_cat VALUES (80,2000031601,18,18,'games','Games/Entertainment','Games and Entertainment software.',0,0,'Topic :: Games/Entertainment','18 :: 80');
+INSERT INTO trove_cat VALUES (81,2000031601,80,18,'realtimestrategy','Real Time Strategy','Real Time strategy games',0,0,'Topic :: Games/Entertainment :: Real Time Strategy','18 :: 80 :: 81');
+INSERT INTO trove_cat VALUES (82,2000031601,80,18,'firstpersonshooters','First Person Shooters','First Person Shooters.',0,0,'Topic :: Games/Entertainment :: First Person Shooters','18 :: 80 :: 82');
+INSERT INTO trove_cat VALUES (83,2000032401,80,18,'turnbasedstrategy','Turn Based Strategy','Turn Based Strategy',0,0,'Topic :: Games/Entertainment :: Turn Based Strategy','18 :: 80 :: 83');
+INSERT INTO trove_cat VALUES (84,2000031601,80,18,'rpg','Role-Playing','Role-Playing games',0,0,'Topic :: Games/Entertainment :: Role-Playing','18 :: 80 :: 84');
+INSERT INTO trove_cat VALUES (85,2000031601,80,18,'simulation','Simulation','Simulation games',0,0,'Topic :: Games/Entertainment :: Simulation','18 :: 80 :: 85');
+INSERT INTO trove_cat VALUES (86,2000031601,80,18,'mud','Multi-User Dungeons (MUD)','Massively-multiplayer text based games.',0,0,'Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)','18 :: 80 :: 86');
+INSERT INTO trove_cat VALUES (87,2000031601,18,18,'internet','Internet','Tools to assist human access to the Internet.',0,0,'Topic :: Internet','18 :: 87');
+INSERT INTO trove_cat VALUES (88,2000031601,87,18,'finger','Finger','The Finger protocol for getting information about users.',0,0,'Topic :: Internet :: Finger','18 :: 87 :: 88');
+INSERT INTO trove_cat VALUES (89,2000031601,87,18,'ftp','File Transfer Protocol (FTP)','Programs and tools for file transfer via FTP.',0,0,'Topic :: Internet :: File Transfer Protocol (FTP)','18 :: 87 :: 89');
+INSERT INTO trove_cat VALUES (90,2000031601,87,18,'www','WWW/HTTP','Programs and tools for the World Wide Web.',0,0,'Topic :: Internet :: WWW/HTTP','18 :: 87 :: 90');
+INSERT INTO trove_cat VALUES (91,2000031601,90,18,'browsers','Browsers','Web Browsers',0,0,'Topic :: Internet :: WWW/HTTP :: Browsers','18 :: 87 :: 90 :: 91');
+INSERT INTO trove_cat VALUES (92,2000031601,90,18,'dynamic','Dynamic Content','Common Gateway Interface scripting and server-side parsing.',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content','18 :: 87 :: 90 :: 92');
+INSERT INTO trove_cat VALUES (93,2000031601,90,18,'indexing','Indexing/Search','Indexing and search tools for the Web.',0,0,'Topic :: Internet :: WWW/HTTP :: Indexing/Search','18 :: 87 :: 90 :: 93');
+INSERT INTO trove_cat VALUES (94,2000031601,92,18,'counters','Page Counters','Scripts to count numbers of pageviews.',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters','18 :: 87 :: 90 :: 92 :: 94');
+INSERT INTO trove_cat VALUES (95,2000031601,92,18,'messageboards','Message Boards','Online message boards',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards','18 :: 87 :: 90 :: 92 :: 95');
+INSERT INTO trove_cat VALUES (96,2000031601,92,18,'cgi','CGI Tools/Libraries','Tools for the Common Gateway Interface',0,0,'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries','18 :: 87 :: 90 :: 92 :: 96');
+INSERT INTO trove_cat VALUES (97,2000042701,18,18,'scientific','Scientific/Engineering','Scientific applications, to include research, applied and pure mathematics and sciences.',0,0,'Topic :: Scientific/Engineering','18 :: 97');
+INSERT INTO trove_cat VALUES (98,2000031601,97,18,'mathematics','Mathematics','Software to support pure and applied mathematics.',0,0,'Topic :: Scientific/Engineering :: Mathematics','18 :: 97 :: 98');
+INSERT INTO trove_cat VALUES (99,2000031601,18,18,'multimedia','Multimedia','Graphics, sound, video, and multimedia.',0,0,'Topic :: Multimedia','18 :: 99');
+INSERT INTO trove_cat VALUES (100,2000031601,99,18,'graphics','Graphics','Tools and resources for computer graphics.',0,0,'Topic :: Multimedia :: Graphics','18 :: 99 :: 100');
+INSERT INTO trove_cat VALUES (101,2000031601,100,18,'capture','Capture','Support for scanners, cameras, and screen capture.',0,0,'Topic :: Multimedia :: Graphics :: Capture','18 :: 99 :: 100 :: 101');
+INSERT INTO trove_cat VALUES (102,2000031601,101,18,'scanners','Scanners','Support for graphic scanners.',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Scanners','18 :: 99 :: 100 :: 101 :: 102');
+INSERT INTO trove_cat VALUES (103,2000031601,101,18,'cameras','Digital Camera','Digital Camera',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Digital Camera','18 :: 99 :: 100 :: 101 :: 103');
+INSERT INTO trove_cat VALUES (104,2000031601,101,18,'screencapture','Screen Capture','Screen capture tools and processors.',0,0,'Topic :: Multimedia :: Graphics :: Capture :: Screen Capture','18 :: 99 :: 100 :: 101 :: 104');
+INSERT INTO trove_cat VALUES (105,2000031701,100,18,'conversion','Graphics Conversion','Programs which convert between graphics formats.',0,0,'Topic :: Multimedia :: Graphics :: Graphics Conversion','18 :: 99 :: 100 :: 105');
+INSERT INTO trove_cat VALUES (106,2000031701,100,18,'editors','Editors','Drawing, painting, and structured editing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors','18 :: 99 :: 100 :: 106');
+INSERT INTO trove_cat VALUES (107,2000031701,106,18,'vector','Vector-Based','Vector-Based drawing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors :: Vector-Based','18 :: 99 :: 100 :: 106 :: 107');
+INSERT INTO trove_cat VALUES (108,2000031701,106,18,'raster','Raster-Based','Raster/Bitmap based drawing programs.',0,0,'Topic :: Multimedia :: Graphics :: Editors :: Raster-Based','18 :: 99 :: 100 :: 106 :: 108');
+INSERT INTO trove_cat VALUES (109,2000031701,100,18,'3dmodeling','3D Modeling','Programs for working with 3D Models.',0,0,'Topic :: Multimedia :: Graphics :: 3D Modeling','18 :: 99 :: 100 :: 109');
+INSERT INTO trove_cat VALUES (110,2000031701,100,18,'3drendering','3D Rendering','Programs which render 3D models.',0,0,'Topic :: Multimedia :: Graphics :: 3D Rendering','18 :: 99 :: 100 :: 110');
+INSERT INTO trove_cat VALUES (111,2000031701,100,18,'presentation','Presentation','Tools for generating presentation graphics and slides.',0,0,'Topic :: Multimedia :: Graphics :: Presentation','18 :: 99 :: 100 :: 111');
+INSERT INTO trove_cat VALUES (112,2000031701,100,18,'viewers','Viewers','Programs that can display various graphics formats.',0,0,'Topic :: Multimedia :: Graphics :: Viewers','18 :: 99 :: 100 :: 112');
+INSERT INTO trove_cat VALUES (113,2000031701,99,18,'sound','Sound/Audio','Tools for generating, editing, analyzing, and playing sound.',0,0,'Topic :: Multimedia :: Sound/Audio','18 :: 99 :: 113');
+INSERT INTO trove_cat VALUES (114,2000031701,113,18,'analysis','Analysis','Sound analysis tools, to include frequency analysis.',0,0,'Topic :: Multimedia :: Sound/Audio :: Analysis','18 :: 99 :: 113 :: 114');
+INSERT INTO trove_cat VALUES (115,2000031701,113,18,'capture','Capture/Recording','Sound capture and recording.',0,0,'Topic :: Multimedia :: Sound/Audio :: Capture/Recording','18 :: 99 :: 113 :: 115');
+INSERT INTO trove_cat VALUES (116,2000031701,113,18,'cdaudio','CD Audio','Programs to play and manipulate audio CDs.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio','18 :: 99 :: 113 :: 116');
+INSERT INTO trove_cat VALUES (117,2000031701,116,18,'cdplay','CD Playing','CD Playing software, to include jukebox software.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing','18 :: 99 :: 113 :: 116 :: 117');
+INSERT INTO trove_cat VALUES (118,2000031701,116,18,'cdripping','CD Ripping','Software to convert CD Audio to other digital formats.',0,0,'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping','18 :: 99 :: 113 :: 116 :: 118');
+INSERT INTO trove_cat VALUES (119,2000031701,113,18,'conversion','Conversion','Programs to convert between audio formats.',0,0,'Topic :: Multimedia :: Sound/Audio :: Conversion','18 :: 99 :: 113 :: 119');
+INSERT INTO trove_cat VALUES (120,2000031701,113,18,'editors','Editors','Programs to edit/manipulate sound data.',0,0,'Topic :: Multimedia :: Sound/Audio :: Editors','18 :: 99 :: 113 :: 120');
+INSERT INTO trove_cat VALUES (121,2000031701,113,18,'mixers','Mixers','Programs to mix audio.',0,0,'Topic :: Multimedia :: Sound/Audio :: Mixers','18 :: 99 :: 113 :: 121');
+INSERT INTO trove_cat VALUES (122,2000031701,113,18,'players','Players','Programs to play audio files to a sound device.',0,0,'Topic :: Multimedia :: Sound/Audio :: Players','18 :: 99 :: 113 :: 122');
+INSERT INTO trove_cat VALUES (123,2000031701,122,18,'mp3','MP3','Programs to play MP3 audio files.',0,0,'Topic :: Multimedia :: Sound/Audio :: Players :: MP3','18 :: 99 :: 113 :: 122 :: 123');
+INSERT INTO trove_cat VALUES (124,2000031701,113,18,'speech','Speech','Speech manipulation and intepretation tools.',0,0,'Topic :: Multimedia :: Sound/Audio :: Speech','18 :: 99 :: 113 :: 124');
+INSERT INTO trove_cat VALUES (125,2000031701,99,18,'video','Video','Video capture, editing, and playback.',0,0,'Topic :: Multimedia :: Video','18 :: 99 :: 125');
+INSERT INTO trove_cat VALUES (126,2000031701,125,18,'capture','Capture','Video capture tools.',0,0,'Topic :: Multimedia :: Video :: Capture','18 :: 99 :: 125 :: 126');
+INSERT INTO trove_cat VALUES (127,2000031701,125,18,'conversion','Conversion','Programs which convert between video formats.',0,0,'Topic :: Multimedia :: Video :: Conversion','18 :: 99 :: 125 :: 127');
+INSERT INTO trove_cat VALUES (128,2000031701,125,18,'display','Display','Programs which display various video formats.',0,0,'Topic :: Multimedia :: Video :: Display','18 :: 99 :: 125 :: 128');
+INSERT INTO trove_cat VALUES (129,2000031701,18,18,'office','Office/Business','Software for assisting and organizing work at your desk.',0,0,'Topic :: Office/Business','18 :: 129');
+INSERT INTO trove_cat VALUES (130,2000031701,129,18,'scheduling','Scheduling','Projects for scheduling time, to include project management.',0,0,'Topic :: Office/Business :: Scheduling','18 :: 129 :: 130');
+INSERT INTO trove_cat VALUES (131,2000032001,129,18,'suites','Office Suites','Integrated office suites (word processing, presentation, spreadsheet, database, etc).',0,0,'Topic :: Office/Business :: Office Suites','18 :: 129 :: 131');
+INSERT INTO trove_cat VALUES (132,2000032001,18,18,'religion','Religion','Programs relating to religion and sacred texts.',0,0,'Topic :: Religion','18 :: 132');
+INSERT INTO trove_cat VALUES (133,2000032001,97,18,'ai','Artificial Intelligence','Artificial Intelligence.',0,0,'Topic :: Scientific/Engineering :: Artificial Intelligence','18 :: 97 :: 133');
+INSERT INTO trove_cat VALUES (134,2000032001,97,18,'astronomy','Astronomy','Software and tools related to astronomy.',0,0,'Topic :: Scientific/Engineering :: Astronomy','18 :: 97 :: 134');
+INSERT INTO trove_cat VALUES (135,2000032001,97,18,'visualization','Visualization','Software for scientific visualization.',0,0,'Topic :: Scientific/Engineering :: Visualization','18 :: 97 :: 135');
+INSERT INTO trove_cat VALUES (136,2000032001,18,18,'system','System','Operating system core and administration utilities.',0,0,'Topic :: System','18 :: 136');
+INSERT INTO trove_cat VALUES (137,2000032001,19,18,'backup','Backup','Programs to manage and sequence system backup.',0,0,'Topic :: System :: Archiving :: Backup','18 :: 136 :: 19 :: 137');
+INSERT INTO trove_cat VALUES (138,2000032001,136,18,'benchmark','Benchmark','Programs for benchmarking system performance.',0,0,'Topic :: System :: Benchmark','18 :: 136 :: 138');
+INSERT INTO trove_cat VALUES (139,2000032001,136,18,'boot','Boot','Programs for bootstrapping your OS.',0,0,'Topic :: System :: Boot','18 :: 136 :: 139');
+INSERT INTO trove_cat VALUES (140,2000032001,139,18,'init','Init','Init-time programs to start system services after boot.',0,0,'Topic :: System :: Boot :: Init','18 :: 136 :: 139 :: 140');
+INSERT INTO trove_cat VALUES (141,2000032001,136,18,'clustering','Clustering/Distributed Networks','Tools for automatically distributing computation across a network.',0,0,'Topic :: System :: Clustering/Distributed Networks','18 :: 136 :: 141');
+INSERT INTO trove_cat VALUES (142,2000032001,136,18,'filesystems','Filesystems','Support for creating, editing, reading, and writing file systems.',0,0,'Topic :: System :: Filesystems','18 :: 136 :: 142');
+INSERT INTO trove_cat VALUES (143,2000032001,144,18,'linux','Linux','The Linux kernel, patches, and modules.',0,0,'Topic :: System :: Operating System Kernels :: Linux','18 :: 136 :: 144 :: 143');
+INSERT INTO trove_cat VALUES (144,2000032001,136,18,'kernels','Operating System Kernels','OS Kernels, patches, modules, and tools.',0,0,'Topic :: System :: Operating System Kernels','18 :: 136 :: 144');
+INSERT INTO trove_cat VALUES (145,2000032001,144,18,'bsd','BSD','Code relating to any of the BSD kernels.',0,0,'Topic :: System :: Operating System Kernels :: BSD','18 :: 136 :: 144 :: 145');
+INSERT INTO trove_cat VALUES (146,2000032001,136,18,'hardware','Hardware','Tools for direct, non-kernel control and configuration of hardware.',0,0,'Topic :: System :: Hardware','18 :: 136 :: 146');
+INSERT INTO trove_cat VALUES (147,2000032001,136,18,'setup','Installation/Setup','Tools for installation and setup of the operating system and other programs.',0,0,'Topic :: System :: Installation/Setup','18 :: 136 :: 147');
+INSERT INTO trove_cat VALUES (148,2000032001,136,18,'logging','Logging','Utilities for clearing, rotating, and digesting system logs.',0,0,'Topic :: System :: Logging','18 :: 136 :: 148');
+INSERT INTO trove_cat VALUES (149,2000032001,87,18,'dns','Name Service (DNS)','Domain name system servers and utilities.',0,0,'Topic :: Internet :: Name Service (DNS)','18 :: 87 :: 149');
+INSERT INTO trove_cat VALUES (150,2000032001,136,18,'networking','Networking','Network configuration and administration.',0,0,'Topic :: System :: Networking','18 :: 136 :: 150');
+INSERT INTO trove_cat VALUES (151,2000032001,150,18,'firewalls','Firewalls','Firewalls and filtering systems.',0,0,'Topic :: System :: Networking :: Firewalls','18 :: 136 :: 150 :: 151');
+INSERT INTO trove_cat VALUES (152,2000032001,150,18,'monitoring','Monitoring','System monitoring, traffic analysis, and sniffers.',0,0,'Topic :: System :: Networking :: Monitoring','18 :: 136 :: 150 :: 152');
+INSERT INTO trove_cat VALUES (153,2000032001,136,18,'power','Power (UPS)','Code for communication with uninterruptible power supplies.',0,0,'Topic :: System :: Power (UPS)','18 :: 136 :: 153');
+INSERT INTO trove_cat VALUES (154,2000032001,18,18,'printing','Printing','Tools, daemons, and utilities for printer control.',0,0,'Topic :: Printing','18 :: 154');
+INSERT INTO trove_cat VALUES (155,2000032001,152,18,'watchdog','Hardware Watchdog','Software to monitor and perform actions or shutdown on hardware trouble detection.',0,0,'Topic :: System :: Networking :: Monitoring :: Hardware Watchdog','18 :: 136 :: 150 :: 152 :: 155');
+INSERT INTO trove_cat VALUES (156,2000032001,18,18,'terminals','Terminals','Terminal emulators, terminal programs, and terminal session utilities.',0,0,'Topic :: Terminals','18 :: 156');
+INSERT INTO trove_cat VALUES (157,2000032001,156,18,'serial','Serial','Dialup, terminal emulation, and file transfer over serial lines.',0,0,'Topic :: Terminals :: Serial','18 :: 156 :: 157');
+INSERT INTO trove_cat VALUES (158,2000032001,156,18,'virtual','Terminal Emulators/X Terminals','Programs to handle multiple terminal sessions. Includes terminal emulations for X and other window systems.',0,0,'Topic :: Terminals :: Terminal Emulators/X Terminals','18 :: 156 :: 158');
+INSERT INTO trove_cat VALUES (159,2000032001,156,18,'telnet','Telnet','Support for telnet; terminal sessions across Internet links.',0,0,'Topic :: Terminals :: Telnet','18 :: 156 :: 159');
+INSERT INTO trove_cat VALUES (160,2000032001,0,0,'language','Programming Language','Language in which this program was written, or was meant to support.',0,0,'Programming Language','160');
+INSERT INTO trove_cat VALUES (161,2000032001,160,160,'apl','APL','APL',0,0,'Programming Language :: APL','160 :: 161');
+INSERT INTO trove_cat VALUES (164,2000032001,160,160,'c','C','C',0,0,'Programming Language :: C','160 :: 164');
+INSERT INTO trove_cat VALUES (162,2000032001,160,160,'assembly','Assembly','Assembly-level programs. Platform specific.',0,0,'Programming Language :: Assembly','160 :: 162');
+INSERT INTO trove_cat VALUES (163,2000051001,160,160,'ada','Ada','Ada',0,0,'Programming Language :: Ada','160 :: 163');
+INSERT INTO trove_cat VALUES (165,2000032001,160,160,'cpp','C++','C++',0,0,'Programming Language :: C++','160 :: 165');
+INSERT INTO trove_cat VALUES (166,2000032401,160,160,'eiffel','Eiffel','Eiffel',0,0,'Programming Language :: Eiffel','160 :: 166');
+INSERT INTO trove_cat VALUES (167,2000032001,160,160,'euler','Euler','Euler',0,0,'Programming Language :: Euler','160 :: 167');
+INSERT INTO trove_cat VALUES (168,2000032001,160,160,'forth','Forth','Forth',0,0,'Programming Language :: Forth','160 :: 168');
+INSERT INTO trove_cat VALUES (169,2000032001,160,160,'fortran','Fortran','Fortran',0,0,'Programming Language :: Fortran','160 :: 169');
+INSERT INTO trove_cat VALUES (170,2000032001,160,160,'lisp','Lisp','Lisp',0,0,'Programming Language :: Lisp','160 :: 170');
+INSERT INTO trove_cat VALUES (171,2000041101,160,160,'logo','Logo','Logo',0,0,'Programming Language :: Logo','160 :: 171');
+INSERT INTO trove_cat VALUES (172,2000032001,160,160,'ml','ML','ML',0,0,'Programming Language :: ML','160 :: 172');
+INSERT INTO trove_cat VALUES (173,2000032001,160,160,'modula','Modula','Modula-2 or Modula-3',0,0,'Programming Language :: Modula','160 :: 173');
+INSERT INTO trove_cat VALUES (174,2000032001,160,160,'objectivec','Objective C','Objective C',0,0,'Programming Language :: Objective C','160 :: 174');
+INSERT INTO trove_cat VALUES (175,2000032001,160,160,'pascal','Pascal','Pascal',0,0,'Programming Language :: Pascal','160 :: 175');
+INSERT INTO trove_cat VALUES (176,2000032001,160,160,'perl','Perl','Perl',0,0,'Programming Language :: Perl','160 :: 176');
+INSERT INTO trove_cat VALUES (177,2000032001,160,160,'prolog','Prolog','Prolog',0,0,'Programming Language :: Prolog','160 :: 177');
+INSERT INTO trove_cat VALUES (178,2000032001,160,160,'python','Python','Python',0,0,'Programming Language :: Python','160 :: 178');
+INSERT INTO trove_cat VALUES (179,2000032001,160,160,'rexx','Rexx','Rexx',0,0,'Programming Language :: Rexx','160 :: 179');
+INSERT INTO trove_cat VALUES (180,2000032001,160,160,'simula','Simula','Simula',0,0,'Programming Language :: Simula','160 :: 180');
+INSERT INTO trove_cat VALUES (181,2000032001,160,160,'smalltalk','Smalltalk','Smalltalk',0,0,'Programming Language :: Smalltalk','160 :: 181');
+INSERT INTO trove_cat VALUES (182,2000032001,160,160,'tcl','Tcl','Tcl',0,0,'Programming Language :: Tcl','160 :: 182');
+INSERT INTO trove_cat VALUES (183,2000032001,160,160,'php','PHP','PHP',0,0,'Programming Language :: PHP','160 :: 183');
+INSERT INTO trove_cat VALUES (184,2000032001,160,160,'asp','ASP','Active Server Pages',0,0,'Programming Language :: ASP','160 :: 184');
+INSERT INTO trove_cat VALUES (185,2000032001,160,160,'shell','Unix Shell','Unix Shell',0,0,'Programming Language :: Unix Shell','160 :: 185');
+INSERT INTO trove_cat VALUES (186,2000032001,160,160,'visualbasic','Visual Basic','Visual Basic',0,0,'Programming Language :: Visual Basic','160 :: 186');
+INSERT INTO trove_cat VALUES (187,2000032001,14,13,'bsd','BSD License','BSD License',0,0,'License :: OSI Approved :: BSD License','13 :: 14 :: 187');
+INSERT INTO trove_cat VALUES (188,2000032001,14,13,'mit','MIT/X Consortium License','MIT License, also the X Consortium License.',0,0,'License :: OSI Approved :: MIT/X Consortium License','13 :: 14 :: 188');
+INSERT INTO trove_cat VALUES (189,2000032001,14,13,'mpl','Mozilla Public License (MPL)','Mozilla Public License (MPL)',0,0,'License :: OSI Approved :: Mozilla Public License (MPL)','13 :: 14 :: 189');
+INSERT INTO trove_cat VALUES (190,2000032001,14,13,'qpl','QT Public License (QPL)','QT Public License',0,0,'License :: OSI Approved :: QT Public License (QPL)','13 :: 14 :: 190');
+INSERT INTO trove_cat VALUES (191,2000032001,14,13,'ibm','IBM Public License','IBM Public License',0,0,'License :: OSI Approved :: IBM Public License','13 :: 14 :: 191');
+INSERT INTO trove_cat VALUES (192,2000032001,14,13,'cvw','MITRE Collaborative Virtual Workspace License (CVW)','MITRE Collaborative Virtual Workspace License (CVW)',0,0,'License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)','13 :: 14 :: 192');
+INSERT INTO trove_cat VALUES (193,2000032001,14,13,'ricoh','Ricoh Source Code Public License','Ricoh Source Code Public License',0,0,'License :: OSI Approved :: Ricoh Source Code Public License','13 :: 14 :: 193');
+INSERT INTO trove_cat VALUES (194,2000032001,14,13,'python','Python License','Python License',0,0,'License :: OSI Approved :: Python License','13 :: 14 :: 194');
+INSERT INTO trove_cat VALUES (195,2000032001,14,13,'zlib','zlib/libpng License','zlib/libpng License',0,0,'License :: OSI Approved :: zlib/libpng License','13 :: 14 :: 195');
+INSERT INTO trove_cat VALUES (196,2000040701,13,13,'other','Other/Proprietary License','Non OSI-Approved/Proprietary license.',0,0,'License :: Other/Proprietary License','13 :: 196');
+INSERT INTO trove_cat VALUES (197,2000032001,13,13,'publicdomain','Public Domain','Public Domain. No author-retained rights.',0,0,'License :: Public Domain','13 :: 197');
+INSERT INTO trove_cat VALUES (198,2000032001,160,160,'java','Java','Java',0,0,'Programming Language :: Java','160 :: 198');
+INSERT INTO trove_cat VALUES (199,2000032101,0,0,'os','Operating System','What operating system the program requires to run, if any.',0,0,'Operating System','199');
+INSERT INTO trove_cat VALUES (200,2000032101,199,199,'posix','POSIX','POSIX plus standard Berkeley socket facilities. Don''t list a more specific OS unless your program requires it.',0,0,'Operating System :: POSIX','199 :: 200');
+INSERT INTO trove_cat VALUES (201,2000032101,200,199,'linux','Linux','Any version of Linux. Don''t specify a subcategory unless the program requires a particular distribution.',0,0,'Operating System :: POSIX :: Linux','199 :: 200 :: 201');
+INSERT INTO trove_cat VALUES (202,2000032101,200,199,'bsd','BSD','Any variant of BSD. Don''t specify a subcategory unless the program requires a particular BSD flavor.',0,0,'Operating System :: POSIX :: BSD','199 :: 200 :: 202');
+INSERT INTO trove_cat VALUES (203,2000041101,202,199,'freebsd','FreeBSD','FreeBSD',0,0,'Operating System :: POSIX :: BSD :: FreeBSD','199 :: 200 :: 202 :: 203');
+INSERT INTO trove_cat VALUES (204,2000032101,202,199,'netbsd','NetBSD','NetBSD',0,0,'Operating System :: POSIX :: BSD :: NetBSD','199 :: 200 :: 202 :: 204');
+INSERT INTO trove_cat VALUES (205,2000032101,202,199,'openbsd','OpenBSD','OpenBSD',0,0,'Operating System :: POSIX :: BSD :: OpenBSD','199 :: 200 :: 202 :: 205');
+INSERT INTO trove_cat VALUES (206,2000032101,202,199,'bsdos','BSD/OS','BSD/OS',0,0,'Operating System :: POSIX :: BSD :: BSD/OS','199 :: 200 :: 202 :: 206');
+INSERT INTO trove_cat VALUES (207,2000032101,200,199,'sun','SunOS/Solaris','Any Sun Microsystems OS.',0,0,'Operating System :: POSIX :: SunOS/Solaris','199 :: 200 :: 207');
+INSERT INTO trove_cat VALUES (208,2000032101,200,199,'sco','SCO','SCO',0,0,'Operating System :: POSIX :: SCO','199 :: 200 :: 208');
+INSERT INTO trove_cat VALUES (209,2000032101,200,199,'hpux','HP-UX','HP-UX',0,0,'Operating System :: POSIX :: HP-UX','199 :: 200 :: 209');
+INSERT INTO trove_cat VALUES (210,2000032101,200,199,'aix','AIX','AIX',0,0,'Operating System :: POSIX :: AIX','199 :: 200 :: 210');
+INSERT INTO trove_cat VALUES (211,2000032101,200,199,'irix','IRIX','IRIX',0,0,'Operating System :: POSIX :: IRIX','199 :: 200 :: 211');
+INSERT INTO trove_cat VALUES (212,2000032101,200,199,'other','Other','Other specific POSIX OS, specified in description.',0,0,'Operating System :: POSIX :: Other','199 :: 200 :: 212');
+INSERT INTO trove_cat VALUES (213,2000032101,160,160,'other','Other','Other programming language, specified in description.',0,0,'Programming Language :: Other','160 :: 213');
+INSERT INTO trove_cat VALUES (214,2000032101,199,199,'microsoft','Microsoft','Microsoft operating systems.',0,0,'Operating System :: Microsoft','199 :: 214');
+INSERT INTO trove_cat VALUES (215,2000032101,214,199,'msdos','MS-DOS','Microsoft Disk Operating System (DOS)',0,0,'Operating System :: Microsoft :: MS-DOS','199 :: 214 :: 215');
+INSERT INTO trove_cat VALUES (216,2000032101,214,199,'windows','Windows','Windows software, not specific to any particular version of Windows.',0,0,'Operating System :: Microsoft :: Windows','199 :: 214 :: 216');
+INSERT INTO trove_cat VALUES (217,2000032101,216,199,'win31','Windows 3.1 or Earlier','Windows 3.1 or Earlier',0,0,'Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier','199 :: 214 :: 216 :: 217');
+INSERT INTO trove_cat VALUES (218,2000032101,216,199,'win95','Windows 95/98/2000','Windows 95, Windows 98, and Windows 2000.',0,0,'Operating System :: Microsoft :: Windows :: Windows 95/98/2000','199 :: 214 :: 216 :: 218');
+INSERT INTO trove_cat VALUES (219,2000041101,216,199,'winnt','Windows NT/2000','Windows NT and Windows 2000.',0,0,'Operating System :: Microsoft :: Windows :: Windows NT/2000','199 :: 214 :: 216 :: 219');
+INSERT INTO trove_cat VALUES (220,2000032101,199,199,'os2','OS/2','OS/2',0,0,'Operating System :: OS/2','199 :: 220');
+INSERT INTO trove_cat VALUES (221,2000032101,199,199,'macos','MacOS','MacOS',0,0,'Operating System :: MacOS','199 :: 221');
+INSERT INTO trove_cat VALUES (222,2000032101,216,199,'wince','Windows CE','Windows CE',0,0,'Operating System :: Microsoft :: Windows :: Windows CE','199 :: 214 :: 216 :: 222');
+INSERT INTO trove_cat VALUES (223,2000032101,199,199,'palmos','PalmOS','PalmOS (for Palm Pilot)',0,0,'Operating System :: PalmOS','199 :: 223');
+INSERT INTO trove_cat VALUES (224,2000032101,199,199,'beos','BeOS','BeOS',0,0,'Operating System :: BeOS','199 :: 224');
+INSERT INTO trove_cat VALUES (225,2000032101,0,0,'environment','Environment','Run-time environment required for this program.',0,0,'Environment','225');
+INSERT INTO trove_cat VALUES (226,2000041101,225,225,'console','Console (Text Based)','Console-based programs.',0,0,'Environment :: Console (Text Based)','225 :: 226');
+INSERT INTO trove_cat VALUES (227,2000032401,226,225,'curses','Curses','Curses-based software.',0,0,'Environment :: Console (Text Based) :: Curses','225 :: 226 :: 227');
+INSERT INTO trove_cat VALUES (228,2000040701,226,225,'newt','Newt','Newt',0,0,'Environment :: Console (Text Based) :: Newt','225 :: 226 :: 228');
+INSERT INTO trove_cat VALUES (229,2000040701,225,225,'x11','X11 Applications','Programs that run in an X windowing environment.',0,0,'Environment :: X11 Applications','225 :: 229');
+INSERT INTO trove_cat VALUES (230,2000040701,225,225,'win32','Win32 (MS Windows)','Programs designed to run in a graphical Microsoft Windows environment.',0,0,'Environment :: Win32 (MS Windows)','225 :: 230');
+INSERT INTO trove_cat VALUES (231,2000040701,229,225,'gnome','Gnome','Programs designed to run in a Gnome environment.',0,0,'Environment :: X11 Applications :: Gnome','225 :: 229 :: 231');
+INSERT INTO trove_cat VALUES (232,2000040701,229,225,'kde','KDE','Programs designed to run in a KDE environment.',0,0,'Environment :: X11 Applications :: KDE','225 :: 229 :: 232');
+INSERT INTO trove_cat VALUES (233,2000040701,225,225,'other','Other Environment','Programs designed to run in an environment other than one listed.',0,0,'Environment :: Other Environment','225 :: 233');
+INSERT INTO trove_cat VALUES (234,2000040701,18,18,'other','Other/Nonlisted Topic','Topic does not fit into any listed category.',0,0,'Topic :: Other/Nonlisted Topic','18 :: 234');
+INSERT INTO trove_cat VALUES (235,2000041001,199,199,'independent','OS Independent','This software does not depend on any particular operating system.',0,0,'Operating System :: OS Independent','199 :: 235');
+INSERT INTO trove_cat VALUES (236,2000040701,199,199,'other','Other OS','Program is designe for a nonlisted operating system.',0,0,'Operating System :: Other OS','199 :: 236');
+INSERT INTO trove_cat VALUES (237,2000041001,225,225,'web','Web Environment','This software is designed for a web environment.',0,0,'Environment :: Web Environment','225 :: 237');
+INSERT INTO trove_cat VALUES (238,2000041101,225,225,'daemon','No Input/Output (Daemon)','This program has no input or output, but is intended to run in the background as a daemon.',0,0,'Environment :: No Input/Output (Daemon)','225 :: 238');
+INSERT INTO trove_cat VALUES (239,2000041301,144,18,'gnuhurd','GNU Hurd','Kernel code and modules for GNU Hurd.',0,0,'Topic :: System :: Operating System Kernels :: GNU Hurd','18 :: 136 :: 144 :: 239');
+INSERT INTO trove_cat VALUES (240,2000041301,200,199,'gnuhurd','GNU Hurd','GNU Hurd',0,0,'Operating System :: POSIX :: GNU Hurd','199 :: 200 :: 240');
+INSERT INTO trove_cat VALUES (241,2000050101,251,18,'napster','Napster','Clients and servers for the Napster file sharing protocol.',0,0,'Topic :: Communications :: File Sharing :: Napster','18 :: 20 :: 251 :: 241');
+INSERT INTO trove_cat VALUES (242,2000042701,160,160,'scheme','Scheme','Scheme programming language.',0,0,'Programming Language :: Scheme','160 :: 242');
+INSERT INTO trove_cat VALUES (243,2000042701,90,18,'sitemanagement','Site Management','Tools for maintanance and management of web sites.',0,0,'Topic :: Internet :: WWW/HTTP :: Site Management','18 :: 87 :: 90 :: 243');
+INSERT INTO trove_cat VALUES (244,2000042701,243,18,'linkchecking','Link Checking','Tools to assist in checking for broken links.',0,0,'Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking','18 :: 87 :: 90 :: 243 :: 244');
+INSERT INTO trove_cat VALUES (245,2000042701,87,18,'loganalysis','Log Analysis','Software to help analyze various log files.',0,0,'Topic :: Internet :: Log Analysis','18 :: 87 :: 245');
+INSERT INTO trove_cat VALUES (246,2000042701,97,18,'eda','Electronic Design Automation (EDA)','Tools for circuit design, schematics, board layout, and more.',0,0,'Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)','18 :: 97 :: 246');
+INSERT INTO trove_cat VALUES (247,2000042701,20,18,'telephony','Telephony','Telephony related applications, to include automated voice response systems.',0,0,'Topic :: Communications :: Telephony','18 :: 20 :: 247');
+INSERT INTO trove_cat VALUES (248,2000042801,113,18,'midi','MIDI','Software related to MIDI synthesis and playback.',0,0,'Topic :: Multimedia :: Sound/Audio :: MIDI','18 :: 99 :: 113 :: 248');
+INSERT INTO trove_cat VALUES (249,2000042801,113,18,'synthesis','Sound Synthesis','Software for creation and synthesis of sound.',0,0,'Topic :: Multimedia :: Sound/Audio :: Sound Synthesis','18 :: 99 :: 113 :: 249');
+INSERT INTO trove_cat VALUES (250,2000042801,90,18,'httpservers','HTTP Servers','Software designed to serve content via the HTTP protocol.',0,0,'Topic :: Internet :: WWW/HTTP :: HTTP Servers','18 :: 87 :: 90 :: 250');
+INSERT INTO trove_cat VALUES (251,2000050101,20,18,'filesharing','File Sharing','Software for person-to-person online file sharing.',0,0,'Topic :: Communications :: File Sharing','18 :: 20 :: 251');
+INSERT INTO trove_cat VALUES (252,2000071101,97,18,'bioinformatics','Bio-Informatics','Category for gene software (e.g. Gene Ontology)',0,0,'Topic :: Scientific/Engineering :: Bio-Informatics','18 :: 97 :: 252');
+INSERT INTO trove_cat VALUES (253,2000071101,136,18,'sysadministration','Systems Administration','Systems Administration Software (e.g. configuration apps.)',0,0,'Topic :: System :: Systems Administration','18 :: 136 :: 253');
+INSERT INTO trove_cat VALUES (254,2000071101,160,160,'plsql','PL/SQL','PL/SQL Programming Language',0,0,'Programming Language :: PL/SQL','160 :: 254');
+INSERT INTO trove_cat VALUES (255,2000071101,160,160,'progress','PROGRESS','PROGRESS Programming Language',0,0,'Programming Language :: PROGRESS','160 :: 255');
+INSERT INTO trove_cat VALUES (256,2000071101,125,18,'nonlineareditor','Non-Linear Editor','Video Non-Linear Editors',0,0,'Topic :: Multimedia :: Video :: Non-Linear Editor','18 :: 99 :: 125 :: 256');
+INSERT INTO trove_cat VALUES (257,2000071101,136,18,'softwaredist','Software Distribution','Systems software for distributing other software.',0,0,'Topic :: System :: Software Distribution','18 :: 136 :: 257');
+INSERT INTO trove_cat VALUES (258,2000071101,160,160,'objectpascal','Object Pascal','Object Pascal',0,0,'Programming Language :: Object Pascal','160 :: 258');
+INSERT INTO trove_cat VALUES (259,2000071401,45,18,'codegen','Code Generators','Code Generators',0,0,'Topic :: Software Development :: Code Generators','18 :: 45 :: 259');
+INSERT INTO trove_cat VALUES (260,2000071401,52,18,'SCCS','SCCS','SCCS',0,0,'Topic :: Software Development :: Version Control :: SCCS','18 :: 45 :: 52 :: 260');
+INSERT INTO trove_cat VALUES (261,2000072501,160,160,'xbasic','XBasic','XBasic programming language',0,0,'Programming Language :: XBasic','160 :: 261');
+INSERT INTO trove_cat VALUES (262,2000073101,160,160,'coldfusion','Cold Fusion','Cold Fusion Language',0,0,'Programming Language :: Cold Fusion','160 :: 262');
+INSERT INTO trove_cat VALUES (263,2000080401,160,160,'euphoria','Euphoria','Euphoria programming language - http://www.rapideuphoria.com/',0,0,'Programming Language :: Euphoria','160 :: 263');
+INSERT INTO trove_cat VALUES (264,2000080701,160,160,'erlang','Erlang','Erlang - developed by Ericsson - http://www.erlang.org/',0,0,'Programming Language :: Erlang','160 :: 264');
+INSERT INTO trove_cat VALUES (265,2000080801,160,160,'Delphi','Delphi','Borland/Inprise Delphi',0,0,'Programming Language :: Delphi','160 :: 265');
+INSERT INTO trove_cat VALUES (266,2000081601,97,18,'medical','Medical Science Apps.','Medical / BioMedical Science Apps.',0,0,'Topic :: Scientific/Engineering :: Medical Science Apps.','18 :: 97 :: 266');
+INSERT INTO trove_cat VALUES (267,2000082001,160,160,'zope','Zope','Zope Object Publishing',0,0,'Programming Language :: Zope','160 :: 267');
+INSERT INTO trove_cat VALUES (268,2000082101,80,18,'Puzzles','Puzzle Games','Puzzle Games',0,0,'Topic :: Games/Entertainment :: Puzzle Games','18 :: 80 :: 268');
+INSERT INTO trove_cat VALUES (269,2000082801,160,160,'asm','Assembly','ASM programming',0,0,'Programming Language :: Assembly','160 :: 269');
+
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5_oci8.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5322 @@
+--
+-- Selected TOC Entries:
+--
+--\connect - tperdue
+--
+-- TOC Entry ID 2 (OID 18138427)
+--
+-- Name: bug_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 182 (OID 18138445)
+--
+-- Name: bug Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug (
+ bug_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ status_id number(*) DEFAULT '0' NOT NULL,
+ priority number(*) DEFAULT '0' NOT NULL,
+ category_id number(*) DEFAULT '0' NOT NULL,
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ assigned_to number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000),
+ details varchar2(4000),
+ close_date number(*),
+ bug_group_id number(*) DEFAULT '0' NOT NULL,
+ resolution_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_id)
+);
+
+--
+-- TOC Entry ID 4 (OID 18138495)
+--
+-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_bug_dependencies_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 183 (OID 18138513)
+--
+-- Name: bug_bug_dependencies Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_bug_dependencies (
+ bug_depend_id number(*) NOT NULL,
+ bug_id number(*) DEFAULT '0' NOT NULL,
+ is_dependent_on_bug_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_depend_id)
+);
+
+--
+-- TOC Entry ID 6 (OID 18138531)
+--
+-- Name: bug_canned_responses_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_canned_responses_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 184 (OID 18138549)
+--
+-- Name: bug_canned_responses Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_canned_responses (
+ bug_canned_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ title varchar2(4000),
+ body varchar2(4000),
+ PRIMARY KEY (bug_canned_id)
+);
+
+--
+-- TOC Entry ID 8 (OID 18138582)
+--
+-- Name: bug_category_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_category_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 185 (OID 18138600)
+--
+-- Name: bug_category Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_category (
+ bug_category_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ category_name varchar2(4000),
+ PRIMARY KEY (bug_category_id)
+);
+
+--
+-- TOC Entry ID 10 (OID 18138632)
+--
+-- Name: bug_filter_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_filter_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 186 (OID 18138650)
+--
+-- Name: bug_filter Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_filter (
+ filter_id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ sql_clause varchar2(4000) DEFAULT ' ' NOT NULL,
+ is_active number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (filter_id)
+);
+
+--
+-- TOC Entry ID 12 (OID 18138687)
+--
+-- Name: bug_group_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_group_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 187 (OID 18138705)
+--
+-- Name: bug_group Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_group (
+ bug_group_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ group_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (bug_group_id)
+);
+
+--
+-- TOC Entry ID 14 (OID 18138738)
+--
+-- Name: bug_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 188 (OID 18138756)
+--
+-- Name: bug_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_history (
+ bug_history_id number(*) NOT NULL,
+ bug_id number(*) DEFAULT '0' NOT NULL,
+ field_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ old_value varchar2(4000) DEFAULT ' ' NOT NULL,
+ mod_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*),
+ PRIMARY KEY (bug_history_id)
+);
+
+--
+-- TOC Entry ID 16 (OID 18138794)
+--
+-- Name: bug_resolution_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_resolution_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 189 (OID 18138812)
+--
+-- Name: bug_resolution Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_resolution (
+ resolution_id number(*) NOT NULL,
+ resolution_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (resolution_id)
+);
+
+--
+-- TOC Entry ID 18 (OID 18138843)
+--
+-- Name: bug_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 190 (OID 18138861)
+--
+-- Name: bug_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_status (
+ status_id number(*) NOT NULL,
+ status_name varchar2(4000),
+ PRIMARY KEY (status_id)
+);
+
+--
+-- TOC Entry ID 20 (OID 18138891)
+--
+-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE bug_task_dependencies_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 191 (OID 18138909)
+--
+-- Name: bug_task_dependencies Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE bug_task_dependencies (
+ bug_depend_id number(*) NOT NULL,
+ bug_id number(*) DEFAULT '0' NOT NULL,
+ is_dependent_on_task_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (bug_depend_id)
+);
+
+--
+-- TOC Entry ID 22 (OID 18138927)
+--
+-- Name: canned_responses_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE canned_responses_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 192 (OID 18138946)
+--
+-- Name: canned_responses Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE canned_responses (
+ response_id number(*) NOT NULL,
+ response_title character varying(25),
+ response_text varchar2(4000),
+ PRIMARY KEY (response_id)
+);
+
+--
+-- TOC Entry ID 24 (OID 18138977)
+--
+-- Name: db_images_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE db_images_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 193 (OID 18138995)
+--
+-- Name: db_images Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE db_images (
+ id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ description varchar2(4000) DEFAULT ' ' NOT NULL,
+ bin_data varchar2(4000) DEFAULT ' ' NOT NULL,
+ filename varchar2(4000) DEFAULT ' ' NOT NULL,
+ filesize number(*) DEFAULT '0' NOT NULL,
+ filetype varchar2(4000) DEFAULT ' ' NOT NULL,
+ width number(*) DEFAULT '0' NOT NULL,
+ height number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 26 (OID 18139040)
+--
+-- Name: doc_data_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE doc_data_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 194 (OID 18139058)
+--
+-- Name: doc_data Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE doc_data (
+ docid number(*) NOT NULL,
+ stateid number(*) DEFAULT '0' NOT NULL,
+ title character varying(255) DEFAULT ' ' NOT NULL,
+ data varchar2(4000) DEFAULT ' ' NOT NULL,
+ updatedate1 number(*) DEFAULT '0' NOT NULL,
+ createdate1 number(*) DEFAULT '0' NOT NULL,
+ created_by number(*) DEFAULT '0' NOT NULL,
+ doc_group number(*) DEFAULT '0' NOT NULL,
+ description varchar2(4000),
+ language_id number(*) DEFAULT '1' NOT NULL,
+ PRIMARY KEY (docid)
+);
+
+--
+-- TOC Entry ID 28 (OID 18139104)
+--
+-- Name: doc_groups_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE doc_groups_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 195 (OID 18139122)
+--
+-- Name: doc_groups Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE doc_groups (
+ doc_group number(*) NOT NULL,
+ groupname character varying(255) DEFAULT ' ' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (doc_group)
+);
+
+--
+-- TOC Entry ID 30 (OID 18139140)
+--
+-- Name: doc_states_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE doc_states_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 196 (OID 18139158)
+--
+-- Name: doc_states Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE doc_states (
+ stateid number(*) NOT NULL,
+ name character varying(255) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (stateid)
+);
+
+--
+-- TOC Entry ID 32 (OID 18139174)
+--
+-- Name: filemodule_monitor_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE filemodule_monitor_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 197 (OID 18139192)
+--
+-- Name: filemodule_monitor Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE filemodule_monitor (
+ id number(*) NOT NULL,
+ filemodule_id number(*) DEFAULT '0' NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 34 (OID 18139210)
+--
+-- Name: forum_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE forum_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 198 (OID 18139228)
+--
+-- Name: forum Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE forum (
+ msg_id number(*) NOT NULL,
+ group_forum_id number(*) DEFAULT '0' NOT NULL,
+ posted_by number(*) DEFAULT '0' NOT NULL,
+ subject varchar2(4000) DEFAULT ' ' NOT NULL,
+ body varchar2(4000) DEFAULT ' ' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ is_followup_to number(*) DEFAULT '0' NOT NULL,
+ thread_id number(*) DEFAULT '0' NOT NULL,
+ has_followups number(*) DEFAULT '0',
+ most_recent_date number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (msg_id)
+);
+
+--
+-- TOC Entry ID 199 (OID 18139275)
+--
+-- Name: forum_agg_msg_count Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE forum_agg_msg_count (
+ group_forum_id number(*) DEFAULT '0' NOT NULL,
+ count number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (group_forum_id)
+);
+
+--
+-- TOC Entry ID 36 (OID 18139291)
+--
+-- Name: forum_group_list_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE forum_group_list_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 200 (OID 18139309)
+--
+-- Name: forum_group_list Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE forum_group_list (
+ group_forum_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ forum_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ is_public number(*) DEFAULT '0' NOT NULL,
+ description varchar2(4000),
+ allow_anonymous number(*) DEFAULT '0' NOT NULL,
+ send_all_posts_to varchar2(4000),
+ PRIMARY KEY (group_forum_id)
+);
+
+--
+-- TOC Entry ID 38 (OID 18139348)
+--
+-- Name: forum_monitor_forums_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE forum_monitor_forums_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 201 (OID 18139366)
+--
+-- Name: forum_monitored_forums Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE forum_monitored_forums (
+ monitor_id number(*) NOT NULL,
+ forum_id number(*) DEFAULT '0' NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (monitor_id)
+);
+
+--
+-- TOC Entry ID 40 (OID 18139384)
+--
+-- Name: forum_saved_place_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE forum_saved_place_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 202 (OID 18139402)
+--
+-- Name: forum_saved_place Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE forum_saved_place (
+ saved_place_id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ forum_id number(*) DEFAULT '0' NOT NULL,
+ save_date number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (saved_place_id)
+);
+
+--
+-- TOC Entry ID 203 (OID 18139454)
+--
+-- Name: foundry_data Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE foundry_data (
+ foundry_id number(*) DEFAULT '0' NOT NULL,
+ freeform1_html varchar2(4000),
+ freeform2_html varchar2(4000),
+ sponsor1_html varchar2(4000),
+ sponsor2_html varchar2(4000),
+ guide_image_id number(*) DEFAULT '0' NOT NULL,
+ logo_image_id number(*) DEFAULT '0' NOT NULL,
+ trove_categories varchar2(4000),
+ PRIMARY KEY (foundry_id)
+);
+
+--
+-- TOC Entry ID 42 (OID 18139492)
+--
+-- Name: foundry_news_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE foundry_news_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 204 (OID 18139510)
+--
+-- Name: foundry_news Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE foundry_news (
+ foundry_news_id number(*) NOT NULL,
+ foundry_id number(*) DEFAULT '0' NOT NULL,
+ news_id number(*) DEFAULT '0' NOT NULL,
+ approve_date number(*) DEFAULT '0' NOT NULL,
+ is_approved number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (foundry_news_id)
+);
+
+--
+-- TOC Entry ID 44 (OID 18139532)
+--
+-- Name: foundry_prefer_proj_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE foundry_prefer_proj_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 205 (OID 18139550)
+--
+-- Name: foundry_preferred_projects Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE foundry_preferred_projects (
+ foundry_project_id number(*) NOT NULL,
+ foundry_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ rank number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (foundry_project_id)
+);
+
+--
+-- TOC Entry ID 46 (OID 18139570)
+--
+-- Name: foundry_projects_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE foundry_projects_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 206 (OID 18139588)
+--
+-- Name: foundry_projects Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE foundry_projects (
+ id number(*) NOT NULL,
+ foundry_id number(*) DEFAULT '0' NOT NULL,
+ project_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 207 (OID 18139606)
+--
+-- Name: frs_dlstats_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_agg (
+ file_id number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ downloads_http number(*) DEFAULT '0' NOT NULL,
+ downloads_ftp number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 208 (OID 18139623)
+--
+-- Name: frs_dlstats_file_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_file_agg (
+ file_id number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 209 (OID 18139638)
+--
+-- Name: frs_dlstats_filetotal_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_filetotal_agg (
+ file_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (file_id)
+);
+
+--
+-- TOC Entry ID 210 (OID 18139654)
+--
+-- Name: frs_dlstats_filetotal_agg_old Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_filetotal_agg_old (
+ file_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 211 (OID 18139667)
+--
+-- Name: frs_dlstats_group_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_group_agg (
+ group_id number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 212 (OID 18139682)
+--
+-- Name: frs_dlstats_grouptotal_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_dlstats_grouptotal_agg (
+ group_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 48 (OID 18139695)
+--
+-- Name: frs_file_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_file_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 213 (OID 18139714)
+--
+-- Name: frs_file Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_file (
+ file_id number(*) NOT NULL,
+ filename varchar2(200),
+ release_id number(*) DEFAULT '0' NOT NULL,
+ type_id number(*) DEFAULT '0' NOT NULL,
+ processor_id number(*) DEFAULT '0' NOT NULL,
+ release_time number(*) DEFAULT '0' NOT NULL,
+ file_size number(*) DEFAULT '0' NOT NULL,
+ post_date number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (file_id)
+);
+
+--
+-- TOC Entry ID 50 (OID 18139756)
+--
+-- Name: frs_filetype_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_filetype_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 214 (OID 18139774)
+--
+-- Name: frs_filetype Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_filetype (
+ type_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (type_id)
+);
+
+--
+-- TOC Entry ID 52 (OID 18139804)
+--
+-- Name: frs_package_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_package_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 215 (OID 18139822)
+--
+-- Name: frs_package Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_package (
+ package_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ name varchar2(4000),
+ status_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (package_id)
+);
+
+--
+-- TOC Entry ID 54 (OID 18139856)
+--
+-- Name: frs_processor_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_processor_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 216 (OID 18139874)
+--
+-- Name: frs_processor Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_processor (
+ processor_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (processor_id)
+);
+
+--
+-- TOC Entry ID 56 (OID 18139904)
+--
+-- Name: frs_release_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_release_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 217 (OID 18139922)
+--
+-- Name: frs_release Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_release (
+ release_id number(*) NOT NULL,
+ package_id number(*) DEFAULT '0' NOT NULL,
+ name varchar2(4000),
+ notes varchar2(4000),
+ changes varchar2(4000),
+ status_id number(*) DEFAULT '0' NOT NULL,
+ preformatted number(*) DEFAULT '0' NOT NULL,
+ release_date number(*) DEFAULT '0' NOT NULL,
+ released_by number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (release_id)
+);
+
+--
+-- TOC Entry ID 58 (OID 18139964)
+--
+-- Name: frs_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE frs_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 218 (OID 18139982)
+--
+-- Name: frs_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE frs_status (
+ status_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (status_id)
+);
+
+--
+-- TOC Entry ID 60 (OID 18140012)
+--
+-- Name: group_cvs_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE group_cvs_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 219 (OID 18140030)
+--
+-- Name: group_cvs_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE group_cvs_history (
+ id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ user_name character varying(80) DEFAULT ' ' NOT NULL,
+ cvs_commits number(*) DEFAULT '0' NOT NULL,
+ cvs_commits_wk number(*) DEFAULT '0' NOT NULL,
+ cvs_adds number(*) DEFAULT '0' NOT NULL,
+ cvs_adds_wk number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 62 (OID 18140056)
+--
+-- Name: group_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE group_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 220 (OID 18140074)
+--
+-- Name: group_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE group_history (
+ group_history_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ field_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ old_value varchar2(4000) DEFAULT ' ' NOT NULL,
+ mod_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*),
+ PRIMARY KEY (group_history_id)
+);
+
+--
+-- TOC Entry ID 64 (OID 18140112)
+--
+-- Name: group_type_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE group_type_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 221 (OID 18140130)
+--
+-- Name: group_type Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE group_type (
+ type_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (type_id)
+);
+
+--
+-- TOC Entry ID 66 (OID 18140160)
+--
+-- Name: groups_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE groups_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 222 (OID 18140178)
+--
+-- Name: groups Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE groups (
+ group_id number(*) NOT NULL,
+ group_name character varying(40),
+ homepage character varying(128),
+ is_public number(*) DEFAULT '0' NOT NULL,
+ status character(1) DEFAULT 'A' NOT NULL,
+ unix_group_name character varying(30) DEFAULT ' ' NOT NULL,
+ unix_box character varying(20) DEFAULT 'shell1' NOT NULL,
+ http_domain character varying(80),
+ short_description character varying(255),
+ cvs_box character varying(20) DEFAULT 'cvs1' NOT NULL,
+ license character varying(16),
+ register_purpose varchar2(4000),
+ license_other varchar2(4000),
+ register_time number(*) DEFAULT '0' NOT NULL,
+ use_bugs number(*) DEFAULT '1' NOT NULL,
+ rand_hash varchar2(4000),
+ use_mail number(*) DEFAULT '1' NOT NULL,
+ use_survey number(*) DEFAULT '1' NOT NULL,
+ use_patch number(*) DEFAULT '1' NOT NULL,
+ use_forum number(*) DEFAULT '1' NOT NULL,
+ use_pm number(*) DEFAULT '1' NOT NULL,
+ use_cvs number(*) DEFAULT '1' NOT NULL,
+ use_news number(*) DEFAULT '1' NOT NULL,
+ use_support number(*) DEFAULT '1' NOT NULL,
+ new_bug_address varchar2(4000) DEFAULT ' ' NOT NULL,
+ new_patch_address varchar2(4000) DEFAULT ' ' NOT NULL,
+ new_support_address varchar2(4000) DEFAULT ' ' NOT NULL,
+ type number(*) DEFAULT '1' NOT NULL,
+ use_docman number(*) DEFAULT '1' NOT NULL,
+ send_all_bugs number(*) DEFAULT '0' NOT NULL,
+ send_all_patches number(*) DEFAULT '0' NOT NULL,
+ send_all_support number(*) DEFAULT '0' NOT NULL,
+ new_task_address varchar2(4000) DEFAULT ' ' NOT NULL,
+ send_all_tasks number(*) DEFAULT '0' NOT NULL,
+ use_bug_depend_box number(*) DEFAULT '1' NOT NULL,
+ use_pm_depend_box number(*) DEFAULT '1' NOT NULL,
+ PRIMARY KEY (group_id)
+);
+
+--
+-- TOC Entry ID 223 (OID 18140269)
+--
+-- Name: intel_agreement Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE intel_agreement (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ message varchar2(4000),
+ is_approved number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (user_id)
+);
+
+--
+-- TOC Entry ID 68 (OID 18140301)
+--
+-- Name: mail_group_list_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE mail_group_list_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 224 (OID 18140319)
+--
+-- Name: mail_group_list Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE mail_group_list (
+ group_list_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ list_name varchar2(4000),
+ is_public number(*) DEFAULT '0' NOT NULL,
+ password character varying(16),
+ list_admin number(*) DEFAULT '0' NOT NULL,
+ status number(*) DEFAULT '0' NOT NULL,
+ description varchar2(4000),
+ PRIMARY KEY (group_list_id)
+);
+
+--
+-- TOC Entry ID 70 (OID 18140359)
+--
+-- Name: news_bytes_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE news_bytes_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 225 (OID 18140377)
+--
+-- Name: news_bytes Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE news_bytes (
+ id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ is_approved number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ forum_id number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000),
+ details varchar2(4000),
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 72 (OID 18140419)
+--
+-- Name: patch_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE patch_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 226 (OID 18140437)
+--
+-- Name: patch Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE patch (
+ patch_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ patch_status_id number(*) DEFAULT '0' NOT NULL,
+ patch_category_id number(*) DEFAULT '0' NOT NULL,
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ assigned_to number(*) DEFAULT '0' NOT NULL,
+ open_date number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000),
+ code varchar2(4000),
+ close_date number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (patch_id)
+);
+
+--
+-- TOC Entry ID 74 (OID 18140483)
+--
+-- Name: patch_category_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE patch_category_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 227 (OID 18140501)
+--
+-- Name: patch_category Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE patch_category (
+ patch_category_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ category_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (patch_category_id)
+);
+
+--
+-- TOC Entry ID 76 (OID 18140534)
+--
+-- Name: patch_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE patch_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 228 (OID 18140552)
+--
+-- Name: patch_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE patch_history (
+ patch_history_id number(*) NOT NULL,
+ patch_id number(*) DEFAULT '0' NOT NULL,
+ field_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ old_value varchar2(4000) DEFAULT ' ' NOT NULL,
+ mod_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*),
+ PRIMARY KEY (patch_history_id)
+);
+
+--
+-- TOC Entry ID 78 (OID 18140590)
+--
+-- Name: patch_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE patch_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 229 (OID 18140608)
+--
+-- Name: patch_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE patch_status (
+ patch_status_id number(*) NOT NULL,
+ status_name varchar2(4000),
+ PRIMARY KEY (patch_status_id)
+);
+
+--
+-- TOC Entry ID 80 (OID 18140638)
+--
+-- Name: people_job_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_job_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 230 (OID 18140656)
+--
+-- Name: people_job Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_job (
+ job_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ created_by number(*) DEFAULT '0' NOT NULL,
+ title varchar2(4000),
+ description varchar2(4000),
+ date1 number(*) DEFAULT '0' NOT NULL,
+ status_id number(*) DEFAULT '0' NOT NULL,
+ category_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (job_id)
+);
+
+--
+-- TOC Entry ID 82 (OID 18140697)
+--
+-- Name: people_job_category_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_job_category_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 231 (OID 18140715)
+--
+-- Name: people_job_category Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_job_category (
+ category_id number(*) NOT NULL,
+ name varchar2(4000),
+ private_flag number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (category_id)
+);
+
+--
+-- TOC Entry ID 84 (OID 18140747)
+--
+-- Name: people_job_inventory_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_job_inventory_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 232 (OID 18140765)
+--
+-- Name: people_job_inventory Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_job_inventory (
+ job_inventory_id number(*) NOT NULL,
+ job_id number(*) DEFAULT '0' NOT NULL,
+ skill_id number(*) DEFAULT '0' NOT NULL,
+ skill_level_id number(*) DEFAULT '0' NOT NULL,
+ skill_year_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (job_inventory_id)
+);
+
+--
+-- TOC Entry ID 86 (OID 18140787)
+--
+-- Name: people_job_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_job_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 233 (OID 18140805)
+--
+-- Name: people_job_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_job_status (
+ status_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (status_id)
+);
+
+--
+-- TOC Entry ID 88 (OID 18140835)
+--
+-- Name: people_skill_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_skill_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 234 (OID 18140853)
+--
+-- Name: people_skill Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_skill (
+ skill_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (skill_id)
+);
+
+--
+-- TOC Entry ID 90 (OID 18140884)
+--
+-- Name: people_skill_inv_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_skill_inv_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 235 (OID 18140902)
+--
+-- Name: people_skill_inventory Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_skill_inventory (
+ skill_inventory_id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ skill_id number(*) DEFAULT '0' NOT NULL,
+ skill_level_id number(*) DEFAULT '0' NOT NULL,
+ skill_year_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (skill_inventory_id)
+);
+
+--
+-- TOC Entry ID 92 (OID 18140924)
+--
+-- Name: people_skill_level_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_skill_level_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 236 (OID 18140942)
+--
+-- Name: people_skill_level Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_skill_level (
+ skill_level_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (skill_level_id)
+);
+
+--
+-- TOC Entry ID 94 (OID 18140972)
+--
+-- Name: people_skill_year_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE people_skill_year_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 237 (OID 18140990)
+--
+-- Name: people_skill_year Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE people_skill_year (
+ skill_year_id number(*) NOT NULL,
+ name varchar2(4000),
+ PRIMARY KEY (skill_year_id)
+);
+
+--
+-- TOC Entry ID 96 (OID 18141020)
+--
+-- Name: project_assigned_to_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_assigned_to_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 238 (OID 18141038)
+--
+-- Name: project_assigned_to Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_assigned_to (
+ project_assigned_id number(*) NOT NULL,
+ project_task_id number(*) DEFAULT '0' NOT NULL,
+ assigned_to_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_assigned_id)
+);
+
+--
+-- TOC Entry ID 239 (OID 18141056)
+--
+-- Name: project_counts_tmp Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_counts_tmp (
+ group_id number(*),
+ type varchar2(4000),
+ count double precision
+);
+
+--
+-- TOC Entry ID 240 (OID 18141083)
+--
+-- Name: project_counts_weekly_tmp Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_counts_weekly_tmp (
+ group_id number(*),
+ type varchar2(4000),
+ count double precision
+);
+
+--
+-- TOC Entry ID 98 (OID 18141110)
+--
+-- Name: project_dependencies_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_dependencies_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 241 (OID 18141128)
+--
+-- Name: project_dependencies Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_dependencies (
+ project_depend_id number(*) NOT NULL,
+ project_task_id number(*) DEFAULT '0' NOT NULL,
+ is_dependent_on_task_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_depend_id)
+);
+
+--
+-- TOC Entry ID 100 (OID 18141146)
+--
+-- Name: project_group_list_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_group_list_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 242 (OID 18141164)
+--
+-- Name: project_group_list Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_group_list (
+ group_project_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ project_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ is_public number(*) DEFAULT '0' NOT NULL,
+ description varchar2(4000),
+ PRIMARY KEY (group_project_id)
+);
+
+--
+-- TOC Entry ID 102 (OID 18141200)
+--
+-- Name: project_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 243 (OID 18141218)
+--
+-- Name: project_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_history (
+ project_history_id number(*) NOT NULL,
+ project_task_id number(*) DEFAULT '0' NOT NULL,
+ field_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ old_value varchar2(4000) DEFAULT ' ' NOT NULL,
+ mod_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_history_id)
+);
+
+--
+-- TOC Entry ID 104 (OID 18141257)
+--
+-- Name: project_metric_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_metric_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 244 (OID 18141275)
+--
+-- Name: project_metric Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_metric (
+ ranking number(*) NOT NULL,
+ percentile double precision,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 106 (OID 18141292)
+--
+-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_metric_tmp1_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 245 (OID 18141310)
+--
+-- Name: project_metric_tmp1 Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_metric_tmp1 (
+ ranking number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ value double precision,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 108 (OID 18141327)
+--
+-- Name: proj_metric_weekly_tm_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE proj_metric_weekly_tm_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 246 (OID 18141346)
+--
+-- Name: project_metric_weekly_tmp1 Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_metric_weekly_tmp1 (
+ ranking number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ value double precision,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 110 (OID 18141363)
+--
+-- Name: project_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 247 (OID 18141381)
+--
+-- Name: project_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_status (
+ status_id number(*) NOT NULL,
+ status_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (status_id)
+);
+
+--
+-- TOC Entry ID 112 (OID 18141412)
+--
+-- Name: project_task_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_task_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 248 (OID 18141430)
+--
+-- Name: project_task Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_task (
+ project_task_id number(*) NOT NULL,
+ group_project_id number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000) DEFAULT ' ' NOT NULL,
+ details varchar2(4000) DEFAULT ' ' NOT NULL,
+ percent_complete number(*) DEFAULT '0' NOT NULL,
+ priority number(*) DEFAULT '0' NOT NULL,
+ hours double precision DEFAULT '0.00' NOT NULL,
+ start_date number(*) DEFAULT '0' NOT NULL,
+ end_date number(*) DEFAULT '0' NOT NULL,
+ created_by number(*) DEFAULT '0' NOT NULL,
+ status_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (project_task_id)
+);
+
+--
+-- TOC Entry ID 114 (OID 18141479)
+--
+-- Name: project_weekly_metric_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE project_weekly_metric_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 249 (OID 18141497)
+--
+-- Name: project_weekly_metric Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE project_weekly_metric (
+ ranking number(*) NOT NULL,
+ percentile double precision,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 250 (OID 18141514)
+--
+-- Name: session Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE session1 (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ session_hash character(32) DEFAULT ' ' NOT NULL,
+ ip_addr character(15) DEFAULT ' ' NOT NULL,
+ time number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (session_hash)
+);
+
+--
+-- TOC Entry ID 116 (OID 18141534)
+--
+-- Name: snippet_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE snippet_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 251 (OID 18141552)
+--
+-- Name: snippet Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE snippet (
+ snippet_id number(*) NOT NULL,
+ created_by number(*) DEFAULT '0' NOT NULL,
+ name varchar2(4000),
+ description varchar2(4000),
+ type number(*) DEFAULT '0' NOT NULL,
+ language number(*) DEFAULT '0' NOT NULL,
+ license varchar2(4000) DEFAULT ' ' NOT NULL,
+ category number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_id)
+);
+
+--
+-- TOC Entry ID 118 (OID 18141593)
+--
+-- Name: snippet_package_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE snippet_package_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 252 (OID 18141611)
+--
+-- Name: snippet_package Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE snippet_package (
+ snippet_package_id number(*) NOT NULL,
+ created_by number(*) DEFAULT '0' NOT NULL,
+ name varchar2(4000),
+ description varchar2(4000),
+ category number(*) DEFAULT '0' NOT NULL,
+ language number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_id)
+);
+
+--
+-- TOC Entry ID 120 (OID 18141648)
+--
+-- Name: snippet_package_item_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE snippet_package_item_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 253 (OID 18141666)
+--
+-- Name: snippet_package_item Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE snippet_package_item (
+ snippet_package_item_id number(*) NOT NULL,
+ snippet_package_version_id number(*) DEFAULT '0' NOT NULL,
+ snippet_version_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_item_id)
+);
+
+--
+-- TOC Entry ID 122 (OID 18141684)
+--
+-- Name: snippet_package_ver_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE snippet_package_ver_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 254 (OID 18141702)
+--
+-- Name: snippet_package_version Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE snippet_package_version (
+ snippet_package_version_id number(*) NOT NULL,
+ snippet_package_id number(*) DEFAULT '0' NOT NULL,
+ changes varchar2(4000),
+ version varchar2(4000),
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (snippet_package_version_id)
+);
+
+--
+-- TOC Entry ID 124 (OID 18141739)
+--
+-- Name: snippet_version_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE snippet_version_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 255 (OID 18141757)
+--
+-- Name: snippet_version Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE snippet_version (
+ snippet_version_id number(*) NOT NULL,
+ snippet_id number(*) DEFAULT '0' NOT NULL,
+ changes varchar2(4000),
+ version varchar2(4000),
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL,
+ code varchar2(4000),
+ PRIMARY KEY (snippet_version_id)
+);
+
+--
+-- TOC Entry ID 256 (OID 18141795)
+--
+-- Name: stats_agg_logo_by_day Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_logo_by_day (
+ day number(*),
+ count integer
+);
+
+--
+-- TOC Entry ID 257 (OID 18141806)
+--
+-- Name: stats_agg_logo_by_group Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_logo_by_group (
+ day number(*),
+ group_id number(*),
+ count integer
+);
+
+--
+-- TOC Entry ID 258 (OID 18141818)
+--
+-- Name: stats_agg_pages_by_browser Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_pages_by_browser (
+ browser character varying(8),
+ count integer
+);
+
+--
+-- TOC Entry ID 259 (OID 18141829)
+--
+-- Name: stats_agg_pages_by_day Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_pages_by_day (
+ day number(*) DEFAULT '0' NOT NULL,
+ count number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 260 (OID 18141842)
+--
+-- Name: stats_agg_pages_by_day_old Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_pages_by_day_old (
+ day number(*),
+ count integer
+);
+
+--
+-- TOC Entry ID 261 (OID 18141853)
+--
+-- Name: stats_agg_site_by_day Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_site_by_day (
+ day number(*) DEFAULT '0' NOT NULL,
+ count number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 262 (OID 18141866)
+--
+-- Name: stats_agg_site_by_group Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agg_site_by_group (
+ day number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ count number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 263 (OID 18141881)
+--
+-- Name: stats_agr_filerelease Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agr_filerelease (
+ filerelease_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 264 (OID 18141896)
+--
+-- Name: stats_agr_project Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_agr_project (
+ group_id number(*) DEFAULT '0' NOT NULL,
+ group_ranking number(*) DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers number(*) DEFAULT '0' NOT NULL,
+ file_releases number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL,
+ site_views number(*) DEFAULT '0' NOT NULL,
+ logo_views number(*) DEFAULT '0' NOT NULL,
+ msg_posted number(*) DEFAULT '0' NOT NULL,
+ msg_uniq_auth number(*) DEFAULT '0' NOT NULL,
+ bugs_opened number(*) DEFAULT '0' NOT NULL,
+ bugs_closed number(*) DEFAULT '0' NOT NULL,
+ support_opened number(*) DEFAULT '0' NOT NULL,
+ support_closed number(*) DEFAULT '0' NOT NULL,
+ patches_opened number(*) DEFAULT '0' NOT NULL,
+ patches_closed number(*) DEFAULT '0' NOT NULL,
+ tasks_opened number(*) DEFAULT '0' NOT NULL,
+ tasks_closed number(*) DEFAULT '0' NOT NULL,
+ help_requests number(*) DEFAULT '0' NOT NULL,
+ cvs_checkouts number(*) DEFAULT '0' NOT NULL,
+ cvs_commits number(*) DEFAULT '0' NOT NULL,
+ cvs_adds number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 265 (OID 18141949)
+--
+-- Name: stats_ftp_downloads Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_ftp_downloads (
+ day number(*) DEFAULT '0' NOT NULL,
+ filerelease_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 266 (OID 18141966)
+--
+-- Name: stats_http_downloads Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_http_downloads (
+ day number(*) DEFAULT '0' NOT NULL,
+ filerelease_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 267 (OID 18141983)
+--
+-- Name: stats_project Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_project (
+ month number(*) DEFAULT '0' NOT NULL,
+ week number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ group_ranking number(*) DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers number(*) DEFAULT '0' NOT NULL,
+ file_releases number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL,
+ site_views number(*) DEFAULT '0' NOT NULL,
+ subdomain_views number(*) DEFAULT '0' NOT NULL,
+ msg_posted number(*) DEFAULT '0' NOT NULL,
+ msg_uniq_auth number(*) DEFAULT '0' NOT NULL,
+ bugs_opened number(*) DEFAULT '0' NOT NULL,
+ bugs_closed number(*) DEFAULT '0' NOT NULL,
+ support_opened number(*) DEFAULT '0' NOT NULL,
+ support_closed number(*) DEFAULT '0' NOT NULL,
+ patches_opened number(*) DEFAULT '0' NOT NULL,
+ patches_closed number(*) DEFAULT '0' NOT NULL,
+ tasks_opened number(*) DEFAULT '0' NOT NULL,
+ tasks_closed number(*) DEFAULT '0' NOT NULL,
+ help_requests number(*) DEFAULT '0' NOT NULL,
+ cvs_checkouts number(*) DEFAULT '0' NOT NULL,
+ cvs_commits number(*) DEFAULT '0' NOT NULL,
+ cvs_adds number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 268 (OID 18142042)
+--
+-- Name: stats_project_tmp Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_project_tmp (
+ month number(*) DEFAULT '0' NOT NULL,
+ week number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ group_ranking number(*) DEFAULT '0' NOT NULL,
+ group_metric double precision DEFAULT '0.00000' NOT NULL,
+ developers number(*) DEFAULT '0' NOT NULL,
+ file_releases number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL,
+ site_views number(*) DEFAULT '0' NOT NULL,
+ subdomain_views number(*) DEFAULT '0' NOT NULL,
+ msg_posted number(*) DEFAULT '0' NOT NULL,
+ msg_uniq_auth number(*) DEFAULT '0' NOT NULL,
+ bugs_opened number(*) DEFAULT '0' NOT NULL,
+ bugs_closed number(*) DEFAULT '0' NOT NULL,
+ support_opened number(*) DEFAULT '0' NOT NULL,
+ support_closed number(*) DEFAULT '0' NOT NULL,
+ patches_opened number(*) DEFAULT '0' NOT NULL,
+ patches_closed number(*) DEFAULT '0' NOT NULL,
+ tasks_opened number(*) DEFAULT '0' NOT NULL,
+ tasks_closed number(*) DEFAULT '0' NOT NULL,
+ help_requests number(*) DEFAULT '0' NOT NULL,
+ cvs_checkouts number(*) DEFAULT '0' NOT NULL,
+ cvs_commits number(*) DEFAULT '0' NOT NULL,
+ cvs_adds number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 269 (OID 18142101)
+--
+-- Name: stats_site Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE stats_site (
+ month number(*) DEFAULT '0' NOT NULL,
+ week number(*) DEFAULT '0' NOT NULL,
+ day number(*) DEFAULT '0' NOT NULL,
+ site_views number(*) DEFAULT '0' NOT NULL,
+ subdomain_views number(*) DEFAULT '0' NOT NULL,
+ downloads number(*) DEFAULT '0' NOT NULL,
+ uniq_users number(*) DEFAULT '0' NOT NULL,
+ sessions number(*) DEFAULT '0' NOT NULL,
+ total_users number(*) DEFAULT '0' NOT NULL,
+ new_users number(*) DEFAULT '0' NOT NULL,
+ new_projects number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 126 (OID 18142132)
+--
+-- Name: support_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 270 (OID 18142150)
+--
+-- Name: support Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support (
+ support_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ support_status_id number(*) DEFAULT '0' NOT NULL,
+ support_category_id number(*) DEFAULT '0' NOT NULL,
+ priority number(*) DEFAULT '0' NOT NULL,
+ submitted_by number(*) DEFAULT '0' NOT NULL,
+ assigned_to number(*) DEFAULT '0' NOT NULL,
+ open_date number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000),
+ close_date number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (support_id)
+);
+
+--
+-- TOC Entry ID 128 (OID 18142196)
+--
+-- Name: support_canned_res_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_canned_res_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 271 (OID 18142214)
+--
+-- Name: support_canned_responses Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support_canned_responses (
+ support_canned_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ title varchar2(4000),
+ body varchar2(4000),
+ PRIMARY KEY (support_canned_id)
+);
+
+--
+-- TOC Entry ID 130 (OID 18142247)
+--
+-- Name: support_category_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_category_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 272 (OID 18142265)
+--
+-- Name: support_category Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support_category (
+ support_category_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ category_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (support_category_id)
+);
+
+--
+-- TOC Entry ID 132 (OID 18142298)
+--
+-- Name: support_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 273 (OID 18142316)
+--
+-- Name: support_history Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support_history (
+ support_history_id number(*) NOT NULL,
+ support_id number(*) DEFAULT '0' NOT NULL,
+ field_name varchar2(4000) DEFAULT ' ' NOT NULL,
+ old_value varchar2(4000) DEFAULT ' ' NOT NULL,
+ mod_by number(*) DEFAULT '0' NOT NULL,
+ date1 number(*),
+ PRIMARY KEY (support_history_id)
+);
+
+--
+-- TOC Entry ID 134 (OID 18142354)
+--
+-- Name: support_messages_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_messages_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 274 (OID 18142372)
+--
+-- Name: support_messages Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support_messages (
+ support_message_id number(*) NOT NULL,
+ support_id number(*) DEFAULT '0' NOT NULL,
+ from_email varchar2(4000),
+ date1 number(*) DEFAULT '0' NOT NULL,
+ body varchar2(4000),
+ PRIMARY KEY (support_message_id)
+);
+
+--
+-- TOC Entry ID 136 (OID 18142407)
+--
+-- Name: support_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE support_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 275 (OID 18142425)
+--
+-- Name: support_status Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE support_status (
+ support_status_id number(*) NOT NULL,
+ status_name varchar2(4000),
+ PRIMARY KEY (support_status_id)
+);
+
+--
+-- TOC Entry ID 138 (OID 18142455)
+--
+-- Name: supported_languages_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE supported_languages_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 276 (OID 18142473)
+--
+-- Name: supported_languages Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE supported_languages (
+ language_id number(*) NOT NULL,
+ name varchar2(4000),
+ filename varchar2(4000),
+ classname varchar2(4000),
+ language_code character(2),
+ PRIMARY KEY (language_id)
+);
+
+--
+-- TOC Entry ID 140 (OID 18142506)
+--
+-- Name: survey_question_types_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE survey_question_types_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 277 (OID 18142524)
+--
+-- Name: survey_question_types Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE survey_question_types (
+ id number(*) NOT NULL,
+ type varchar2(4000) DEFAULT ' ' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 142 (OID 18142555)
+--
+-- Name: survey_questions_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE survey_questions_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 278 (OID 18142573)
+--
+-- Name: survey_questions Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE survey_questions (
+ question_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ question varchar2(4000) DEFAULT ' ' NOT NULL,
+ question_type number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (question_id)
+);
+
+--
+-- TOC Entry ID 279 (OID 18142608)
+--
+-- Name: survey_rating_aggregate Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE survey_rating_aggregate (
+ type number(*) DEFAULT '0' NOT NULL,
+ id number(*) DEFAULT '0' NOT NULL,
+ response double precision DEFAULT '0' NOT NULL,
+ count number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 280 (OID 18142625)
+--
+-- Name: survey_rating_response Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE survey_rating_response (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ type number(*) DEFAULT '0' NOT NULL,
+ id number(*) DEFAULT '0' NOT NULL,
+ response number(*) DEFAULT '0' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 281 (OID 18142644)
+--
+-- Name: survey_responses Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE survey_responses (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ survey_id number(*) DEFAULT '0' NOT NULL,
+ question_id number(*) DEFAULT '0' NOT NULL,
+ response varchar2(4000) DEFAULT ' ' NOT NULL,
+ date1 number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 144 (OID 18142680)
+--
+-- Name: surveys_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE surveys_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 282 (OID 18142698)
+--
+-- Name: surveys Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE surveys (
+ survey_id number(*) NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ survey_title varchar2(4000) DEFAULT ' ' NOT NULL,
+ survey_questions varchar2(4000) DEFAULT ' ' NOT NULL,
+ is_active number(*) DEFAULT '1' NOT NULL,
+ PRIMARY KEY (survey_id)
+);
+
+--
+-- TOC Entry ID 146 (OID 18142735)
+--
+-- Name: system_history_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE system_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 148 (OID 18142787)
+--
+-- Name: system_machines_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE system_machines_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 150 (OID 18142836)
+--
+-- Name: system_news_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE system_news_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 152 (OID 18142895)
+--
+-- Name: system_services_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE system_services_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 154 (OID 18142944)
+--
+-- Name: system_status_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE system_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 283 (OID 18142992)
+--
+-- Name: theme_prefs Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE theme_prefs (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ user_theme number(*) DEFAULT '0' NOT NULL,
+ body_font character(80) DEFAULT '',
+ body_size character(5) DEFAULT '',
+ titlebar_font character(80) DEFAULT '',
+ titlebar_size character(5) DEFAULT '',
+ color_titlebar_back character(7) DEFAULT '',
+ color_ltback1 character(7) DEFAULT '',
+ PRIMARY KEY (user_id)
+);
+
+--
+-- TOC Entry ID 156 (OID 18143020)
+--
+-- Name: themes_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE themes_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 284 (OID 18143038)
+--
+-- Name: themes Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE themes (
+ theme_id number(*) NOT NULL,
+ dirname character varying(80),
+ fullname character varying(80),
+ PRIMARY KEY (theme_id)
+);
+
+--
+-- TOC Entry ID 285 (OID 18143054)
+--
+-- Name: tmp_projs_releases_tmp Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE tmp_projs_releases_tmp (
+ year number(*) DEFAULT '0' NOT NULL,
+ month number(*) DEFAULT '0' NOT NULL,
+ total_proj number(*) DEFAULT '0' NOT NULL,
+ total_releases number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 286 (OID 18143071)
+--
+-- Name: top_group Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE top_group (
+ group_id number(*) DEFAULT '0' NOT NULL,
+ group_name character varying(40),
+ downloads_all number(*) DEFAULT '0' NOT NULL,
+ rank_downloads_all number(*) DEFAULT '0' NOT NULL,
+ rank_downloads_all_old number(*) DEFAULT '0' NOT NULL,
+ downloads_week number(*) DEFAULT '0' NOT NULL,
+ rank_downloads_week number(*) DEFAULT '0' NOT NULL,
+ rank_downloads_week_old number(*) DEFAULT '0' NOT NULL,
+ userrank number(*) DEFAULT '0' NOT NULL,
+ rank_userrank number(*) DEFAULT '0' NOT NULL,
+ rank_userrank_old number(*) DEFAULT '0' NOT NULL,
+ forumposts_week number(*) DEFAULT '0' NOT NULL,
+ rank_forumposts_week number(*) DEFAULT '0' NOT NULL,
+ rank_forumposts_week_old number(*) DEFAULT '0' NOT NULL,
+ pageviews_proj number(*) DEFAULT '0' NOT NULL,
+ rank_pageviews_proj number(*) DEFAULT '0' NOT NULL,
+ rank_pageviews_proj_old number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 158 (OID 18143113)
+--
+-- Name: trove_cat_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE trove_cat_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 287 (OID 18143131)
+--
+-- Name: trove_cat Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE trove_cat (
+ trove_cat_id number(*) NOT NULL,
+ version number(*) DEFAULT '0' NOT NULL,
+ parent number(*) DEFAULT '0' NOT NULL,
+ root_parent number(*) DEFAULT '0' NOT NULL,
+ shortname character varying(80),
+ fullname character varying(80),
+ description character varying(255),
+ count_subcat number(*) DEFAULT '0' NOT NULL,
+ count_subproj number(*) DEFAULT '0' NOT NULL,
+ fullpath varchar2(4000) DEFAULT ' ' NOT NULL,
+ fullpath_ids varchar2(4000),
+ PRIMARY KEY (trove_cat_id)
+);
+
+--
+-- TOC Entry ID 160 (OID 18143176)
+--
+-- Name: trove_group_link_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE trove_group_link_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 288 (OID 18143194)
+--
+-- Name: trove_group_link Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE trove_group_link (
+ trove_group_id number(*) NOT NULL,
+ trove_cat_id number(*) DEFAULT '0' NOT NULL,
+ trove_cat_version number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ trove_cat_root number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (trove_group_id)
+);
+
+--
+-- TOC Entry ID 162 (OID 18143216)
+--
+-- Name: trove_treesums_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE trove_treesums_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 289 (OID 18143234)
+--
+-- Name: trove_treesums Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE trove_treesums (
+ trove_treesums_id number(*) NOT NULL,
+ trove_cat_id number(*) DEFAULT '0' NOT NULL,
+ limit_1 number(*) DEFAULT '0' NOT NULL,
+ subprojects number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (trove_treesums_id)
+);
+
+--
+-- TOC Entry ID 164 (OID 18143286)
+--
+-- Name: user_bookmarks_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_bookmarks_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 290 (OID 18143304)
+--
+-- Name: user_bookmarks Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_bookmarks (
+ bookmark_id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ bookmark_url varchar2(4000),
+ bookmark_title varchar2(4000),
+ PRIMARY KEY (bookmark_id)
+);
+
+--
+-- TOC Entry ID 166 (OID 18143337)
+--
+-- Name: user_diary_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_diary_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 291 (OID 18143355)
+--
+-- Name: user_diary Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_diary (
+ id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ date_posted number(*) DEFAULT '0' NOT NULL,
+ summary varchar2(4000),
+ details varchar2(4000),
+ is_public number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (id)
+);
+
+--
+-- TOC Entry ID 168 (OID 18143392)
+--
+-- Name: user_diary_monitor_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_diary_monitor_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 292 (OID 18143410)
+--
+-- Name: user_diary_monitor Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_diary_monitor (
+ monitor_id number(*) NOT NULL,
+ monitored_user number(*) DEFAULT '0' NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (monitor_id)
+);
+
+--
+-- TOC Entry ID 170 (OID 18143428)
+--
+-- Name: user_group_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_group_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 293 (OID 18143446)
+--
+-- Name: user_group Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_group (
+ user_group_id number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ admin_flags character(16) DEFAULT ' ' NOT NULL,
+ bug_flags number(*) DEFAULT '0' NOT NULL,
+ forum_flags number(*) DEFAULT '0' NOT NULL,
+ project_flags number(*) DEFAULT '2' NOT NULL,
+ patch_flags number(*) DEFAULT '1' NOT NULL,
+ support_flags number(*) DEFAULT '1' NOT NULL,
+ doc_flags number(*) DEFAULT '0' NOT NULL,
+ cvs_flags number(*) DEFAULT '1' NOT NULL,
+ member_role number(*) DEFAULT '100' NOT NULL,
+ release_flags number(*) DEFAULT '0' NOT NULL,
+ PRIMARY KEY (user_group_id)
+);
+
+--
+-- TOC Entry ID 172 (OID 18143484)
+--
+-- Name: user_metric_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_metric_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 294 (OID 18143502)
+--
+-- Name: user_metric Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_metric (
+ ranking number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ times_ranked number(*) DEFAULT '0' NOT NULL,
+ avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL,
+ avg_rating double precision DEFAULT '0.00000000' NOT NULL,
+ metric double precision DEFAULT '0.00000000' NOT NULL,
+ percentile double precision DEFAULT '0.00000000' NOT NULL,
+ importance_factor double precision DEFAULT '0.00000000' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 174 (OID 18143530)
+--
+-- Name: user_metric0_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE user_metric0_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 295 (OID 18143548)
+--
+-- Name: user_metric0 Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_metric0 (
+ ranking number(*) NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ times_ranked number(*) DEFAULT '0' NOT NULL,
+ avg_raters_importance double precision DEFAULT '0.00000000' NOT NULL,
+ avg_rating double precision DEFAULT '0.00000000' NOT NULL,
+ metric double precision DEFAULT '0.00000000' NOT NULL,
+ percentile double precision DEFAULT '0.00000000' NOT NULL,
+ importance_factor double precision DEFAULT '0.00000000' NOT NULL,
+ PRIMARY KEY (ranking)
+);
+
+--
+-- TOC Entry ID 296 (OID 18143576)
+--
+-- Name: user_preferences Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_preferences (
+ user_id number(*) DEFAULT '0' NOT NULL,
+ preference_name character varying(20),
+ preference_value character varying(20),
+ set_date number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 297 (OID 18143591)
+--
+-- Name: user_ratings Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE user_ratings (
+ rated_by number(*) DEFAULT '0' NOT NULL,
+ user_id number(*) DEFAULT '0' NOT NULL,
+ rate_field number(*) DEFAULT '0' NOT NULL,
+ rating number(*) DEFAULT '0' NOT NULL
+);
+
+--
+-- TOC Entry ID 176 (OID 18143608)
+--
+-- Name: users_pk_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE users_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 298 (OID 18143626)
+--
+-- Name: users Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE users (
+ user_id number(*) NOT NULL,
+ user_name varchar2(200) DEFAULT ' ' NOT NULL,
+ email varchar2(4000) DEFAULT ' ' NOT NULL,
+ user_pw character varying(32) DEFAULT ' ' NOT NULL,
+ realname character varying(32) DEFAULT ' ' NOT NULL,
+ status character(1) DEFAULT 'A' NOT NULL,
+ shell character varying(20) DEFAULT '/bin/bash' NOT NULL,
+ unix_pw character varying(40) DEFAULT ' ' NOT NULL,
+ unix_status character(1) DEFAULT 'N' NOT NULL,
+ unix_uid number(*) DEFAULT '0' NOT NULL,
+ unix_box character varying(10) DEFAULT 'shell1' NOT NULL,
+ add_date number(*) DEFAULT '0' NOT NULL,
+ confirm_hash character varying(32),
+ mail_siteupdates number(*) DEFAULT '0' NOT NULL,
+ mail_va number(*) DEFAULT '0' NOT NULL,
+ authorized_keys varchar2(4000),
+ email_new varchar2(4000),
+ people_view_skills number(*) DEFAULT '0' NOT NULL,
+ people_resume varchar2(4000) DEFAULT ' ' NOT NULL,
+ timezone character varying(64) DEFAULT 'GMT',
+ language number(*) DEFAULT '1' NOT NULL,
+ PRIMARY KEY (user_id)
+);
+
+--
+-- TOC Entry ID 178 (OID 27311232)
+--
+-- Name: unix_uid_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE unix_uid_seq START WITH 1;
+
+--
+-- TOC Entry ID 180 (OID 27311250)
+--
+-- Name: forum_thread_seq Type: SEQUENCE Owner: tperdue
+--
+
+CREATE SEQUENCE forum_thread_seq START WITH 1;
+
+--
+-- TOC Entry ID 299 (OID 27311451)
+--
+-- Name: trove_agg Type: TABLE Owner: tperdue
+--
+
+CREATE TABLE trove_agg (
+ trove_cat_id number(*),
+ group_id number(*),
+ group_name character varying(40),
+ unix_group_name character varying(30),
+ status character(1),
+ register_time number(*),
+ short_description character varying(255),
+ percentile double precision,
+ ranking integer
+);
+
+--
+-- TOC Entry ID 302 (OID 30136736)
+--
+-- Name: activity_log Type: TABLE Owner: www
+--
+
+CREATE TABLE activity_log (
+ day number(*) DEFAULT '0' NOT NULL,
+ hour number(*) DEFAULT '0' NOT NULL,
+ group_id number(*) DEFAULT '0' NOT NULL,
+ browser character varying(8) DEFAULT 'OTHER' NOT NULL,
+ ver double precision DEFAULT '0.00' NOT NULL,
+ platform character varying(8) DEFAULT 'OTHER' NOT NULL,
+ time number(*) DEFAULT '0' NOT NULL,
+ page varchar2(4000),
+ type number(*) DEFAULT '0' NOT NULL
+);
+
+--\connect - tperdue
+--
+-- TOC Entry ID 316 (OID 18138445)
+--
+-- Name: bug_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_group_id on bug ( group_id );
+
+--
+-- TOC Entry ID 466 (OID 18138445)
+--
+-- Name: bug_groupid_statusid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_groupid_statusid on bug ( group_id, status_id );
+
+--
+-- TOC Entry ID 467 (OID 18138445)
+--
+-- Name: bug_groupid_assign_statusid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_groupid_assign_statusid on bug ( group_id, assigned_to, status_id );
+
+--
+-- TOC Entry ID 317 (OID 18138513)
+--
+-- Name: bug_bug_dependencies_bug_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_bug_dependencies_bug_id on bug_bug_dependencies ( bug_id );
+
+--
+-- TOC Entry ID 318 (OID 18138513)
+--
+-- Name: bug_bug_dependent_on_task_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_bug_dependent_on_task_id on bug_bug_dependencies ( is_dependent_on_bug_id );
+
+--
+-- TOC Entry ID 319 (OID 18138549)
+--
+-- Name: bug_canned_response_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_canned_response_group_id on bug_canned_responses ( group_id );
+
+--
+-- TOC Entry ID 320 (OID 18138600)
+--
+-- Name: bug_category_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_category_group_id on bug_category ( group_id );
+
+--
+-- TOC Entry ID 321 (OID 18138705)
+--
+-- Name: bug_group_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_group_group_id on bug_group ( group_id );
+
+--
+-- TOC Entry ID 322 (OID 18138756)
+--
+-- Name: bug_history_bug_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_history_bug_id on bug_history ( bug_id );
+
+--
+-- TOC Entry ID 323 (OID 18138909)
+--
+-- Name: bug_task_dependencies_bug_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_task_dependencies_bug_id on bug_task_dependencies ( bug_id );
+
+--
+-- TOC Entry ID 324 (OID 18138909)
+--
+-- Name: bug_task_dependent_on_task_i Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_task_dependent_on_task_i on bug_task_dependencies ( is_dependent_on_task_id );
+
+--
+-- TOC Entry ID 325 (OID 18138995)
+--
+-- Name: db_images_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX db_images_group on db_images ( group_id );
+
+--
+-- TOC Entry ID 326 (OID 18139058)
+--
+-- Name: doc_group_doc_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX doc_group_doc_group on doc_data ( doc_group );
+
+--
+-- TOC Entry ID 327 (OID 18139122)
+--
+-- Name: doc_groups_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX doc_groups_group on doc_groups ( group_id );
+
+--
+-- TOC Entry ID 328 (OID 18139192)
+--
+-- Name: filemodule_monitor_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX filemodule_monitor_id on filemodule_monitor ( filemodule_id );
+
+--
+-- TOC Entry ID 329 (OID 18139228)
+--
+-- Name: forum_forumid_msgid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_forumid_msgid on forum ( group_forum_id, msg_id );
+
+--
+-- TOC Entry ID 330 (OID 18139228)
+--
+-- Name: forum_group_forum_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_group_forum_id on forum ( group_forum_id );
+
+--
+-- TOC Entry ID 331 (OID 18139228)
+--
+-- Name: forum_forumid_isfollowupto Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_forumid_isfollowupto on forum ( group_forum_id, is_followup_to );
+
+--
+-- TOC Entry ID 332 (OID 18139228)
+--
+-- Name: forum_forumid_threadid_mrec Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_forumid_threadid_mrec on forum ( group_forum_id, thread_id, most_recent_date );
+
+--
+-- TOC Entry ID 333 (OID 18139228)
+--
+-- Name: forum_threadid_isfollowupto Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_threadid_isfollowupto on forum ( thread_id, is_followup_to );
+
+--
+-- TOC Entry ID 334 (OID 18139228)
+--
+-- Name: forum_forumid_isfollto_mrec Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_forumid_isfollto_mrec on forum ( group_forum_id, is_followup_to, most_recent_date );
+
+--
+-- TOC Entry ID 335 (OID 18139309)
+--
+-- Name: forum_group_list_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_group_list_group_id on forum_group_list ( group_id );
+
+--
+-- TOC Entry ID 336 (OID 18139366)
+--
+-- Name: forum_monitor_combo_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_monitor_combo_id on forum_monitored_forums ( forum_id, user_id );
+
+--
+-- TOC Entry ID 337 (OID 18139366)
+--
+-- Name: forum_monitor_thread_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_monitor_thread_id on forum_monitored_forums ( forum_id );
+
+--
+-- TOC Entry ID 338 (OID 18139510)
+--
+-- Name: foundry_news_foundry_app_d Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_news_foundry_app_d on foundry_news ( foundry_id, is_approved, approve_date );
+
+--
+-- TOC Entry ID 339 (OID 18139510)
+--
+-- Name: foundry_news_foundry_approved Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_news_foundry_approved on foundry_news ( foundry_id, is_approved );
+
+--
+-- TOC Entry ID 340 (OID 18139510)
+--
+-- Name: foundry_news_foundry Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_news_foundry on foundry_news ( foundry_id );
+
+--
+-- TOC Entry ID 463 (OID 18139510)
+--
+-- Name: foundrynews_foundry_date_app Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundrynews_foundry_date_app on foundry_news ( foundry_id, approve_date, is_approved );
+
+--
+-- TOC Entry ID 341 (OID 18139550)
+--
+-- Name: foundry_project_group_rank Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_project_group_rank on foundry_preferred_projects ( group_id, rank );
+
+--
+-- TOC Entry ID 342 (OID 18139550)
+--
+-- Name: foundry_project_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_project_group on foundry_preferred_projects ( group_id );
+
+--
+-- TOC Entry ID 343 (OID 18139588)
+--
+-- Name: foundry_projects_foundry Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX foundry_projects_foundry on foundry_projects ( foundry_id );
+
+--
+-- TOC Entry ID 344 (OID 18139606)
+--
+-- Name: downloads_http_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX downloads_http_idx on frs_dlstats_agg ( downloads_http );
+
+--
+-- TOC Entry ID 345 (OID 18139606)
+--
+-- Name: downloads_ftp_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX downloads_ftp_idx on frs_dlstats_agg ( downloads_ftp );
+
+--
+-- TOC Entry ID 346 (OID 18139606)
+--
+-- Name: file_id_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX file_id_idx on frs_dlstats_agg ( file_id );
+
+--
+-- TOC Entry ID 347 (OID 18139606)
+--
+-- Name: day_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX day_idx on frs_dlstats_agg ( day );
+
+--
+-- TOC Entry ID 348 (OID 18139623)
+--
+-- Name: dlstats_file_down Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX dlstats_file_down on frs_dlstats_file_agg ( downloads );
+
+--
+-- TOC Entry ID 349 (OID 18139623)
+--
+-- Name: dlstats_file_file_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX dlstats_file_file_id on frs_dlstats_file_agg ( file_id );
+
+--
+-- TOC Entry ID 350 (OID 18139623)
+--
+-- Name: dlstats_file_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX dlstats_file_day on frs_dlstats_file_agg ( day );
+
+--
+-- TOC Entry ID 351 (OID 18139638)
+--
+-- Name: stats_agr_tmp_fid Type: INDEX Owner: tperdue
+--
+
+--CREATE INDEX stats_agr_tmp_fid on frs_dlstats_filetotal_agg ( file_id );
+
+--
+-- TOC Entry ID 352 (OID 18139654)
+--
+-- Name: frs_dlstats_filet_agg_old_f Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_dlstats_filet_agg_old_f on frs_dlstats_filetotal_agg_old ( file_id );
+
+--
+-- TOC Entry ID 303 (OID 18139667)
+--
+-- Name: frsdlstatsgroupagg_day_dls Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frsdlstatsgroupagg_day_dls on frs_dlstats_group_agg ( day, downloads );
+
+--
+-- TOC Entry ID 353 (OID 18139667)
+--
+-- Name: group_id_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX group_id_idx on frs_dlstats_group_agg ( group_id );
+
+--
+-- TOC Entry ID 355 (OID 18139667)
+--
+-- Name: frs_dlstats_group_agg_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_dlstats_group_agg_day on frs_dlstats_group_agg ( day );
+
+--
+-- TOC Entry ID 356 (OID 18139682)
+--
+-- Name: stats_agr_tmp_gid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_agr_tmp_gid on frs_dlstats_grouptotal_agg ( group_id );
+
+--
+-- TOC Entry ID 357 (OID 18139714)
+--
+-- Name: frs_file_name Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_file_name on frs_file ( filename );
+
+--
+-- TOC Entry ID 358 (OID 18139714)
+--
+-- Name: frs_file_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_file_date on frs_file ( post_date );
+
+--
+-- TOC Entry ID 359 (OID 18139714)
+--
+-- Name: frs_file_processor Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_file_processor on frs_file ( processor_id );
+
+--
+-- TOC Entry ID 360 (OID 18139714)
+--
+-- Name: frs_file_release_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_file_release_id on frs_file ( release_id );
+
+--
+-- TOC Entry ID 361 (OID 18139714)
+--
+-- Name: frs_file_type Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_file_type on frs_file ( type_id );
+
+--
+-- TOC Entry ID 362 (OID 18139822)
+--
+-- Name: package_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX package_group_id on frs_package ( group_id );
+
+--
+-- TOC Entry ID 363 (OID 18139922)
+--
+-- Name: frs_release_package Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_release_package on frs_release ( package_id );
+
+--
+-- TOC Entry ID 364 (OID 18139922)
+--
+-- Name: frs_release_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_release_date on frs_release ( release_date );
+
+--
+-- TOC Entry ID 365 (OID 18139922)
+--
+-- Name: frs_release_by Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX frs_release_by on frs_release ( released_by );
+
+--
+-- TOC Entry ID 366 (OID 18140030)
+--
+-- Name: group_cvs_history_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX group_cvs_history_group_id on group_cvs_history ( group_id );
+
+--
+-- TOC Entry ID 367 (OID 18140030)
+--
+-- Name: user_name_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_name_idx on group_cvs_history ( user_name );
+
+--
+-- TOC Entry ID 368 (OID 18140074)
+--
+-- Name: group_history_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX group_history_group_id on group_history ( group_id );
+
+--
+-- TOC Entry ID 369 (OID 18140178)
+--
+-- Name: groups_unix Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX groups_unix on groups ( unix_group_name );
+
+--
+-- TOC Entry ID 370 (OID 18140178)
+--
+-- Name: groups_type Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX groups_type on groups ( type );
+
+--
+-- TOC Entry ID 371 (OID 18140178)
+--
+-- Name: groups_public Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX groups_public on groups ( is_public );
+
+--
+-- TOC Entry ID 372 (OID 18140178)
+--
+-- Name: groups_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX groups_status on groups ( status );
+
+--
+-- TOC Entry ID 373 (OID 18140319)
+--
+-- Name: mail_group_list_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX mail_group_list_group on mail_group_list ( group_id );
+
+--
+-- TOC Entry ID 374 (OID 18140377)
+--
+-- Name: news_bytes_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX news_bytes_group on news_bytes ( group_id );
+
+--
+-- TOC Entry ID 375 (OID 18140377)
+--
+-- Name: news_bytes_approved Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX news_bytes_approved on news_bytes ( is_approved );
+
+--
+-- TOC Entry ID 376 (OID 18140377)
+--
+-- Name: news_bytes_forum Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX news_bytes_forum on news_bytes ( forum_id );
+
+--
+-- TOC Entry ID 464 (OID 18140377)
+--
+-- Name: news_group_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX news_group_date on news_bytes ( group_id, date1 );
+
+--
+-- TOC Entry ID 465 (OID 18140377)
+--
+-- Name: news_approved_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX news_approved_date on news_bytes ( is_approved, date1 );
+
+--
+-- TOC Entry ID 377 (OID 18140437)
+--
+-- Name: patch_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_group_id on patch ( group_id );
+
+--
+-- TOC Entry ID 451 (OID 18140437)
+--
+-- Name: patch_groupid_assign_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_groupid_assign_status on patch ( group_id, assigned_to, patch_status_id );
+
+--
+-- TOC Entry ID 452 (OID 18140437)
+--
+-- Name: patch_groupid_assignedto Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_groupid_assignedto on patch ( group_id, assigned_to );
+
+--
+-- TOC Entry ID 453 (OID 18140437)
+--
+-- Name: patch_groupid_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_groupid_status on patch ( group_id, patch_status_id );
+
+--
+-- TOC Entry ID 378 (OID 18140501)
+--
+-- Name: patch_group_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_group_group_id on patch_category ( group_id );
+
+--
+-- TOC Entry ID 379 (OID 18140552)
+--
+-- Name: patch_history_patch_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX patch_history_patch_id on patch_history ( patch_id );
+
+--
+-- TOC Entry ID 461 (OID 18140656)
+--
+-- Name: people_job_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX people_job_group_id on people_job ( group_id );
+
+--
+-- TOC Entry ID 380 (OID 18141038)
+--
+-- Name: project_assign_to_assigned_to Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_assign_to_assigned_to on project_assigned_to ( assigned_to_id );
+
+--
+-- TOC Entry ID 381 (OID 18141038)
+--
+-- Name: project_assigned_to_task_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_assigned_to_task_id on project_assigned_to ( project_task_id );
+
+--
+-- TOC Entry ID 382 (OID 18141128)
+--
+-- Name: project_dependent_on_task_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_dependent_on_task_id on project_dependencies ( is_dependent_on_task_id );
+
+--
+-- TOC Entry ID 383 (OID 18141128)
+--
+-- Name: project_dependencies_task_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_dependencies_task_id on project_dependencies ( project_task_id );
+
+--
+-- TOC Entry ID 384 (OID 18141164)
+--
+-- Name: project_group_list_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_group_list_group_id on project_group_list ( group_id );
+
+--
+-- TOC Entry ID 385 (OID 18141218)
+--
+-- Name: project_history_task_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_history_task_id on project_history ( project_task_id );
+
+--
+-- TOC Entry ID 386 (OID 18141275)
+--
+-- Name: project_metric_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_metric_group on project_metric ( group_id );
+
+--
+-- TOC Entry ID 387 (OID 18141430)
+--
+-- Name: project_task_group_project_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_task_group_project_id on project_task ( group_project_id );
+
+--
+-- TOC Entry ID 454 (OID 18141430)
+--
+-- Name: projecttask_projid_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX projecttask_projid_status on project_task ( group_project_id, status_id );
+
+--
+-- TOC Entry ID 354 (OID 18141497)
+--
+-- Name: projectweeklymetric_ranking Type: INDEX Owner: tperdue
+--
+
+--CREATE INDEX projectweeklymetric_ranking on project_weekly_metric ( ranking );
+
+--
+-- TOC Entry ID 388 (OID 18141497)
+--
+-- Name: project_metric_weekly_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_metric_weekly_group on project_weekly_metric ( group_id );
+
+--
+-- TOC Entry ID 389 (OID 18141514)
+--
+-- Name: session_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX session1_user_id on session1 ( user_id );
+
+--
+-- TOC Entry ID 390 (OID 18141514)
+--
+-- Name: session_time Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX session1_time on session1 ( time );
+
+--
+-- TOC Entry ID 391 (OID 18141552)
+--
+-- Name: snippet_language Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_language on snippet ( language );
+
+--
+-- TOC Entry ID 392 (OID 18141552)
+--
+-- Name: snippet_category Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_category on snippet ( category );
+
+--
+-- TOC Entry ID 393 (OID 18141611)
+--
+-- Name: snippet_package_language Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_package_language on snippet_package ( language );
+
+--
+-- TOC Entry ID 394 (OID 18141611)
+--
+-- Name: snippet_package_category Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_package_category on snippet_package ( category );
+
+--
+-- TOC Entry ID 395 (OID 18141666)
+--
+-- Name: snippet_package_item_pkg_ver Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_package_item_pkg_ver on snippet_package_item ( snippet_package_version_id );
+
+--
+-- TOC Entry ID 396 (OID 18141702)
+--
+-- Name: snippet_package_version_pkg_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_package_version_pkg_id on snippet_package_version ( snippet_package_id );
+
+--
+-- TOC Entry ID 397 (OID 18141757)
+--
+-- Name: snippet_version_snippet_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX snippet_version_snippet_id on snippet_version ( snippet_id );
+
+--
+-- TOC Entry ID 398 (OID 18141829)
+--
+-- Name: pages_by_day_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX pages_by_day_day on stats_agg_pages_by_day ( day );
+
+--
+-- TOC Entry ID 399 (OID 18141881)
+--
+-- Name: stats_agr_filerelease_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_agr_filerelease_group_id on stats_agr_filerelease ( group_id );
+
+--
+-- TOC Entry ID 400 (OID 18141881)
+--
+-- Name: stats_agr_filerel_filerelea Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_agr_filerel_filerelea on stats_agr_filerelease ( filerelease_id );
+
+--
+-- TOC Entry ID 401 (OID 18141896)
+--
+-- Name: project_agr_log_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_agr_log_group on stats_agr_project ( group_id );
+
+--
+-- TOC Entry ID 402 (OID 18141949)
+--
+-- Name: ftpdl_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX ftpdl_group_id on stats_ftp_downloads ( group_id );
+
+--
+-- TOC Entry ID 403 (OID 18141949)
+--
+-- Name: ftpdl_fid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX ftpdl_fid on stats_ftp_downloads ( filerelease_id );
+
+--
+-- TOC Entry ID 404 (OID 18141949)
+--
+-- Name: ftpdl_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX ftpdl_day on stats_ftp_downloads ( day );
+
+--
+-- TOC Entry ID 405 (OID 18141966)
+--
+-- Name: httpdl_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX httpdl_group_id on stats_http_downloads ( group_id );
+
+--
+-- TOC Entry ID 406 (OID 18141966)
+--
+-- Name: httpdl_fid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX httpdl_fid on stats_http_downloads ( filerelease_id );
+
+--
+-- TOC Entry ID 407 (OID 18141966)
+--
+-- Name: httpdl_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX httpdl_day on stats_http_downloads ( day );
+
+--
+-- TOC Entry ID 408 (OID 18141983)
+--
+-- Name: archive_project_monthday Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX archive_project_monthday on stats_project ( month, day );
+
+--
+-- TOC Entry ID 409 (OID 18141983)
+--
+-- Name: project_log_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_log_group on stats_project ( group_id );
+
+--
+-- TOC Entry ID 410 (OID 18141983)
+--
+-- Name: archive_project_week Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX archive_project_week on stats_project ( week );
+
+--
+-- TOC Entry ID 411 (OID 18141983)
+--
+-- Name: archive_project_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX archive_project_day on stats_project ( day );
+
+--
+-- TOC Entry ID 412 (OID 18141983)
+--
+-- Name: archive_project_month Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX archive_project_month on stats_project ( month );
+
+--
+-- TOC Entry ID 413 (OID 18142042)
+--
+-- Name: stats_project_tmp_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_project_tmp_group_id on stats_project_tmp ( group_id );
+
+--
+-- TOC Entry ID 414 (OID 18142042)
+--
+-- Name: project_stats_week Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_stats_week on stats_project_tmp ( week );
+
+--
+-- TOC Entry ID 415 (OID 18142042)
+--
+-- Name: project_stats_month Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_stats_month on stats_project_tmp ( month );
+
+--
+-- TOC Entry ID 416 (OID 18142042)
+--
+-- Name: project_stats_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_stats_day on stats_project_tmp ( day );
+
+--
+-- TOC Entry ID 417 (OID 18142101)
+--
+-- Name: stats_site_monthday Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_site_monthday on stats_site ( month, day );
+
+--
+-- TOC Entry ID 418 (OID 18142101)
+--
+-- Name: stats_site_week Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_site_week on stats_site ( week );
+
+--
+-- TOC Entry ID 419 (OID 18142101)
+--
+-- Name: stats_site_day Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_site_day on stats_site ( day );
+
+--
+-- TOC Entry ID 420 (OID 18142101)
+--
+-- Name: stats_site_month Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX stats_site_month on stats_site ( month );
+
+--
+-- TOC Entry ID 421 (OID 18142150)
+--
+-- Name: support_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_group_id on support ( group_id );
+
+--
+-- TOC Entry ID 448 (OID 18142150)
+--
+-- Name: support_groupid_assignedto Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_groupid_assignedto on support ( group_id, assigned_to );
+
+--
+-- TOC Entry ID 449 (OID 18142150)
+--
+-- Name: support_groupid_assign_stat Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_groupid_assign_stat on support ( group_id, assigned_to, support_status_id );
+
+--
+-- TOC Entry ID 450 (OID 18142150)
+--
+-- Name: support_groupid_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_groupid_status on support ( group_id, support_status_id );
+
+--
+-- TOC Entry ID 422 (OID 18142214)
+--
+-- Name: support_canned_res_group_i Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_canned_res_group_i on support_canned_responses ( group_id );
+
+--
+-- TOC Entry ID 423 (OID 18142265)
+--
+-- Name: support_group_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_group_group_id on support_category ( group_id );
+
+--
+-- TOC Entry ID 424 (OID 18142316)
+--
+-- Name: support_history_support_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_history_support_id on support_history ( support_id );
+
+--
+-- TOC Entry ID 425 (OID 18142372)
+--
+-- Name: support_messages_support_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX support_messages_support_id on support_messages ( support_id );
+
+--
+-- TOC Entry ID 426 (OID 18142473)
+--
+-- Name: supported_languages_code Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX supported_languages_code on supported_languages ( language_code );
+
+--
+-- TOC Entry ID 427 (OID 18142573)
+--
+-- Name: survey_questions_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_questions_group on survey_questions ( group_id );
+
+--
+-- TOC Entry ID 428 (OID 18142608)
+--
+-- Name: survey_rating_agg_type_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_rating_agg_type_id on survey_rating_aggregate ( type, id );
+
+--
+-- TOC Entry ID 429 (OID 18142625)
+--
+-- Name: survey_rating_res_user_ty Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_rating_res_user_ty on survey_rating_response ( user_id, type, id );
+
+--
+-- TOC Entry ID 430 (OID 18142625)
+--
+-- Name: survey_rating_res_type_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_rating_res_type_id on survey_rating_response ( type, id );
+
+--
+-- TOC Entry ID 431 (OID 18142644)
+--
+-- Name: survey_responses_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_responses_group_id on survey_responses ( group_id );
+
+--
+-- TOC Entry ID 432 (OID 18142644)
+--
+-- Name: survey_res_user_survey_qu Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_res_user_survey_qu on survey_responses ( user_id, survey_id, question_id );
+
+--
+-- TOC Entry ID 433 (OID 18142644)
+--
+-- Name: survey_responses_user_survey Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_responses_user_survey on survey_responses ( user_id, survey_id );
+
+--
+-- TOC Entry ID 434 (OID 18142644)
+--
+-- Name: survey_res_survey_questio Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX survey_res_survey_questio on survey_responses ( survey_id, question_id );
+
+--
+-- TOC Entry ID 435 (OID 18142698)
+--
+-- Name: surveys_group Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX surveys_group on surveys ( group_id );
+
+--
+-- TOC Entry ID 436 (OID 18143071)
+--
+-- Name: rank_forumposts_week_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX rank_forumposts_week_idx on top_group ( rank_forumposts_week );
+
+--
+-- TOC Entry ID 437 (OID 18143071)
+--
+-- Name: rank_downloads_week_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX rank_downloads_week_idx on top_group ( rank_downloads_week );
+
+--
+-- TOC Entry ID 438 (OID 18143071)
+--
+-- Name: pageviews_proj_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX pageviews_proj_idx on top_group ( pageviews_proj );
+
+--
+-- TOC Entry ID 439 (OID 18143071)
+--
+-- Name: rank_userrank_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX rank_userrank_idx on top_group ( rank_userrank );
+
+--
+-- TOC Entry ID 440 (OID 18143071)
+--
+-- Name: rank_downloads_all_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX rank_downloads_all_idx on top_group ( rank_downloads_all );
+
+--
+-- TOC Entry ID 441 (OID 18143131)
+--
+-- Name: parent_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX parent_idx on trove_cat ( parent );
+
+--
+-- TOC Entry ID 442 (OID 18143131)
+--
+-- Name: root_parent_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX root_parent_idx on trove_cat ( root_parent );
+
+--
+-- TOC Entry ID 443 (OID 18143131)
+--
+-- Name: version_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX version_idx on trove_cat ( version );
+
+--
+-- TOC Entry ID 444 (OID 18143194)
+--
+-- Name: trove_group_link_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX trove_group_link_group_id on trove_group_link ( group_id );
+
+--
+-- TOC Entry ID 445 (OID 18143194)
+--
+-- Name: trove_group_link_cat_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX trove_group_link_cat_id on trove_group_link ( trove_cat_id );
+
+--
+-- TOC Entry ID 446 (OID 18143304)
+--
+-- Name: user_bookmark_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_bookmark_user_id on user_bookmarks ( user_id );
+
+--
+-- TOC Entry ID 304 (OID 18143355)
+--
+-- Name: user_diary_user Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_diary_user on user_diary ( user_id );
+
+--
+-- TOC Entry ID 305 (OID 18143355)
+--
+-- Name: user_diary_user_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_diary_user_date on user_diary ( user_id, date_posted );
+
+--
+-- TOC Entry ID 306 (OID 18143355)
+--
+-- Name: user_diary_date Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_diary_date on user_diary ( date_posted );
+
+--
+-- TOC Entry ID 307 (OID 18143410)
+--
+-- Name: user_diary_monitor_user Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_diary_monitor_user on user_diary_monitor ( user_id );
+
+--
+-- TOC Entry ID 308 (OID 18143410)
+--
+-- Name: user_diary_monitor_monitor_us Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_diary_monitor_monitor_us on user_diary_monitor ( monitored_user );
+
+--
+-- TOC Entry ID 309 (OID 18143446)
+--
+-- Name: user_group_group_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_group_group_id on user_group ( group_id );
+
+--
+-- TOC Entry ID 310 (OID 18143446)
+--
+-- Name: bug_flags_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX bug_flags_idx on user_group ( bug_flags );
+
+--
+-- TOC Entry ID 311 (OID 18143446)
+--
+-- Name: project_flags_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX project_flags_idx on user_group ( project_flags );
+
+--
+-- TOC Entry ID 312 (OID 18143446)
+--
+-- Name: user_group_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_group_user_id on user_group ( user_id );
+
+--
+-- TOC Entry ID 313 (OID 18143446)
+--
+-- Name: admin_flags_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX admin_flags_idx on user_group ( admin_flags );
+
+--
+-- TOC Entry ID 314 (OID 18143446)
+--
+-- Name: forum_flags_idx Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX forum_flags_idx on user_group ( forum_flags );
+
+--
+-- TOC Entry ID 315 (OID 18143548)
+--
+-- Name: user_metric0_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_metric0_user_id on user_metric0 ( user_id );
+
+--
+-- TOC Entry ID 455 (OID 18143576)
+--
+-- Name: user_pref_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_pref_user_id on user_preferences ( user_id );
+
+--
+-- TOC Entry ID 456 (OID 18143591)
+--
+-- Name: user_ratings_rated_by Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_ratings_rated_by on user_ratings ( rated_by );
+
+--
+-- TOC Entry ID 457 (OID 18143591)
+--
+-- Name: user_ratings_user_id Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX user_ratings_user_id on user_ratings ( user_id );
+
+--
+-- TOC Entry ID 447 (OID 18143626)
+--
+-- Name: users_status Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX users_status on users ( status );
+
+--
+-- TOC Entry ID 458 (OID 18143626)
+--
+-- Name: user_user Type: INDEX Owner: tperdue
+--
+
+--CREATE INDEX user_user on users ( status );
+
+--
+-- TOC Entry ID 459 (OID 18143626)
+--
+-- Name: idx_users_username Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX idx_users_username on users ( user_name );
+
+--
+-- TOC Entry ID 462 (OID 18143626)
+--
+-- Name: users_user_pw Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX users_user_pw on users ( user_pw );
+
+--
+-- TOC Entry ID 460 (OID 27311451)
+--
+-- Name: troveagg_trovecatid Type: INDEX Owner: tperdue
+--
+
+CREATE INDEX troveagg_trovecatid on trove_agg ( trove_cat_id );
+
+--
+-- TOC Entry ID 536 (OID 27311269)
+--
+-- Name: RI_ConstraintTrigger_27311268 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 537 (OID 27311271)
+--
+-- Name: RI_ConstraintTrigger_27311270 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 538 (OID 27311273)
+--
+-- Name: RI_ConstraintTrigger_27311272 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 535 (OID 27311275)
+--
+-- Name: RI_ConstraintTrigger_27311274 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 506 (OID 27311277)
+--
+-- Name: RI_ConstraintTrigger_27311276 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 505 (OID 27311279)
+--
+-- Name: RI_ConstraintTrigger_27311278 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 487 (OID 27311281)
+--
+-- Name: RI_ConstraintTrigger_27311280 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 539 (OID 27311283)
+--
+-- Name: RI_ConstraintTrigger_27311282 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 540 (OID 27311285)
+--
+-- Name: RI_ConstraintTrigger_27311284 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 486 (OID 27311287)
+--
+-- Name: RI_ConstraintTrigger_27311286 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 492 (OID 27311289)
+--
+-- Name: RI_ConstraintTrigger_27311288 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 491 (OID 27311291)
+--
+-- Name: RI_ConstraintTrigger_27311290 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 490 (OID 27311293)
+--
+-- Name: RI_ConstraintTrigger_27311292 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 504 (OID 27311295)
+--
+-- Name: RI_ConstraintTrigger_27311294 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 503 (OID 27311297)
+--
+-- Name: RI_ConstraintTrigger_27311296 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 479 (OID 27311299)
+--
+-- Name: RI_ConstraintTrigger_27311298 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 502 (OID 27311301)
+--
+-- Name: RI_ConstraintTrigger_27311300 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 501 (OID 27311303)
+--
+-- Name: RI_ConstraintTrigger_27311302 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 476 (OID 27311305)
+--
+-- Name: RI_ConstraintTrigger_27311304 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 500 (OID 27311307)
+--
+-- Name: RI_ConstraintTrigger_27311306 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 499 (OID 27311309)
+--
+-- Name: RI_ConstraintTrigger_27311308 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 473 (OID 27311311)
+--
+-- Name: RI_ConstraintTrigger_27311310 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 541 (OID 27311313)
+--
+-- Name: RI_ConstraintTrigger_27311312 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 542 (OID 27311315)
+--
+-- Name: RI_ConstraintTrigger_27311314 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 472 (OID 27311317)
+--
+-- Name: RI_ConstraintTrigger_27311316 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 543 (OID 27311319)
+--
+-- Name: RI_ConstraintTrigger_27311318 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 544 (OID 27311321)
+--
+-- Name: RI_ConstraintTrigger_27311320 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 471 (OID 27311323)
+--
+-- Name: RI_ConstraintTrigger_27311322 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 483 (OID 27311325)
+--
+-- Name: RI_ConstraintTrigger_27311324 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 482 (OID 27311327)
+--
+-- Name: RI_ConstraintTrigger_27311326 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 470 (OID 27311329)
+--
+-- Name: RI_ConstraintTrigger_27311328 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 475 (OID 27311331)
+--
+-- Name: RI_ConstraintTrigger_27311330 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 474 (OID 27311333)
+--
+-- Name: RI_ConstraintTrigger_27311332 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 469 (OID 27311335)
+--
+-- Name: RI_ConstraintTrigger_27311334 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 481 (OID 27311337)
+--
+-- Name: RI_ConstraintTrigger_27311336 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 480 (OID 27311339)
+--
+-- Name: RI_ConstraintTrigger_27311338 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 468 (OID 27311341)
+--
+-- Name: RI_ConstraintTrigger_27311340 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 478 (OID 27311343)
+--
+-- Name: RI_ConstraintTrigger_27311342 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 477 (OID 27311345)
+--
+-- Name: RI_ConstraintTrigger_27311344 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 485 (OID 27311347)
+--
+-- Name: RI_ConstraintTrigger_27311346 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 545 (OID 27311349)
+--
+-- Name: RI_ConstraintTrigger_27311348 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 546 (OID 27311351)
+--
+-- Name: RI_ConstraintTrigger_27311350 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 484 (OID 27311353)
+--
+-- Name: RI_ConstraintTrigger_27311352 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 489 (OID 27311355)
+--
+-- Name: RI_ConstraintTrigger_27311354 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 488 (OID 27311357)
+--
+-- Name: RI_ConstraintTrigger_27311356 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 518 (OID 27311359)
+--
+-- Name: RI_ConstraintTrigger_27311358 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 498 (OID 27311361)
+--
+-- Name: RI_ConstraintTrigger_27311360 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 497 (OID 27311363)
+--
+-- Name: RI_ConstraintTrigger_27311362 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 523 (OID 27311365)
+--
+-- Name: RI_ConstraintTrigger_27311364 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 517 (OID 27311367)
+--
+-- Name: RI_ConstraintTrigger_27311366 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 516 (OID 27311369)
+--
+-- Name: RI_ConstraintTrigger_27311368 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 522 (OID 27311371)
+--
+-- Name: RI_ConstraintTrigger_27311370 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 547 (OID 27311373)
+--
+-- Name: RI_ConstraintTrigger_27311372 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 548 (OID 27311375)
+--
+-- Name: RI_ConstraintTrigger_27311374 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 521 (OID 27311377)
+--
+-- Name: RI_ConstraintTrigger_27311376 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 520 (OID 27311379)
+--
+-- Name: RI_ConstraintTrigger_27311378 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 519 (OID 27311381)
+--
+-- Name: RI_ConstraintTrigger_27311380 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 510 (OID 27311383)
+--
+-- Name: RI_ConstraintTrigger_27311382 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 515 (OID 27311385)
+--
+-- Name: RI_ConstraintTrigger_27311384 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 514 (OID 27311387)
+--
+-- Name: RI_ConstraintTrigger_27311386 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 509 (OID 27311389)
+--
+-- Name: RI_ConstraintTrigger_27311388 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 513 (OID 27311391)
+--
+-- Name: RI_ConstraintTrigger_27311390 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 512 (OID 27311393)
+--
+-- Name: RI_ConstraintTrigger_27311392 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 508 (OID 27311395)
+--
+-- Name: RI_ConstraintTrigger_27311394 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 549 (OID 27311397)
+--
+-- Name: RI_ConstraintTrigger_27311396 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 550 (OID 27311399)
+--
+-- Name: RI_ConstraintTrigger_27311398 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 507 (OID 27311401)
+--
+-- Name: RI_ConstraintTrigger_27311400 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 551 (OID 27311403)
+--
+-- Name: RI_ConstraintTrigger_27311402 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 552 (OID 27311405)
+--
+-- Name: RI_ConstraintTrigger_27311404 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 511 (OID 27311407)
+--
+-- Name: RI_ConstraintTrigger_27311406 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 496 (OID 27311409)
+--
+-- Name: RI_ConstraintTrigger_27311408 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 495 (OID 27311411)
+--
+-- Name: RI_ConstraintTrigger_27311410 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 527 (OID 27311413)
+--
+-- Name: RI_ConstraintTrigger_27311412 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 532 (OID 27311415)
+--
+-- Name: RI_ConstraintTrigger_27311414 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 531 (OID 27311417)
+--
+-- Name: RI_ConstraintTrigger_27311416 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 526 (OID 27311419)
+--
+-- Name: RI_ConstraintTrigger_27311418 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 530 (OID 27311421)
+--
+-- Name: RI_ConstraintTrigger_27311420 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 529 (OID 27311423)
+--
+-- Name: RI_ConstraintTrigger_27311422 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 525 (OID 27311425)
+--
+-- Name: RI_ConstraintTrigger_27311424 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 553 (OID 27311427)
+--
+-- Name: RI_ConstraintTrigger_27311426 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 554 (OID 27311429)
+--
+-- Name: RI_ConstraintTrigger_27311428 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 524 (OID 27311431)
+--
+-- Name: RI_ConstraintTrigger_27311430 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 555 (OID 27311433)
+--
+-- Name: RI_ConstraintTrigger_27311432 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 556 (OID 27311435)
+--
+-- Name: RI_ConstraintTrigger_27311434 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 528 (OID 27311437)
+--
+-- Name: RI_ConstraintTrigger_27311436 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 494 (OID 27311439)
+--
+-- Name: RI_ConstraintTrigger_27311438 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 493 (OID 27311441)
+--
+-- Name: RI_ConstraintTrigger_27311440 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 557 (OID 27311443)
+--
+-- Name: RI_ConstraintTrigger_27311442 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 534 (OID 27311445)
+--
+-- Name: RI_ConstraintTrigger_27311444 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 533 (OID 27311447)
+--
+-- Name: RI_ConstraintTrigger_27311446 Type: TRIGGER Owner: tperdue
+--
+
+
+--
+-- TOC Entry ID 3 (OID 18138427)
+--
+-- Name: bug_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_pk_seq;
+CREATE SEQUENCE bug_pk_seq START WITH 125359;
+
+--
+-- TOC Entry ID 5 (OID 18138495)
+--
+-- Name: bug_bug_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_bug_dependencies_pk_seq;
+CREATE SEQUENCE bug_bug_dependencies_pk_seq START WITH 44691;
+
+--
+-- TOC Entry ID 7 (OID 18138531)
+--
+-- Name: bug_canned_responses_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_canned_responses_pk_seq;
+CREATE SEQUENCE bug_canned_responses_pk_seq START WITH 100204;
+
+--
+-- TOC Entry ID 9 (OID 18138582)
+--
+-- Name: bug_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_category_pk_seq;
+CREATE SEQUENCE bug_category_pk_seq START WITH 5053;
+
+--
+-- TOC Entry ID 11 (OID 18138632)
+--
+-- Name: bug_filter_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_filter_pk_seq;
+CREATE SEQUENCE bug_filter_pk_seq START WITH 140;
+
+--
+-- TOC Entry ID 13 (OID 18138687)
+--
+-- Name: bug_group_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_group_pk_seq;
+CREATE SEQUENCE bug_group_pk_seq START WITH 2780;
+
+--
+-- TOC Entry ID 15 (OID 18138738)
+--
+-- Name: bug_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_history_pk_seq;
+CREATE SEQUENCE bug_history_pk_seq START WITH 106196;
+
+--
+-- TOC Entry ID 17 (OID 18138794)
+--
+-- Name: bug_resolution_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_resolution_pk_seq;
+CREATE SEQUENCE bug_resolution_pk_seq START WITH 101;
+
+--
+-- TOC Entry ID 19 (OID 18138843)
+--
+-- Name: bug_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_status_pk_seq;
+CREATE SEQUENCE bug_status_pk_seq START WITH 100;
+
+--
+-- TOC Entry ID 21 (OID 18138891)
+--
+-- Name: bug_task_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE bug_task_dependencies_pk_seq;
+CREATE SEQUENCE bug_task_dependencies_pk_seq START WITH 44583;
+
+--
+-- TOC Entry ID 23 (OID 18138927)
+--
+-- Name: canned_responses_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE canned_responses_pk_seq;
+CREATE SEQUENCE canned_responses_pk_seq START WITH 5;
+
+--
+-- TOC Entry ID 25 (OID 18138977)
+--
+-- Name: db_images_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE db_images_pk_seq;
+CREATE SEQUENCE db_images_pk_seq START WITH 1128;
+
+--
+-- TOC Entry ID 27 (OID 18139040)
+--
+-- Name: doc_data_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE doc_data_pk_seq;
+CREATE SEQUENCE doc_data_pk_seq START WITH 2124;
+
+--
+-- TOC Entry ID 29 (OID 18139104)
+--
+-- Name: doc_groups_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE doc_groups_pk_seq;
+CREATE SEQUENCE doc_groups_pk_seq START WITH 1815;
+
+--
+-- TOC Entry ID 31 (OID 18139140)
+--
+-- Name: doc_states_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE doc_states_pk_seq;
+CREATE SEQUENCE doc_states_pk_seq START WITH 5;
+
+--
+-- TOC Entry ID 33 (OID 18139174)
+--
+-- Name: filemodule_monitor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE filemodule_monitor_pk_seq;
+CREATE SEQUENCE filemodule_monitor_pk_seq START WITH 312;
+
+--
+-- TOC Entry ID 35 (OID 18139210)
+--
+-- Name: forum_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE forum_pk_seq;
+CREATE SEQUENCE forum_pk_seq START WITH 84486;
+
+--
+-- TOC Entry ID 37 (OID 18139291)
+--
+-- Name: forum_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE forum_group_list_pk_seq;
+CREATE SEQUENCE forum_group_list_pk_seq START WITH 51981;
+
+--
+-- TOC Entry ID 39 (OID 18139348)
+--
+-- Name: forum_monitor_forums_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE forum_monitor_forums_pk_seq;
+CREATE SEQUENCE forum_monitor_forums_pk_seq START WITH 14831;
+
+--
+-- TOC Entry ID 41 (OID 18139384)
+--
+-- Name: forum_saved_place_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE forum_saved_place_pk_seq;
+CREATE SEQUENCE forum_saved_place_pk_seq START WITH 1835;
+
+--
+-- TOC Entry ID 43 (OID 18139492)
+--
+-- Name: foundry_news_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE foundry_news_pk_seq;
+CREATE SEQUENCE foundry_news_pk_seq START WITH 1973;
+
+--
+-- TOC Entry ID 45 (OID 18139532)
+--
+-- Name: foundry_prefer_proj_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE foundry_prefer_proj_pk_seq;
+CREATE SEQUENCE foundry_prefer_proj_pk_seq START WITH 165;
+
+--
+-- TOC Entry ID 47 (OID 18139570)
+--
+-- Name: foundry_projects_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE foundry_projects_pk_seq;
+CREATE SEQUENCE foundry_projects_pk_seq START WITH 320807;
+
+--
+-- TOC Entry ID 49 (OID 18139695)
+--
+-- Name: frs_file_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_file_pk_seq;
+CREATE SEQUENCE frs_file_pk_seq START WITH 29214;
+
+--
+-- TOC Entry ID 51 (OID 18139756)
+--
+-- Name: frs_filetype_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_filetype_pk_seq;
+CREATE SEQUENCE frs_filetype_pk_seq START WITH 9999;
+
+--
+-- TOC Entry ID 53 (OID 18139804)
+--
+-- Name: frs_package_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_package_pk_seq;
+CREATE SEQUENCE frs_package_pk_seq START WITH 12688;
+
+--
+-- TOC Entry ID 55 (OID 18139856)
+--
+-- Name: frs_processor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_processor_pk_seq;
+CREATE SEQUENCE frs_processor_pk_seq START WITH 9999;
+
+--
+-- TOC Entry ID 57 (OID 18139904)
+--
+-- Name: frs_release_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_release_pk_seq;
+CREATE SEQUENCE frs_release_pk_seq START WITH 17983;
+
+--
+-- TOC Entry ID 59 (OID 18139964)
+--
+-- Name: frs_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE frs_status_pk_seq;
+CREATE SEQUENCE frs_status_pk_seq START WITH 3;
+
+--
+-- TOC Entry ID 61 (OID 18140012)
+--
+-- Name: group_cvs_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE group_cvs_history_pk_seq;
+CREATE SEQUENCE group_cvs_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 63 (OID 18140056)
+--
+-- Name: group_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE group_history_pk_seq;
+CREATE SEQUENCE group_history_pk_seq START WITH 29283;
+
+--
+-- TOC Entry ID 65 (OID 18140112)
+--
+-- Name: group_type_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE group_type_pk_seq;
+CREATE SEQUENCE group_type_pk_seq START WITH 2;
+
+--
+-- TOC Entry ID 67 (OID 18140160)
+--
+-- Name: groups_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE groups_pk_seq;
+CREATE SEQUENCE groups_pk_seq START WITH 16379;
+
+--
+-- TOC Entry ID 69 (OID 18140301)
+--
+-- Name: mail_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE mail_group_list_pk_seq;
+CREATE SEQUENCE mail_group_list_pk_seq START WITH 7581;
+
+--
+-- TOC Entry ID 71 (OID 18140359)
+--
+-- Name: news_bytes_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE news_bytes_pk_seq;
+CREATE SEQUENCE news_bytes_pk_seq START WITH 10299;
+
+--
+-- TOC Entry ID 73 (OID 18140419)
+--
+-- Name: patch_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE patch_pk_seq;
+CREATE SEQUENCE patch_pk_seq START WITH 102785;
+
+--
+-- TOC Entry ID 75 (OID 18140483)
+--
+-- Name: patch_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE patch_category_pk_seq;
+CREATE SEQUENCE patch_category_pk_seq START WITH 10607;
+
+--
+-- TOC Entry ID 77 (OID 18140534)
+--
+-- Name: patch_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE patch_history_pk_seq;
+CREATE SEQUENCE patch_history_pk_seq START WITH 9813;
+
+--
+-- TOC Entry ID 79 (OID 18140590)
+--
+-- Name: patch_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE patch_status_pk_seq;
+CREATE SEQUENCE patch_status_pk_seq START WITH 103;
+
+--
+-- TOC Entry ID 81 (OID 18140638)
+--
+-- Name: people_job_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_job_pk_seq;
+CREATE SEQUENCE people_job_pk_seq START WITH 1641;
+
+--
+-- TOC Entry ID 83 (OID 18140697)
+--
+-- Name: people_job_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_job_category_pk_seq;
+CREATE SEQUENCE people_job_category_pk_seq START WITH 102;
+
+--
+-- TOC Entry ID 85 (OID 18140747)
+--
+-- Name: people_job_inventory_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_job_inventory_pk_seq;
+CREATE SEQUENCE people_job_inventory_pk_seq START WITH 1970;
+
+--
+-- TOC Entry ID 87 (OID 18140787)
+--
+-- Name: people_job_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_job_status_pk_seq;
+CREATE SEQUENCE people_job_status_pk_seq START WITH 3;
+
+--
+-- TOC Entry ID 89 (OID 18140835)
+--
+-- Name: people_skill_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_skill_pk_seq;
+CREATE SEQUENCE people_skill_pk_seq START WITH 33;
+
+--
+-- TOC Entry ID 91 (OID 18140884)
+--
+-- Name: people_skill_inv_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_skill_inv_pk_seq;
+CREATE SEQUENCE people_skill_inv_pk_seq START WITH 60179;
+
+--
+-- TOC Entry ID 93 (OID 18140924)
+--
+-- Name: people_skill_level_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_skill_level_pk_seq;
+CREATE SEQUENCE people_skill_level_pk_seq START WITH 5;
+
+--
+-- TOC Entry ID 95 (OID 18140972)
+--
+-- Name: people_skill_year_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE people_skill_year_pk_seq;
+CREATE SEQUENCE people_skill_year_pk_seq START WITH 5;
+
+--
+-- TOC Entry ID 97 (OID 18141020)
+--
+-- Name: project_assigned_to_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_assigned_to_pk_seq;
+CREATE SEQUENCE project_assigned_to_pk_seq START WITH 30257;
+
+--
+-- TOC Entry ID 99 (OID 18141110)
+--
+-- Name: project_dependencies_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_dependencies_pk_seq;
+CREATE SEQUENCE project_dependencies_pk_seq START WITH 25231;
+
+--
+-- TOC Entry ID 101 (OID 18141146)
+--
+-- Name: project_group_list_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_group_list_pk_seq;
+CREATE SEQUENCE project_group_list_pk_seq START WITH 6360;
+
+--
+-- TOC Entry ID 103 (OID 18141200)
+--
+-- Name: project_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_history_pk_seq;
+CREATE SEQUENCE project_history_pk_seq START WITH 27347;
+
+--
+-- TOC Entry ID 105 (OID 18141257)
+--
+-- Name: project_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_metric_pk_seq;
+CREATE SEQUENCE project_metric_pk_seq START WITH 13274;
+
+--
+-- TOC Entry ID 107 (OID 18141292)
+--
+-- Name: project_metric_tmp1_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_metric_tmp1_pk_seq;
+CREATE SEQUENCE project_metric_tmp1_pk_seq START WITH 13274;
+
+--
+-- TOC Entry ID 109 (OID 18141327)
+--
+-- Name: proj_metric_weekly_tm_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE proj_metric_weekly_tm_pk_seq;
+CREATE SEQUENCE proj_metric_weekly_tm_pk_seq START WITH 2213;
+
+--
+-- TOC Entry ID 111 (OID 18141363)
+--
+-- Name: project_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_status_pk_seq;
+CREATE SEQUENCE project_status_pk_seq START WITH 100;
+
+--
+-- TOC Entry ID 113 (OID 18141412)
+--
+-- Name: project_task_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_task_pk_seq;
+CREATE SEQUENCE project_task_pk_seq START WITH 23295;
+
+--
+-- TOC Entry ID 115 (OID 18141479)
+--
+-- Name: project_weekly_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE project_weekly_metric_pk_seq;
+CREATE SEQUENCE project_weekly_metric_pk_seq START WITH 2213;
+
+--
+-- TOC Entry ID 117 (OID 18141534)
+--
+-- Name: snippet_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE snippet_pk_seq;
+CREATE SEQUENCE snippet_pk_seq START WITH 100501;
+
+--
+-- TOC Entry ID 119 (OID 18141593)
+--
+-- Name: snippet_package_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE snippet_package_pk_seq;
+CREATE SEQUENCE snippet_package_pk_seq START WITH 100035;
+
+--
+-- TOC Entry ID 121 (OID 18141648)
+--
+-- Name: snippet_package_item_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE snippet_package_item_pk_seq;
+CREATE SEQUENCE snippet_package_item_pk_seq START WITH 100100;
+
+--
+-- TOC Entry ID 123 (OID 18141684)
+--
+-- Name: snippet_package_ver_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE snippet_package_ver_pk_seq;
+CREATE SEQUENCE snippet_package_ver_pk_seq START WITH 100035;
+
+--
+-- TOC Entry ID 125 (OID 18141739)
+--
+-- Name: snippet_version_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE snippet_version_pk_seq;
+CREATE SEQUENCE snippet_version_pk_seq START WITH 100662;
+
+--
+-- TOC Entry ID 127 (OID 18142132)
+--
+-- Name: support_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_pk_seq;
+CREATE SEQUENCE support_pk_seq START WITH 109672;
+
+--
+-- TOC Entry ID 129 (OID 18142196)
+--
+-- Name: support_canned_res_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_canned_res_pk_seq;
+CREATE SEQUENCE support_canned_res_pk_seq START WITH 100088;
+
+--
+-- TOC Entry ID 131 (OID 18142247)
+--
+-- Name: support_category_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_category_pk_seq;
+CREATE SEQUENCE support_category_pk_seq START WITH 10699;
+
+--
+-- TOC Entry ID 133 (OID 18142298)
+--
+-- Name: support_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_history_pk_seq;
+CREATE SEQUENCE support_history_pk_seq START WITH 24027;
+
+--
+-- TOC Entry ID 135 (OID 18142354)
+--
+-- Name: support_messages_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_messages_pk_seq;
+CREATE SEQUENCE support_messages_pk_seq START WITH 122077;
+
+--
+-- TOC Entry ID 137 (OID 18142407)
+--
+-- Name: support_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE support_status_pk_seq;
+CREATE SEQUENCE support_status_pk_seq START WITH 3;
+
+--
+-- TOC Entry ID 139 (OID 18142455)
+--
+-- Name: supported_languages_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE supported_languages_pk_seq;
+CREATE SEQUENCE supported_languages_pk_seq START WITH 21;
+
+--
+-- TOC Entry ID 141 (OID 18142506)
+--
+-- Name: survey_question_types_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE survey_question_types_pk_seq;
+CREATE SEQUENCE survey_question_types_pk_seq START WITH 100;
+
+--
+-- TOC Entry ID 143 (OID 18142555)
+--
+-- Name: survey_questions_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE survey_questions_pk_seq;
+CREATE SEQUENCE survey_questions_pk_seq START WITH 14662;
+
+--
+-- TOC Entry ID 145 (OID 18142680)
+--
+-- Name: surveys_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE surveys_pk_seq;
+CREATE SEQUENCE surveys_pk_seq START WITH 11185;
+
+--
+-- TOC Entry ID 147 (OID 18142735)
+--
+-- Name: system_history_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE system_history_pk_seq;
+CREATE SEQUENCE system_history_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 149 (OID 18142787)
+--
+-- Name: system_machines_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE system_machines_pk_seq;
+CREATE SEQUENCE system_machines_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 151 (OID 18142836)
+--
+-- Name: system_news_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE system_news_pk_seq;
+CREATE SEQUENCE system_news_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 153 (OID 18142895)
+--
+-- Name: system_services_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE system_services_pk_seq;
+CREATE SEQUENCE system_services_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 155 (OID 18142944)
+--
+-- Name: system_status_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE system_status_pk_seq;
+CREATE SEQUENCE system_status_pk_seq START WITH 1;
+
+--
+-- TOC Entry ID 157 (OID 18143020)
+--
+-- Name: themes_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE themes_pk_seq;
+CREATE SEQUENCE themes_pk_seq START WITH 2;
+
+--
+-- TOC Entry ID 159 (OID 18143113)
+--
+-- Name: trove_cat_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE trove_cat_pk_seq;
+CREATE SEQUENCE trove_cat_pk_seq START WITH 281;
+
+--
+-- TOC Entry ID 161 (OID 18143176)
+--
+-- Name: trove_group_link_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE trove_group_link_pk_seq;
+CREATE SEQUENCE trove_group_link_pk_seq START WITH 111628;
+
+--
+-- TOC Entry ID 163 (OID 18143216)
+--
+-- Name: trove_treesums_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE trove_treesums_pk_seq;
+CREATE SEQUENCE trove_treesums_pk_seq START WITH 765;
+
+--
+-- TOC Entry ID 165 (OID 18143286)
+--
+-- Name: user_bookmarks_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_bookmarks_pk_seq;
+CREATE SEQUENCE user_bookmarks_pk_seq START WITH 23482;
+
+--
+-- TOC Entry ID 167 (OID 18143337)
+--
+-- Name: user_diary_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_diary_pk_seq;
+CREATE SEQUENCE user_diary_pk_seq START WITH 892;
+
+--
+-- TOC Entry ID 169 (OID 18143392)
+--
+-- Name: user_diary_monitor_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_diary_monitor_pk_seq;
+CREATE SEQUENCE user_diary_monitor_pk_seq START WITH 521;
+
+--
+-- TOC Entry ID 171 (OID 18143428)
+--
+-- Name: user_group_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_group_pk_seq;
+CREATE SEQUENCE user_group_pk_seq START WITH 27204;
+
+--
+-- TOC Entry ID 173 (OID 18143484)
+--
+-- Name: user_metric_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_metric_pk_seq;
+CREATE SEQUENCE user_metric_pk_seq START WITH 115;
+
+--
+-- TOC Entry ID 175 (OID 18143530)
+--
+-- Name: user_metric0_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE user_metric0_pk_seq;
+CREATE SEQUENCE user_metric0_pk_seq START WITH 5;
+
+--
+-- TOC Entry ID 177 (OID 18143608)
+--
+-- Name: users_pk_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE users_pk_seq;
+CREATE SEQUENCE users_pk_seq START WITH 120800;
+
+--
+-- TOC Entry ID 179 (OID 27311232)
+--
+-- Name: unix_uid_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE unix_uid_seq;
+CREATE SEQUENCE unix_uid_seq START WITH 21044;
+
+--
+-- TOC Entry ID 181 (OID 27311250)
+--
+-- Name: forum_thread_seq Type: SEQUENCE SET Owner:
+--
+
+DROP SEQUENCE forum_thread_seq;
+CREATE SEQUENCE forum_thread_seq START WITH 59698;
+
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_auto.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,1400 @@
+
+CREATE OR REPLACE TRIGGER A_bug_pk_seq
+ BEFORE INSERT OR UPDATE of bug_id
+ ON bug FOR EACH ROW
+BEGIN
+ IF (:new.bug_id is null) then
+ IF INSERTING THEN
+ SELECT bug_pk_seq.nextval INTO :new.bug_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_id := :old.bug_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_bug_dependencies_pk_seq
+ BEFORE INSERT OR UPDATE of bug_depend_id
+ ON bug_bug_dependencies FOR EACH ROW
+BEGIN
+ IF (:new.bug_depend_id is null) then
+ IF INSERTING THEN
+ SELECT bug_bug_dependencies_pk_seq.nextval INTO :new.bug_depend_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_depend_id := :old.bug_depend_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_canned_responses_pk_seq
+ BEFORE INSERT OR UPDATE of bug_canned_id
+ ON bug_canned_responses FOR EACH ROW
+BEGIN
+ IF (:new.bug_canned_id is null) then
+ IF INSERTING THEN
+ SELECT bug_canned_responses_pk_seq.nextval INTO :new.bug_canned_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_canned_id := :old.bug_canned_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_category_pk_seq
+ BEFORE INSERT OR UPDATE of bug_category_id
+ ON bug_category FOR EACH ROW
+BEGIN
+ IF (:new.bug_category_id is null) then
+ IF INSERTING THEN
+ SELECT bug_category_pk_seq.nextval INTO :new.bug_category_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_category_id := :old.bug_category_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_filter_pk_seq
+ BEFORE INSERT OR UPDATE of filter_id
+ ON bug_filter FOR EACH ROW
+BEGIN
+ IF (:new.filter_id is null) then
+ IF INSERTING THEN
+ SELECT bug_filter_pk_seq.nextval INTO :new.filter_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.filter_id := :old.filter_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_group_pk_seq
+ BEFORE INSERT OR UPDATE of bug_group_id
+ ON bug_group FOR EACH ROW
+BEGIN
+ IF (:new.bug_group_id is null) then
+ IF INSERTING THEN
+ SELECT bug_group_pk_seq.nextval INTO :new.bug_group_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_group_id := :old.bug_group_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_history_pk_seq
+ BEFORE INSERT OR UPDATE of bug_history_id
+ ON bug_history FOR EACH ROW
+BEGIN
+ IF (:new.bug_history_id is null) then
+ IF INSERTING THEN
+ SELECT bug_history_pk_seq.nextval INTO :new.bug_history_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_history_id := :old.bug_history_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_resolution_pk_seq
+ BEFORE INSERT OR UPDATE of resolution_id
+ ON bug_resolution FOR EACH ROW
+BEGIN
+ IF (:new.resolution_id is null) then
+ IF INSERTING THEN
+ SELECT bug_resolution_pk_seq.nextval INTO :new.resolution_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.resolution_id := :old.resolution_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_status_pk_seq
+ BEFORE INSERT OR UPDATE of status_id
+ ON bug_status FOR EACH ROW
+BEGIN
+ IF (:new.status_id is null) then
+ IF INSERTING THEN
+ SELECT bug_status_pk_seq.nextval INTO :new.status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.status_id := :old.status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_bug_task_dependencies_pk_seq
+ BEFORE INSERT OR UPDATE of bug_depend_id
+ ON bug_task_dependencies FOR EACH ROW
+BEGIN
+ IF (:new.bug_depend_id is null) then
+ IF INSERTING THEN
+ SELECT bug_task_dependencies_pk_seq.nextval INTO :new.bug_depend_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bug_depend_id := :old.bug_depend_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_canned_responses_pk_seq
+ BEFORE INSERT OR UPDATE of response_id
+ ON canned_responses FOR EACH ROW
+BEGIN
+ IF (:new.response_id is null) then
+ IF INSERTING THEN
+ SELECT canned_responses_pk_seq.nextval INTO :new.response_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.response_id := :old.response_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_db_images_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON db_images FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT db_images_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_doc_data_pk_seq
+ BEFORE INSERT OR UPDATE of docid
+ ON doc_data FOR EACH ROW
+BEGIN
+ IF (:new.docid is null) then
+ IF INSERTING THEN
+ SELECT doc_data_pk_seq.nextval INTO :new.docid FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.docid := :old.docid;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_doc_groups_pk_seq
+ BEFORE INSERT OR UPDATE of doc_group
+ ON doc_groups FOR EACH ROW
+BEGIN
+ IF (:new.doc_group is null) then
+ IF INSERTING THEN
+ SELECT doc_groups_pk_seq.nextval INTO :new.doc_group FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.doc_group := :old.doc_group;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_doc_states_pk_seq
+ BEFORE INSERT OR UPDATE of stateid
+ ON doc_states FOR EACH ROW
+BEGIN
+ IF (:new.stateid is null) then
+ IF INSERTING THEN
+ SELECT doc_states_pk_seq.nextval INTO :new.stateid FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.stateid := :old.stateid;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_filemodule_monitor_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON filemodule_monitor FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT filemodule_monitor_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_forum_pk_seq
+ BEFORE INSERT OR UPDATE of msg_id
+ ON forum FOR EACH ROW
+BEGIN
+ IF (:new.msg_id is null) then
+ IF INSERTING THEN
+ SELECT forum_pk_seq.nextval INTO :new.msg_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.msg_id := :old.msg_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_forum_group_list_pk_seq
+ BEFORE INSERT OR UPDATE of group_forum_id
+ ON forum_group_list FOR EACH ROW
+BEGIN
+ IF (:new.group_forum_id is null) then
+ IF INSERTING THEN
+ SELECT forum_group_list_pk_seq.nextval INTO :new.group_forum_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.group_forum_id := :old.group_forum_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_forum_monitor_forums_pk_seq
+ BEFORE INSERT OR UPDATE of monitor_id
+ ON forum_monitored_forums FOR EACH ROW
+BEGIN
+ IF (:new.monitor_id is null) then
+ IF INSERTING THEN
+ SELECT forum_monitor_forums_pk_seq.nextval INTO :new.monitor_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.monitor_id := :old.monitor_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_forum_saved_place_pk_seq
+ BEFORE INSERT OR UPDATE of saved_place_id
+ ON forum_saved_place FOR EACH ROW
+BEGIN
+ IF (:new.saved_place_id is null) then
+ IF INSERTING THEN
+ SELECT forum_saved_place_pk_seq.nextval INTO :new.saved_place_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.saved_place_id := :old.saved_place_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_foundry_news_pk_seq
+ BEFORE INSERT OR UPDATE of foundry_news_id
+ ON foundry_news FOR EACH ROW
+BEGIN
+ IF (:new.foundry_news_id is null) then
+ IF INSERTING THEN
+ SELECT foundry_news_pk_seq.nextval INTO :new.foundry_news_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.foundry_news_id := :old.foundry_news_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_foundry_prefer_proj_pk_seq
+ BEFORE INSERT OR UPDATE of foundry_project_id
+ ON foundry_preferred_projects FOR EACH ROW
+BEGIN
+ IF (:new.foundry_project_id is null) then
+ IF INSERTING THEN
+ SELECT foundry_prefer_proj_pk_seq.nextval INTO :new.foundry_project_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.foundry_project_id := :old.foundry_project_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_foundry_projects_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON foundry_projects FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT foundry_projects_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_file_pk_seq
+ BEFORE INSERT OR UPDATE of file_id
+ ON frs_file FOR EACH ROW
+BEGIN
+ IF (:new.file_id is null) then
+ IF INSERTING THEN
+ SELECT frs_file_pk_seq.nextval INTO :new.file_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.file_id := :old.file_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_filetype_pk_seq
+ BEFORE INSERT OR UPDATE of type_id
+ ON frs_filetype FOR EACH ROW
+BEGIN
+ IF (:new.type_id is null) then
+ IF INSERTING THEN
+ SELECT frs_filetype_pk_seq.nextval INTO :new.type_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.type_id := :old.type_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_package_pk_seq
+ BEFORE INSERT OR UPDATE of package_id
+ ON frs_package FOR EACH ROW
+BEGIN
+ IF (:new.package_id is null) then
+ IF INSERTING THEN
+ SELECT frs_package_pk_seq.nextval INTO :new.package_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.package_id := :old.package_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_processor_pk_seq
+ BEFORE INSERT OR UPDATE of processor_id
+ ON frs_processor FOR EACH ROW
+BEGIN
+ IF (:new.processor_id is null) then
+ IF INSERTING THEN
+ SELECT frs_processor_pk_seq.nextval INTO :new.processor_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.processor_id := :old.processor_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_release_pk_seq
+ BEFORE INSERT OR UPDATE of release_id
+ ON frs_release FOR EACH ROW
+BEGIN
+ IF (:new.release_id is null) then
+ IF INSERTING THEN
+ SELECT frs_release_pk_seq.nextval INTO :new.release_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.release_id := :old.release_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_frs_status_pk_seq
+ BEFORE INSERT OR UPDATE of status_id
+ ON frs_status FOR EACH ROW
+BEGIN
+ IF (:new.status_id is null) then
+ IF INSERTING THEN
+ SELECT frs_status_pk_seq.nextval INTO :new.status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.status_id := :old.status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_group_cvs_history_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON group_cvs_history FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT group_cvs_history_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_group_history_pk_seq
+ BEFORE INSERT OR UPDATE of group_history_id
+ ON group_history FOR EACH ROW
+BEGIN
+ IF (:new.group_history_id is null) then
+ IF INSERTING THEN
+ SELECT group_history_pk_seq.nextval INTO :new.group_history_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.group_history_id := :old.group_history_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_group_type_pk_seq
+ BEFORE INSERT OR UPDATE of type_id
+ ON group_type FOR EACH ROW
+BEGIN
+ IF (:new.type_id is null) then
+ IF INSERTING THEN
+ SELECT group_type_pk_seq.nextval INTO :new.type_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.type_id := :old.type_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_groups_pk_seq
+ BEFORE INSERT OR UPDATE of group_id
+ ON groups FOR EACH ROW
+BEGIN
+ IF (:new.group_id is null) then
+ IF INSERTING THEN
+ SELECT groups_pk_seq.nextval INTO :new.group_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.group_id := :old.group_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_mail_group_list_pk_seq
+ BEFORE INSERT OR UPDATE of group_list_id
+ ON mail_group_list FOR EACH ROW
+BEGIN
+ IF (:new.group_list_id is null) then
+ IF INSERTING THEN
+ SELECT mail_group_list_pk_seq.nextval INTO :new.group_list_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.group_list_id := :old.group_list_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_news_bytes_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON news_bytes FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT news_bytes_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_patch_pk_seq
+ BEFORE INSERT OR UPDATE of patch_id
+ ON patch FOR EACH ROW
+BEGIN
+ IF (:new.patch_id is null) then
+ IF INSERTING THEN
+ SELECT patch_pk_seq.nextval INTO :new.patch_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.patch_id := :old.patch_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_patch_category_pk_seq
+ BEFORE INSERT OR UPDATE of patch_category_id
+ ON patch_category FOR EACH ROW
+BEGIN
+ IF (:new.patch_category_id is null) then
+ IF INSERTING THEN
+ SELECT patch_category_pk_seq.nextval INTO :new.patch_category_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.patch_category_id := :old.patch_category_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_patch_history_pk_seq
+ BEFORE INSERT OR UPDATE of patch_history_id
+ ON patch_history FOR EACH ROW
+BEGIN
+ IF (:new.patch_history_id is null) then
+ IF INSERTING THEN
+ SELECT patch_history_pk_seq.nextval INTO :new.patch_history_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.patch_history_id := :old.patch_history_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_patch_status_pk_seq
+ BEFORE INSERT OR UPDATE of patch_status_id
+ ON patch_status FOR EACH ROW
+BEGIN
+ IF (:new.patch_status_id is null) then
+ IF INSERTING THEN
+ SELECT patch_status_pk_seq.nextval INTO :new.patch_status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.patch_status_id := :old.patch_status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_job_pk_seq
+ BEFORE INSERT OR UPDATE of job_id
+ ON people_job FOR EACH ROW
+BEGIN
+ IF (:new.job_id is null) then
+ IF INSERTING THEN
+ SELECT people_job_pk_seq.nextval INTO :new.job_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.job_id := :old.job_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_job_category_pk_seq
+ BEFORE INSERT OR UPDATE of category_id
+ ON people_job_category FOR EACH ROW
+BEGIN
+ IF (:new.category_id is null) then
+ IF INSERTING THEN
+ SELECT people_job_category_pk_seq.nextval INTO :new.category_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.category_id := :old.category_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_job_inventory_pk_seq
+ BEFORE INSERT OR UPDATE of job_inventory_id
+ ON people_job_inventory FOR EACH ROW
+BEGIN
+ IF (:new.job_inventory_id is null) then
+ IF INSERTING THEN
+ SELECT people_job_inventory_pk_seq.nextval INTO :new.job_inventory_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.job_inventory_id := :old.job_inventory_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_job_status_pk_seq
+ BEFORE INSERT OR UPDATE of status_id
+ ON people_job_status FOR EACH ROW
+BEGIN
+ IF (:new.status_id is null) then
+ IF INSERTING THEN
+ SELECT people_job_status_pk_seq.nextval INTO :new.status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.status_id := :old.status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_skill_pk_seq
+ BEFORE INSERT OR UPDATE of skill_id
+ ON people_skill FOR EACH ROW
+BEGIN
+ IF (:new.skill_id is null) then
+ IF INSERTING THEN
+ SELECT people_skill_pk_seq.nextval INTO :new.skill_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.skill_id := :old.skill_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_skill_inv_pk_seq
+ BEFORE INSERT OR UPDATE of skill_inventory_id
+ ON people_skill_inventory FOR EACH ROW
+BEGIN
+ IF (:new.skill_inventory_id is null) then
+ IF INSERTING THEN
+ SELECT people_skill_inv_pk_seq.nextval INTO :new.skill_inventory_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.skill_inventory_id := :old.skill_inventory_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_skill_level_pk_seq
+ BEFORE INSERT OR UPDATE of skill_level_id
+ ON people_skill_level FOR EACH ROW
+BEGIN
+ IF (:new.skill_level_id is null) then
+ IF INSERTING THEN
+ SELECT people_skill_level_pk_seq.nextval INTO :new.skill_level_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.skill_level_id := :old.skill_level_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_people_skill_year_pk_seq
+ BEFORE INSERT OR UPDATE of skill_year_id
+ ON people_skill_year FOR EACH ROW
+BEGIN
+ IF (:new.skill_year_id is null) then
+ IF INSERTING THEN
+ SELECT people_skill_year_pk_seq.nextval INTO :new.skill_year_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.skill_year_id := :old.skill_year_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_assigned_to_pk_seq
+ BEFORE INSERT OR UPDATE of project_assigned_id
+ ON project_assigned_to FOR EACH ROW
+BEGIN
+ IF (:new.project_assigned_id is null) then
+ IF INSERTING THEN
+ SELECT project_assigned_to_pk_seq.nextval INTO :new.project_assigned_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.project_assigned_id := :old.project_assigned_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_dependencies_pk_seq
+ BEFORE INSERT OR UPDATE of project_depend_id
+ ON project_dependencies FOR EACH ROW
+BEGIN
+ IF (:new.project_depend_id is null) then
+ IF INSERTING THEN
+ SELECT project_dependencies_pk_seq.nextval INTO :new.project_depend_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.project_depend_id := :old.project_depend_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_group_list_pk_seq
+ BEFORE INSERT OR UPDATE of group_project_id
+ ON project_group_list FOR EACH ROW
+BEGIN
+ IF (:new.group_project_id is null) then
+ IF INSERTING THEN
+ SELECT project_group_list_pk_seq.nextval INTO :new.group_project_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.group_project_id := :old.group_project_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_history_pk_seq
+ BEFORE INSERT OR UPDATE of project_history_id
+ ON project_history FOR EACH ROW
+BEGIN
+ IF (:new.project_history_id is null) then
+ IF INSERTING THEN
+ SELECT project_history_pk_seq.nextval INTO :new.project_history_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.project_history_id := :old.project_history_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_metric_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON project_metric FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT project_metric_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_metric_tmp1_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON project_metric_tmp1 FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT project_metric_tmp1_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_proj_metric_weekly_tm_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON project_metric_weekly_tmp1 FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT proj_metric_weekly_tm_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_status_pk_seq
+ BEFORE INSERT OR UPDATE of status_id
+ ON project_status FOR EACH ROW
+BEGIN
+ IF (:new.status_id is null) then
+ IF INSERTING THEN
+ SELECT project_status_pk_seq.nextval INTO :new.status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.status_id := :old.status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_task_pk_seq
+ BEFORE INSERT OR UPDATE of project_task_id
+ ON project_task FOR EACH ROW
+BEGIN
+ IF (:new.project_task_id is null) then
+ IF INSERTING THEN
+ SELECT project_task_pk_seq.nextval INTO :new.project_task_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.project_task_id := :old.project_task_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_project_weekly_metric_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON project_weekly_metric FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT project_weekly_metric_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_snippet_pk_seq
+ BEFORE INSERT OR UPDATE of snippet_id
+ ON snippet FOR EACH ROW
+BEGIN
+ IF (:new.snippet_id is null) then
+ IF INSERTING THEN
+ SELECT snippet_pk_seq.nextval INTO :new.snippet_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.snippet_id := :old.snippet_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_snippet_package_pk_seq
+ BEFORE INSERT OR UPDATE of snippet_package_id
+ ON snippet_package FOR EACH ROW
+BEGIN
+ IF (:new.snippet_package_id is null) then
+ IF INSERTING THEN
+ SELECT snippet_package_pk_seq.nextval INTO :new.snippet_package_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.snippet_package_id := :old.snippet_package_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_snippet_package_item_pk_seq
+ BEFORE INSERT OR UPDATE of snippet_package_item_id
+ ON snippet_package_item FOR EACH ROW
+BEGIN
+ IF (:new.snippet_package_item_id is null) then
+ IF INSERTING THEN
+ SELECT snippet_package_item_pk_seq.nextval INTO :new.snippet_package_item_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.snippet_package_item_id := :old.snippet_package_item_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_snippet_package_ver_pk_seq
+ BEFORE INSERT OR UPDATE of snippet_package_version_id
+ ON snippet_package_version FOR EACH ROW
+BEGIN
+ IF (:new.snippet_package_version_id is null) then
+ IF INSERTING THEN
+ SELECT snippet_package_ver_pk_seq.nextval INTO :new.snippet_package_version_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.snippet_package_version_id := :old.snippet_package_version_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_snippet_version_pk_seq
+ BEFORE INSERT OR UPDATE of snippet_version_id
+ ON snippet_version FOR EACH ROW
+BEGIN
+ IF (:new.snippet_version_id is null) then
+ IF INSERTING THEN
+ SELECT snippet_version_pk_seq.nextval INTO :new.snippet_version_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.snippet_version_id := :old.snippet_version_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_pk_seq
+ BEFORE INSERT OR UPDATE of support_id
+ ON support FOR EACH ROW
+BEGIN
+ IF (:new.support_id is null) then
+ IF INSERTING THEN
+ SELECT support_pk_seq.nextval INTO :new.support_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_id := :old.support_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_canned_res_pk_seq
+ BEFORE INSERT OR UPDATE of support_canned_id
+ ON support_canned_responses FOR EACH ROW
+BEGIN
+ IF (:new.support_canned_id is null) then
+ IF INSERTING THEN
+ SELECT support_canned_res_pk_seq.nextval INTO :new.support_canned_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_canned_id := :old.support_canned_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_category_pk_seq
+ BEFORE INSERT OR UPDATE of support_category_id
+ ON support_category FOR EACH ROW
+BEGIN
+ IF (:new.support_category_id is null) then
+ IF INSERTING THEN
+ SELECT support_category_pk_seq.nextval INTO :new.support_category_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_category_id := :old.support_category_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_history_pk_seq
+ BEFORE INSERT OR UPDATE of support_history_id
+ ON support_history FOR EACH ROW
+BEGIN
+ IF (:new.support_history_id is null) then
+ IF INSERTING THEN
+ SELECT support_history_pk_seq.nextval INTO :new.support_history_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_history_id := :old.support_history_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_messages_pk_seq
+ BEFORE INSERT OR UPDATE of support_message_id
+ ON support_messages FOR EACH ROW
+BEGIN
+ IF (:new.support_message_id is null) then
+ IF INSERTING THEN
+ SELECT support_messages_pk_seq.nextval INTO :new.support_message_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_message_id := :old.support_message_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_support_status_pk_seq
+ BEFORE INSERT OR UPDATE of support_status_id
+ ON support_status FOR EACH ROW
+BEGIN
+ IF (:new.support_status_id is null) then
+ IF INSERTING THEN
+ SELECT support_status_pk_seq.nextval INTO :new.support_status_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.support_status_id := :old.support_status_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_supported_languages_pk_seq
+ BEFORE INSERT OR UPDATE of language_id
+ ON supported_languages FOR EACH ROW
+BEGIN
+ IF (:new.language_id is null) then
+ IF INSERTING THEN
+ SELECT supported_languages_pk_seq.nextval INTO :new.language_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.language_id := :old.language_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_survey_question_types_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON survey_question_types FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT survey_question_types_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_survey_questions_pk_seq
+ BEFORE INSERT OR UPDATE of question_id
+ ON survey_questions FOR EACH ROW
+BEGIN
+ IF (:new.question_id is null) then
+ IF INSERTING THEN
+ SELECT survey_questions_pk_seq.nextval INTO :new.question_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.question_id := :old.question_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_surveys_pk_seq
+ BEFORE INSERT OR UPDATE of survey_id
+ ON surveys FOR EACH ROW
+BEGIN
+ IF (:new.survey_id is null) then
+ IF INSERTING THEN
+ SELECT surveys_pk_seq.nextval INTO :new.survey_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.survey_id := :old.survey_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_themes_pk_seq
+ BEFORE INSERT OR UPDATE of theme_id
+ ON themes FOR EACH ROW
+BEGIN
+ IF (:new.theme_id is null) then
+ IF INSERTING THEN
+ SELECT themes_pk_seq.nextval INTO :new.theme_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.theme_id := :old.theme_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_trove_cat_pk_seq
+ BEFORE INSERT OR UPDATE of trove_cat_id
+ ON trove_cat FOR EACH ROW
+BEGIN
+ IF (:new.trove_cat_id is null) then
+ IF INSERTING THEN
+ SELECT trove_cat_pk_seq.nextval INTO :new.trove_cat_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.trove_cat_id := :old.trove_cat_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_trove_group_link_pk_seq
+ BEFORE INSERT OR UPDATE of trove_group_id
+ ON trove_group_link FOR EACH ROW
+BEGIN
+ IF (:new.trove_group_id is null) then
+ IF INSERTING THEN
+ SELECT trove_group_link_pk_seq.nextval INTO :new.trove_group_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.trove_group_id := :old.trove_group_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_trove_treesums_pk_seq
+ BEFORE INSERT OR UPDATE of trove_treesums_id
+ ON trove_treesums FOR EACH ROW
+BEGIN
+ IF (:new.trove_treesums_id is null) then
+ IF INSERTING THEN
+ SELECT trove_treesums_pk_seq.nextval INTO :new.trove_treesums_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.trove_treesums_id := :old.trove_treesums_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_bookmarks_pk_seq
+ BEFORE INSERT OR UPDATE of bookmark_id
+ ON user_bookmarks FOR EACH ROW
+BEGIN
+ IF (:new.bookmark_id is null) then
+ IF INSERTING THEN
+ SELECT user_bookmarks_pk_seq.nextval INTO :new.bookmark_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.bookmark_id := :old.bookmark_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_diary_pk_seq
+ BEFORE INSERT OR UPDATE of id
+ ON user_diary FOR EACH ROW
+BEGIN
+ IF (:new.id is null) then
+ IF INSERTING THEN
+ SELECT user_diary_pk_seq.nextval INTO :new.id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.id := :old.id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_diary_monitor_pk_seq
+ BEFORE INSERT OR UPDATE of monitor_id
+ ON user_diary_monitor FOR EACH ROW
+BEGIN
+ IF (:new.monitor_id is null) then
+ IF INSERTING THEN
+ SELECT user_diary_monitor_pk_seq.nextval INTO :new.monitor_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.monitor_id := :old.monitor_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_group_pk_seq
+ BEFORE INSERT OR UPDATE of user_group_id
+ ON user_group FOR EACH ROW
+BEGIN
+ IF (:new.user_group_id is null) then
+ IF INSERTING THEN
+ SELECT user_group_pk_seq.nextval INTO :new.user_group_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.user_group_id := :old.user_group_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_metric_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON user_metric FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT user_metric_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+CREATE OR REPLACE TRIGGER A_user_metric0_pk_seq
+ BEFORE INSERT OR UPDATE of ranking
+ ON user_metric0 FOR EACH ROW
+BEGIN
+ IF (:new.ranking is null) then
+ IF INSERTING THEN
+ SELECT user_metric0_pk_seq.nextval INTO :new.ranking FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.ranking := :old.ranking;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
+
+CREATE OR REPLACE TRIGGER A_users_pk_seq
+ BEFORE INSERT OR UPDATE of user_id
+ ON users FOR EACH ROW
+BEGIN
+ IF (:new.user_id is null) then
+ IF INSERTING THEN
+ SELECT users_pk_seq.nextval INTO :new.user_id FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.user_id := :old.user_id;
+ END IF;
+ END IF;
+END;
+
+
+/
+
+/
+
+/
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/SourceForge2.5oci8-Trigger_er.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,420 @@
+CREATE OR REPLACE TRIGGER user_group_user_id_fk
+ AFTER INSERT OR UPDATE
+ ON user_group FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.user_id = users.user_id;
+ if (:new.user_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE user_group using non-existing user_id (user_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER user_group_group_id_fk
+ AFTER INSERT OR UPDATE
+ ON user_group FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE user_group using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER forum_posted_by_fk
+ AFTER INSERT OR UPDATE
+ ON forum FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.posted_by = users.user_id;
+ if (:new.posted_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE forum using non-existing user_id (posted_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER forum_group_forum_id_fk
+ AFTER INSERT OR UPDATE
+ ON forum FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from forum_group_list
+ where :new.group_forum_id = forum_group_list.group_forum_id;
+ if (:new.group_forum_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE forum using non-existing group_forum_id (group_forum_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER forum_group_list_group_id_fk
+ AFTER INSERT OR UPDATE
+ ON forum_group_list FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE forum_group_list using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_group_group_fk
+ AFTER INSERT OR UPDATE
+ ON bug_group FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug_group using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_category_group_fk
+ AFTER INSERT OR UPDATE
+ ON bug_category FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug_category using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_submitted_by_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.submitted_by = users.user_id;
+ if (:new.submitted_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing user_id (submitted_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_assigned_to_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.assigned_to = users.user_id;
+ if (:new.assigned_to is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing user_id (assigned_to).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_status_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from bug_status
+ where :new.status_id = bug_status.status_id;
+ if (:new.status_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing status_id (status_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_category_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from bug_category
+ where :new.category_id = bug_category.bug_category_id;
+ if (:new.category_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing bug_category_id (category_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_resolution_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from bug_resolution
+ where :new.resolution_id = bug_resolution.resolution_id;
+ if (:new.resolution_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing resolution_id (resolution_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER bug_group_fk
+ AFTER INSERT OR UPDATE
+ ON bug FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from bug_group
+ where :new.bug_group_id = bug_group.bug_group_id;
+ if (:new.bug_group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE bug using non-existing bug_group_id (bug_group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER forum_posted_by_fk
+ AFTER INSERT OR UPDATE
+ ON forum FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.posted_by = users.user_id;
+ if (:new.posted_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE forum using non-existing user_id (posted_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER forum_group_forum_id_fk
+ AFTER INSERT OR UPDATE
+ ON forum FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from forum_group_list
+ where :new.group_forum_id = forum_group_list.group_forum_id;
+ if (:new.group_forum_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE forum using non-existing group_forum_id (group_forum_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER project_group_list_group_id_fk
+ AFTER INSERT OR UPDATE
+ ON project_group_list FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE project_group_list using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER project_task_group_proj_id_f
+ AFTER INSERT OR UPDATE
+ ON project_task FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from project_group_list
+ where :new.group_project_id = project_group_list.group_project_id;
+ if (:new.group_project_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE project_task using non-existing group_project_id (group_project_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER project_task_created_by_fk
+ AFTER INSERT OR UPDATE
+ ON project_task FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.created_by = users.user_id;
+ if (:new.created_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE project_task using non-existing user_id (created_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER project_task_status_id_fk
+ AFTER INSERT OR UPDATE
+ ON project_task FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from project_status
+ where :new.status_id = project_status.status_id;
+ if (:new.status_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE project_task using non-existing status_id (status_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER patch_status_id_fk
+ AFTER INSERT OR UPDATE
+ ON patch FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from patch_status
+ where :new.patch_status_id = patch_status.patch_status_id;
+ if (:new.patch_status_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE patch using non-existing patch_status_id (patch_status_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER patch_category_id_fk
+ AFTER INSERT OR UPDATE
+ ON patch FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from patch_category
+ where :new.patch_category_id = patch_category.patch_category_id;
+ if (:new.patch_category_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE patch using non-existing patch_category_id (patch_category_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER patch_submitted_by_fk
+ AFTER INSERT OR UPDATE
+ ON patch FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.submitted_by = users.user_id;
+ if (:new.submitted_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE patch using non-existing user_id (submitted_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER patch_assigned_to_fk
+ AFTER INSERT OR UPDATE
+ ON patch FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.assigned_to = users.user_id;
+ if (:new.assigned_to is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE patch using non-existing user_id (assigned_to).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER patch_category_group_id_fk
+ AFTER INSERT OR UPDATE
+ ON patch_category FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE patch_category using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER support_status_id_fk
+ AFTER INSERT OR UPDATE
+ ON support FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from support_status
+ where :new.support_status_id = support_status.support_status_id;
+ if (:new.support_status_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE support using non-existing support_status_id (support_status_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER support_category_id_fk
+ AFTER INSERT OR UPDATE
+ ON support FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from support_category
+ where :new.support_category_id = support_category.support_category_id;
+ if (:new.support_category_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE support using non-existing support_category_id (support_category_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER support_submitted_by_fk
+ AFTER INSERT OR UPDATE
+ ON support FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.submitted_by = users.user_id;
+ if (:new.submitted_by is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE support using non-existing user_id (submitted_by).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER support_assigned_to_fk
+ AFTER INSERT OR UPDATE
+ ON support FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from users
+ where :new.assigned_to = users.user_id;
+ if (:new.assigned_to is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE support using non-existing user_id (assigned_to).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER support_category_group_id_fk
+ AFTER INSERT OR UPDATE
+ ON support_category FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from groups
+ where :new.group_id = groups.group_id;
+ if (:new.group_id is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE support_category using non-existing group_id (group_id).');
+ end if;
+end;
+
+/
+CREATE OR REPLACE TRIGGER users_languageid_fk
+ AFTER INSERT OR UPDATE
+ ON users FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from supported_languages
+ where :new.language = supported_languages.language_id;
+ if (:new.language is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE users using non-existing language_id (language).');
+ end if;
+end;
+
+/
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/database.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/database.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/database.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,506 @@
+<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id$
+//
+
+/*
+
+This document summarize the changes I made to SourceForge 2.5 code that
+supports Oracle 8 (oci8) database replacing postgres. The change covers
+the oracle layer, namely the script database-oci8.php which is an ALPHA
+version as claimed in its header, the database schema that is converted
+from the postgres schema (file SourceForge.sql), and some PHP code with
+SQL statements that have wrong syntax, or with bugs.
+
+Part 1: database-oci8.php
+
+ The changes are made to correct the defects/bugs in this ALPHA
+ version of OCI8 support in SourceForge 2.5. I used PHP version
+ 4 OCI functions and the working environment includes apache
+ 1.3.14 and Sun Solaris 2.6
+
+ Summary of changes:
+
+ . Eliminated all @ in front of the OCI function calls;
+ . Added ocicommit($conn) after ociexecute. OCI_COMMIT_ON_SUCCESS
+ should take care of that, but somehow certain INSERT/UPDATE
+ queries do not commit unless I call ocicommit.
+ . I use column name instead of column index number to retrieve
+ column values here, though both should work due to the mode
+ OCI_ASSOC+OCI_NUM used in ocifetchinto. The reason I make
+ the change is that column names are used in most of PHP codes
+ of SourceForge (I recall that a few places use numbers though)
+ and I want to make it consistent. There is a defect here that
+ I did not fix: the db_query will return if the value of the
+ first column is null. This would cause problem if it happens
+ that the value is null, not because it is at the end of the
+ rows. The function could return less rows than actual result.
+ I do not have time to figure out a better way to detect if we
+ are at the end of the rows, considering that function db_query
+ applies to SELECT, INSERT, UPDATE, DELETE, all the queries.
+ . The ALPHA code uses the returned value of ociexecute as the
+ array index of the returned result rows. Note that the returned
+ value is always 1 (if execution is successful) and if I have
+ two db_query calls and the result of the second call will
+ unexpectedly replace that of the first one. I use the returned
+ handle of ociparse as the index instead, since the handle will
+ be a different value for each db_query call. Then in all the
+ code of calling db_query, it would be nice to free that handle
+ and the result array after the call. I guess it does not matter
+ much since each PHP script runs once as a CGI program and then
+ exit. If the PHP script is permanently loaded in web server
+ after the call, that would cause memory leak problem. I will
+ try to clean the SourceForge PHP code that calls db_query later.
+
+ . There was a problem with $sys_db_row_pointer, fixed that.
+
+ . Oracle likes UPPER case names. If you try to SELECT rows from
+ an oracle table, most likely you will get a upper case column
+ name, which means you have to retrieve a column value like
+ $x[USER_ID] or $x['USER_ID'] or $x["USER_ID"], and $x[user_id]
+ or $x['user_id'] or $x["user_id"] will not work. I noticed that
+ almost all of the SourceForge codes use lower case names.
+ A solution could be defining oracle tables like:
+
+ create table users ("user_id" varchar2(20), ...)
+
+ In this case the field user_id is created in lower case in Oracle.
+ As a result $x["user_id"] is correct.
+
+ I personally does not like it due to that I have to do SELECT as:
+
+ select "user_id" from users
+
+ Another solution is to make a copy of the returned rows and
+ replace the upper case names to lower case when copying.
+ Then make both result arrays available to the caller of db_query.
+ I prefer this generic approach even it costs a little bit of
+ memory and cpu. I have not done that though.
+
+ What I did here is accepting upper case column names and changed
+ all of the places in SourceForge that call db_query, or uses the
+ result arrays. Anyhow I want to find out the places and free the
+ arrays later when I have more time.
+
+Part 2: Database Schema
+
+ The schema enclosed in SF 2.5 is for postgres. I wrote a perl
+ script that converts the postgres SQL statements to Oracle.
+
+ The results are 3 separate files. File SourceForge_oci8.sql includes
+ all the tables, sequences, indices. Table session has been renamed
+ to session1, since it is a key word in Oracle DDL. Also all the
+ fields date has been renamed to date1. Corresponding changes need
+ to be made in places that refer to the table and/or fields.
+
+ File Trigger_auto.sql are triggers that used to implement the auto
+ insertion of sequence numbers. Oracle does not allow
+
+ "bug_id" integer DEFAULT nextval('bug_pk_seq'::text) NOT NULL,
+
+ So the triggers are necessary here. With these triggers, you can
+ insert a record without specify the sequence number, and the
+ trigger will get the next one and insert for you. If you do want
+ to specify sequences in your INSERT/UPDATE queries, the trigger
+ will take you number.
+
+ File Trigger_er.sql is integrity constraint triggers defining the
+ E-R among tables. I did not apply those in my case due to that I
+ would not be able to insert the default rows after that. I will
+ apply the constraints later.
+
+ Many fields are defined as text in postgres and I had trouble
+ deciding what to do with it. There are a lot of limitation in
+ Oracle to LONG and LOB fields. I use varchar2() to replace text
+ even though the maximum bytes for varchar2() is 4000 (?). Most
+ likely we will not run that limit and if any case, I can simply
+ change it to LONG or LOB.
+
+Part 3: Misc Changes Fixing SQL Syntax or Bugs (incomplete)
+
+ File Name Changes
+ ------------------------------------------------------------------
+
+ account/login.php
+
+ added lines to set the hask cookie. Also added
+ the 3rd parameters to session_login_valid.
+ changed table name session to session1
+
+
+ account/logout.php
+
+ changed table name session to session1
+
+ admin/lastlogins.php
+
+ changed table name session to session1
+
+ admin/search.php
+
+ changed "distinctrow" to "unique"
+
+ admin/userlist.php
+
+ added select before insert statement
+
+ developer/monitor.php
+
+ changed variable user to user_id
+
+ docman/doc_utils.php
+
+ defined count(*) as cnt
+
+ forum/forum.php
+
+ changed table field date to date1
+
+ forum/forum_utils.php
+
+ changed table field date to date1. changed the
+ SELECT nextval('forum_thread_seq') to
+ SELECT forum_thread_seq.nextval from dual
+
+ include/User.class
+
+ added select statement to get a user object
+
+ include/cache.php
+
+ comment out flock statements due to access rights.
+
+ include/osdn.php
+
+ image changed to /image. commented out some ads.
+
+ include/session.php
+
+ $allowingpending=0 changed to allowpending. added
+ UPDATE statement to activate pending user accounts.
+ changed session to session1
+
+ include/user_home.php
+
+ changed user= to user_id=
+
+ my/diary.php
+
+ added a section to retrieve user object to set
+ $G_SESSION
+
+ news/news_utils.php
+
+ changed date to date1. changed a few http to https.
+
+ news/submit.php
+
+ changed date to date1
+
+ project/memberlist.php
+
+ changed the join to outer join in query
+
+ softwaremap/trove_list.php
+
+ changed the LEFT JOIN to outer join in Oracle.
+
+
+*/
+$sys_db_oci_commit_mode='OCI_COMMIT_ON_SUCCESS';
+
+/**
+ *
+ * Connect to the database
+ * Notice the global vars that must be set up
+ * Sets up a global $conn variable which is used
+ * in other functions in this library
+ *
+ */
+function db_connect() {
+ global $sys_dbuser,$sys_dbpasswd,$conn,$sys_dbname;
+ $conn = ocilogon($sys_dbuser,$sys_dbpasswd,$sys_dbname);
+ #return $conn;
+}
+
+/**
+ *
+ * Query the database
+ *
+ * @param qstring - SQL statement
+ * @param limit - how many rows do you want returned
+ * @param offset - of matching rows, return only rows starting here
+ *
+ *
+ * NOTE - the OCI version of this may be somewhat inefficient
+ * for large result sets (hundreds or thousands of rows selected)
+ * However - most queries are returning 25-50 rows
+ *
+ */
+
+function db_query($qstring,$limit='-1',$offset=0) {
+
+ global $conn,$QUERY_COUNT,$sys_db_results;
+ global $sys_db_row_pointer,$sys_db_oci_commit_mode;
+
+ $QUERY_COUNT++;
+
+ $stmt=ociparse($conn,$qstring);
+
+ if (!$stmt) {
+ return 0;
+ } else {
+ if ($limit > 0) {
+ if (!$offset || $offset < 0) {
+ $offset=0;
+ }
+ }
+
+ $res=ociexecute($stmt,$sys_db_oci_commit_mode);
+ ocicommit($conn);
+
+ if (!$res) {
+ return 0;
+ } else {
+ //if offset, seek to starting point
+ //potentially expensive if large offset
+ //however there is no data_seek feature AFAICT
+ $col_name = OCIColumnName($stmt,1);
+
+ $more_data=true;
+ if ($offset > 0) {
+ for ($i=0; $i<$offset; $i++) {
+ //burn them off
+ ocifetchinto($stmt,&$x,OCI_ASSOC+OCI_NUM);
+ if (!$x[$col_name]) {
+ //if no data be returned
+ //get out of loop
+ $more_data=false;
+ break;
+ }
+ }
+ }
+
+ $i=0;
+ while ($more_data) {
+
+ unset($x);
+ $ret = ocifetchinto($stmt,&$x,OCI_ASSOC+OCI_NUM);
+ if (!$ret) {
+ //if no data be returned
+ //get out of loop
+ $more_data=false;
+ break;
+ }
+
+ $i++;
+
+ $sys_db_results[$stmt][$i-1]=$x;
+
+ //see if data is being returned && we are
+ //still within the requested $limit
+ if (count($x) < 1 || (($limit > 0) &&
+ ($i >= $limit)))
+ {
+ $more_data=false;
+ }
+ }
+ $sys_db_row_pointer[$stmt]=0;
+
+ return $stmt;
+ }
+ }
+}
+
+/**
+ * db_begin()
+ *
+ * begin a transaction
+ */
+function db_begin() {
+ global $sys_db_oci_commit_mode;
+ $sys_db_oci_commit_mode='OCI_DEFAULT';
+}
+
+/**
+ * db_commit()
+ *
+ * commit a transaction
+ */
+function db_commit() {
+ global $sys_db_oci_commit_mode,$conn;
+ $sys_db_oci_commit_mode='OCI_COMMIT_ON_SUCCESS';
+ return ocicommit($conn);
+}
+
+/**
+ * db_rollback()
+ *
+ * rollback a transaction
+ */
+function db_rollback() {
+ global $sys_db_oci_commit_mode,$conn;
+ $sys_db_oci_commit_mode='OCI_COMMIT_ON_SUCCESS';
+ return ocirollback($conn);
+}
+
+/**
+ *
+ * Returns the number of rows in this result set
+ *
+ * @param qhandle query result set handle
+ *
+ */
+function db_numrows($qhandle) {
+ global $sys_db_results;
+ // return only if qhandle exists, otherwise 0
+
+ if ($qhandle) {
+
+ return count($sys_db_results[$qhandle]);
+ } else {
+ return 0;
+ }
+}
+
+/**
+ *
+ * Frees a database result properly
+ *
+ * @param qhandle query result set handle
+ *
+ */
+
+function db_free_result($qhandle) {
+ global $sys_db_results;
+ unset($sys_db_results[$qhandle]);
+ return ocifreestatement($qhandle);
+}
+
+/**
+ *
+ * Reset is useful for db_fetch_array
+ * sometimes you need to start over
+ *
+ * @param qhandle query result set handle
+ * @param row - integer row number
+ *
+ */
+
+function db_reset_result($qhandle,$row=0) {
+ global $sys_db_row_pointer;
+ return $sys_db_row_pointer[$qhandle]=$row;
+}
+
+/**
+ *
+ * Returns a field from a result set
+ *
+ * @param qhandle query result set handle
+ * @param row - integer row number
+ * @param field - text field name
+ *
+ */
+
+function db_result($qhandle,$row,$field) {
+ global $sys_db_results;
+ $fieldu = strtoupper($field);
+
+ return $sys_db_results[$qhandle][$row][$fieldu];
+}
+
+/**
+ *
+ * Returns the number of fields in this result set
+ *
+ * @param qhandle query result set handle
+ *
+ */
+
+function db_numfields($lhandle) {
+ return ocinumcols($lhandle);
+}
+
+/**
+ *
+ * Returns the number of rows changed in the last query
+ *
+ * @param qhandle - query result set handle
+ * @param fnumber - column number
+ *
+ */
+
+function db_fieldname($lhandle,$fnumber) {
+ return ocicolumnname($lhandle,$fnumber);
+}
+
+/**
+ *
+ * Returns the number of rows changed in the last query
+ *
+ * @param qhandle query result set handle
+ *
+ */
+
+function db_affected_rows($qhandle) {
+ return ocirowcount($qhandle);
+}
+
+/**
+ *
+ * Returns an associative array from
+ * the current row of this database result
+ * Use db_reset_result to seek a particular row
+ *
+ * @param qhandle query result set handle
+ *
+ */
+
+function db_fetch_array($qhandle) {
+ global $sys_db_results,$sys_db_row_pointer;
+ $row = $sys_db_row_pointer[$qhandle];
+ $sys_db_row_pointer[$qhandle] = $sys_db_row_pointer[$qhandle] + 1;
+ //$sys_db_row_pointer = $sys_db_row_pointer + 1;
+ return $sys_db_results[$qhandle][$row];
+}
+
+/**
+ *
+ * Returns the last primary key from an insert
+ *
+ * @param qhandle query result set handle
+ * @param table_name is the name of the table you inserted into
+ * @param pkey_field_name is the field name of the primary key
+ *
+ */
+
+function db_insertid($qhandle,$table_name,$pkey_field_name) {
+ $res=db_query("SELECT max($pkey_field_name) AS id FROM $table_name");
+ if ($res && db_numrows($res) > 0) {
+ return db_result($res,0,'id');
+ } else {
+ return 0;
+ }
+}
+
+/**
+ *
+ * Returns the last error from the database
+ *
+ */
+
+function db_error() {
+ global $conn;
+ $err= ocierror($conn);
+ if ($err) {
+ return $err['message'];
+ } else {
+ return false;
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/pgdb-convert.pl
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/pgdb-convert.pl (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/oci8port/shaguo/pgdb-convert.pl 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,223 @@
+#!/usr/local/bin/perl
+
+#conver the postgres schema to oracle 8
+
+$postgres_file = "SourceForge.sql";
+$oracle_file = "SourceForge_oci8.sql";
+$trigger_auto = "Trigger_auto.sql";
+$trigger_er = "Trigger_er.sql";
+$drop_file = "Drop.sql";
+
+if (!(open (POSTGRES, "<$postgres_file")))
+{
+ die "Can not open $postgres_file\n";
+}
+if (!(open (ORACLE, ">$oracle_file")))
+{
+ die "Can not open $oracle_file\n";
+}
+if (!(open (TRIGGER_AUTO, ">$trigger_auto")))
+{
+ die "Can not open $trigger_auto\n";
+}
+if (!(open (TRIGGER_ER, ">$trigger_er")))
+{
+ die "Can not open $trigger_er\n";
+}
+if (!(open (DROP , ">$drop_file")))
+{
+ die "Can not open $drop_file\n";
+}
+
+$table = '';
+
+while (<POSTGRES>)
+{
+ # filter "
+ $_ =~ s/\"//g;
+
+ if ($_ =~ /CREATE\s+TABLE\s+(\w+)/i)
+ {
+ $table = $1;
+ if ($table =~ /session/i)
+ {
+ $table = 'session1';
+ }
+ $_ =~ s/session/session1/g;
+
+ print DROP "drop table $table;\n";
+
+ if (length($table) > 30)
+ {
+ print STDOUT "TAB NAME: $table\n";
+ }
+ }
+
+ # change the sequence creation statement
+ if ($_ =~ /CREATE\s+SEQUENCE (\w+)/i)
+ {
+ $_ = "CREATE SEQUENCE $1 START WITH 1;\n";
+ print DROP "drop sequence $1;\n";
+ }
+
+ # change the index creation statement
+ $_ =~ s/ using btree//g;
+ $_ =~ s/ int4_ops//g;
+ $_ =~ s/ text_ops//g;
+ $_ =~ s/ varchar_ops//g;
+ $_ =~ s/ bpchar_ops//g;
+
+ if ($_ =~ /CREATE\s+INDEX\s+(\w+)/i)
+ {
+ if (length($1) > 30)
+ {
+ print STDOUT "IND NAME: $1\n";
+ }
+ if ($1 =~ /session/i)
+ {
+ $_ =~ s/session/session1/g;
+ }
+ }
+
+ # replace the nextval with a trigger
+ if ($_ =~ /\s+(\w+)\s+\w+\s+DEFAULT\s+nextval\(\'(\w+)\'/i)
+ {
+
+ if (length($2) > 30)
+ {
+ print STDOUT "SEQ NAME: $2\n";
+ }
+
+ if (length($2) > 28)
+ {
+ print STDOUT "N_T NAME: A_$2\n";
+ }
+
+ $trigger = <<ENDTRIGGER;
+
+CREATE OR REPLACE TRIGGER A_$2
+ BEFORE INSERT OR UPDATE of $1
+ ON $table FOR EACH ROW
+BEGIN
+ IF (:new.$1 is null) then
+ IF INSERTING THEN
+ SELECT $2.nextval INTO :new.$1 FROM DUAL;
+ ELSIF UPDATING THEN
+ :new.$1 := :old.$1;
+ END IF;
+ END IF;
+END;
+
+ENDTRIGGER
+
+ $_ =~ s/DEFAULT\s+nextval\(\'\w+\'::text\) //g;
+ $_ =~ s/DEFAULT\s+nextval\(\'\w+\'::text\)//g;
+ }
+ # replace integer with number(*)
+ $_ =~ s/ integer,/ number(\*),/g;
+ $_ =~ s/ integer / number(\*) /g;
+
+ # replace text with long varchar2
+ if ($_ =~ / text\s*\((\d+)\)/i)
+ {
+ $_ =~ s/ text/ varchar2/g;
+ }
+ else
+ {
+ $_ =~ s/ text,/ varchar2(4000),/g;
+ $_ =~ s/ text / varchar2(4000) /g;
+ }
+
+ # replace field name date with date1
+ $_ =~ s/date number/date1 number/g;
+ $_ =~ s/ date / date1 /g;
+ $_ =~ s/_date1 /_date /g;
+
+ # replace trigger statements
+ $_ =~ s/ CONSTRAINT / OR REPLACE /g;
+
+ # set the sequence current value: oracle has no setval
+ # so we drop the sequence and then re-create it with new
+ # start value
+
+ if ($_ =~ /SELECT\s+setval\s+\('(\w+)',\s+(\d+)/i)
+ {
+ $new_seq = <<ENDSEQ;
+DROP SEQUENCE $1;
+CREATE SEQUENCE $1 START WITH $2;
+ENDSEQ
+ print ORACLE $new_seq;
+ }
+ elsif ($_ =~ /(\w+)\s+AFTER\s+INSERT\s+OR\s+UPDATE\s+ON\s+(\w+)/i)
+ {
+ $t_name = $1;
+ $tab_name = $2;
+
+ if (length($t_name) > 30)
+ {
+ print STDOUT "R_T NAME: $t_name\n";
+ }
+
+ if ($_ =~ /\('(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)'\)/i)
+ {
+ $trigger_new = <<ENDTRIGGER;
+CREATE OR REPLACE TRIGGER $t_name
+ AFTER INSERT OR UPDATE
+ ON $tab_name FOR EACH ROW
+declare numrows INTEGER;
+begin
+ select count(*) into numrows from $3
+ where :new.$5 = $3.$6;
+ if (:new.$5 is not null and numrows = 0) then
+ raise_application_error(-20001,
+ 'Cannot INSERT/UPDATE $tab_name using non-existing $6 ($5).');
+ end if;
+end;
+ENDTRIGGER
+ print TRIGGER_ER $trigger_new;
+ print TRIGGER_ER "\n\/\n";
+ }
+ }
+ elsif ($_ =~ /(\w+)\s+AFTER\s+UPDATE\s+ON\s+(\w+)/i)
+ {
+ $t_name = $1;
+ $tab_name = $2;
+
+ if ($_ =~ /\('(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)'\)/i)
+ {
+ $trigger_new = '';
+ #print TRIGGER_ER $trigger_new;
+ #print TRIGGER_ER "\n\/\n";
+ }
+ }
+ elsif ($_ =~ /(\w+)\s+AFTER\s+DELETE\s+ON\s+(\w+)/i)
+ {
+ $t_name = $1;
+ $tab_name = $2;
+
+ if ($_ =~ /\('(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)',\s+'(\w+)'\)/i)
+ {
+ $trigger_new = '';
+ #print TRIGGER_ER $trigger_new;
+ #print TRIGGER_ER "\n\/\n";
+ }
+ }
+ else
+ {
+ print ORACLE $_;
+ }
+
+ if ($_ =~ /;/ && $table)
+ {
+ print TRIGGER_AUTO $trigger;
+ print TRIGGER_AUTO "\n\/\n";
+ $table = '';
+ $trigger = '';
+ }
+}
+
+close (POSTGRES);
+close (ORACLE);
+close (TRIGGER_AUTO);
+close (TRIGGER_ER);
+close (DROP);
Added: trunk/gforge_base/evolvisforge/gforge/db/replicate.sh
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replicate.sh (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replicate.sh 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,54 @@
+#!/bin/sh
+#
+# SourceForge: Breaking Down the Barriers to Open Source Development
+# Copyright 1999-2001 (c) VA Linux Systems
+# http://sourceforge.net
+#
+# $Id: replicate.sh,v 1.5 2001/06/19 16:50:06 jbyers Exp $
+#
+
+MasterInit alexandria
+SlaveInit --host=sf-db2 stats
+
+MasterAddTable alexandria stats_site oid
+MasterAddTable alexandria stats_project oid
+MasterAddTable alexandria stats_project_developers oid
+MasterAddTable alexandria stats_project_metric oid
+MasterAddTable alexandria frs_dlstats_file_agg oid
+MasterAddTable alexandria stats_subd_pages oid
+MasterAddTable alexandria stats_agg_logo_by_group oid
+MasterAddTable alexandria stats_cvs_group oid
+MasterAddTable alexandria stats_agg_site_by_group oid
+MasterAddTable alexandria stats_site_pages_by_day oid
+MasterAddTable alexandria frs_package package_id
+MasterAddTable alexandria frs_release release_id
+MasterAddTable alexandria frs_file file_id
+MasterAddTable alexandria frs_processor processor_id
+MasterAddTable alexandria frs_filetype type_id
+MasterAddTable alexandria project_weekly_metric group_id
+MasterAddTable alexandria trove_cat trove_cat_id
+MasterAddTable alexandria trove_group_link trove_group_id
+MasterAddTable alexandria groups group_id
+MasterAddTable alexandria users user_id
+MasterAddTable alexandria foundry_projects id
+SlaveAddTable --host=sf-db2 stats foundry_projects id
+SlaveAddTable --host=sf-db2 stats stats_site oid
+SlaveAddTable --host=sf-db2 stats stats_project oid
+SlaveAddTable --host=sf-db2 stats stats_project_developers oid
+SlaveAddTable --host=sf-db2 stats stats_project_metric oid
+SlaveAddTable --host=sf-db2 stats frs_dlstats_file_agg oid
+SlaveAddTable --host=sf-db2 stats stats_subd_pages oid
+SlaveAddTable --host=sf-db2 stats stats_agg_logo_by_group oid
+SlaveAddTable --host=sf-db2 stats stats_cvs_group oid
+SlaveAddTable --host=sf-db2 stats stats_agg_site_by_group oid
+SlaveAddTable --host=sf-db2 stats stats_site_pages_by_day oid
+SlaveAddTable --host=sf-db2 stats frs_package package_id
+SlaveAddTable --host=sf-db2 stats frs_release release_id
+SlaveAddTable --host=sf-db2 stats frs_file file_id
+SlaveAddTable --host=sf-db2 stats frs_processor processor_id
+SlaveAddTable --host=sf-db2 stats frs_filetype type_id
+SlaveAddTable --host=sf-db2 stats project_weekly_metric group_id
+SlaveAddTable --host=sf-db2 stats trove_cat trove_cat_id
+SlaveAddTable --host=sf-db2 stats trove_group_link trove_group_id
+SlaveAddTable --host=sf-db2 stats groups group_id
+SlaveAddTable --host=sf-db2 stats users user_id
Property changes on: trunk/gforge_base/evolvisforge/gforge/db/replicate.sh
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/db/replication-master.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replication-master.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replication-master.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,65 @@
+--
+-- SourceForge: Breaking Down the Barriers to Open Source Development
+-- Copyright 1999-2001 (c) VA Linux Systems
+-- http://sourceforge.net
+--
+-- $Id: replication-master.sql,v 1.7 2001/06/27 00:11:20 tperdue Exp $
+--
+
+COPY stats_site WITH OIDS TO '/home/tperdue/dumpfiles/stats_site.dump';
+COPY stats_project WITH OIDS TO '/home/tperdue/dumpfiles/stats_project.dump';
+COPY stats_project_developers WITH OIDS TO '/home/tperdue/dumpfiles/stats_project_developers.dump';
+COPY stats_project_metric WITH OIDS TO '/home/tperdue/dumpfiles/stats_project_metric.dump';
+COPY frs_dlstats_file_agg WITH OIDS TO '/home/tperdue/dumpfiles/frs_dlstats_file_agg.dump';
+COPY stats_subd_pages WITH OIDS TO '/home/tperdue/dumpfiles/stats_subd_pages.dump';
+COPY stats_agg_logo_by_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_agg_logo_by_group.dump';
+COPY stats_cvs_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_cvs_group.dump';
+COPY stats_agg_site_by_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_agg_site_by_group.dump';
+COPY stats_site_pages_by_day WITH OIDS TO '/home/tperdue/dumpfiles/stats_site_pages_by_day.dump';
+COPY frs_package WITH OIDS TO '/home/tperdue/dumpfiles/frs_package.dump';
+COPY frs_release WITH OIDS TO '/home/tperdue/dumpfiles/frs_release.dump';
+COPY frs_processor WITH OIDS TO '/home/tperdue/dumpfiles/frs_processor.dump';
+COPY frs_filetype WITH OIDS TO '/home/tperdue/dumpfiles/frs_filetype.dump';
+COPY frs_file WITH OIDS TO '/home/tperdue/dumpfiles/frs_file.dump';
+COPY project_weekly_metric WITH OIDS TO '/home/tperdue/dumpfiles/project_weekly_metric.dump';
+COPY trove_cat WITH OIDS TO '/home/tperdue/dumpfiles/trove_cat.dump';
+COPY trove_group_link WITH OIDS TO '/home/tperdue/dumpfiles/trove_group_link.dump';
+COPY users WITH OIDS TO '/home/tperdue/dumpfiles/users.dump';
+COPY groups WITH OIDS TO '/home/tperdue/dumpfiles/groups.dump';
+COPY foundry_projects WITH oids to '/home/tperdue/dumpfiles/foundry_projects.dump';
+
+
+DROP INDEX frs_release_date;
+DROP INDEX frs_file_name;
+DROP INDEX frs_file_processor;
+DROP INDEX frs_file_type;
+DROP INDEX frs_release_by;
+
+CREATE UNIQUE INDEX statssite_oid ON stats_site(oid);
+CREATE UNIQUE INDEX statsproject_oid ON stats_project(oid);
+CREATE UNIQUE INDEX statsprojectdevelop_oid ON stats_project_developers(oid);
+CREATE UNIQUE INDEX statsprojectmetric_oid ON stats_project_metric(oid);
+CREATE UNIQUE INDEX frsdlfileagg_oid ON frs_dlstats_file_agg(oid);
+CREATE UNIQUE INDEX statssubdpages_oid ON stats_subd_pages(oid);
+CREATE UNIQUE INDEX statsagglogobygrp_oid ON stats_agg_site_by_group(oid);
+CREATE UNIQUE INDEX statscvsgrp_oid ON stats_cvs_group(oid);
+CREATE UNIQUE INDEX statsaggsitebygrp_oid ON stats_agg_site_by_group(oid);
+CREATE UNIQUE INDEX statssitepgsbyday_oid ON stats_site_pages_by_day(oid);
+
+DROP TABLE frs_dlstats_filetotal_agg;
+DROP TABLE frs_dlstats_grouptotal_agg;
+DROP TABLE frs_dlstats_group_agg;
+DROP TABLE stats_project_months;
+DROP TABLE stats_project_all;
+DROP TABLE stats_project_last_30;
+DROP TABLE stats_project_developers_last30;
+DROP TABLE stats_site_pages_by_month;
+DROP TABLE stats_site_last_30;
+DROP TABLE stats_site_months;
+DROP TABLE stats_site_all;
+DROP TABLE trove_agg;
+DROP TABLE trove_treesums;
+
+DROP TABLE foundry_project_rankings_agg;
+DROP TABLE foundry_project_downloads_agg;
+
Added: trunk/gforge_base/evolvisforge/gforge/db/replication-reset-master.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replication-reset-master.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replication-reset-master.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,43 @@
+BEGIN;
+
+--
+-- reloid's get lost during dump/restore - reset them
+--
+UPDATE _rserv_tables_
+SET reloid=
+(select oid
+FROM pg_class pgc
+WHERE relname=_rserv_tables_.tname);
+
+--
+-- Purge pending sync logs
+--
+DELETE FROM _rserv_log_;
+DELETE FROM _rserv_sync_;
+
+--
+-- Get a dump of all tables inside a transaction to guarantee integrity
+--
+COPY stats_site WITH OIDS TO '/home/tperdue/dumpfiles/stats_site.dump';
+COPY stats_project WITH OIDS TO '/home/tperdue/dumpfiles/stats_project.dump';
+COPY stats_project_developers WITH OIDS TO '/home/tperdue/dumpfiles/stats_project_developers.dump';
+COPY stats_project_metric WITH OIDS TO '/home/tperdue/dumpfiles/stats_project_metric.dump';
+COPY frs_dlstats_file_agg WITH OIDS TO '/home/tperdue/dumpfiles/frs_dlstats_file_agg.dump';
+COPY stats_subd_pages WITH OIDS TO '/home/tperdue/dumpfiles/stats_subd_pages.dump';
+COPY stats_agg_logo_by_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_agg_logo_by_group.dump';
+COPY stats_cvs_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_cvs_group.dump';
+COPY stats_agg_site_by_group WITH OIDS TO '/home/tperdue/dumpfiles/stats_agg_site_by_group.dump';
+COPY stats_site_pages_by_day WITH OIDS TO '/home/tperdue/dumpfiles/stats_site_pages_by_day.dump';
+COPY frs_package WITH OIDS TO '/home/tperdue/dumpfiles/frs_package.dump';
+COPY frs_release WITH OIDS TO '/home/tperdue/dumpfiles/frs_release.dump';
+COPY frs_processor WITH OIDS TO '/home/tperdue/dumpfiles/frs_processor.dump';
+COPY frs_filetype WITH OIDS TO '/home/tperdue/dumpfiles/frs_filetype.dump';
+COPY frs_file WITH OIDS TO '/home/tperdue/dumpfiles/frs_file.dump';
+COPY project_weekly_metric WITH OIDS TO '/home/tperdue/dumpfiles/project_weekly_metric.dump';
+COPY trove_cat WITH OIDS TO '/home/tperdue/dumpfiles/trove_cat.dump';
+COPY trove_group_link WITH OIDS TO '/home/tperdue/dumpfiles/trove_group_link.dump';
+COPY users WITH OIDS TO '/home/tperdue/dumpfiles/users.dump';
+COPY groups WITH OIDS TO '/home/tperdue/dumpfiles/groups.dump';
+COPY foundry_projects WITH oids to '/home/tperdue/dumpfiles/foundry_projects.dump';
+
+COMMIT;
Added: trunk/gforge_base/evolvisforge/gforge/db/replication-reset-slave.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replication-reset-slave.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replication-reset-slave.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,58 @@
+--
+-- reloid's get lost during a dump/restore - reset them
+--
+UPDATE _rserv_slave_tables_
+SET reloid=
+(select oid
+FROM pg_class pgc
+WHERE relname=_rserv_slave_tables_.tname);
+
+--
+-- Blank out all the tables
+--
+TRUNCATE foundry_projects ;
+TRUNCATE stats_site ;
+TRUNCATE stats_project ;
+TRUNCATE stats_project_developers ;
+TRUNCATE stats_project_metric ;
+TRUNCATE frs_dlstats_file_agg ;
+TRUNCATE stats_subd_pages ;
+TRUNCATE stats_agg_logo_by_group ;
+TRUNCATE stats_cvs_group ;
+TRUNCATE stats_agg_site_by_group ;
+TRUNCATE stats_site_pages_by_day ;
+TRUNCATE frs_package ;
+TRUNCATE frs_release ;
+TRUNCATE frs_processor ;
+TRUNCATE frs_filetype ;
+TRUNCATE frs_file ;
+TRUNCATE users ;
+TRUNCATE groups ;
+TRUNCATE project_weekly_metric ;
+TRUNCATE trove_cat ;
+TRUNCATE trove_group_link ;
+
+COPY foundry_projects WITH oids from '/home/tperdue/dumpfiles/foundry_projects.dump';
+COPY stats_site WITH OIDS FROM '/home/tperdue/dumpfiles/stats_site.dump';
+COPY stats_project WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project.dump';
+COPY stats_project_developers WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project_developers.dump';
+COPY stats_project_metric WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project_metric.dump';
+COPY frs_dlstats_file_agg WITH OIDS FROM '/home/tperdue/dumpfiles/frs_dlstats_file_agg.dump';
+COPY stats_subd_pages WITH OIDS FROM '/home/tperdue/dumpfiles/stats_subd_pages.dump';
+COPY stats_agg_logo_by_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_agg_logo_by_group.dump';
+COPY stats_cvs_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_cvs_group.dump';
+COPY stats_agg_site_by_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_agg_site_by_group.dump';
+COPY stats_site_pages_by_day WITH OIDS FROM '/home/tperdue/dumpfiles/stats_site_pages_by_day.dump';
+COPY frs_package WITH OIDS FROM '/home/tperdue/dumpfiles/frs_package.dump';
+COPY frs_release WITH OIDS FROM '/home/tperdue/dumpfiles/frs_release.dump';
+COPY frs_processor WITH OIDS FROM '/home/tperdue/dumpfiles/frs_processor.dump';
+COPY frs_filetype WITH OIDS FROM '/home/tperdue/dumpfiles/frs_filetype.dump';
+COPY frs_file WITH OIDS FROM '/home/tperdue/dumpfiles/frs_file.dump';
+COPY users WITH OIDS FROM '/home/tperdue/dumpfiles/users.dump';
+COPY groups WITH OIDS FROM '/home/tperdue/dumpfiles/groups.dump';
+COPY project_weekly_metric WITH OIDS FROM '/home/tperdue/dumpfiles/project_weekly_metric.dump';
+COPY trove_cat WITH OIDS FROM '/home/tperdue/dumpfiles/trove_cat.dump';
+COPY trove_group_link WITH OIDS FROM '/home/tperdue/dumpfiles/trove_group_link.dump';
+
+DELETE FROM _rserv_slave_sync_;
+
Added: trunk/gforge_base/evolvisforge/gforge/db/replication-slave.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replication-slave.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replication-slave.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,349 @@
+--
+-- SourceForge: Breaking Down the Barriers to Open Source Development
+-- Copyright 1999-2001 (c) VA Linux Systems
+-- http://sourceforge.net
+--
+-- $Id: replication-slave.sql,v 1.8 2001/06/27 00:11:20 tperdue Exp $
+--
+
+CREATE TABLE "stats_site" (
+ "month" integer,
+ "day" integer,
+ "uniq_users" integer,
+ "sessions" integer,
+ "total_users" integer,
+ "new_users" integer,
+ "new_projects" integer
+);
+CREATE UNIQUE INDEX "statssite_month_day" on "stats_site" using btree ( "month" "int4_ops", "day" "int4_ops" );
+
+
+CREATE TABLE "stats_project" (
+ "month" integer DEFAULT 0 NOT NULL,
+ "day" integer DEFAULT 0 NOT NULL,
+ "group_id" integer DEFAULT 0 NOT NULL,
+ "file_releases" integer DEFAULT 0,
+ "msg_posted" integer DEFAULT 0,
+ "msg_uniq_auth" integer DEFAULT 0,
+ "bugs_opened" integer DEFAULT 0,
+ "bugs_closed" integer DEFAULT 0,
+ "support_opened" integer DEFAULT 0,
+ "support_closed" integer DEFAULT 0,
+ "patches_opened" integer DEFAULT 0,
+ "patches_closed" integer DEFAULT 0,
+ "artifacts_opened" integer DEFAULT 0,
+ "artifacts_closed" integer DEFAULT 0,
+ "tasks_opened" integer DEFAULT 0,
+ "tasks_closed" integer DEFAULT 0,
+ "help_requests" integer DEFAULT 0
+);
+CREATE UNIQUE INDEX "statsproject_month_day_group" on "stats_project"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_project_developers" (
+ "month" integer DEFAULT 0 NOT NULL,
+ "day" integer DEFAULT 0 NOT NULL,
+ "group_id" integer DEFAULT 0 NOT NULL,
+ "developers" integer DEFAULT 0 NOT NULL
+);
+CREATE UNIQUE INDEX "statsprojectdev_month_day_group" on "stats_project_developers"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_project_metric" (
+ "month" integer DEFAULT 0 NOT NULL,
+ "day" integer DEFAULT 0 NOT NULL,
+ "ranking" integer DEFAULT 0 NOT NULL,
+ "percentile" double precision DEFAULT 0 NOT NULL,
+ "group_id" integer DEFAULT 0 NOT NULL
+);
+CREATE UNIQUE INDEX "statsprojectmetric_month_day_gr" on "stats_project_metric"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "frs_dlstats_file_agg" (
+ "month" integer,
+ "day" integer,
+ "file_id" integer,
+ "downloads" integer
+);
+CREATE UNIQUE INDEX "frsdlfileagg_month_day_file" on "frs_dlstats_file_agg"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "file_id" "int4_ops" );
+
+
+CREATE TABLE "stats_subd_pages" (
+ "month" integer DEFAULT 0 NOT NULL,
+ "day" integer DEFAULT 0 NOT NULL,
+ "group_id" integer DEFAULT 0 NOT NULL,
+ "pages" integer DEFAULT 0 NOT NULL
+);
+CREATE UNIQUE INDEX "statssubdpages_month_day_group" on "stats_subd_pages"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_agg_logo_by_group" (
+ "month" integer,
+ "day" integer,
+ "group_id" integer,
+ "count" integer
+);
+CREATE UNIQUE INDEX "statslogobygroup_month_day_grou" on "stats_agg_logo_by_group"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_cvs_group" (
+ "month" integer DEFAULT 0 NOT NULL,
+ "day" integer DEFAULT 0 NOT NULL,
+ "group_id" integer DEFAULT 0 NOT NULL,
+ "checkouts" integer DEFAULT 0 NOT NULL,
+ "commits" integer DEFAULT 0 NOT NULL,
+ "adds" integer DEFAULT 0 NOT NULL
+);
+CREATE UNIQUE INDEX "statscvsgroup_month_day_group" on "stats_cvs_group"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_agg_site_by_group" (
+ "month" integer,
+ "day" integer,
+ "group_id" integer,
+ "count" integer
+);
+CREATE UNIQUE INDEX "statssitebygroup_month_day_grou" on "stats_agg_site_by_group"
+ using btree ( "month" "int4_ops", "day" "int4_ops", "group_id" "int4_ops" );
+
+
+CREATE TABLE "stats_site_pages_by_day" (
+ "month" integer,
+ "day" integer,
+ "site_page_views" integer
+);
+CREATE INDEX "statssitepagesbyday_month_day" on "stats_site_pages_by_day"
+ using btree ( "month" "int4_ops", "day" "int4_ops" );
+
+
+CREATE TABLE "frs_package" (
+ "package_id" integer DEFAULT nextval('frs_package_pk_seq'::text) NOT NULL,
+ "group_id" integer DEFAULT '0' NOT NULL,
+ "name" text,
+ "status_id" integer DEFAULT '0' NOT NULL,
+ Constraint "frs_package_pkey" Primary Key ("package_id")
+);
+CREATE INDEX "package_group_id" on "frs_package" using btree ( "group_id" "int4_ops" );
+
+
+CREATE TABLE "frs_release" (
+ "release_id" integer DEFAULT nextval('frs_release_pk_seq'::text) NOT NULL,
+ "package_id" integer DEFAULT '0' NOT NULL,
+ "name" text,
+ "notes" text,
+ "changes" text,
+ "status_id" integer DEFAULT '0' NOT NULL,
+ "preformatted" integer DEFAULT '0' NOT NULL,
+ "release_date" integer DEFAULT '0' NOT NULL,
+ "released_by" integer DEFAULT '0' NOT NULL,
+ Constraint "frs_release_pkey" Primary Key ("release_id")
+);
+CREATE INDEX "frs_release_package" on "frs_release" using btree ( "package_id" "int4_ops" );
+
+
+CREATE TABLE "frs_file" (
+ "file_id" integer DEFAULT nextval('frs_file_pk_seq'::text) NOT NULL,
+ "filename" text,
+ "release_id" integer DEFAULT '0' NOT NULL,
+ "type_id" integer DEFAULT '0' NOT NULL,
+ "processor_id" integer DEFAULT '0' NOT NULL,
+ "release_time" integer DEFAULT '0' NOT NULL,
+ "file_size" integer DEFAULT '0' NOT NULL,
+ "post_date" integer DEFAULT '0' NOT NULL,
+ Constraint "frs_file_pkey" Primary Key ("file_id")
+);
+CREATE INDEX "frs_file_date" on "frs_file" using btree ( "post_date" "int4_ops" );
+CREATE INDEX "frs_file_release_id" on "frs_file" using btree ( "release_id" "int4_ops" );
+
+
+CREATE TABLE "users" (
+ "user_id" integer DEFAULT nextval('users_pk_seq'::text) NOT NULL,
+ "user_name" text DEFAULT '' NOT NULL,
+ "email" text DEFAULT '' NOT NULL,
+ "user_pw" character varying(32) DEFAULT '' NOT NULL,
+ "realname" character varying(32) DEFAULT '' NOT NULL,
+ "status" character(1) DEFAULT 'A' NOT NULL,
+ "shell" character varying(20) DEFAULT '/bin/bash' NOT NULL,
+ "unix_pw" character varying(40) DEFAULT '' NOT NULL,
+ "unix_status" character(1) DEFAULT 'N' NOT NULL,
+ "unix_uid" integer DEFAULT '0' NOT NULL,
+ "unix_box" character varying(10) DEFAULT 'shell1' NOT NULL,
+ "add_date" integer DEFAULT '0' NOT NULL,
+ "confirm_hash" character varying(32),
+ "mail_siteupdates" integer DEFAULT '0' NOT NULL,
+ "mail_va" integer DEFAULT '0' NOT NULL,
+ "authorized_keys" text,
+ "email_new" text,
+ "people_view_skills" integer DEFAULT '0' NOT NULL,
+ "people_resume" text DEFAULT '' NOT NULL,
+ "timezone" character varying(64) DEFAULT 'GMT',
+ "language" integer DEFAULT '1' NOT NULL,
+ Constraint "users_pkey" Primary Key ("user_id")
+);
+CREATE UNIQUE INDEX "users_namename_uniq" on "users" using btree ( "user_name" "text_ops" );
+CREATE INDEX "users_status" on "users" using btree ( "status" "bpchar_ops" );
+CREATE INDEX "users_user_pw" on "users" using btree ( "user_pw" "varchar_ops" );
+
+
+CREATE TABLE "groups" (
+ "group_id" integer DEFAULT nextval('groups_pk_seq'::text) NOT NULL,
+ "group_name" character varying(40),
+ "homepage" character varying(128),
+ "is_public" integer DEFAULT '0' NOT NULL,
+ "status" character(1) DEFAULT 'A' NOT NULL,
+ "unix_group_name" character varying(30) DEFAULT '' NOT NULL,
+ "unix_box" character varying(20) DEFAULT 'shell1' NOT NULL,
+ "http_domain" character varying(80),
+ "short_description" character varying(255),
+ "cvs_box" character varying(20) DEFAULT 'cvs1' NOT NULL,
+ "license" character varying(16),
+ "register_purpose" text,
+ "license_other" text,
+ "register_time" integer DEFAULT '0' NOT NULL,
+ "dead1" integer DEFAULT '1' NOT NULL,
+ "rand_hash" text,
+ "use_mail" integer DEFAULT '1' NOT NULL,
+ "use_survey" integer DEFAULT '1' NOT NULL,
+ "dead2" integer DEFAULT '1' NOT NULL,
+ "use_forum" integer DEFAULT '1' NOT NULL,
+ "use_pm" integer DEFAULT '1' NOT NULL,
+ "use_cvs" integer DEFAULT '1' NOT NULL,
+ "use_news" integer DEFAULT '1' NOT NULL,
+ "dead3" integer DEFAULT '1' NOT NULL,
+ "dead4" text DEFAULT '' NOT NULL,
+ "dead5" text DEFAULT '' NOT NULL,
+ "dead6" text DEFAULT '' NOT NULL,
+ "type" integer DEFAULT '1' NOT NULL,
+ "use_docman" integer DEFAULT '1' NOT NULL,
+ "dead7" integer DEFAULT '0' NOT NULL,
+ "dead8" integer DEFAULT '0' NOT NULL,
+ "dead9" integer DEFAULT '0' NOT NULL,
+ "new_task_address" text DEFAULT '' NOT NULL,
+ "send_all_tasks" integer DEFAULT '0' NOT NULL,
+ "dead10" integer DEFAULT '1' NOT NULL,
+ "use_pm_depend_box" integer DEFAULT '1' NOT NULL,
+ "dead11" integer,
+ "dead12" integer,
+ "dead13" integer,
+ Constraint "groups_pkey" Primary Key ("group_id")
+);
+CREATE UNIQUE INDEX "group_unix_uniq" on "groups" using btree ( "unix_group_name" "varchar_ops" );
+CREATE INDEX "groups_type" on "groups" using btree ( "type" "int4_ops" );
+CREATE INDEX "groups_public" on "groups" using btree ( "is_public" "int4_ops" );
+CREATE INDEX "groups_status" on "groups" using btree ( "status" "bpchar_ops" );
+
+
+CREATE TABLE "frs_processor" (
+ "processor_id" integer DEFAULT nextval('frs_processor_pk_seq'::text) NOT NULL,
+ "name" text,
+ Constraint "frs_processor_pkey" Primary Key ("processor_id")
+);
+
+
+CREATE TABLE "frs_filetype" (
+ "type_id" integer DEFAULT nextval('frs_filetype_pk_seq'::text) NOT NULL,
+ "name" text,
+ Constraint "frs_filetype_pkey" Primary Key ("type_id")
+);
+
+
+CREATE TABLE "project_weekly_metric" (
+ "ranking" integer DEFAULT nextval('project_weekly_metric_pk_seq'::text) NOT NULL,
+ "percentile" double precision,
+ "group_id" integer DEFAULT '0' NOT NULL,
+ Constraint "project_weekly_metric_pkey" Primary Key ("ranking")
+);
+CREATE INDEX "projectweeklymetric_ranking" on "project_weekly_metric" using btree ( "ranking" "int4_ops" );
+CREATE INDEX "project_metric_weekly_group" on "project_weekly_metric" using btree ( "group_id" "int4_ops" );
+
+
+CREATE TABLE "trove_group_link" (
+ "trove_group_id" integer DEFAULT nextval('trove_group_link_pk_seq'::text) NOT NULL,
+ "trove_cat_id" integer DEFAULT '0' NOT NULL,
+ "trove_cat_version" integer DEFAULT '0' NOT NULL,
+ "group_id" integer DEFAULT '0' NOT NULL,
+ "trove_cat_root" integer DEFAULT '0' NOT NULL,
+ Constraint "trove_group_link_pkey" Primary Key ("trove_group_id")
+);
+CREATE INDEX "trove_group_link_group_id" on "trove_group_link" using btree ( "group_id" "int4_ops" );
+CREATE INDEX "trove_group_link_cat_id" on "trove_group_link" using btree ( "trove_cat_id" "int4_ops" );
+
+
+CREATE TABLE "trove_cat" (
+ "trove_cat_id" integer DEFAULT nextval('trove_cat_pk_seq'::text) NOT NULL,
+ "version" integer DEFAULT '0' NOT NULL,
+ "parent" integer DEFAULT '0' NOT NULL,
+ "root_parent" integer DEFAULT '0' NOT NULL,
+ "shortname" character varying(80),
+ "fullname" character varying(80),
+ "description" character varying(255),
+ "count_subcat" integer DEFAULT '0' NOT NULL,
+ "count_subproj" integer DEFAULT '0' NOT NULL,
+ "fullpath" text DEFAULT '' NOT NULL,
+ "fullpath_ids" text,
+ Constraint "trove_cat_pkey" Primary Key ("trove_cat_id")
+);
+CREATE INDEX "parent_idx" on "trove_cat" using btree ( "parent" "int4_ops" );
+CREATE INDEX "root_parent_idx" on "trove_cat" using btree ( "root_parent" "int4_ops" );
+CREATE INDEX "version_idx" on "trove_cat" using btree ( "version" "int4_ops" );
+
+
+CREATE SEQUENCE "trove_treesums_pk_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;
+CREATE TABLE "trove_treesums" (
+ "trove_treesums_id" integer DEFAULT nextval('trove_treesums_pk_seq'::text) NOT NULL,
+ "trove_cat_id" integer DEFAULT '0' NOT NULL,
+ "limit_1" integer DEFAULT '0' NOT NULL,
+ "subprojects" integer DEFAULT '0' NOT NULL,
+ Constraint "trove_treesums_pkey" Primary Key ("trove_treesums_id")
+);
+
+CREATE TABLE "foundry_projects" (
+ "id" integer DEFAULT nextval('foundry_projects_pk_seq'::text) NOT NULL,
+ "foundry_id" integer DEFAULT '0' NOT NULL,
+ "project_id" integer DEFAULT '0' NOT NULL,
+ Constraint "foundry_projects_pkey" Primary Key ("id")
+);
+CREATE INDEX "foundry_projects_foundry" on "foundry_projects" using btree (
+"foundry_id" "int4_ops" );
+
+COPY foundry_projects WITH oids from '/home/tperdue/dumpfiles/foundry_projects.dump';
+COPY stats_site WITH OIDS FROM '/home/tperdue/dumpfiles/stats_site.dump';
+COPY stats_project WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project.dump';
+COPY stats_project_developers WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project_developers.dump';
+COPY stats_project_metric WITH OIDS FROM '/home/tperdue/dumpfiles/stats_project_metric.dump';
+COPY frs_dlstats_file_agg WITH OIDS FROM '/home/tperdue/dumpfiles/frs_dlstats_file_agg.dump';
+COPY stats_subd_pages WITH OIDS FROM '/home/tperdue/dumpfiles/stats_subd_pages.dump';
+COPY stats_agg_logo_by_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_agg_logo_by_group.dump';
+COPY stats_cvs_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_cvs_group.dump';
+COPY stats_agg_site_by_group WITH OIDS FROM '/home/tperdue/dumpfiles/stats_agg_site_by_group.dump';
+COPY stats_site_pages_by_day WITH OIDS FROM '/home/tperdue/dumpfiles/stats_site_pages_by_day.dump';
+COPY frs_package WITH OIDS FROM '/home/tperdue/dumpfiles/frs_package.dump';
+COPY frs_release WITH OIDS FROM '/home/tperdue/dumpfiles/frs_release.dump';
+COPY frs_processor WITH OIDS FROM '/home/tperdue/dumpfiles/frs_processor.dump';
+COPY frs_filetype WITH OIDS FROM '/home/tperdue/dumpfiles/frs_filetype.dump';
+COPY frs_file WITH OIDS FROM '/home/tperdue/dumpfiles/frs_file.dump';
+COPY users WITH OIDS FROM '/home/tperdue/dumpfiles/users.dump';
+COPY groups WITH OIDS FROM '/home/tperdue/dumpfiles/groups.dump';
+COPY project_weekly_metric WITH OIDS FROM '/home/tperdue/dumpfiles/project_weekly_metric.dump';
+COPY trove_cat WITH OIDS FROM '/home/tperdue/dumpfiles/trove_cat.dump';
+COPY trove_group_link WITH OIDS FROM '/home/tperdue/dumpfiles/trove_group_link.dump';
+
+drop index project_weekly_metric_pkey;
+
+CREATE UNIQUE INDEX statssite_oid ON stats_site(oid);
+CREATE UNIQUE INDEX statsproject_oid ON stats_project(oid);
+CREATE UNIQUE INDEX statsprojectdevelop_oid ON stats_project_developers(oid);
+CREATE UNIQUE INDEX statsprojectmetric_oid ON stats_project_metric(oid);
+CREATE UNIQUE INDEX frsdlfileagg_oid ON frs_dlstats_file_agg(oid);
+CREATE UNIQUE INDEX statssubdpages_oid ON stats_subd_pages(oid);
+CREATE UNIQUE INDEX statsagglogobygrp_oid ON stats_agg_logo_by_group(oid);
+CREATE UNIQUE INDEX statscvsgrp_oid ON stats_cvs_group(oid);
+CREATE UNIQUE INDEX statsaggsitebygrp_oid ON stats_agg_site_by_group(oid);
+CREATE UNIQUE INDEX statssitepgsbyday_oid ON stats_site_pages_by_day(oid);
Added: trunk/gforge_base/evolvisforge/gforge/db/replication.plan
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/replication.plan (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/replication.plan 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,54 @@
+#
+# SourceForge: Breaking Down the Barriers to Open Source Development
+# Copyright 1999-2001 (c) VA Linux Systems
+# http://sourceforge.net
+#
+# $Id: replication.plan,v 1.3 2001/06/19 16:50:06 jbyers Exp $
+#
+
+Replicate Tables:
+
+stats_site
+stats_project
+stats_project_developers
+stats_project_metric
+frs_dlstats_file_agg
+stats_subd_pages
+stats_agg_logo_by_group
+stats_cvs_group
+stats_agg_site_by_group
+stats_site_pages_by_day
+
+project_weekly_metric
+trove_cat
+trove_group_link
+
+frs_package
+frs_release
+frs_file
+frs_processor
+frs_filetype
+users
+groups
+
+foundry_projects
+
+Slave-only tables:
+
+frs_dlstats_filetotal_agg
+frs_dlstats_grouptotal_agg
+frs_dlstats_group_agg
+stats_project_months
+stats_project_all
+stats_project_last_30
+stats_project_developers_last30
+stats_site_pages_by_month
+stats_site_last_30
+stats_site_months
+stats_site_all
+
+trove_agg
+trove_treesums
+
+foundry_project_rankings_agg
+foundry_project_downloads_agg
Added: trunk/gforge_base/evolvisforge/gforge/db/sfdocs.sql
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/sfdocs.sql (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/sfdocs.sql 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,89 @@
+# MySQL dump 8.8
+#
+# Host: localhost Database: sourceforge
+#--------------------------------------------------------
+# Server version 3.23.22-beta
+
+#
+# Dumping data for table 'doc_groups'
+#
+
+INSERT INTO doc_groups VALUES (793,'About SourceForge',1);
+INSERT INTO doc_groups VALUES (794,'SourceForge Development',1);
+INSERT INTO doc_groups VALUES (801,'Account Information',1);
+INSERT INTO doc_groups VALUES (802,'CVS - General Information',1);
+INSERT INTO doc_groups VALUES (803,'CVS - OS Specific Information',1);
+INSERT INTO doc_groups VALUES (804,'Database Information',1);
+INSERT INTO doc_groups VALUES (805,'General Documentation',1);
+INSERT INTO doc_groups VALUES (806,'Project Administration',1);
+INSERT INTO doc_groups VALUES (807,'Translated Documentation',1);
+INSERT INTO doc_groups VALUES (808,'Website Hosting Information',1);
+
+# MySQL dump 8.8
+#
+# Host: localhost Database: sourceforge
+#--------------------------------------------------------
+# Server version 3.23.22-beta
+
+#
+# Dumping data for table 'doc_states'
+#
+
+INSERT INTO doc_states VALUES (1,'active');
+INSERT INTO doc_states VALUES (2,'deleted');
+INSERT INTO doc_states VALUES (3,'pending');
+INSERT INTO doc_states VALUES (4,'hidden');
+INSERT INTO doc_states VALUES (5,'private');
+
+# MySQL dump 8.8
+#
+# Host: localhost Database: sourceforge
+#--------------------------------------------------------
+# Server version 3.23.22-beta
+
+#
+# Dumping data for table 'doc_data'
+#
+
+INSERT INTO doc_data VALUES (753,1,'SourceForge services','<H1>Summary of SourceForge Services</H1>\r\n\r\n<P>Following is a list of the services which \r\nwe currently provide to SourceForge projects.\r\nWe expect to continually add services and improve upon\r\nthe services on this list.\r\n\r\n<P><B>The SourceForge Team Development Environment (TDE)</B>\r\na\r\n<UL>\r\n<li><B>TDE Web Administrative Tools</B>\r\n<BR><I>Advanced web-based administrative tools\r\nprovide easy maintenance for all facets of your project.</I>\r\n<BR><li><B>Web Server</B>\r\n<BR><I><P>Each project receives its own Apache-style htdocs and cgi-bin directories.\r\nCGI can be executed only from the cgi-bin directory and is ScriptAliased to\r\nhttp://yourproject.SourceForge.net/cgi-bin/. Your domain is hosted on\r\na name-based VirtualHost on the main project web server.\r\n\r\n<P>The Apache server is compiled with PHP3/MySQL support and is able to\r\naccess your MySQL database.\r\n\r\n<P>There is a 100MB soft quota for your web site and anonymous FTP directory.\r\n(The high-capacity file server has no limit.) More space can be requested.\r\n</l>\r\n<LI><B>MySQL Database</B>\r\n<BR><I>Your shell account and web server have access to your project\'s own MySQL database.</I>\r\n<BR><A href="display_topic.php?topicid=11">[Details...]</A>\r\n<BR><LI><B>Your Own Domain</B>\r\n<BR><I>If you make the registration with Internic, we can\r\nanswer for your domain. That is, we can configure our webserver to respond for [whatevername.{com,net,org}. We currently\r\naren\'t providing primary/secondary DNS hosting.\r\nThis will affect all domains that would otherwise be\r\nreferenced by yourproject.SourceForge.net.</I>\r\n<!--<BR><LI><B>Mail Aliases</B>\r\n<BR><I>A web interface provides unlimited control over mail aliases at\r\nalias at yourproject.SourceForge.net.</I>-->\r\n<BR><li><B>E-mail Lists</B> (Public & Private)\r\n<BR><I>The Mailman mailing list manager and majordomo are available\r\nfor your mailing lists.</I>\r\n<BR><li><B>CVS Repository</B> \r\n<BR><I>Each project has its own CVS repository (with separate CVSROOT).\r\nDevelopers are granted secure access to the tree through SSH. Anonymous\r\nCVS/pserver access is granted to the general public.</I>\r\n\r\n<P>This means that your cvs logs, history files, and behavior\r\nare unique to your repository. This allows us to customize certain\r\nprojects on request. The old method of housing several directories\r\nin one CVS tree also led to the mixing of log files and inability\r\nto separate certain parts of projects easily.\r\n\r\n<P>We\'ve made custom changes to the CVS code to allow us to host\r\nthis many CVS Repositories through one access point, and to\r\nclean up the handling of anonymous CVS users.\r\n\r\n<P>We have chosen to allow developers to access the CVS reponsitories\r\nthrough SSH, which the CVS client can easily do by setting one\r\nenvironment variable (and installing SSH).\r\n\r\n<P>While normally this would open up the CVS box to shell access,\r\nan in-house developed custom shell ensures that only SSH/CVS access\r\nis allowed.\r\n\r\n<P>We open up the repositories for anonymous access through pserver.\r\nNo passwords are sent in anonymous CVS access.\r\n\r\n<li><B>High-capacity File Server</B>\r\n<BR><I>Released versions of your project are stored on our\r\nextreme-capacity fileserver. Current capacity for this server\r\nis 1000 concurrent ftp and 3000 concurrent http connections.</I>\r\n<BR><li><B>Mid-capacity FTP directory</I>\r\n<BR><I>Full read/write access to your own FTP directory, available\r\nanonymously to the outside world.</I>\r\n<BR><li><B>Project Management Software</B>\r\n<BR><li><B>Support system</B>\r\n<l>The support tools bundled with your project will allow you to help users in a recorded forum, so that your prior\r\nuser problems will be indexed for later tracking.\r\n<BR><li><B>Patch Manager</B>\r\n<l>The patch manager allows for people external to the project to submit patches, allowing you to accept external developer support.\r\n<BR><li><B>Bug-Tracking System</B> (Public & Private)\r\n<BR><li><B>Discussion Forums</B> (Public & Private)\r\n<BR><li><B>SSH Account</B>\r\n<BR><I>A restricted SSH account provides basic shell functions, your own crontab,\r\nand access to your HTTP account for you and all of your developers.</I>\r\n</p> ',968792095,968791939,1458,793,'aka \'What do I get?\'');
+INSERT INTO doc_data VALUES (754,1,'Harware behind SourceForge',' <p> <P><H1>SourceForge Hardware Summary</H1></P>\r\n\r\n<P>\r\n<TABLE>\r\n<TR valign=top>\r\n<TD><B>Load Balancing Firewall Server</B></TD>\r\n<TD>PII 350<BR>128MB RAM<BR> 4.5GB U2W SCSI HDD</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>SourceForge Web Server 1</B></TD>\r\n<TD>Dual PIII 600<BR>512MB RAM<BR> 18GB U2W SCSI HDD</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>SourceForge Web Server 2</B></TD>\r\n<TD>Dual PIII 600<BR>512MB RAM<BR> 18GB U2W SCSI HDD</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>SourceForge Database Server</B></TD>\r\n<TD>Quad PII-Xeon 400<BR>2GB RAM<BR>75GB RAID-5</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>SourceForge File Server</B></TD>\r\n<TD>Quad PII-Xeon 400<BR>2GB RAM<BR>850GB on 5 Mylex ExtremeRaid Controllers</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>SourceForge Mail/DNS Server</B></TD>\r\n<TD>Dual PII-350<BR>512MB RAM<BR>54GB U2W SCSI HDD</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Geocrawler Mail Archiver</B></TD>\r\n<TD>Dual PIII-500<BR>1GB RAM<BR>154GB RAID-5</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Sitewide Backup Server</B></TD>\r\n<TD>PII-350<BR>128MB RAM<BR>18GB U2W SCSI HDD<BR>5 Seagate 25GB Native AIT Tape Drives</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Project CVS Server</B></TD>\r\n<TD>Dual PIII-600<BR>1GB RAM<BR>75GB RAID-5</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Project Web Server</B></TD>\r\n<TD>Dual PIII-600<BR>512MB RAM<BR>2 18GB U2W SCSI HDD</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Project Database Server</B></TD>\r\n<TD>Dual PIII-Xeon 500<BR>1GB RAM<BR>35GB RAID-5</TD>\r\n</TR>\r\n\r\n<TR valign=top>\r\n<TD><B>Totals (Rough)</B></TD>\r\n<TD>CPU: 11.4Gz<BR>RAM: 9.5GB<BR>Storage: 1.34TB (Formatted Storage, After RAID)</TD>\r\n</TR>\r\n\r\n</TABLE>\r\n',968792102,968792041,1458,793,'aka\' How many boxen ya got?\'');
+INSERT INTO doc_data VALUES (755,1,'Software behind SourceForge','<P>\r\n<h1>The Software behind SourceForge</h1>\r\n\r\n<P>In addition to writing much of our own software, we utilized the\r\nefforts of many great software developers, and would like to \r\nrecognize their products here. These are all fantastic products and\r\nwe would be happy to talk about how we have implemented them to any\r\ninterested parties. \r\n\r\n<HR>\r\n\r\n<table border=0 cellspacing=2 cellpadding=2 bgcolor="" valign="bottom">\r\n<tr valign=top>\r\n<td><a href="http://www.amanda.org/">Amanda</a></td>\r\n<td>AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that allows the administrator of a LAN to set up a single master backup server to back up multiple hosts to a single large capacity tape drive.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.apache.org/">Apache</a></td>\r\n<td>Apache is an award winning webserver that made this site possible.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.boa.org/">Boa</a>*</td>\r\n<td>Boa is a single-tasking HTTP server. That means that unlike traditional web servers, it does not fork for each incoming connection, nor does it fork many copies of itself to handle multiple connections.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.cyclic.com/">CVS</a>*</td>\r\n<td>CVS is the Version Control system that we use, for both our development and that of the projects.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi/">cvsweb</a>*</td>\r\n<td>A script to allow easy viewing of live CVS repositories.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.leonine.com/~ltemplin/">Grap</a></td>\r\n<td>General execution wRAPper. Grap is a wrapper designed to verify commands before executing them.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.linuxvirtualserver.org/">IPVS</a></td>\r\n<td>Virtual server is a scalable and highly available server built on a cluster of real servers. The architecture of the cluster is transparent to end users, and the users see only a single virtual server.</td>\r\n</td>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.list.org/">GNU MailMan</a>*</td>\r\n<td>Mailman is software to help manage email discussion lists, much like Majordomo and Smartmail. Unlike most similar products, Mailman gives each mailing list a web page, and allows users to subscribe, unsubscribe, etc. over the web.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.modssl.org/">ModSSL</a></td>\r\n<td>The mod_ssl project provides strong cryptography for the Apache 1.3 webserver via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols by the help of the Open Source SSL/TLS toolkit OpenSSL, which is based on SSLeay from Eric A. Young and Tim J. Hudson.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.mysql.com/">MySQL</a></td>\r\n<td>MySQL is a true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular and standardized database language in the world. MySQL is a client/server implementation that consists of a server daemon mysqld and many different client programs and libraries.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.php.net/">PHP</a></td>\r\n<td>PHP is a server-side, cross-platform, HTML embedded scripting language.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.redhat.com/">Redhat Linux</a></td>\r\n<td>Red Hat Linux is a powerful, extremely stable, next-generation computer operating system that provides a high performance computing environment for both server and desktop PCs.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href=http://sourceforge.net/project/?group_id=1>SourceForge</a></td>\r\n<td>A bundle of the home made software that runs www.sourceforge.net, distributed\r\nunder the GPL license.</td>\r\n</tr>\r\n\r\n<tr valign=top>\r\n<td><a href="http://www.ssh.fi/">SSH</a></td>\r\n<td>Secure Shell is a program that allows you to open an encrypted connection to another computer. It allows remote execution of command and copying of files from one machine to another.</td>\r\n</tr>\r\n\r\n</table>\r\n',968792386,968792185,1458,793,'Open Source is a good thing');
+INSERT INTO doc_data VALUES (756,1,'Frequently Asked Questions','<P><H1>SourceForge Frequently Asked Questions (FAQ)</h1>\r\n\r\n<UL>\r\n<LI><A href="#what-main">What is SourceForge?</A>\r\n <UL>\r\n <LI><A href="#what-os">What is Open Source software?</A>\r\n <LI><A href="#what-beta">What is this "public beta"? When is your full release?</A>\r\n </UL>\r\n<LI><A href="#whodev-main">Who develops SourceForge?</A>\r\n <UL>\r\n <LI><A href="#whodev-why">Why did you create SourceForge?</A>\r\n <LI><A href="#whodev-pays">Who pays for SourceForge?</A>\r\n <LI><A href="#whodev-mot">What is the motivation to pay for something like this?</A>\r\n <LI><A href="#whodev-catch">This seems like an awful lot of free stuff. What\'s the catch?</A>\r\n <LI><A href="#whodev-help">That\'s cool! I\'d really like to help. Can I?</A>\r\n </UL>\r\n<LI><A href="#whohost-main">Who can host with SourceForge?</A>\r\n <UL>\r\n <LI><A href="#whohost-web">What if I don\'t have software, but wanted you to host my web site?</A>\r\n <LI><A href="#whohost-rest">Are there any restrictions on the types of software I can host here?</A>\r\n <LI><A href="#whohost-com">Can I host commercial software on SourceForge?</A>\r\n <LI><A href="#whohost-owns">Who owns the source code on SourceForge?</A>\r\n <LI><A href="#whohost-stop">What if I host with SourceForge, then decide to stop?</A>\r\n </UL>\r\n<LI><A href="#whyhost-main">Why should I host my software with SourceForge?</A>\r\n <UL>\r\n <LI><A href="#whyhost-secure">Is SourceForge secure?</A>\r\n <LI><A href="#whyhost-backup">What is your backup strategy?</A>\r\n <LI><A href="#whyhost-all">Do I have to use all of your services? Can I just use mailing lists, or bug tracking?</A>\r\n <LI><A href="#whyhost-root">Won\'t I lose a lot of control if I don\'t have root access?</A>\r\n <LI><A href="#whyhost-cvs">I already have a cvs tree. Can you import it?</A>\r\n <LI><A href="#whyhost-files">I have a lot of file releases already. Can I make them available on the main file server?</A>\r\n </UL>\r\n<LI><A href="#big-main">So how big is all this, really?</A>\r\n <UL>\r\n <LI><A href="#big-fad">Isn\'t Open Source a fad? Can it really work?</A>\r\n <LI><A href="#big-cap">How much capacity does SourceForge have right now?</A>\r\n <LI><A href="#big-scale">Wow. That\'s a lot. Can it scale?</A>\r\n <LI><A href="#big-mirror">Are you going to mirror SourceForge? (and can I pay for it?)</A>\r\n <LI><A href="#big-ready">I thought Linux wasn\'t ready for the enterprise. What was your setup experience like?</A>\r\n <LI><A href="#big-wait">What improvements in Linux/Open Source software are you still waiting for? </A>\r\n <LI><A href="#big-future">What is the future of SourceForge?</A>\r\n </UL>\r\n<LI><A href="#whowrote">Who wrote this FAQ? Are you available?</A>\r\n</UL>\r\n\r\n<HR noshade>\r\n\r\n<P><A name="what-main"> </A><B>What is SourceForge?</B>\r\n<P>SourceForge is a free hosting service for <A href="http://www.opensource.org">Open Source</A> \r\ndevelopers which offers, among other things, a CVS repository, mailing lists,\r\nbug tracking, message forums, task management software, web site hosting,\r\npermanent file archival, full backups, and total web-based administration.\r\nA more <A href="services.php">complete description of services</A> is\r\navailable. \r\n\r\n<P><A name="what-os"> </A><B>What is Open Source software?</B>\r\n<P>In short, Open Source software is software with source code made available to the public,\r\nwith no fees or royalties for use or distribution. The official definition, as well\r\nas the rationale and history behind open source software, can be found\r\nat <A href="http://www.opensource.org">The Open Source Initiative</A>\'s web site.\r\n<P>In the near future we will have an Open Source FAQ, with discussion\r\nabout the legalities of Open Source software, business justification,\r\nand market trends.\r\n\r\n<P><A name="what-beta"> </A><B>What is this "public beta"? When is your full release?</B>\r\n<P>SourceForge includes a lot of components, from the scripts that run behind\r\nthe scenes, to administrative pages for project leaders, to front-end material\r\nfor casual browsers. We have reached a stability point in most of the backend\r\ncode that we would like to start receiving input from developers on SourceForge.\r\n<P>SourceForge is now a very functional site/system, and in fact many developers\r\nare now working on projects from within the SourceForge framework. We now need\r\nyour help to mold SourceForge into a tool that will truly benefit\r\nOpen Source developers.\r\n<P>We will call ourselves a full release when we think the site is worthy of it.\r\nThe services are available now, however. The "full release" will be more of a\r\nsymbolic occasion than anything else.\r\n\r\n<P><A name="whodev-main"> </A><B>Who develops SourceForge?</B>\r\n<P>The <A href="http://sourceforge.net/staff.php">SourceForge admin staff</A>, Tony, Drew, Tim, and Uriah,\r\ndeveloped most of what you see on SourceForge now. We of course owe a lot of credit\r\nto the <A href="http://sourceforge.net/docs/site/software.php">software</A> that made our work a lot easier,\r\nand to the <A href="http://sourceforge.net/thanks.php">people and organizations</A> that donated time\r\nand hardware to make SourceForge possible. \r\n<P>SourceForge started out as a small idea that just refused to stop growing. \r\nMany people have been incredibly helpful along the way. We would like to thank\r\nthe entire open source community for the support that they are known for.\r\n\r\n<P><A name="whodev-why"> </A><B>Why did you create SourceForge?</B>\r\n<P>Strangely, a system this big wasn\'t our original intention. We really had no idea\r\nthat there would be such a reception for this kind of innovation in hosting\r\nopen source software.\r\n<P>As open source developers ourselves, we have run into the kinds of obstacles\r\nthat still plague many would-be developers. It was our intent to remove many\r\nof those obstacles and let developers focus on software development.\r\n(An odd concept, but easier to get used to than you\'d think.) \r\n<P>A suite of tools isn\'t enough, though. In the end, you need the hardware\r\npower for the whole setup, which might lead to your next question:\r\n\r\n<P><A name="whodev-pays"> </A><B>Who pays for SourceForge?</B>\r\n<P><A href="http://valinux.com">VA Linux Systems</A> has supported this project\r\nfrom the beginning. Some of us were employed by VA before the conception\r\nof SourceForge (although none had ever worked in the same department), others\r\nwere hired specifically for this project.\r\n<P>The <A href="hardware.php">hardware behind this site</A> is truly\r\nimpressive, and has proven to us VA\'s dedication to this project and to Open Source\r\ndevelopment.\r\n\r\n<P><A name="whodev-mot"> </A><B>What is the motivation to pay for something like this?</B>\r\n<P>Stop looking for ulterior motives or fantasies about world domination.\r\nThere are some good business reasons why a Linux company would\r\nbenefit from a site such as this.\r\n<P>VA Linux Systems thrives upon the success of Open Source software in\r\ngeneral. They sell Linux systems, installed with a myriad of Open Source\r\ntools and applications, to clients that require enterprise-ready\r\ncomponents and software. They also sell support for these systems.\r\nIf the selection and quality of Open Source\r\nsoftware improves, VA can offer its customers more competitive solutions.\r\n<P>On a more personal note, VA is not a behemoth with no sense\r\nof the community which made it grow. I joined VA because they would allow\r\nme to continue to spend significant amounts of my time in Open Source development.\r\nThey have never taken that freedom from me, and in fact have encouraged\r\nemployees to take part in community endeavors. This site is the real \r\nthing. -drew\r\n\r\n<P><A name="whodev-catch"> </A><B>This seems like an awful lot of free stuff. What\'s the catch?</B>\r\n<P>There\'s no catch.\r\n<P>I\'m an Open Source developer. I work on a project to aid other Open Source developers.\r\nSo do many other developers. An Open Source friendly company pays for it, and we thank them a lot.\r\n<P>Do you always ask this many questions?\r\n\r\n<P><A name="whodev-help"> </A><B>That\'s cool! I\'d really like to help. Can I?</B>\r\n<P>Of course.\r\n<P>We\'re working on a lot of ways that we can utilize the help of the\r\nrest of the community.\r\n<P>As soon as we can clean up some of this code and package it in some recognizable\r\nformat, we\'ll be releasing many of the SourceForge web-based tools as\r\nOpen Source projects in SourceForge. (That still confuses me, but\r\nsomehow the logic works.) This means that we can take on developers on \r\nthese projects, and as the tools improve, the new versions will automatically\r\nbe available to other SourceForge project developers.\r\n<P>There will also be a place for other users of SourceForge to help.\r\nWe expect to eventually have some sort of news system that will require maintenance,\r\nwe could definitely use help answering emails, and we could always\r\nuse help with site design. (Don\'t laugh. We\'re software developers, not artists.)\r\n<P>Everyone can help by answering the site surveys that we will\r\noccasionally post. Answers to these questions will directly influence\r\nthe direction of our development.\r\n\r\n<P><A name="whohost-main"> </A><B>Who can host with SourceForge?</B>\r\n<P>We\'re trying to keep it simple, and chose to rely on the work of a\r\nvery talented group, the <A href="http://www.opensource.org">Open Source Initiative</A>.\r\nIf your software utilizes one of the OSI\'s \r\n<A href="http://www.opensource.org/licenses/">approved licenses</A>, we\'d\r\nlove to offer you hosting at SourceForge. Software that falls under\r\nother licenses will require further scrutiny, but is not altogether ruled out.\r\nIn the end, we\'re looking to further Open Source software development,\r\nand will approve projects accordingly.\r\n\r\n<P><A name="whohost-web"> </A><B>What if I don\'t have software, but wanted you to host my web site?</B>\r\n<P>If you\'re site is oriented towards the Open Source community, we\'d\r\nprobably be happy to offer you hosting. Please be careful with this one, though.\r\nWe\'re not here to host personal homepages, or your Southpark picture\r\narchive (despite how much we all love Southpark). There are plenty of\r\nfree site hosting services for these sites. Our goal is the advancement\r\nof Open Source, and if your web site does that, we\'d love to have you.\r\n\r\n<P><A name="whohost-rest"> </A><B>Are there any restrictions on the types of software I can host here?</B>\r\n<P>For legal reasons, we can\'t host strong-encryption products with code\r\nthat originated outside of the US. We\'re working on a system to allow the hosting\r\nUS-originated strong-encryption, with restricted access to downloads.\r\n<P>We are also not set up with the right age-checking mechanisms to host\r\nmaterial/software of a pornographic nature. (As nice as a local connection\r\nto your porn archive might be to us, we just can\'t do it.) There is a more complete definition\r\nof these restrictions in the terms of service agreement, presented \r\nduring project registration.\r\n<P>Cut us some slack on this one. We\'re trying to keep ourselves and the\r\ncompany that provided all of this hardware and bandwidth out of trouble.\r\nWe\'re not here to start a political discussion.\r\n\r\n<P><A name="whohost-com"> </A><B>Can I host commercial software on SourceForge?</B>\r\n<P>Maybe.\r\n<P>If your commercially developed software is Open Source, then yes.\r\n<P>If your commercially developed software is not yet Open Source, but will be later, then probably yes.\r\n<P>If your commercially developed software is not Open Source, but may help\r\nto advance other Open Source software, then maybe.\r\n<P>If you just like our tools so much that you want to use them, then\r\ngo ahead. We\'ll be releasing many of them as Open Source soon. If this\r\n\r\nprospect overwhelms you, then contact VA Linux Professional\r\nServices, they\'ll be glad to help you. (Shameless plug for\r\nour sponsors.)\r\n\r\n<P><A name="whohost-owns"> </A><B>Who owns the source code on SourceForge?</B>\r\n<P>The individual authors hold the copyright on their own software. Because\r\nof the nature of Open Source licenses, we are allowed to give people access\r\nto that software; however, all license disputes and issues are the responsibilities\r\nof the individual authors.\r\n<P>There is often a misconception that Open Source software does not actually\r\nhave a license holder, because of its free nature. This is not the case, however,\r\nand software hosted on SourceForge is responsible for its own licensing.\r\n\r\n<P><A name="whohost-stop"> </A><B>What if I host with SourceForge, then decide to stop?</B>\r\n<P>We would of course like to solve any problems you were having before it came\r\nto this, but in the end, you are free to leave at anytime. After all, we\'re not\r\nthe copyright holders.\r\n<P>Because your software was/is Open Source, however, we will probably still\r\nhave the right to continue to make existing versions of your software available\r\nto the public. If we didn\'t, someone else probably would anyway.\r\n<P>We\'re happy people here. Can\'t we all just Open Source and be happy together?\r\n\r\n<P><A name="whyhost-main"> </A><B>Why should I host my software with SourceForge?</B>\r\n<P>...mumble...free...mumble...gift horse....\r\n<P>But seriously, we\'re not trying to force anything on anybody here. We would\r\nlove people to host with SourceForge because we are a superior hosting service.\r\nIn the spirit of Open Source, we want any popularity we gain to be merit-based.\r\n<P>As we grow, we will also be able to provide you with traffic to your project.\r\nThere is a lot of benefit to giving end-users a window into your development\r\nenvironment. There will be more peer review of your source, and potential developers\r\nwill be wandering by.\r\n\r\n<P><A name="whyhost-secure"> </A><B>Is SourceForge secure?</B>\r\n<P>Yes, we have taken extreme caution in the methods we use for SourceForge\r\nservices. No system is uncrackable, but we continuously monitor the software\r\nwe use for bugs and security holes, and audit our own software regularly.\r\n<P>Encryption is available and enforced on all parts of the SourceForge site\r\nexcept mailing lists. (These passwords should be different than your site\r\npasswords. We are in the process of modifying GNU Mailman to use our own \r\nsecure authentication system.)\r\n<P>We give SSH accounts rather than telnet, SCP rather than ftp, and\r\nCVS/SSH instead of pserver. Site logins are via SSL and site passwords\r\nare never stored nor communicated in plaintext. Because it is possible\r\nto change your site password by confirming your email address (via\r\na partial MD5 hash sent to your registered address), we recommend that\r\nyou also keep your own mail account secure.\r\n\r\n<P><A name="whyhost-backup"> </A><B>What is your backup strategy?</B>\r\n<P>We perform a full backup of all site and project data daily, and rotate\r\nbackups off-site weekly through a large company that specializes in\r\nstoring backup tapes. \r\nWe also have access to a fireproof safe for storage of\r\ndaily tapes.\r\n<P>The exception to this rotation is the mega-file-server, which cannot be fully\r\nbacked up (when full) by less than 34 25GB AIT tapes (our medium of\r\nchoice). It gets a full backup once per month and incrementals otherwise. \r\n\r\n<P><A name="whyhost-all"> </A><B>Do I have to use all of your services? \r\nCan I just use mailing lists, or bug tracking?</B>\r\n<P>You can use whatever you want. If you don\'t need all of the services now,\r\ndon\'t use them. They are there when you need them.\r\n\r\n<P><A name="whyhost-root"> </A><B>Won\'t I lose a lot of control if I don\'t have root access?</B>\r\n<P>Yes and no.\r\n<P>The tradeoff is the security and stability of a professionally managed server.\r\n<P>Once initial setup is through, there really isn\'t much need for root\r\naccess except for security and maintenance upgrades, which we are taking\r\ncare of. We would like to implement all other functions for which you would\r\nnormally require root access via a web interface.\r\n<P>Obviously we can\'t give root access to everyone, or your own security\r\nis at the disposal of any other project admin. We\'re trying to find a happy\r\nmedium. In general we\'ll try to give as much access as we can without damaging\r\nthe security of other projects within SourceForge.\r\n<P>In the end, we\'re here to serve you. VA Linux Systems now pays our salary to\r\noffer you these services. We\'re a pretty responsive bunch. We\'d like to work\r\nthrough any issues you have, just let us know what we need to do. We hope\r\nthat you\'ll find our web administration tools powerful and easy to use. We\'re \r\nconstantly continuing to develop and improve these tools.\r\nIf there is some feature we can add that you think we\'ve forgotten, \r\nplease let us know.\r\n\r\n<P><A name="whyhost-cvs"> </A><B>I already have a cvs tree. Can you import it?</B>\r\n<P>Yes. Register a new project normally and let us know you need to import a\r\nCVS tree. We\'ll need a tar/gzip of your entire document root, including CVSROOT\r\ndirectory. This will preserve your revision history.\r\n\r\n<P><A name="whyhost-files"> </A><B>I have a lot of file releases already. \r\nCan I make them available on the main file server?</B>\r\n<P>Yes, when releasing new files via the project admin interface, there\r\nis an option to set the release date of each file. You may back-populate\r\nyour release history in this manner. That way all previous revisions of your\r\nsoftware are available on the main file server.\r\n\r\n<P><A name="big-main"> </A><B>So how big is all this, really?</B>\r\n<P>We are all of course biased, but it is this writer\'s opinion that this is one\r\nof the best opportunities for Open Source developers in history.\r\n\r\n<P><A name="big-fad"> </A><B>Isn\'t Open Source a fad? Can it really work?</B>\r\n<P>Ack! \r\n<P>This site\'s developers and the company behind it believe deeply in the concepts\r\nof Open Source software.\r\n<P>Open Source is not a fad. Open Source can and does work. This site is proof of\r\nthat. We would not have been able to offer many of our functions without modifications\r\nto many programs we use. Their open source let us make these modifications (which\r\nwere sent back to the original authors for inclusion in the next versions of their\r\nsoftware).\r\n<P><RANT>I can\'t believe that after BIND, Apache, Samba, PERL, Linux, and the\r\nGNU toolset, you can still ask that question.</RANT>\r\n\r\n<P><A name="big-cap"> </A><B>How much capacity does SourceForge have right now?</B>\r\n<P>A quick look at our <A href="hardware.php">hardware list</A> will partially\r\nanswer that question.\r\n<P>We\'ve performed many real-world benchmarks of the various parts of our systems.\r\nWe are capable of handling many projects now, and will scale our systems\r\nto meet demand. Nobody likes a slow server, especially us.\r\n<P>If you want some quick stats on our current systems, here you go:\r\n<UL>\r\n<LI>At 100% usage, our main web servers can handle approximately 8.6 million PHP pageviews\r\ndaily. (Including all of the site authentication necessary for each view.)\r\n<LI>The project web server can handle about 12 million pageviews daily with simple PHP\r\npages, and some unknown (think large numbers) millions of static pages.\r\n<LI>We can\'t properly benchmark our main file server, because we keep saturating its\r\ncurrent 100Mbit connection. We\'ve managed to get 93.8Mbit with 5000 concurrent HTTP\r\nconnections with it though (using only one of its four processors). If we start\r\napproaching our facility bandwidth (a couple of DS-3\'s and a T-1 right now), then we\'ll start\r\nlooking at gigabit and more digital drops. (Don\'t tell the CFO.)\r\n<LI>The 1.3 terabytes of storage in the room gets very loud.\r\n<LI>We blew many circuit-breakers when we were building this thing. Dedicated\r\n220V/30A power circuits solved this problem.\r\n<LI>Our UPS weighs about as much as our entire team.\r\n<LI>VA systems rock. (Another shameless sponsor plug)\r\n</UL>\r\n\r\n<P><A name="big-scale"> </A><B>Wow. That\'s a lot. Can it scale?</B>\r\n<P>Yes, and don\'t threaten us or we\'ll do it.\r\n\r\n<P><A name="big-mirror"> </A><B>Are you going to mirror SourceForge? (and can I pay for it?)</B>\r\n<P>We will probably be mirroring the main file server sometime in the near\r\nfuture. The real problem is the databases behind the main website and synchronization\r\nof all the other servers in real-time.\r\n<P>For now, we\'re content to have good backups, and spare hardware to put\r\nin place if something should fail. \r\n<P>We do take reliability seriously, and a non-west-coast mirror does seem like\r\na good idea. In lieu of a realtime mirror, we\'re considering setting up a \r\nfailover mirror that would lag a few minutes behind the live site.\r\nWe\'re pursuing our options here and will keep you posted.\r\n<P>As for the second question... VA\'s CFO says, yes, you may pay for it.\r\n\r\n<P><A name="big-ready"> </A><B>I thought Linux wasn\'t ready for the \r\nenterprise. What was your setup experience like?</B>\r\n<P>We\'re working on a paper detailing our experience setting up this system.\r\nWe expect to publish it soon.\r\n<P>For those of you that can\'t wait, it can be summarized, "Yay Open Source."\r\n\r\n<P><A name="big-wait"> </A><B>What improvements in Linux/Open Source software are you still waiting for? </B>\r\n<P>We\'re especially anxious to see shared disk arrays over fibre channel,\r\na journalled file system (although we\'re looking at promising ones now),\r\n32-bit UIDs (should be fixed with the new file system),\r\nbetter scheduling (apparent in the development Linux kernels),\r\nand support for my Philips PC Camera.\r\n\r\n<P><A name="big-future"> </A><B>What is the future of SourceForge?</B>\r\n<P>It is looking good, my friend.\r\n<P>VA is committed, we\'re committed, and we\'ve already got ideas that will\r\ncontinue to drive us for months.\r\n<P>The rest is up to you. Help us to help you, and we can all help to advance\r\nOpen Source to new heights.\r\n\r\n<P><A name="whowrote"> </A><B>Who wrote this FAQ? Are you available?</B>\r\n<P>This FAQ was written by <A href="mailto:dtype at valinux.com">Drew Streib</A> (dtype),\r\nalthough I\'m sure it will be modified by many people in the future, especially\r\nafter they see what I\'ve written.\r\n<P>Yes.',968792394,968792324,1458,793,'FAQ');
+INSERT INTO doc_data VALUES (757,1,'VA Linux Affiliate Underground','<h1>VA LINUX AFFILIATE UNDERGROUND </h1><P>VA Linux has rolled out a VA Linux/Community banner program. By displaying VA Linux and Open Source\r\nproject banners on your content pages (hosted on SourceForge or anywhere else), you can earn points redeemable for Debian T-shirts, Geek,\r\nGnome and Tux hats, a Tux Polo shirt, Quake III for Linux...and the much sought after VA Linux and Themes.org T-shirts. (It\'s not that hard, you get a\r\npoint per banner impression, and prizes start at 5000 points.) You can read more and sign up at: http://www.valinux.com/about/affiliates/affiliate.html ',968792399,968792373,1458,793,'Earn swag by displaying VA and Open Source banners');
+INSERT INTO doc_data VALUES (782,1,'Local installation guide',' <B>Local installation guide</b>\r\n\r\n <p>This is an installation guide for the SourceForge software as found\r\non <a href=http://sourceforge.net/project/?group_id=1>SourceForge</a>.\r\nThis is not yet complete but allows to experiment everything not involving\r\nDNS, CVS, cvsweb, ftp.\r\n\r\n<pre>\r\n-------------------------------------------------------------------------------\r\nCreating the MySQL database (assuming MySQL version >= 3.22.25)\r\n\r\n1) Install MySQL from http://www.mysql.com/\r\n\r\n2) Choose a database name (let\'s say \'sourceforge\' for the rest of\r\n this document).\r\n\r\n mysql -e "create database sourceforge"\r\n\r\n3) Create the tables.\r\n\r\n mysql sourceforge < db/SourceForge.sql \r\n\r\n This script also populates the following tables\r\n\r\n bug_resolution\r\n bug_status\r\n patch_category\r\n patch_status\r\n project_status\r\n survey_question_types\r\n user\r\n\r\n-------------------------------------------------------------------------------\r\nConfiguring Apache with SSL (assuming Apache version >= 1.3.9 \r\n openssl version >= 0.9.4\r\n mod_ssl version >= 2.4.10-1.3.9)\r\n\r\nThe best starting point is http://www.modssl.org/. There is very\r\nlittle chance that your installed Apache server contains SSL, you\'ll\r\nhave to recompile and reinstall. I highly recommend to install Apache\r\nit in a non-standard place. It won\'t interfere with your working\r\nApache, if any. And, more important, the installation process will \r\ninstall sample configuration files instead of keeping them in the\r\nsource directory because you already have some installed. \r\n\r\n1) Install openssl\r\n\r\n2) Configure mod_ssl\r\n\r\n3) Install Apache\r\n\r\n-------------------------------------------------------------------------------\r\nConfiguring Apache with PHP (assuming Apache version >= 1.3.9 and \r\n php3 version >= 3.0.12) \r\n\r\n1) Create a file in the Apache document root named phpinfo.php\r\n\r\n echo \'<? phpinfo(); ?>\' > .../phpinfo.php \r\n\r\n Try to load it with your browser using http://localhost/phpinfo.php. \r\n If it shows an HTML page you already have php3 installed.\r\n If the page shown contains the word MySQL you have php3 compiled\r\n with MySQL support. \r\n If you see the page and find MySQL in it, you\'re finished with this\r\n chapter. Otherwise proceed to the following steps.\r\n\r\n2) Make sure php3 is compiled in.\r\n Try to access http://localhost/server-info and search for php3. If\r\n it\'s found somewhere in the page, the php3 module is available. \r\n If http://localhost/server-info does not work add the following lines to \r\n the access.conf file:\r\n\r\n #\r\n # Allow remote server configuration reports, with the URL of\r\n # http://servername/server-info (requires that mod_info.c be loaded).\r\n # Change the ".your_domain.com" to match your domain to enable.\r\n #\r\n <Location /server-info>\r\n SetHandler server-info\r\n Order deny,allow\r\n Deny from all\r\n Allow from localhost\r\n </Location>\r\n\r\n If you did not find php3 you\'ll have to recompile it yourself. See\r\n http://www.php.net/ and remember that you must re-compile php3 with\r\n MySQL support.\r\n\r\n3) Activate php3.\r\n\r\n In order to activate php3 the following lines must be found in the\r\n httpd.conf file:\r\n\r\n LoadModule php3_module modules/libphp3.so\r\n AddModule mod_php3.c\r\n\r\n4) Enable index.php as a directory index in srm.conf. \r\n\r\n DirectoryIndex index.html index.shtml index.cgi index.php\r\n\r\n5) Add .php extension to srm.conf.\r\n\r\n AddType application/x-httpd-php3 .php3 .php .phtml \r\n AddType application/x-httpd-php3-source .phps \r\n\r\n6) Try loading http://localhost/phpinfo.php again.\r\n\r\n-------------------------------------------------------------------------------\r\nConfiguring php3 and Apache for SourceForge\r\n\r\n1) Change the DocumentRoot\r\n\r\n Since some scripts assume that the document root starts at the\r\n www directory, just say that the document root is this directory.\r\n\r\n In srm.conf\r\n\r\n DocumentRoot /home/loic/local/ports/SourceForge/www\r\n\r\n In access.conf substitute/clone the <Directory> block for the\r\n new document root.\r\n\r\n2) Type the URL http://localhost/ in your navigator.\r\n\r\n You should see an error message like this:\r\n\r\n Fatal error: Failed opening required \'pre.php\' in /home/httpd/html/sf/index.php on line 9\r\n meaning that Apache is properly configured as far as php is concerned.\r\n\r\n3) Specify the include path.\r\n\r\n You must tell php where the include files are. Add the full path to\r\n ../SourceForge/www/include to the include_path variable of the\r\n php.ini file. Something like\r\n\r\n include_path = /home/php:/home/loic/local/ports/SourceForge/www/include\r\n\r\n Alternatively you can add the following lines in httpd.conf:\r\n\r\n <Directory /> \r\n php3_include_path /usr/local/htdocs/alexandria/www/include:. \r\n </Directory>\r\n\r\n4) Include magic in php.ini.\r\n\r\n magic_quotes_gpc = On ; magic quotes for incoming GET/POST/Cookie data \r\n magic_quotes_runtime = Off ; magic quotes for runtime-generated data, e.g. data from SQL, \r\n track_vars = On ; enable $HTTP_GET_VARS[], $HTTP_POST_VARS[] and $HTTP_COOKIE_VARS[] arrays \r\n\r\n5) Restart httpd\r\n\r\n6) Type the URL http://localhost/ in your navigator. Two things\r\n may happen at that point:\r\n\r\n a) You\'re redirected to http://sourceforge.net/ since that\'s what the library does\r\n when you\'re not using localhost in the URL.\r\n\r\n b) You see an error message like this:\r\n\r\n Fatal error: Failed opening required \'/etc/local.inc\' in database.php on line 11\r\n\r\n In either cases it means that the pre.php file was found and that the include\r\n path is correct. \r\n\r\n-------------------------------------------------------------------------------\r\nConfiguring SourceForge\r\n\r\n1) Copy the SourceForge/etc/local.inc sample to /etc/local.inc. Edit\r\n it to fit your system parameters. Variables should have self explanatory\r\n names or comments to make it clearer.\r\n\r\n2) Look at the home page http://localhost/\r\n It should display well.\r\n\r\n3) Create a user named admin\r\n\r\n This user will automatically be assigned server wide administration permissions.\r\n\r\n\r\n</pre>\r\n',968796599,968794910,1458,794,'How to setup SourceForge on your own box');
+INSERT INTO doc_data VALUES (783,1,'Local administrator\'s guide','<b>Local administrator\'s guide</b>\r\n <p>This is an administrator guide to the SourceForge software as found\r\non <a href=http://sourceforge.net/project/?group_id=1>SourceForge</a>.\r\nIt gives hints to successfully create a SourceForge service on a machine.\r\nIt assumes that you\'ve successfully installed the software as described\r\nin SourceForge-1.0.4 Installation Guide\r\n\r\n<P><B>Prepare the testing environment</B><P>\r\n\r\nBefore doing anything run the <a href=sffakeenv.txt>Fake env. SQL script</a>.\r\nIt will create a user <b>admin</b> with password <b>admin1</b> and \r\na project <b>test1</b> owned by him. It will also minimaly populate\r\nthe <b>test1</b> patch/bug/task list. If you want to do all this manually\r\nread the following chapters.\r\n\r\n<P><B>Create the admin user</B><P>\r\n\r\n<I>This is not needed if you run the <a href=sffakeenv.txt>Fake env. SQL script</a>.</I><P>\r\n\r\nSome users are granted site wide administration permissions based on their\r\nuser id. \r\nYou can create a user named <b>admin</b> using the menus and afterwards set\r\nit\'s user id to <b>2</b>. \r\n\r\n<pre>\r\nmysql -e "update user set user_id = 2 where user_name = \'admin\'" sourceforge\r\n</pre>\r\n\r\nWhen you log in check that a <b>Site Administrator</b> menu shows on the \r\npage.\r\n\r\n<P><B>Create categories</B><P>\r\n<I>This is not needed if you run the <a href=sffakeenv.txt>Fake env. SQL script</a>.</I><P>\r\n\r\nUnless some categories exist in the software map you won\'t be able to create\r\na new project. Create one or two categories using the <b>Site Administrator</b> menu.\r\n\r\n<P><B>Create a test project</B><P>\r\n<I>This is not needed if you run the <a href=sffakeenv.txt>Fake env. SQL script</a>.</I><P>\r\n\r\nApply for a new project (test1 for instance), using the <b>Register\r\nNew Project</b> link. Once done, go to the <b>Site Admin</b> link on\r\nthe home page and approve the project using the links that display <b>groups</b>.\r\nA project is called a <b>group</b> in the database. When displaying the \r\ndescription of the project, use the <b>Status</b> popup menu and move the\r\nproject status from <b>Pending</b> to <b>Active</b>. Click on <b>Update</b>.\r\n\r\n<P><B>Default IDs</B><P>\r\n\r\nid=100 is used throughout the site as a default. user_id=100 is for a\r\nuser named "none", which is referenced a lot. bug_group_id=100 is a\r\ndefault adefault as well. There are instances throughout the patch\r\nmanager, surveys, bugs, and task manager where this is used, as an\r\nFYI. Also bug_status, patch_status, project_status are tables (maybe\r\nmore), that we need to include default data for.',968796609,968794955,1458,794,'How to administer your local installation');
+INSERT INTO doc_data VALUES (794,1,'Additional contributor guidelines',' <p> <p>This is an contributor guide to the SourceForge software as found\r\non <a href=http://sourceforge.net/project/?group_id=1>SourceForge</a>.\r\nIt explains how contributors should behave in order to see their \r\npatches accepted by the administrators of the project.\r\nIt assumes that you\'ve successfully installed the software as described\r\nin <a href=sfinstall.php>SourceForge-1.0.4 Installation Guide</a> and\r\nthat you\'re running your own instance as explained in <a href=sfusage.php>SourceForge-1.0.4 Administrator Guide</a>\r\n\r\n<P>\r\nYou must understand that integration of any kind of modification to the\r\ncode is subject to carefull reviewing by the SourceForge team. They will\r\nultimately be responsible for bugs or security problems, not you. At\r\npresent patches are processed using the patch manager and it is expected\r\nthat <b>very</b> few people will have write access to the CVS repository.\r\n\r\n<P>\r\nAt present no software roadmap exists and no regression tests are implemented\r\nand therefore the following rules cannot apply fully. Hopefully a contributor\r\nwill make these two happen.\r\n\r\n<P><B>Etiquette</B><P>\r\n\r\n<UL>\r\n<LI> Whatever your coding style is, mimic exactly the existing\r\n style. Period. Here are some hints:\r\n <UL>\r\n <LI> Use tabulations instead of white space for indentation.\r\n <LI> Tabulations are 4 spaces wide.\r\n <LI> Indentation style is\r\n<pre>\r\nif (...) {\r\n ...\r\n} else if (...) {\r\n} else {\r\n ...\r\n}\r\n</pre>\r\n note the space after the if.\r\n When an if expression is too long wrap to the next line when the\r\n line is full. Do not wrap to next line for every boolean expression.\r\n Not good:\r\n<pre>\r\nif (condition ||\r\n condition ||\r\n condition) \r\n</pre>\r\n Good:\r\n<pre>\r\nif (condition || condition ||\r\n condition\r\n</pre>\r\n <LI> Array literals style is\r\n<pre>\r\narray(\'name\'=>\'value\',\'name\'=>\'value\')\r\n</pre>\r\n note that there are <b>no</b> spaces.\r\n <LI> Function arguments and definition style is\r\n<pre>\r\nfunction($arg, $arg, $arg)\r\n</pre>\r\n note the space after the comma.\r\n <LI> Comments are either marked with /* */ or //, never with #\r\n <LI> Comments are above the commented code and must <b>not</b> \r\n rephrase the code. Do not comment at all if just rephrasing.\r\n <LI> Function definitions use a prefix to desambiguate the name\r\n and are lower case words separated by underscore. Function names\r\n may be long but must be explicit. For instance:\r\n<pre>\r\nfunction group_getname($group_id = 0) {\r\n</pre>\r\n </UL>\r\n<LI> Fully review the code roadmap before modifying anything.\r\n If you discover things that are not in the roadmap, contribute to\r\n the roadmap document with updates or additions.\r\n<LI> Search carefully the forums and mailing list archives for discussions\r\n related to the contribution/bugfix you\'re willing to make.\r\n<LI> Read all the code in www/include at least once and understand its\r\n purpose. This is the library and you don\'t want to re-implement anything\r\n it contains.\r\n<LI> Always update the ChangeLog file and be very precise.\r\n</UL>\r\n\r\n<P><B>New functionalities</B><P>\r\n\r\nSo, you\'re absolutely sure the functionality is not already implemented, \r\nthat it\'s not a task in progress. You should now convince at least one\r\nperson in the developper community that it\'s worth doing.\r\n<P>\r\nDescribe what you\'re planning to do in the forum.\r\nPrecisely describe algorithms, functionalities. Wait for approval from \r\nanother developper. In the meantime you can implement what you have in \r\nmind.\r\n<P>\r\n\r\n<UL>\r\n<LI> Add the task in the task list and update daily.\r\n<LI> Implement the functionality.\r\n<LI> Write a non-regression test for it.\r\n<LI> Run the non-regression tests for all the software until it says ok.\r\n<LI> Update the SourceForge documentation and roadmap to describe the new functionality.\r\n</UL>\r\n\r\n<P><B>Bug Fixing</B><P>\r\n\r\n<UL>\r\n<LI> Assign the bug to yourself in the bug list. Never work on a bug\r\n assigned to someone else, unless you\'re talking to the other\r\n developper.\r\n<LI> Write a non-regression test for it. Should it pop again, the test\r\n must detect it.\r\n<LI> Fix the problem.\r\n<LI> Run the non-regression tests for all the software until it says ok.\r\n</UL>\r\n',968796616,968796441,1458,794,' ');
+INSERT INTO doc_data VALUES (759,1,'Your SourceForge Email Address','<b>Your SourceForge email address </b><P>\r\n\r\nWith the activation of your user account, you were given an email address at loginname at users.sourceforge.net. \r\n<P>\r\nThroughout the site, when your email address is displayed, the SourceForge address is given rather than the email address under which you\r\nregistered. Changing your personal email address under "Account Maintenance" will change where this mail forwards. \r\n<P>\r\nThis keeps your own email private, but allows easy access to all site users through their SourceForge addresses. We also filter blacklisted spammers\r\nfrom sending mail to this address. \r\n<P>\r\nYou may also use your SourceForge email address outside of the site. Mail will forward as you would expect it to. Your username will never change,\r\nso this email address is yours to keep. ',968796657,968792565,1458,801,'yourname at users.sourceforge.net forwards email');
+INSERT INTO doc_data VALUES (760,1,'HELP! I\'ve lost my password!','<b>If you lose your password... </b>\r\n<P>\r\nIf you lose your password simply visit the login page and click "Lost Your Password?". A confirmation hash will be emailed to the address we have on\r\nfile for you. Load the URL in the email to reset your password. ',968796664,968792628,1458,801,'You\'re not the first...');
+INSERT INTO doc_data VALUES (761,1,'SSH Keys and CVS/Shell Accounts','<b>SSH Keys and CVS/Shell Accounts </b><P>\r\n\r\nIf you wish to use your ssh keys with CVS/Shell accounts - this is no problem. For your shell account, simply copy your identity.pub file to\r\n"~username/.ssh/authorized_keys" on shell1. Also cut/paste it into the web based account manager to have it synced across to the CVS server. ',968796669,968792682,1458,801,'You don\'t have to re-type, we can store them');
+INSERT INTO doc_data VALUES (762,1,'How do I use the compile farm?','<b>Accessing the compile farm</b><P>\r\n\r\n\r\nIf you have a account on our shell server then you have an account on the compile farm as the same username and password. Please be sure to\r\nread the /etc/motd when you log in. It has information you\'re going to need. If you have any problems please submit another support request. The\r\nhostnames for the current compile farm machines are listed on the CompileFarm page, along with more detailed instructions. Please see:\r\nhttp://sourceforge.net/compilefarm/',968796695,968792789,1458,801,'Build your software across distributions (and BSD)');
+INSERT INTO doc_data VALUES (763,1,'CVS HOWTO',' <p> <P>This very basic right now, but it will get you up and running.\r\n<P>For all developer (read/write) access, you will be using SSH.\r\nSSH (1.x) client must be available to your local machine. The local\r\nenvironment variable CVS_RSH must also be set to the path to ssh.\r\nThis is done on most linux (bash) systems by typing:\r\n<UL><B><I>export CVS_RSH=ssh</I></B>\r\n</UL>\r\n\r\n<P>Anonymous CVS access uses CVS pserver and does not require SSH.\r\n\r\n<P>If you get \'permission denied\' errors with no prompt for a password,\r\nyou do not have this environment variable set properly or SSH is not\r\navailable to your system. Fix this before suspecting a password problem.\r\n\r\n<P><B>How to import source code into your repository</B>\r\n<UL>\r\n<LI>On your local machine, change to the directory whose files (and subdirectories) \r\nyou want to import. Everything now in the current directory\r\nand all subdirectories will be imported into the tree.\r\n<LI>Type the following, where loginname is your SourceForge login name,\r\nyourproject is the unix group name of your project, and\r\ndirectoryname is the name of the new CVS root level directory.\r\n<BR><B><I>cvs -dloginname at cvs.yourproject.sourceforge.net:/cvsroot/yourproject import directoryname vendor start</I></B>\r\n</UL>\r\n\r\n<P><B>How to check out source via SSH</B>\r\n<UL>\r\n<LI>Type the following, making necessary obvious substitutions for\r\nyour username and project.\r\n<BR><B><I>cvs -dloginname at cvs.yourproject.sourceforge.net:/cvsroot/yourproject co directoryname</I></B>\r\n<LI>After initial checkout, you can change into this directory and execute\r\ncvs commands without the -d tag. For example:\r\n<BR><B><I>cvs update<BR>cvs commit -m "comments for this commit"<BR>cvs add myfile.c</I></B>\r\n</UL>\r\n\r\n<P><B>How to check out source anonymously through pserver</B>\r\n<UL>\r\n<LI>Type the following, making necessary obvious substitutions for\r\nyour username and project.\r\n<BR><B><I>cvs -d:pserver:anonymous at cvs.yourproject.sourceforge.net:/cvsroot/yourproject login</I></B>\r\n<LI>After anonymously logging in:\r\n<BR><B><I>cvs -d:pserver:anonymous at cvs.yourproject.sourceforge.net:/cvsroot/yourproject co directoryname</I></B>\r\n<LI>After initial checkout, you can change into this directory and execute\r\ncvs commands without the -d tag. For example:\r\n<BR><B><I>cvs update</I></B>\r\n</UL>\r\n\r\n<P><B>How to use cvs when logged on shell.sourceforge.net</B>\r\n<UL>\r\n<LI>Type the following, making necessary obvious substitutions for username and project.\r\n<BR><B><I>cvs -dloginname at cvs1:/cvsroot/yourproject co directoryname</I></B>\r\n</UL>\r\n<DD>See <a href="/docman/display_doc.php?docid=765&group_id=1" >CVS/SSH FAQ</a> for more information.\r\n\r\n<P><B>How to import an existing CVS tree</B><P>\r\n\r\nThis must be done manually by the SourceForge staff. Proceed as follow:\r\n<UL>\r\n<LI> Prepare a tar/gzip of your entire CVS tree.\r\n<LI> Make sure you include the CVSROOT directory if it contains information\r\n you want to keep. If you\'re not sure, include it.\r\n<LI> Submit a support request asking them to include the tar/gzip in the CVS repository of your project.\r\n Make sure you provide the necessary information in your request:\r\n <UL>\r\n <LI> The exact name of the project or the URL of its home page.\r\n Something like <a href=http://sourceforge.net/project/?group_id=1695>\r\n http://sourceforge.net/project/?group_id=1695</a>.\r\n <LI> The ftp or http location of the tar/gzip file, or its location on shell1.\r\nDouble check with your navigator that the file is available.\r\n <LI> Your SourceForge login name.\r\n <LI> Your project\'s unixname\r\n <LI> Your mail address.\r\n </UL>\r\n<LI> You will be mailed by the SourceForge staff when the CVS tree is\r\n ready for use.\r\n</UL>\r\n\r\n<P><B>How to get your CVS tree back</B><P>\r\n\r\nDaily tarballs of entire project CVS Repositories are available\r\nfor backup or mirroring purposes. These are available at:\r\nhttp://cvs.sourceforge.net/cvstarballs/projectname-cvsroot.tar.gz.\r\nWhere <b>projectname</b> is the Unix name of your project.\r\n\r\n<P><B>Additional References</B>\r\n<UL>\r\n<LI><A href="/docman/display_doc.php?docid=765&group_id=1">SourceForge CVS/SSH FAQ</A>\r\n<LI><A href="http://cvsbook.red-bean.com/">The CVS Book</A>\r\n<LI><A href="http://www.loria.fr/~molli/cvs/doc/cvs_toc.html">CVS Docs at www.loria.fr</A>\r\n</UL>\r\n',968880603,968792962,1458,802,'The basics of CVS');
+INSERT INTO doc_data VALUES (764,1,'Getting daily CVS snapshots','<B>Getting Daily Snapshots of a CVS Tree </b><P>\r\n\r\nDaily tarballs of entire project CVS Repositories are now available for backup or mirroring purposes. \r\n<P>\r\nThese tarballs are generated daily, and ar available at : <B>http://cvs.sourceforge.net/cvstarballs/projectname-cvsroot.tar.gz \r\n</b><P>\r\nwhere projectname is the UNIX name of the project you want to download. ',968797189,968793052,1458,802,'Backup your code');
+INSERT INTO doc_data VALUES (765,1,'CVS/SSH FAQ','<B>CVS/SSH Frequently Asked Questions (FAQ)</B>\r\n<P>\r\nThis FAQ is intended to help using CVS with SSH without reading the\r\ncomplete CVS and SSH documentation.\r\n\r\n<UL>\r\n <LI><A href="#ssh">How does CVS/SSH work?</A>\r\n <LI><A href="#ssh-firewall">Why cvs hangs forever?</A>\r\n <LI><A href="#ssh-key">Am I forced to enter my password for every cvs command?</A>\r\n <LI><A href="#ssh-pass">I updated my CVS/SSH shared key but I\'m still asked for a passphrase?</A>\r\n <LI><A href="#ssh-shell">CVS does not work on shell.sourceforge.net?</A>\r\n</UL>\r\n\r\n<HR noshade>\r\n\r\n<P><A name="ssh"> </A><B>How does CVS/SSH work?</B>\r\n<P>SSH is the authentication mechanism used to allow authorized users to have\r\nread/write access to the CVS repository. The protocol used is ssh protocol version 1.\r\nYou must not try to use ssh protocol version 2. If you have both ssh1 and ssh2 installed\r\non your machine, the ssh1 commands are all suffixed with a 1. For instance use ssh1 instead\r\nof ssh or ssh-keygen1 instead of ssh-keygen.\r\n<P>\r\nCVS will use SSH for authentification if you set the environment variable CVS_RSH to ssh.\r\nCVS_RSH=ssh or CVS_RSH=ssh1.\r\n\r\n<P><A name="ssh-firewall"> </A><B>Why cvs hangs forever?</B>\r\n<P>If you\'re behind a firewall you may need to instruct ssh not to use a privileged port.\r\nInsert the \r\n<br><b>\r\nUsePrivilegedPort no\r\n</b><br>\r\nline in your ~/.ssh/config file. This is equivalent to\r\nspecifying the -P option on the command line. You need to do that since you can\'t simply\r\nset CVS_RSH=\'ssh -P\'.\r\n\r\n<P><A name="ssh-key"> </A><B>Am I forced to enter my password for every cvs command?</B>\r\n<P>No, you can upload a shared key that will allow SSH sessions to be established without\r\nthe need to enter you password every time. Go to your <b>Account Maintainance page</b>, click on\r\nthe <b>Edit Keys</b> link and follow the instructions.\r\n\r\n<P><A name="ssh-pass"> </A><B>I updated my CVS/SSH shared key but\r\nI\'m still asked for a passphrase?</B>\r\n<P>A passphrase is not a password. When you used ssh-keygen (or\r\nssh-keygen1) to produce your shared key, you were asked for a\r\npassphrase. There are two possibilities to avoid cvs passphrase\r\nprompts: you can use ssh-agent tool or you can generate key pair\r\nwithout passphrase.\r\n<P>To use ssh-agent edit your .xsession (or .xstart) script and change\r\nline where window manager is started into:\r\n\r\n<P> ssh-agent $WM\r\n\r\n<P>where $WM is your window manager. Logout-login to activate the\r\nssh-agent. Use ssh-add to add your key to the ssh-agent (you must\r\nenter the passphrase). As long as the ssh-agent runs you will not be\r\nprompted for the passphrase again. For more details see the man pages\r\nof ssh-agent and ssh-add.\r\n\r\n<P>To generate unprotected key pair just type return at the ssh-keygen\r\npassphrase prompt. The drawback of the unprotected key pair is that\r\neverybody who has your private key will have access to the cvs\r\nrepository.\r\n\r\n<P><A name="ssh-shell"> </A><B>CVS does not work on shell.sourceforge.net?</B>\r\n<P>\r\nWhen you\'re logged on shell.sourceforge.net using ssh1, you should use the\r\n<b>cvs1</b> hostname instead of the full host name. For instance:\r\n<P>\r\n<UL>\r\n<LI> <b>Not good:</b> cvs -dprecision at cvs.phpsysinfo.sourceforge.net:/cvsroot/phpsysinfo -z3 co phpsysinfo\r\n<LI> <b>Good:</b> cvs -dprecision at cvs1:/cvsroot/phpsysinfo -z3 co phpsysinfo\r\n</UL>\r\nThis has to do with the fact that both the shell\r\nservers and the cvs servers are firewalled behind the same firewall. Since you\'re inside\r\nthe firewall when you\'re logged on shell.sourceforge.net, the rules do not apply in the same\r\nway.',968797172,968793085,1458,802,'Basics of using CVS with SSH');
+INSERT INTO doc_data VALUES (768,1,'Importing existing CVS trees','<b>Importing existing CVS trees </b><P>\r\n\r\nWe can import your existing CVS tree fairly easily. Just upload it using SCP/ssh to your project\'s home directory on the primary shell server.\r\nAlternatively, put it somewhere visible via anonymous ftp or http. \r\n<P>\r\nLet us know the details when you are done (in a <a href="http://sourceforge.net/support/?func=addsupport&group_id=1">support request</a>). That is, your unix name, the project\'s unix name and the file address. \r\n<P>\r\n(e.g. "Please import the CVS tree for project hal2000. My login is aphzen, the project\'s unix name is hal2000, and the CVS tree can be found on\r\nshell1, in /home/groups/hal2000/hal2000-cvs.tar.gz") Also see the CVS HowTo & FAQ. ',968797212,968793272,1458,802,'Bring your existing code to its new home');
+INSERT INTO doc_data VALUES (772,1,'Getting email from CVS','<p> <b>Getting email from CVS</b>\r\n\r\n<p>\r\nIn any large project, keeping track of changes is difficult. CVS does\r\na reasonable job of allowing source changes to be controlled and\r\nmanaged, but does not provide tools to make it easier to work with a\r\nchanging code base. The hardest part of working on a dynamic project\r\nwith many changing modules is knowing when changes occur, and what\r\nthose changes are.\r\n\r\n<p>\r\nSoftware developers often are heavy email users, spending huge amounts\r\nof time working with their email software. Open source developers are\r\namong the most serious email addicts out there, sorting through\r\nhundreds of emails a day, since this is often the only way to stay in\r\ntouch with users and fellow developers.\r\n\r\n<p>\r\n<em>Clearly, we need more email.</em>\r\n\r\n\r\n<h2>Set up a mailing list</h2>\r\n\r\n<p>\r\nIf you haven\'t already created a mailing list to handle messages sent\r\nby CVS, follow these instructions to do so.\r\n\r\n<p>\r\nTo get started, surf to your project\'s "Project Page." If the "Public\r\nAreas" section of the page doesn\'t list "Mailing Lists," click over to\r\nthe <b>Project Admin</b> page, the to the <b>Edit Public Info</b>\r\npage. Make sure the "Use Mailing Lists:" checkbox is on, and click\r\n"Update." Now go back to your "Project Page."\r\n\r\n<p>\r\nGo to the <b>Mailing Lists</b> page and click through to the\r\n<b>Admin</b> page. Select <b>Add Mailing List</b> to get a really\r\neasy-to-use form that asks you only <em>two questions</em>:\r\n\r\n<ol>\r\n<li><b>What do you want to name your list?</b>\r\n<br>\r\nSince all SourceForge list names start with the Unix name of your\r\nproject and a hyphen, you don\'t even have to worry about that part!\r\nYou just decide on the hard part: "Do I call it\r\n<em>myproject-cvs</em>, or <em>myproject-checkins</em>?" You can\r\nchoose other names, but those are well-recognized by active open\r\nsource developers.\r\n<p>\r\n<li><b>Should I let just anyone subscribe?</b>\r\n<br>\r\n"Yes" will already be checked for you, so leave it that way. You want\r\nyour users to be able to subscribe so they\'ll know when you\'ve fixed\r\nthe bug they reported, because they want to try out the changes as\r\nsoon as they\'re in.\r\n</ol>\r\n\r\n<p>\r\nOk, so you really only had to decide one thing -- that\'s even better.\r\nNow, click the "Add This List" button, and wait for your list to be\r\ncreated.\r\n\r\n\r\n<h2>Set up syncmail</h2>\r\n\r\n<p>\r\n<b>syncmail</b> is a <a href="http://www.python.org/">Python</a>\r\nscript written by Barry Warsaw to send mail to the\r\n<tt>python-checkins</tt> list long ago, before the Python development\r\ntree moved to SourceForge. It\'s undergone a bit of evolution, but\r\nessentially does one thing: send email based on CVS activity. It\r\ntakes a little bit of information from CVS and generates messages that\r\ninclude useful information, such as the actual changes that happened\r\nto the modified files. It shoves all this into email that gets sent\r\nto an email address passed on the command line. For projects with\r\nenough developers that <b>syncmail</b> becomes interesting, this will\r\ntypically be a mailing list.\r\n\r\n<p>\r\nFor your project, this will be\r\n<tt>yourproject-checkins at lists.sourceforge.net</tt> or\r\n<tt>yourproject-cvs at lists.sourceforget.net</tt>, depending on the name\r\nyou chose in the first part of these instructions.\r\n\r\n<p>\r\nTo install <b>syncmail</b>, you need a working copy of the <font\r\n\r\nface="sans serif">CVSROOT</font> directory from your CVS repository.\r\nCheck it out just like you did for your project modules, but with the\r\nmodule name "CVSROOT".\r\n\r\n<p>\r\nNow, get the latest version of <b>syncmail</b>. The canonical copy is\r\nin the repository for the <a href="http://www.list.org/">GNU\r\nMailman</a> mailing list manager (the one you\'re using for the\r\ncheckins list you set up earlier). Get it from SourceForge:\r\n\r\n<p>\r\n<a\r\n\r\nhref="http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/CVSROOT/syncmail?cvsroot=mailman"\r\n>http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/CVSROOT/syncmail?cvsroot=mailman</a>\r\n\r\n<p>\r\nSave the most recent revision to your working copy of your project\'s\r\n<font face="sans serif">CVSROOT</font> directory. Use <b>chmod +x</b>\r\nto set the executable bit for all users, and then add the file to your\r\nproject: <b>cvs add syncmail</b>; <b>cvs commit syncmail</b>. You\r\nprobably want to mention in your comment message where the file came\r\nfrom and the revision number you picked up.\r\n\r\n<p>\r\nSend a support request to SourceForge asking the admin to check out a\r\nworking copy of <b>syncmail</b> into your <font face="sans\r\nserif">CVSROOT</font> directory and verify that it gets the proper\r\nexecutable permissions. The admin only needs to execute <b>cd\r\n/cvsroot/yourproject/CVSROOT</b>; <b>co syncmail</b> to get the\r\ndesired behavior. Copy those commands into your support request to\r\nmake it easy on the admin; they\'re busy people! Be sure to change\r\n"yourproject" to the real Unix name for your project.\r\n\r\n\r\n<h2>Configure CVS to use syncmail</h2>\r\n\r\n<p>\r\nNow that you\'ve spent the better part of a day (or night) reading\r\nthese instructions, and a few minutes following them, you have just a\r\ntiny bit more to do to get CVS to put <b>syncmail</b> to work.\r\n\r\n<p>\r\n<em>After</em> some stressed out, overworked SoruceForge administrator\r\nhas handled your request to checkout a working copy of <b>syncmail</b>\r\ninto the repository, you need to modify your <font face="sans\r\nserif">CVSROOT/loginfo</font> file to tell CVS to invoke\r\n<b>syncmail</b> for all the interesting events CVS is willing to tell\r\nus about.\r\n\r\n<p>\r\nIf you have not modified the <font face="sans serif"\r\n>CVSROOT/loginfo</font> file from the stock file provided by\r\nSourceForge (which is very useful, as the comments include\r\ndocumentation), what you need to do is very simple: just add stuff to\r\nthe end. Here\'s some example stuff to get you started:\r\n\r\n<pre>\r\nCVSROOT $CVSROOT/CVSROOT/syncmail %{sVv} you at someplace.else\r\n\r\nDEFAULT $CVSROOT/CVSROOT/syncmail %{sVv} myproject-checkins at lists.sourceforge.net\r\n</pre>\r\n\r\n<p>\r\nThis will cause email to be sent to two different places, with which\r\ndepending on what files in the repository are affected. For\r\nadministrative files in the <font face="sans serif">CVSROOT</font>\r\ndirectory, email will be sent to <tt>you at someplace.else</tt>; you\r\nshould probably list all your project administrators here. For all\r\nother files, email will be sent to your mailing list (remember to\r\nchange the list name to match <em>your</em> mailing list!).\r\n\r\n<p>\r\nIf you have several sub-products for which you want different checkin\r\nlists, you can change the "DEFAULT" label to match the subtree that\r\nyou want to go to each list, with a separate line for each distinct\r\nprefix. For example, if your project includes the products "one" and\r\n"two", you could use the following:\r\n\r\n<pre>\r\nCVSROOT $CVSROOT/CVSROOT/syncmail %{sVv} you at someplace.else\r\n\r\none/ $CVSROOT/CVSROOT/syncmail %{sVv} myproject-one-cvs at lists.sourceforge.net\r\ntwo/ $CVSROOT/CVSROOT/syncmail %{sVv} myproject-two-cvs at lists.sourceforge.net\r\n</pre>\r\n\r\n<p>\r\nYou can still have a "DEFAULT" line that gets used for any additional\r\nsubprojects.\r\n\r\n<p>\r\nIf you do <em>not</em> have a stock <font face="sans serif"\r\n>CVSROOT/loginfo</font> file, then you can probably figure out what\r\nyou need to do to combine the information above with your existing\r\nchanges. You might not have even needed any of these instructions!\r\n\r\n<p>\r\nCheck in your changes to <font face="sans serif">CVSROOT/loginfo</font>\r\nand check in some other change in your working directories to test your\r\nnew configuration.\r\n\r\n\r\n<h2>Read email!</h2>\r\n\r\n<p>\r\nNow for the real test. If you have started a successful Open Source\r\nproject, you will not be able to catch up with your email. If you can\r\nkeep up with it and still have time to hack, you need to make your\r\nproject more attractive to others, so you can get more developers\r\nchecking in more changes. Then you\'ll always have more email than you\r\nknow what to do with!',968797217,968793546,1458,802,'CVS can automatically send email updates ');
+INSERT INTO doc_data VALUES (766,1,'Win32/CVS/SSH Guide',' <p> <b>A Complete Guide to Using SourceForge for Windows Development<b>\r\n<h2>Introduction </h2>\r\n<p>This is a guide that will allow you to setup, configure and use SourceForge\r\nfor developing Windows based projects. </p>\r\n<p>OpenSource projects tend to usually be *NIX (any flavour of UNIX Linux,\r\nFreeBSD, etc.) based. This is great since UNIX provides a full set of tools for\r\ncommunicating with SourceForge, usually without having to install anything\r\nbeyond your normal system. If your project is firmly based in the Windows world,\r\nor has a Windows port to it, this may leave you scratching your head wondering\r\nhow to get CVS running, what SSH is and how you can upload your website right?\r\nThat\'s the purpose of this guide.</p>\r\n<p>This guide is compiled from my own experience and information scattered on\r\nSourceForges forums. I am indebted to Jay Key and Joel Utting for their work in\r\ncompiling information that was used as input into this document, as well as\r\neveryone who posted messages on SourceForge. While this\r\ndocument is as complete as possible, there may be some errors or omissions.\r\nPlease feel free to <a href="mailto:bsimser at home.com">email</a> me if you find\r\nanything. NOTE: This document does NOT cover generating or using an SSH keypair.\r\nThis is optional and doesn\'t work quite right under Windows.</p>\r\n<h2>Setup</h2>\r\n<p>This document assumes you\'ve done the following:</p>\r\n<ol>\r\n <li>Registered as a new user on SourceForge</li>\r\n <li>Created a project on SourceForge and received confirmation that the\r\n project is setup</li>\r\n</ol>\r\n<p>If you haven\'t already done this, please do so now before proceeding.</p>\r\n<h2>Tools of the Trade</h2>\r\n<p>Since when did you see Bob Vila build a house without his trusty Black &\r\n\r\nDecker tools? You\'ll need some tools of your own to get going with SourceForge\r\nas well.</p>\r\n<h3>CVS</h3>\r\n<p>CVS is the version control system used on SourceForge. This is where you\'ll\r\nstore your source code to all your revisions of your project. You use a CVS\r\nclient on your end to communicate with the CVS server (the repository) on the\r\nSourceForge end. </p>\r\n<p>CVS keeps a record of every change made to the source code, along with\r\ncomments about that change. At any time you can see any previous version of any\r\nfile in the repository. It allows multiple people to work on the same files at\r\nthe same time, merging the changes as they are "committed", and\r\nalarming the user if two changes conflict making sure the difference is resolved\r\nby a human being before allowing the new version of that file to be placed into\r\nthe repository.\r\n<p>This may take some getting used to however. Basically the development cycle\r\ngoes like this:</p>\r\n<ol>\r\n <li>Code is imported into the repository</li>\r\n <li>Everyone working on the project "checks out" a working copy of\r\n the source tree (or a portion thereof) to their local drives</li>\r\n <li>Each person works in the comfort of their own computer generated reality,\r\n and when they have a new feature working, they "update" their\r\n local copy to be as much in sync with the current version as possible, and\r\n then they "commit" the files that have changed, back into the\r\n repository.</li>\r\n</ol>\r\n<p>Any problems CVS has with commiting the files will be mentioned, and you must\r\nthen go through the problem files and resolve the differences manually. In the\r\nfiles, the changed section is highlighted with >>>>> and both\r\nversions are shown. Simply delete the old version (or edit to make it work how\r\nits supposed to), and re-commit the file. Once CVS has no problem, return to\r\nstep 2, and get back to work !</p>\r\n<p>The manual for CVS can be found here: <a href="http://www.fsf.org/manual/cvs-1.9/cvs.html">http://www.fsf.org/manual/cvs-1.9/cvs.html</a>.\r\nI suggest you take some time to read through it when you get a chance. It will\r\nhelp later.</p>\r\n<h3>SSH</h3>\r\n<p>SSH is a secure mechanism for connecting to SourceForge\'s servers. You can\r\nfind a copy of SSH for Windows <a href="ftp://ftp.cs.hut.fi/pub/ssh/contrib/ssh-1.2.14-win32bin.zip">here</a>.\r\nIt\'s just like telnet but provides a secure connection to SourceForge.\r\n</p>\r\n<h3>SCP</h3>\r\n<p>SCP is like a secure FTP client and allows you to put files onto SourceForges\r\nsystem. SCP is usually bundled with SSH so the link\r\nabove will get you both programs.</p>\r\n<h2>Setup</h2>\r\n<p>Once you have all the files you\'re ready to setup your environment to connect\r\nto SourceForge. There\'s only a few things that need to be done, but it\'s\r\nimportant you do them or else your connection will probably not work.</p>\r\n<h3>SSH</h3>\r\n<blockquote>\r\n<p>1. You\'ll need to unpack the SSH distribution files somewhere in your path.\r\nEither unzip them to a directory already in your path or create a new path and\r\nadd it to your AUTOEXEC.BAT file. For example, if you put them in C:\\BIN\r\nthen add this to your AUTOEXEC.BAT file: </p>\r\n<pre>SET PATH=%PATH%;C:\\BIN</pre>\r\n<p>2. You\'ll need a "home" directory where SSH will store settings for\r\nyou. This can be anywhere but set it up by adding an environmental variable to\r\nyour AUTOEXEC.BAT file like this:</p>\r\n<pre>SET HOME=D:\\HOME </pre>\r\n<p>(or wherever you want your home directory to be)</p>\r\n<p>3. You need to create an \\ETC directory on the same drive you set your HOME\r\ndirectory to. In the example above, create a directory on drive D: called ETC:</p>\r\n<pre>D:\r\nMD \\ETC</pre>\r\n<p>4. Create a text file in this new directory called PASSWD. The file should\r\nhave one line in it that looks something like this:</p>\r\n<pre>bsimser:x:1:10:Simser, Bil:d:/home:c:/windows/command.com</pre>\r\n<p>Each entry is separated by a colon (":"). The first entry is your\r\nSourceForge username. Make sure it\'s all in lower case. Don\'t worry about the\r\nnext 4 entries. The 6th entry is the path to your HOME directory you setup in\r\nstep 2. This can include a drive letter but remember to use the "/"\r\ncharacter instead of the normal DOS "\\". The next entry points to your\r\ncommand interpreter (command.com on Windows 95/98, cmd.exe on Windows NT). This\r\nisn\'t used but you need an entry here.\r\n<p>5. Restart your system so your environmental variables and path can be\r\nupdated.</p>\r\n <p>6. You\'re ready to test your connection to SourceForge. From a DOS prompt\r\n enter the following command:</p>\r\n <pre>ssh -l bsimser projectname.sourceforge.net</pre>\r\n <p>Replace bsimser with your SourceForge username. If this is your first time\r\n connecting you\'ll see a message saying SSH is adding the host to your known\r\n hosts. </p>\r\n <p>7. Enter your password at the prompt. Congratulations! You should now be\r\n logged into SourceForge through SSH.</p>\r\n <p>SSH will create a new directory the first time you log into SourceForge in\r\n your HOME directory called ".SSH". In this directory are two files.\r\n "random_seed" is just a binary file so don\'t worry about it (let me\r\n know if you know what it\'s used for). Each time you log into a project on\r\n SourceForge through SSH, an entry will be added to a binary file called "known_hosts"\r\n (remember the message when you logged in?). Again, I\'m not sure what this file\r\n is used for.</p>\r\n</blockquote>\r\n<h3>CVS </h3>\r\n<p>CVS comes in two flavours, command line version and Windows GUI. </p>\r\n<h4>Command Line</h4>\r\n<blockquote>\r\n<p>1. Download\r\nthe command line version of CVS for Windows <a href="http://download.cyclic.com/pub/cvs-1.10/windows/cvs-1.10-win.zip">here</a>. </p>\r\n<p>2. Unpack the command line version (CVS.EXE) to a pathed directory of your\r\nchoosing. You can put it in the same directory as SSH for convenience.</p>\r\n<p>3. Add the following environmental variables to your AUTOEXEC.BAT:</p>\r\n<pre>SET CVSROOT=username at cvs.projectname.sourceforge.net:/cvsroot/projectname\r\nSET USERNAME=username\r\nSET HOMEDRIVE=d:\r\nSET HOME=\\home\r\nSET HOMEPATH=\\home\r\nSET CVS_RSH=ssh</pre>\r\n <p>Change the context to your own SourceForge username and the HOME and\r\n HOMEPATH variables to the ones you used in the SSH setup. Change projectname\r\n to the short name for your SourceForge project.</p>\r\n <p>4. You can now import your local source code to CVS on SourceForge. Switch\r\n to the root directory of your project on your local hard drive like so:</p>\r\n <pre>CD \\SRC\\PROJECTNAME\r\ncvs -dusername at cvs.projectname.sourceforge.net:/cvsroot/projectname import directoryname vendor start</pre>\r\n <p>NOTE: The following has also been reported to work (let me know if it\r\n does):</p>\r\n <pre>cvs -d:ext:username at cvs.projectname.sourceforge.net:/cvsroot/projectname import directoryname vendor start</pre>\r\n <p>Substitute your username and projectname as before. Directoryname is the\r\n name of the new directory that will be created in your CVS repository -- you\'ll\r\n probably want to use your project name for this as well.</p>\r\n <p>5. To checkout a copy of the latest source use this command:</p>\r\n <pre>cvs -dusername at cvs.projectname.sourceforge.net:/cvsroot/projectname co projectname</pre>\r\n After the initial checkout, you can change into this directory and execute cvs\r\n commands without the -d tag. For example:\r\n <pre>cvs update\r\ncvs commit -m "comments for this commit"\r\ncvs add myfile.c</pre>\r\n</blockquote>\r\n<h4>Windows GUI</h4>\r\n<blockquote>\r\n<p>1. Download the Windows GUI client from <a href="http://www.wincvs.org">here</a>. </p>\r\n<p>2. Unzip the file into a temporary directory and run SETUP.EXE.</p>\r\n<p>3. Start the WinCvs client.</p>\r\n<p>4. Restart your system.</p>\r\n<p>4. Under Admin | Preferences enter the CVSROOT for your project:</p>\r\n<pre>username at cvs.projectname.sourceforge.net:/cvsroot/projectname</pre>\r\n<p>5. Under Admin | Login login to CVS. It will prompt you for your SourceForge password.</p>\r\n\r\n<p>6. You can now use the menu commands to check in/out source code from the\r\nGUI.</p>\r\n\r\n</blockquote>\r\n<h3>Website</h3>\r\n<p>So now that you have your source code imported and working how about setting\r\nup your projects website!</p>\r\n<blockquote>\r\n<p>1. Create your website locally using whatever HTML editor you want.</p>\r\n<p>2. Upload the file(s) with the following command:</p>\r\n<pre>scp filename.htm username at shell.sourceforge.net:/home/groups/projectname/htdocs</pre>\r\n</blockquote>\r\n<p>That\'s it! If you have a lot of files you might want to use gzip to compress\r\nthem into one file and upload them instead of doing it file by file. Follow\r\nthese instructions for this technique:</p>\r\n<blockquote>\r\n <p>1. You\'ll need to ZIP your files up with something like WinZip. Don\'t\r\n worry, gunzip on the Unix side can handle ZIP files (or at least it should).\r\n You can find WinZip <a href="http://www.winzip.com">here</a>. Create your ZIP\r\n file of all your HTML, GIF, etc. files.</p>\r\n<p>2. Upload the ZIP file to SourceForge:</p>\r\n<pre>scp filename.zip username at shell.sourceforge.net:/home/groups/projectname/htdocs</pre>\r\n<p>3. Login to SourceForge with the SSH command:</p>\r\n<pre>ssh -l username projectname.sourceforge.net</pre>\r\n<p>You will now be in your home directory. From here all group files are stored\r\nin /home/groups/projectname. Change to this directory. All your web pages are\r\nstored in the htdocs directory.</p>\r\n<p>4. Unzip the file on SourceForge:</p>\r\n<pre>gunzip -d filename.zip</pre>\r\n <p>5. Make sure your files were unzipped successfully with the command:</p>\r\n <pre>ls -l</pre>\r\n <p>6. Remove the ZIP file from SourceForge:</p>\r\n <pre>rm filename.zip</pre>\r\n</blockquote>\r\n<p>That\'s it! You now can import your source code, work with CVS and upload your\r\nwebsite. That should be enough to keep you going on SourceForge.</p>\r\n<h2>Links</h2>\r\n<ul>\r\n <li>Joel Utting\'s <a href="https://sourceforge.net/docs/site/user/newproject-howto.php">SourceForge New Project HOWTO</a></li>\r\n <li>Jay Andrew Key\'s <a href="http://akrip.sourceforge.net/cvs-ssh-win32-howto.txt">win32 on SourceForge HOWTO</a></li>\r\n</ul>\r\n',968797222,968793133,1458,803,'Open Source is for Windows too');
+INSERT INTO doc_data VALUES (767,1,'Win32/CVS/SSH HowTo','<p> <pre>\r\nTitle: cvs/ssh/win32 on SourceForge HowTo\r\nVersion: 0.3\r\nDate: 03-Jan-2000\r\nAuthor: Jay A. Key, scsiprog at geocities.com\r\n\r\n\r\nI. Introduction\r\nThis document intends to provide a quick and dirty guide to using SSH and\r\nCVS on SourceForge in a Win32 environment. These steps worked for me, and\r\nit is my hope that they will provide a starting point for others as well.\r\nIt took a fair amount of trial and error to find two distributions of SSH\r\nand CVS that would work together to access the CVS repository on SourceForge.\r\nWith the setup described below, I am able to access the repository both\r\nthrough a permanent connection through a firewall and via a dialup connection.\r\n\r\n\r\nII. Files\r\nThese are the versions of cvs and ssh that I have made to work together:\r\n ssh: ftp://ftp.cs.hut.fi/pub/ssh/contrib/ssh-1.2.14-win32bin.zip\r\n cvs: http://download.cyclic.com/pub/cvs-1.10/windows/cvs-1.10-win.zip\r\nAdditionally, you may want to download a different SSH archive to be able\r\nto generate an SSH keypair (Optional). One such archive can be found at\r\n http://dome.weeg.uiowa.edu/sos/ssh-without-cygwin.html \r\n\r\n\r\nIII. Setup\r\n Setup for SSH\r\n 1. Create directories for the SSH executables and config files\r\n md c:\\usr\\local\\bin\r\n md c:\\etc\r\n 2. If you don\'t have a \'home\' directory for yourself, create it now. For\r\n example, my home directory is c:\\users\\ak. In the home directory, \r\n create a .ssh directory -- this is where your ssh keys will be stored.\r\n md c:\\users\r\n md c:\\users\\ak\r\n md c:\\users\\ak\\.ssh\r\n 3. Unpack the ssh-1.2.14-win32bin.zip archive into c:\\usr\\local\\bin\r\n 4. Add c:\\usr\\local\\bin to your path. You may wish to add this to your\r\n autoexec.bat:\r\n set path=%path%;c:\\usr\\local\\bin\r\n 5. Using your favorite text editor, create a PASSWD file in c:\\etc. The\r\n format of a line the file is:\r\n keyja:x:1:10:Key, Jay A.:/users/ak/:/windows/command.com\r\n The important items are #1, #6. #1 is the login name on the local\r\n machine. #6 is your home directory. #7 is the command shell on your\r\n system (command.com on Win95 and cmd.exe on NT) -- but since it is not\r\n a *NIX shell, it\'s probably useless to put it in there :-).\r\n 6. Set your HOME environment variable (again, remember to add it to\r\n autoexec.bat as well) to the same directory you entered as item #6 in\r\n the /etc/passwd file:\r\n set HOME=c:\\users\\ak\r\n 7. Optional: Generate an ssh keypair. Unfortunately, the ssh-keygen in \r\n the ssh-1.2.14-win32bin.zip archive doesn\'t appear to work. You can \r\n fortunately use the ssh-keygen executable from a different SSH archive.\r\n This step is not strictly necessary, since you\'ll have to type in\r\n either your password or your passphrase every time you use it.\r\n ssh-keygen\r\n After running this command, verify that identity and identity.pub are\r\n present in your .ssh directory.\r\n 8. Test your connection to SourceForge:\r\n ssh -l username projectname.sourceforge.net\r\n Of course, substitute your SourceForge username and projectname for\r\n username and projectname in the command above.\r\n 9. Accept the key from SourceForge, and when prompted, enter your \r\n password for SourceForge.\r\n\r\n If you have gotten this far, then SSH is now working and configured on\r\n your system.\r\n\r\n CVS setup:\r\n 1. Follow the instructions in the README file in the CVS distribution.\r\n\r\n Optional steps (not necessary nor even necessarily advantageous):\r\n 2. On your user page at SourceForge, you should find a place to upload\r\n your SSH public key. Copy the file identity.pub into the text entry\r\n box on the page -- be sure not to add any line breaks or it will not\r\n work.\r\n 3. After the requisite 6 hour wait, you should be able to use CVS with\r\n SSH without using your password. Of course, under windows I still\r\n haven\'t found a working ssh-agent for Win32, so you\'ll have to type\r\n your passphrase instead -- since my passphrase is *much* longer than\r\n my password, it\'s easier for me to use the password instead.\r\n\r\n\r\nIV. Importing your source code\r\n At this point, you should be able to check in your source following the \r\n instructions in the CVS documentation on SourceForge.\r\n\r\n 1. Switch to the root directory of your project on your local hard drive.\r\n 2. Check in the initial version of your software to CVS:\r\n cvs -d:ext:username at cvs.projectname.sourceforge.net:/cvsroot/projectname import directoryname vendor start\r\n Substitute your username and projectname as before. Directoryname is\r\n the name of the new directory that will be created in your CVS\r\n repository -- you\'ll probably want to use your project name for this\r\n as well.\r\n\r\n\r\nHistory:\r\nv0.3, 03-Jan-2000: Added ":ext:" to -d parameter for the cvs initial import.\r\n\r\nv0.2, 15-Dec-1999: Added missing HOME environment variable.\r\n\r\nv0.1, 15-Dec-1999: Initial version\r\n</pre>\r\n',968797226,968793182,1458,803,'A "quick & dirty" guide');
+INSERT INTO doc_data VALUES (769,1,'Win32/CVS/SSH addendum for WinCVS','<b>Win32/CVS/SSH addendum for WinCVS</b> \r\n<p>\r\nThis note was written to expand a little more on the existing documents\r\n<a href="http://sfdocs.sourceforge.net/sfdocs/display_topic.php?topicid=19">Win32/CVS/SSH Guide</a> and\r\n<a href="http://sfdocs.sourceforge.net/sfdocs/display_topic.php?topicid=19">Win32/CVS/SSH HOW-TO</a>\r\nwith regard to using the WinCVS GUI front-end. (Disclaimer: my experiences were under WinNT. It is possible\r\nthat Win9x will misbehave in new strange and wonderful ways!)\r\n</p>\r\n\r\n<h2>Setting things up from scratch</h2>\r\n\r\n<p>\r\nLet us suppose you (with SourceForge username "<code>your-username</code>") have set\r\nSSH up successfully and are able to SSH to your SourceForge project (named\r\n"<code>your-project</code>".) You have also installed WinCVS, have started it up, and you want\r\nto get it to talk to your SourceForge CVS repository. This is not too difficult, although you might\r\nnot discover it straight away by trial and error.\r\n</p>\r\n\r\n<ul>\r\n<li>Select CVS Admin->Preferences ...</li>\r\n<li>In the \'General\' tab,\r\n <ul>\r\n <li>Set the \'CVSROOT\' to "<code>:ext:your-username at cvs.your-project.sourceforge.net:/cvsroot/your-project</code>".</li>\r\n <li>Set the \'Authentication\' to "SSH Server"</li>\r\n </ul></li>\r\n<li>In the \'Ports\' tab, set \'Check for an alternative rsh name\' to "<code>ssh</code>"</li>\r\n</ul>\r\n\r\n<p>\r\nYou will be tempted now to try to log in using the CVS Admin->Login\r\noption; however, this will just result in a misleading error message,\r\n"Set the password authentication first in the preferences !" We\'ve\r\nset up our preferences just fine, password authentification works\r\ndifferently for an SSH server. So <strong>don\'t</strong> use\r\nCVS Admin->Login.\r\n</p> \r\n\r\n<p>\r\nInstead, whenever you perform some CVS operation that requires authentification, WinCVS will invoke your SSH\r\nclient, albeit in a rather unhelpful way. The invocation of the SSH client is silent and may take a \r\nbit of time. Eventually (for me at least) it appears in a minimised blank DOS shell window and sits there silently\r\nwaiting for me to type in my SourceForge password without any echo... nonetheless it works if I do this.\r\nAfter a brief pause to authenticate WinCVS carries out its communications with the repository as usual.\r\n</p>\r\n\r\n<h2>Correcting an existing mess</h2>\r\n\r\n<p>\r\nThis seems simple enough (if a little awkward!) but if you have experimented with the various other options, you may have\r\nalready fallen foul of a gotcha that certainly gotch me. If you optimistically set your CVSROOT instead to\r\n<code>:pserver:your-username at cvs.your-project.sourceforge.net:/cvsroot/your-project</code> and selected ".passwd\r\nfile on the CVS server" for \'Authentication\', you will have found to your delight that you can then use CVS Admin->Login...,\r\nand then enter your SourceForge password just the once, after which you can talk successfully to the repository, doing such\r\npleasant read-only things as checking out existing modules, updating them, and diffing your changes. However,\r\nWinCVS has trapped you and is giggling. You will find that when you come to commit your changes back to the repository\r\nfor everyone to play with, you will not be able to do so: you will hear the complaint \'<code>cvs [server aborted]: "commit" requires write\r\naccess to the repository</code>\'.\r\n</p>\r\n\r\n<p>\r\nThe reason this can cause particular problems is that by this point, simply switching to the correct Preferences settings\r\ngiven above isn\'t enough. As a result of checking stuff out with different settings in place,\r\nyou now have lots of <code>CVS/Root</code> metadata files that know the material they control was\r\nchecked out from a <code>:pserver:</code> CVSROOT. As a result, even after changing your Preferences\r\nas required, WinCVS won\'t launch SSH and give you a chance to prove you have write permission since it thinks\r\nyou have already identified yourself; it will just continue to flake out with the "...<code>requires write access</code>..."\r\ncomplaint. The simplest solution is to undo your crimes completely, and start again by checking the stuff out with the\r\ncorrect <code>:ext:</code> CVSROOT. However, if you\'re feeling adventurous, you can edit all the existing\r\n<code>CVS/Root</code> metadata files to achieve the same effect without compromising your existing\r\nchanges. (It worked for me - the resulting change to the files\' modification dates seemed to do no harm.)\r\n</p>\r\n\r\n<dl>\r\n\r\n<dt>2000.07.07</dt>\r\n<dd>\r\nAdded warning about not using CVS Admin->Login and clarification of\r\nSSH invocation - thanks <a href="mailto:beman at esva.net">Beman Dawes</a>.\r\n</dd>\r\n\r\n<dt>2000.06.06</dt>\r\n<dd>Original document submitted</dd>\r\n\r\n</dl>\r\n',968797231,968793318,1458,803,'Read after the Win32 Guide & Howto');
+INSERT INTO doc_data VALUES (770,1,'SourceForge setup tool for CVS/SSH/Win32','This is a tool written in Delphi that will set up all associated functions of WinCVS/ssh for SourceForge CVS usage (under Windows).\r\n<P>\r\n Visit: http://sfsetup.sourceforge.net/ for more information',968797238,968793383,1458,803,'There\'s a tool to help');
+INSERT INTO doc_data VALUES (771,1,'CVS/SSH and OS/2','<b>CVS/SSH and OS/2</b><p> Details from a recent support posting:\r\n<br>\r\n<pre>\r\n I\'m working under OS/2, and for some strange reasons it seems to be impossible to use OS/2 CVS together \r\n with OS/2 SSH, so I have to use :pserver: instead (I verified this fact with some other developer working under \r\n OS/2 with CVS for years). I can do a checkout as well as an update this way (I use cvs login first), but \r\n unfortunately no commit - cvs responds with\r\n\r\n cvs [server aborted]: "commit" requires write access to the repository\r\n\r\n Is it impossible to commit via :pserver: on sourceforge? In this case, every OS/2 developer would have problems \r\n using cvs on sourceforge. Or is there something wrong with my account?\r\n--------------------\r\nand the followup:\r\n--------------------\r\n\r\nThis is due to some buggy behaviour of the cvs os/2 port. It still tries to call ssh with parameter "-b" \r\n which is not understood by the os/2 port of ssh. So the workaround would be something like this:\r\n\r\n set CVS_RSH=some\\path\\to\\ssh.cmd\r\n\r\n and in ssh.cmd:\r\n some\\path\\to\\ssh.exe %2 %3 %4 %5\r\n\r\n as long as cvs.exe keeps passing "-b" as first parameter. Very "safe method" (I used here):\r\n\r\n ssh cvs1.sourceforge.net cvs server\r\n\r\n works fine :)\r\n----------------\r\nWith thanks to Izzy.\r\n----------------\r\n<P>\r\nMore:\r\nto use CVS over SSH on OS/2 you need specific versions of both SSH and CVS:\r\nCVS: either 1.10 or 1.10.6 both available from http://hobbes.nmsu.edu, the 1.10.7 version will NOT work\r\n<P>\r\nSSH: os/2-1.2.13-03, available as sshos203.zip from http://hobbes.nmsu.edu\r\n<P>\r\nI had huge problems wiht SSH CVS access and they where only because of wrong versions, everything works fine now ',968797243,968793470,1458,803,'Open Source is for OS/2 too');
+INSERT INTO doc_data VALUES (773,1,'Accessing & using databases at SourceForge',' <p> <b>Accessing & using batabases at SourceForge</b><P><UL>\r\n<EM>If you need to store regularly formatted data for your project...\r\nand you need it stored reliably...\r\nand wish to search it flexibly...\r\nthen you want to request a database;\r\nand SourceForge provides it!\r\n</EM>\r\n</UL></P>\r\n\r\n<P><B>On this page:</B></P>\r\n<P><UL>\r\n<LI><A HREF="#what">What is a Database?</A>\r\n<LI><A HREF="#mysql">What is MySQL?</A>\r\n<!-- pgqsql\r\n<LI><A HREF="#pgsql">What is PostgreSQL?</A>\r\n-->\r\n<LI><A HREF="#request">How to request a database at SourceForge?</A>\r\n<LI><A HREF="#php">How to access a database from a webpage?</A>\r\n<LI><A HREF="#tips">Tips and Tricks</A>\r\n<LI><A HREF="#ref">References</A>\r\n</UL></P>\r\n\r\n<A NAME="what">\r\n<P><B>What is a Database?</B></P>\r\n</A>\r\n\r\n<P>A database, or more precisely, a <EM>relational</EM> database, stores information in a number of tables.\r\nTables contain records, each of which represents a bit of information, shaped according to the format for that table.\r\nGo look up any book on SQL and see how simple it all is.</P>\r\n\r\n<P>Particularly interesting are so-called <EM>keys</EM>, which are unique values stored in a position of that database.\r\nIf these values are mentioned in a(nother) table in the database, they can be interpreted as a reference from one record to another, just like addresses serve as pointers in C and any of its crippled follow-ups.</P>\r\n\r\n<P>Databases are simply structured and can therefore be put to just about any use you can think of.\r\nThey are particularly useful in being <EM>persistent</EM>, that is, anything short of an atom bomb will not do to erase once-stored data.\r\nTo clearly mark the timing for this `once-stored\' notion, an important process concept in the database world is a <EM>transaction</EM>, which is particularly useful when many users concurrently access the same database but wish to pretend they access it one at a time.</P>\r\n\r\n\r\n<A NAME="mysql">\r\n<P><B>What is MySQL?</B></P>\r\n</A>\r\n\r\n<P>Ah, MySQL is a database... except that it\'s a <EM>crisp</EM> database.\r\nSure, it\'s fairly accepted in the GNU/Linux world, so it must be good. \r\nBut <EM>why</EM> is it so good?\r\nAnd why is it used so much more often under web services than that other, full-blown, Open Source database, PostgreSQL?</P>\r\n\r\n<P>Basically, the people that made MySQL don\'t implement a complete relational database.\r\nThey\'re very close, but left out a few concepts that slow down a complete SQL implementation.\r\nThe result: A crisp database which is in most situations quite usable for web applications.</P>\r\n\r\n<P>The MySQL people left out <EM>transactions</EM>.\r\nThis means that it is not possible to imagine all database operations as happening in sequence, but since most interactions deal with a combination of tables iterated over once in one SQL statement, this is not a problem.\r\nTransactions get useful if you first perform one SQL statement to request information, then another to process it somehow.\r\nBe a little smarter in writing your SQL queries, and you\'ll do fine (mostly, that is).\r\nAnd in case of trouble, you are supposed to be able to lock tables, but I never needed it, so I cannot tell you how.</P>\r\n\r\n<P>To avoid most chances of trouble with this lack of transactions, MySQL also doesn\'t allow you to nest one SQL query inside another.\r\nAnd that\'s the only true constraint on query expressiveness in MySQL --- But again, mostly you should be fine.</P>\r\n\r\n<P>Without transactions, MySQL can be an incredible lot faster in SQL query processing than any database that does offer transaction support.</P>\r\n\r\n<P>Without transactions, don\'t even think of e-commerce applications (don\'t think of it on SourceForge anyway, you promised to stay clear of such horrible habits).\r\nReason for not doing e-commerce with MySQL is that e-commerce usually requires <EM>distributed transactions</EM>, that ensure that all parties (like you, your bank, the selling party, the selling bank, any intermediaries) all agree on the success of failure of the deal.\r\nWithout transactions, let alone distributed ones, you cannot expect this stuff to reliably go right.</P>\r\n\r\n<P>Without transactions, there still are many SQL queries that may be utilised for all sorts of purposes on dynamic web pages and the underlying administration.\r\nSourceForge, for example, administers all its data in MySQL.\r\nHeck, you don\'t expect to need more complicated queries than those of SourceForge, do you?\r\nFor almost any purpose, MySQL fits the bill!</P>\r\n\r\n<!-- pgsql\r\n\r\n<A NAME="pgsql">\r\n<P><B>What is PostgreSQL?</B></P>\r\n</A>\r\n\r\n<P>PostgreSQL is another relational database, completely Open Source this time.\r\nIt is a complete implementation of SQL (as far as I know) and in comparison to MySQL it adds transactions, even distributed transactions if you want.\r\nFor most purposes, MySQL will do, but for some...\r\nAnyway, I think you can even request a PostgreSQL database if you want to!</P>\r\n\r\n-->\r\n\r\n\r\n<A NAME="request">\r\n<P><B>How to request a database at SourceForge?</B></P>\r\n</A>\r\n\r\n<P>Okay, remember the <A HREF="faq.php#whyhost-root">FAQ question</A> whether it was a good thing not to have root access and that the reply by the SourceForge folks was that in return you get professional sysadmin services? Here\'s where that\'s absolutely true.\r\nYou don\'t have to (or want to) get into user administration of MySQL, it is a small disaster.\r\nBelieve me, you should be glad some experienced guy is doing it for you!</P>\r\n\r\n<P>All you need to do is to request a database <EM>for your project</EM> (so, be sure to mention its name) on the <A HREF="http://sourceforge.net/support/?func=addsupport&group_id=1">request submission</A> page of the <A HREF="http://sourceforge.net/support/?group_id=1">support pages</A> of SourceForge.\r\nEnter a "Database Server" category query with a text like\r\n<PRE>\r\n Hi!\r\n\r\n Could you create a MySQL database for my project GeeksGoGroovy?\r\n\r\n Thanx,\r\n -ThisGeek.\r\n</PRE>\r\n<!-- pgsql\r\nThey\'ll even provide you with PostgreSQL if you want to, but the default is MySQL, because it\'s lighter and suitable for most purposes anyway.\r\n-->\r\nAfter requesting your database, just wait a few days or so, and then an email should poor into your mailbox.</P>\r\n\r\n<P>This email contains the hostname that runs your database, the username you should access the database with (not necessarily related to your SourceForge-login, but it usually equals your project name), the name of the database (usually also equals your project name) and a password.\r\nThe email therefore looks a bit like this:\r\n<PRE>\r\n Hostname: VAntastic\r\n Database: Dumpster\r\n Username: GeeksGoGroovy\r\n Password: Sekreet\r\n</PRE>\r\nPlus the usual amount of geek wisdom at the bottom <CODE>;-)</CODE>\r\nYou need this information to start up MySQL from your shell account at SourceForge:\r\n<PRE>\r\n bash$ mysql -h VAntastic -u GeeksGoGroovy Dumpster -p\r\n Password: Sekreet\r\n Welcome to the MySQL monitor. Commands end with ; or g.\r\n Your MySQL connection id is 2 to server version: 3.22.30\r\n\r\n Type \'help\' for help.\r\n\r\n mysql> \r\n</PRE>\r\nAt the <CODE>mysql></CODE> prompt, you may start entering SQl commands and end them with <CODE>;</CODE> plus return.</P>\r\n\r\n<P>For example, this is what you could do to create your first database table:\r\n<PRE>\r\n create table goosebumps\r\n ( id integer not null,\r\n country varchar(255),\r\n monster varchar(255),\r\n primary key (id)\r\n );\r\n</PRE>\r\nand more tables in a similar way.\r\nYou could inserted some entries in tables as follows:\r\n<PRE>\r\n insert into goosebumps\r\n values (1, \'Scotland\', \'Nessy\'),\r\n (2, \'USA\', \'Bill\'),\r\n (3, \'Transilvania\', \'Dracula\');\r\n</PRE>\r\nWe\'ll use this data in the example in the next section, but you can query it here too, with SQL queries like:\r\n<PRE>\r\n select country,monster\r\n from goosebumps\r\n where country<>\'USA\';\r\n</PRE>\r\nWhen entered in MySQL, this prints the following table:\r\n<PRE>\r\n +--------------+---------+\r\n | country | monster |\r\n +--------------+---------+\r\n | Scotland | Nessy |\r\n | Transilvania | Dracula |\r\n +--------------+---------+\r\n 2 rows in set (0.00 sec)\r\n</PRE>\r\nbut of course, such layout is <EM>not dun</EM> for commercial quality (find the contradiction) software, for which the following layout is often <EM>mission-critical</EM>:\r\n<UL>\r\n<TABLE BORDER=3>\r\n<TR><TH ALIGN=LEFT>country</TH><TH ALIGN=LEFT>monster</TH></TR>\r\n<TR><TD>Scotland</TD><TD>Nessy</TD></TR>\r\n<TR><TD>Transilvania</TD><TD>Dracula</TD>\r\n</TABLE>\r\n</UL>\r\nSo, we start wondering:</P>\r\n\r\n\r\n<A NAME="php">\r\n<P><B>How to access a database from a webpage?</B></P>\r\n</A>\r\n\r\n<P>Let\'s get to some real work now!\r\nThe previous section explained how to log in.\r\nYour favourite SQL book taught you how to create tables and insert initial data into it.\r\nLet\'s assume this all worked.\r\n(And no, it\'s not a shame if you make typo\'s in SQL syntax, people once stared at me in utter amazement for extending a table with a new attribute in one try, just to demonstrate how average SQL queries are formed: by trial and error.)</P>\r\n\r\n<P>Next to enjoying the pleasures of typing SQL commands manually and getting the results back in the format of tables that don\'t fit on a 80-char-wide terminal, there is the possibility to exploit PHP for this purpose.\r\nIt goes without saying that SourceForge provides PHP for anything you deem worthy, including even an <CODE>index.php</CODE> entrance page instead of <CODE>index.html</CODE>!</P>\r\n\r\n<P>The PHP language is a server-side scripting language that can directly access a database, without the need of complicated web structures like <CODE>cgi-bin</CODE> scripts.\r\nJust let your filenames end in <CODE>.php</CODE> or perhaps in <CODE>.php3</CODE> and the script is interpreted as PHP code.\r\nBasically, PHP is just HTML, but with the possibility (to name one of many) of intersecting dynamic sections of code, such as\r\n<PRE>\r\n <?php\r\n\r\n echo "<BLINK>This is blinking</BLINK>";\r\n ?>\r\n</PRE>\r\nor, of course, much more fancy material, such as database access.</P>\r\n\r\n<P>These are the steps you need to take to access a database from PHP scripts:\r\n<OL>\r\n<LI> <B>Open a MySQL connection:</B>\r\n First, we need to establish a connection to the database on the host that runs the MySQL daemon.\r\n In terms of PHP, this goes:\r\n <PRE>\r\n $db=mysql_connect ("VAntastic", "GeeksGoGroovy", "Sekreet");\r\n </PRE>\r\n<LI> <B>Select your database:</B>\r\n There now is a connection to MySQL, but since many databases may reside at the contacted host, we should specify which one to use, just like we did with <CODE>-h</CODE> on the command line; in PHP:\r\n <PRE>\r\n mysql_select_db ("Dumpster", $db);\r\n </PRE>\r\n<LI> <B>Send an SQL query:</B>\r\n We first have to specify what we want to ask the database.\r\n This is a plain query as you learned from your favourite SQL book, entered as a string.\r\n In PHP, this goes:\r\n <PRE>\r\n $result=mysql_query ("select country,monster from goosebumps", $db);\r\n </PRE>\r\n<LI> <B>Iterate over the rows:</B>\r\n The SQL query can return any number records, or in database terms, rows.\r\n To deal with this generally, we should iterate over the rows in the result.\r\n In PHP, this is done as follows:\r\n <PRE>\r\n while ($row=mysql_fetch_row ($result)) {\r\n ... process $row ...\r\n }\r\n </PRE>\r\n<LI> <B>Process each row:</B>\r\n Let\'s assume we lack any imagination, and just wish to print the data in the current row.\r\n This can be done with a PHP statement like:\r\n <PRE>\r\n print ("<TR><TD>$row[0]</TD><TD>$row[1]</TD>n");\r\n </PRE>\r\n<LI><B>Close the deal:</B>\r\n Being good Un*x community citizens, we have learnt to clean up after we\'re done.\r\n This habit is formulated in PHP with:\r\n <PRE>\r\n mysql_close ($db);\r\n </PRE>\r\n provided, of course, that <CODE>isset($db)</CODE> because otherwise, there was a fault in opening the database to start with.\r\n</OL>\r\n</P>\r\n\r\n\r\n<P>The whole PHP code with some table-embellishments now reads:\r\n<PRE>\r\n <?php\r\n\r\n $db=mysql_connect ("VAntastic", "GeeksGoGroovy", "Sekreet");\r\n mysql_select_db ("Dumpster", $db);\r\n $result=mysql_query ("select country,monster from goosebumps", $db);\r\n print ("<TABLE BORDER=3>n");\r\n print ("<TR><TH ALIGN=LEFT>country</TH><TH ALIGN=LEFT>monster</TH>n");\r\n while ($row=mysql_fetch_row ($result)) {\r\n print ("<TR><TD>$row[0]</TD><TD>$row[1]</TD>n");\r\n }\r\n print ("</TABLE>n");\r\n mysql_close ($db);\r\n ?>\r\n</PRE>\r\nPut all of this in a <CODE>.php</CODE> file in your project\'s <CODE>htdocs</CODE>, for example <CODE>/home/groups/GeeksGoGroovy/htdocs/tralala.php</CODE> and access its webpage <CODE>http://GeeksGoGroovy.sourceforge.net/tralala.php</CODE> to see the results.\r\nThat\'s all there is to it!</P>\r\n\r\n\r\n<A NAME="tips">\r\n<P><B>Tips and Tricks</B></P>\r\n</A>\r\n<P>\r\nOnce your database runs, find out how you can make one table refer to another (or to itself, for that matter) by naming the <EM>primary key</EM> in an attribute, much like you would use a pointer in a programming language.\r\nYou can pass those around between PHP scrips by generating references like <CODE><A HREF="HallOfGeeks.php?country=USA"></A></CODE> that pass a <CODE>country</CODE> parameter to the PHP script <CODE>HallOfGeeks.php</CODE>, that can use it as a normal variable, like in\r\n<PRE>\r\n $result=mysql_query ("select country,monster from goosebumps\r\n where country=\'$country\'", $db);\r\n</PRE>\r\nwhere you should mind the different use of quotes!</P>\r\n\r\n<P>If you don\'t want to pass around numbers, but prefer names, you should encode according to the HTTP standards for a URL, to handles spaces and so on well.\r\nDo this with the PHP function <CODE>urlencode</CODE> as follows:\r\n<PRE>\r\n echo "&lt;A HREF=\'HallOfGeeks.php?search=", urlencode($plaintext), "\'&gt;";\r\n</PRE>\r\nto turn a string &lt;CODE&gt\'n*s</CODE&gt; into a reference like\r\n<PRE>\r\n &lt;A HREF=\'HallOfGeeks.php?search=n%25s\'&gt;\r\n</PRE>\r\nThe asterisk is automatically recovered from these codes when PHP parses its script parameters.</P>\r\n\r\n<P>Parameters can be treated as optional.\r\nConsider this code as a replacement of the previous:\r\n<PRE>\r\n $cc="";\r\n if (isset ($search)) {\r\n $cc=" and monster regexp \'$search\'";\r\n }\r\n $result=mysql_query ("select country,monster from goosebumps\r\n where country=\'$country\'\r\n $cc", $db);\r\n</PRE>\r\nThis would add the new constraint only when the variable is defined; the variable will be defined if it occurs as a parameter to the script.</P>\r\n<P>One last tip: It is possible to make pages <EM>very</EM> dynamic.\r\nIf a browsing person visits the same page several times, make sure that it is clear what the goal for that page is.\r\nThere is no problem in using login interactions when a browsers accesses a privileged page, as long as it can eventually lead to the page longed for.\r\nThis lesson helped me to drastically improve the web structure of the LHSD project.</P>\r\n<P>Do you see how quick and easy this combination of MySQL+PHP works?\r\nThat\'s what I meant before with crispness of this stuff!\r\nPerhaps your fingers are starting to itch a tad bit?\r\nLook at the URLs in SourceForge, and it\'ll only get worse <CODE>:-)</CODE>\r\n<BR>\r\n<EM>Enjoy!</EM></P>\r\n\r\n\r\n<A NAME="ref">\r\n<P><B>References</B></P>\r\n</A>\r\n<P>\r\n<A HREF="http://sourceforge.net">SourceForge</A> is an incredible development platform for the <A HREF="http://www.opensource.org">Open Source</A> and <A HREF="http://www.gnu.org">GNU</A> community.\r\n<BR>\r\n<A HREF="http://www.mysql.com">MySQL</A> is freely <A HREF="http://www.mysql.com/download.html">downloadable</A> and has an online <A HREF="http://www.mysql.com/Manual_chapter/manual_toc.html">reference manual</A>.\r\n<BR>\r\n<A HREF="http://www.php.net">PHP</A> has online <A HREF="http://www.php.net/docs.php3">documentation</A>, also on <A HREF="http://www.php.net/manual/ref.mysql.php3">MySQL</A>\r\n<!-- pgsql\r\nand <A HREF="http://www.php.net/manual/ref.pgsql.php3">PostgreSQL</A>\r\n-->\r\n.\r\n<BR>\r\n<!-- pgsql\r\n<A HREF="http://www.postgresql.org">PostgreSQL</A> is freely <A HREF="http://www.postgresql.org/sites.html">downloadable</A> and has online <A HREF="http://www.postgresql.org/doxlist.html">documentation</A>.\r\n<BR>\r\n-->\r\n<A HREF="http://home.zonnet.nl/vanrein">Rick van Rein</A>, author of this page, is a <A HREF="http://www.cs.utwente.nl/~vanrein">PhD student</A> in the <A HREF="http://wwwis.cs.utwente.nl:8080">database group</A> of the <A HREF="http://www.cs.utwente.nl/eng">computer science</A> department at the <A HREF="http://www.utwente.nl/uk">University of Twente</A>.\r\n\r\n',968797253,968793885,1458,804,'A primer');
+INSERT INTO doc_data VALUES (774,1,'Getting started with SourceForge',' <p> <b>Introduction</b>\r\n<P>Hello new SourceForge user ! I\'m writing this HOWTO in\r\nan effort to make it easier to setup a new project at SourceForge. This\r\ndocument is incomplete, (of course) and will hopefully be added to over\r\ntime as more features are added to SourceForge. My intention is for this\r\nto be a step-by-step guide for the initial setup of your new project. First\r\nI will outline what I think is the most common situation new developers\r\nwill face ; You have a directory of code, maybe even a current CVS repository,\r\nand you wish to use all the features of SourceForge to continue developing\r\nyour project in the public eye, free, and open sourced, and hopefully to\r\nattract some new developers to it, and, of course, users. So let\'s get\r\nstarted...\r\n<P><FONT SIZE=+2>Steps for setting up a new project</FONT>\r\n<P>Here is a brief overview of what is involved, details\r\nto follow ;\r\n<P><B>1. Register as a new user with SourceForge.\r\n<BR>2. Register a New Project, logged in as the user you\r\ncreated in step 1.\r\n<BR>3. Setup your group and project information.\r\n<BR>4. Create your CVS repository with the latest snapshot\r\nof your code.\r\n<BR>5. Setup your group\'s web site.\r\n<BR>6. Setup mailing lists for your project.\r\n<BR>7. Finally, get used to using CVS for development, and\r\nget to work !</b>\r\n<P>...and some other things that you may need ;\r\n<P><b>8. Release a file module so people can see your work !\r\n<BR>9. Read the SourceForge site documentation and the help\r\nmessage forums.</b>\r\n<P><FONT SIZE=+2>Now on to the business...</FONT>\r\n<P><B>1. Register as a new user with SourceForge.</b>\r\n<P>On the <A HREF="http://www.sourceforge.net">SourceForge\r\nhomepage</A>, click on the option New User via SSL. This will allow you\r\nto give your details to SourceForge, and it will then setup a user account\r\nfor you. To do just about anything involving interacting with SourceForge\r\nyou need to have a user account. Once this is done, you can login as this\r\nuser anytime using the Login via SSL option on the SourceForge homepage.\r\n<P>When you login you are presented with your personal page\r\n; any projects you are involved in are listed, along with some other info.\r\nAlong the side of the page are some options for you, including one which\r\nis of particular interest to us ; Register New Project...\r\n<P><b>2. Register a New Project, logged in as the user you created\r\nin step 1.</b>\r\n<P>Clicking on the Register New Project link takes you to\r\na set of pages which you must simply step through, providing all the information\r\nrequired. It is very straightforward and well setup, so no help here is\r\nreally needed\r\n<P>Once complete, it gets sent to the SourceForge staff,\r\nand they look over it to determine if your project would be suited to the\r\ngoals of SourceForge. I\'ve yet to hear of a project rejected, so don\'t\r\nworry ; if its open sourced and free, I think you\'ll get accepted quickly<P>Now you wait, and hopefully receive a reply within 24\r\nhours. (if it takes longer, mail them directly - there were some problems\r\nwith new projects, but I believe they have been corrected now) If all goes\r\nwell you will be informed of your new project being up, and so login via\r\nSSL and at the bottom of your personal page there will be a link to your\r\nnew project\'s group page\r\n<P><b>3. Setup your group and project information.</b>\r\n<P>Click on that link ! You will now see your group\'s SourceForge\r\npage (this is different from your web site), and a list of options allowing\r\nyou to change things, basically to administer your project.\r\n<P>What do you have now ? Well, you have all of the following\r\n<ul>\r\n<li>a website at http://yourproject.sourceforge.net\r\n<li>a CVS repository at <li>cvs.yourproject.sourceforge.net:/cvsroot/yourproject\r\n<li>anonymous FTP at yourproject.sourceforge.net,\r\n<li>and access to mailing lists, which we\'ll use later.\r\n</ul>\r\n<P>The first thing to do is to enter a description of your\r\nproject for your group page. Click on Project Admin, and then on Edit Group\r\npublic Information and Categorization. Insert the required info into the\r\nfields.\r\n<P>Next question ; Do you have any other developers already\r\n? If so, they must all register as users on SourceForge, and then give\r\nyou their user names. You can then add them by user name to your list of\r\ndevelopers, giving them write access to your group\'s CVS and web site.\r\nTo do this go back to Project Admin, and click on Add Group Member. Now\r\ntype in their user name, and they will be added.\r\n<P>The rest of your group page you can explore and see what\r\nelse is about. I think we\'ve done the most important things here.\r\nTime to get some code where everyone can see it...\r\n<P><b>4. Create your CVS repository with the latest snapshot\r\nof your code.</b>\r\n<P>For people new to internet development (as I am myself)\r\nCVS takes a little getting used to. For the newbies, here is a brief description\r\nof what it does and how ;\r\n<P>It keeps a record of every change made to the source code,\r\nalong with comments about that change. At any time you can see any previous\r\nversion of any file in the repository. It allows multiple people to work\r\non the same files at the same time, merging the changes as they are "committed",\r\nand alarming the user if two changes conflict (very clearly, I might add)\r\nmaking sure the difference is resolved by a human being before allowing\r\nthe new version of that file to be placed into the repository.\r\n<P>This is cool. It takes some getting used to however. Basically\r\nthe development cycle goes like this ;\r\n<ol>\r\n<li>You import all your code into the CVS, then everyone\r\n"checks out" a working copy of the source tree.\r\n<li>Each person works in the comfort of their own computer\r\ngenerated reality, and when they have a new feature working, they "update"\r\ntheir local copy to be as much in sync with the current version as possible,\r\nand then they "commit" the files that have changed, back into the repository.\r\n<li>Any problems CVS has with commiting the files will\r\nbe mentioned, and you must then go through the problem files and resolve\r\nthe differences manually. In the files, the changed section is highlighted\r\nwith >>>>> and both versions are shown. Simply delete the old version (or\r\nedit to make it work how its supposed to), and re-commit the file. Once\r\nCVS has no problem, return to step (2), and get back to work !\r\n</ol>\r\n<P>So, now to the details of importing your source tree into\r\nyour CVS repository at SourceForge. First read the site documentation on\r\nCVS. For more info read a bit of the free 180 page <A HREF="http://cvsbook.red-bean.com">CVS\r\nbook</A>. Then do the following ;\r\n<P>Get <A HREF="http://www.ssh.fi">SSH</A> and CVS for your\r\nplatform. Under linux using a Bash shell, type in the following ;\r\n<P>export CVS_RSH=ssh\r\n<BR>export CVSROOT=loginname at cvs.yourproject.sourceforge.net:/cvsroot/yourproject\r\n<P>The first line tells CVS to use SSH to connect to the\r\nrepository. This is for security purposes. The second line tells CVS where\r\nto look for its Repository.\r\n<P>Now, the most likely situation is that you have some source\r\ncode in a directory tree you wish to import into CVS. Go to the top directory\r\nyou wish to import, in your source code tree, and type in the following,\r\nfilling in the bits mentioned below ;\r\n<P>cvs import directoryname vendor start\r\n<P>directoryname is the name under which the repository\r\nwill be accessed. If all goes well it will ask for your SourceForge user\r\npassword, and then go on its merry way importing your whole source tree.\r\n<P>Next, backup your old code base somewhere, because you\r\ndon\'t want to work with it anymore, and checkout a fresh CVS version using\r\n;\r\n<P>cvs checkout directoryname\r\n<P>This will get you a "working copy" of the code, in CVS\r\nform, ready for you to hack on. You should remember, however, that any\r\nchanges such as adding/removing files and directories must be explicitly\r\nstated to CVS - see the above mentioned book for details.\r\n<P><b>5. Setup your group\'s web site.</b>\r\n<P>I\'ll assume that you have some sort of web page or site\r\nbuilt already that you wish to put up on SourceForge to give your group\r\na public face. Login to SourceForge using SSH, for example ;\r\n<P>ssh -l loginname yourproject.sourceforge.net\r\n<P>you will now be in your home directory. From here all\r\ngroup files are stored in /home/groups/yourproject. Change to this\r\ndirectory. All your web pages are stored in the htdocs directory. Going\r\nin here will contain index.php, which is a blank page that says you haven\'t\r\nuploaded a web page yet. Logout, and copy the files for your web page using\r\nscp, a program which comes with ssh. For example ;\r\n<P>scp localfile loginname at shell.sourceforge.net:/home/groups/yourproject/htdocs\r\n<P>I suggest you gzip up your site, send it in one go using\r\nscp, then login with ssh and gunzip it.\r\n<P>So what should be on the web page ? Perhaps you\'d like\r\nthe following, as well as your project\'s information ;\r\n<ol>\r\n<li>A link to the projects group page on SourceForge.\r\n<li>Mailing list links (we\'ll create them in a second)\r\n<li>A SourceForge icon and web counter - see the site\r\ndocumentation for this.\r\n<li>A link to the CVS web interface at http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=yourproject\r\n<li>Some info about using CVS specific to your project.\r\n<li>Setup mailing lists for your project.</b>\r\n</ol>\r\n\r\n<P>If your project isn\'t that active yet (or only has one\r\nlonely developer) your mailing lists will be very quiet, however I still\r\nsuggest you look to the future and setup three standard lists for your\r\nproject ; a devel list for developers, a users list for users, and an announce\r\nlist for new version announcements.\r\n<P>Do this via your group page using the mailing list admin\r\nlink. Its quite simple so you shouldn\'t have any problems...\r\n<P><b>7. Finally, get used to using CVS for development, and\r\nget to work !</b>\r\n<P>I\'ll give you some quick details of the development cycle\r\nto get you started, but anything you\'ll have to look up yourself.\r\n<P>To update your working copy to be in sync with the CVS\r\nrepository one use ;\r\n<P>cvs -z3 update -Pd\r\n<P>(after setting up CVSROOT and CVS_RSH as outline previously)\r\n<BR>For commiting the changes to a file ;\r\n<P>cvs commit -m "comment about changes." filename\r\n<P>To add a new file to the CVS repository ;\r\n<P>cvs add filename\r\n<BR>cvs commit -m "added filename" filename\r\n<P>...and now you\'re ready to go !\r\n<P>Some other things that you may need ;\r\n<P><b>8. Release a file module so people can see your work !</b>\r\n<P><b>9. Read the SourceForge site documentation and the help\r\nmessage forums.</b>\r\n<P>From the homepage. Recommended.',968796731,968794021,1458,805,'An introduction');
+INSERT INTO doc_data VALUES (775,1,'INTERNET EXPLORER USERS - PAGE NOT FOUND/DNS/SECURE CHANNEL ERRORS','<b>PAGE NOT FOUND/DNS/SECURE CHANNEL ERRORS \r\n<P></b>\r\nIf you receive this error, it is probably because you are using IE 4. This is due to IE having a problem understanding both Netscape and Microsoft\r\nSGS SSL certificates. It _should_ support both, but doesn\'t. While we\'re working toward getting a new cert enabled on the servers, the best action in\r\nthe mean time is to either: (1) use IE 5 128bit, or (2) use Netscape. ',968796806,968794080,1458,805,'It\'s not our fault...');
+INSERT INTO doc_data VALUES (778,1,'Help Choosing an Open Source license','<b>Help Choosing an Open Source license</b><P>\r\n[Originally submitted by a user; updated] Because of the many open-source licensing options I found it helpful to link to discussions of the differences between and philosophies of many of the\r\nmain options. What follows is a short list, although I\'m sure there are others.<P>\r\n\r\n<a href="http://www.opensource.org/">Open Source Initiative: Perspectives on Open Source and licenses</a>\r\n<a href="http://www.fsf.org/philosophy/license-list.html">Free Software Foundation license commentary</a>\r\n<a href="http://www.daemonnews.org/199905/gpl.html">FreeBSD DaemonNews</a>\r\n<a href="http://www.stromian.com/Public_Licenses.html">Evaluation of Public Software Licenses </a>\r\n<a href="http://slashdot.org/interviews/99/07/30/2220240.shtml">Interview: Bruce Perens Answers Open Source License Questions </a>',968796795,968794418,1458,805,'Some links and resources');
+INSERT INTO doc_data VALUES (788,1,'The 6 hour cron delay','<P>IMPORTANT: The 6 hour cron delay </b>\r\n<P>\r\nMany functions on the SourceForge web site affect accounts on other SourceForge machines. This includes all functions relating to mail aliases, shell\r\npasswords, user additions, group member changes, cvs repository creation, etc. \r\n<P>\r\nUpdates to these other systems happen via cron 4 times per day, so changes made on the web site will appear to be live, but will not take effect until\r\nthe next cron update. ',968796754,968795282,1458,805,'Important');
+INSERT INTO doc_data VALUES (791,1,'Submitting bugs','<P><B>Submitting a bug for a Project \r\n<P></b>\r\nSubmitting a bug is something very important for developers. They are often in need of feedback on their projects. You can in SourceForge submit a\r\nbug for any project. For this, you just need to be logged in.\r\n<P><B>\r\nSubmitting a bug \r\n<P></b>\r\nJust go on the Bug Tracking system for a project, and then click on Submit. \r\n<P>\r\nFirst, you must choose a category and a group for the bug you will submit. Categories and groups are set up by a project administrator. Categories are\r\nequivalent to project parts (i.e : Server, Graphics, Engine , ...), and Bug groups define types of bugs (i.e : Unreproducible, Missing Feature ...). If no\r\ncategories or bug groups are defined, just let "none" and a project administrator will classify the bug himself. \r\n<P>\r\nAfter that, enter a quick description of the bug in the summary field. This description must be as clear as possible. \r\n<P>\r\nThen enter the details in the details Box. And click on the Submit button to end this bug report. You\'ll be noticed when the bug will be closed. ',968796777,968795560,1458,805,'A quick howto');
+INSERT INTO doc_data VALUES (889,1,'Foundries for users and projects','<h2>How does the list of projects work?</h2>\r\n\r\n<p>The "featured projects" list is manually edited by\r\nthe foundry admin.\r\n\r\n<p>The other lists (most active, top downloads) come from\r\nthe Trove maps. Provided that you have characterized your\r\nproject correctly in the Trove software map,\r\nit should just be a question of\r\nwhether your project is active enough. Note that most active\r\nis based on the rating of the last week, not all time.\r\n\r\n<h2>How do I get my news into the foundry?</h2>\r\n\r\n<p>Submit it to your project. The foundry admin will see\r\na list of all news items submitted for projects in the\r\nrelevant software map categories and can approve the most\r\nnewsworthy for the foundry.\r\n\r\n<p>If you have questions, contact the foundry admin (just\r\nbe aware that most foundries have more news items available\r\nthan they have space to run).\r\n\r\n<h2>I want to help with a foundry or create one</h2>\r\n\r\n<p>For an existing foundry, contact the foundry admins.\r\nHelping with an existing one before creating one is\r\nencouraged (so you can get to know the tools) - you can\r\nsee a list of foundries under the "About Foundries" link.\r\n\r\n<h2>I still have questions</h2>\r\n\r\n<p>Contact the foundry admin. Their name is on the left\r\nside of the foundry page.\r\n',969418525,969418381,4527,805,'How can I get mentioned in a foundry, etc');
+INSERT INTO doc_data VALUES (779,1,'Administering developers for your project',' <P><B>Site Documentation - Administering Developers for Your Project</B>\r\n\r\n<P>One of the most important and powerful features of the SourceForge\r\nTeam Development Environment is web-based user administration. As a project\r\nadmin, you have complete control over developer permissions in\r\nthe bug tracker, message forums, and task manager. \r\n\r\n<P>At this time, all\r\ndevelopers have write access to the CVS Repository and to your\r\ngroup directory (web site). There are plans to make these permissions\r\noptional as well.\r\n\r\n<P><B>Adding developers to your project</B>\r\n\r\n<P>As a project administrator, you will control the developer list for your\r\nproject. If someone wants to join your project as a developer, they\r\nmust first register on the site as a user, then they must contact you\r\nrequesting to join.\r\n\r\n<P>You control this membership list through the "Group Members" box\r\non the Project Admin page (available to you in the menu bar when you\r\nare logged in and at your project page).\r\n\r\n<UL>\r\n<LI> Go to the project page (https://sourceforge.net/project/admin/?group_id=89348\r\n for instance).\r\n<LI> Click on <B>Project Admin</B>\r\n<LI> Click on <B>Add Group Member</B>\r\n<LI> Fill one of the input box with either a SourceForge UID or a login name\r\n<LI> Click on <B>Submit</B>\r\n</UL>\r\n\r\n<P><B>Removing developers from your project</B>\r\n\r\n<P>Click "Remove from Group" from the "Project Admin" page to remove a\r\ngroup member. Project administrators cannot be removed in this\r\nmanner. To remove or add an administrator, email admin at sourceforge.net\r\nwith the request.\r\n\r\n<P>IMPORTANT: The cvs and shell account permissions will not be updated\r\nto reflect your changes immediately, but will take effect at the next\r\nsitewide cron update (once per 6 hours).\r\n\r\n<!-- <P><I>Group Members Box</I><BR> -->\r\n\r\n<P><B>Editing developer permissions</B>\r\n\r\n<P>To control developer permissions within your project, click\r\n"Edit Member Permissions" in the Group Members box, resulting in the\r\npage shown below, where each member\'s permissions may be set. Don\'t\r\nforget to click "Update Developer Permissions" after making any changes.\r\n\r\n',968797292,968794675,1458,806,'(How to be in charge)');
+INSERT INTO doc_data VALUES (780,1,'File Modules','<B>File Modules \r\n</b><P>\r\nAny given project may want to release one or more file products under their project name. This will include any official released versions of their\r\nsource code, in any format. \r\n<P>\r\nBefore releasing files, you must first define a file module for your project. If your project has only one development tree, you will probably define only\r\none module. If your project will be releasing multiple filesets, then additional modules may be defined. \r\n<P>\r\nA file module defines an actual software product. When other projects choose to make references to your products, for dependencies or other\r\nreasons, it is your file modules that will be referenced. For this reason, when a file module is defined, it cannot be deleted in case it is referenced\r\nspecifically by other parts of the site. \r\n<P><B>\r\nIMPORTANT! \r\n<P></b>\r\nFile modules are always referenced through their parent project. People do not search for your modules, they search for your project. Modules will\r\nshare bug tracking, task management, forums, developers, web site, and cvs repository. \r\n<P><b><i>\r\nFor MOST projects, there will only be the need to define one file release module. \r\n<P></b></i>\r\nNew modules vs. New projects \r\n<P>\r\nProjects share administrators and developers, have one web site, and share a CVS repository. If it is conceivable that a new file module would ever\r\nspin off into its own development cycle, with a non-identical developer set or requiring an independent web site, it is probably best to assign the\r\nproduct a new project, rather than just a module. It is OK to have the same developer set on two projects, if they are releasing two different products. \r\n<P><b>\r\nExamples \r\n<P></b>\r\nFor a project I used to work on, ThorMail, we used to simultaneously maintain two file release modules. Every time we released a new version of\r\nThorMail, we would simultaneously release a ThorData module, which included some utility scripts and patches for additional programs that would\r\nwork with ThorMail. These two files were always dependent upon eachother, would always have the same set of developers, and would never be\r\nseparated. They would have been two modules under one project in SourceForge. \r\n',968797297,968794762,1458,806,'Important when releasing multiple file products under the same name');
+INSERT INTO doc_data VALUES (781,1,'Making File Releases','<b>Making File Releases</b> \r\n<p> This text explains the steps to publish a release for a project.\r\nUsually a release for project foo is a file named foo-2.0.tar.gz\r\nthat you want to show in the <B>File Release</B> box of your project\r\nhome page. See <a href="modules.php">File Modules</a> for conceptual\r\nbackground. In the following we assume the most simple case:\r\n\r\n<UL>\r\n<LI> Your project is <B>foo</B>\r\n<LI> It has a <B>File Module</B> named <B>foo</B>\r\n<LI> You want to show <B>foo-2.0.tar.gz</B> in the <B>File Release</B> box.\r\n</UL>\r\n\r\n<P><B>Uploading to download.sourceforge.net</B><P>\r\n\r\nThe interactive method would be:\r\n\r\n<UL>\r\n<LI> ftp download.sourceforge.net\r\n<LI> user: ftp\r\n<LI> password: me at myself.org\r\n<LI> cd incoming\r\n<LI> bin\r\n<LI> put foo-2.0.tar.gz\r\n</UL>\r\n<P>\r\n\r\nThe command line method would be:\r\n\r\n<UL>\r\n<LI> ncftpput -V download.sourceforge.net /incoming foo-2.0.tar.gz\r\n</UL>\r\n\r\n<P><B>Accept the new release</B><P>\r\n\r\n<UL>\r\n<LI> Login as administrator of project <B>foo</B>\r\n<LI> Go to the <B>foo</B> project home page\r\n<LI> Click on <B>File Release</B>\r\n<LI> A popup menu shows all the files in the ftp://download.sourceforge.net/incoming/\r\n area. Choose your file. Be very carefull not to choose the distribution of \r\n someone else. \r\n<LI> Click on <B>Submit</B>\r\n</UL>\r\n\r\n<P><B>Fill information about the release</B><P>\r\n\r\nAlthough you should be carefull when filling these fields, you will \r\nhave the opportunity to fix mistakes later. \r\n\r\n<UL>\r\n<LI> Filling the version number is mandatory. In our example we\r\n put <B>2.0</B> in the <B>Release Version Number</B> input box.\r\n<LI> Unless you want another date than the current date, leave the\r\n <B>Release Date</B> input box empty. \r\n<LI> If your project contains more than one File Module, you must \r\n chose the one to which the release belongs. When handling a \r\n simple project like <B>foo</B> you have only one file module\r\n named <B>foo</B> and it is automatically selected. We leave\r\n the <B>Module Name</B> popup menu untouched for our example.\r\n<LI> The <B>Text Display Format</B> checkbox choose the display \r\n format of the ChangeLog and Release Notes text. \r\n<LI> The <B>Release Notes</B> text area is intended for compatibility\r\n information and synthetic description of the modifications. Basically\r\n it should be formated as a mail the users of the project would like\r\n to receive to know what\'s new in this release.\r\n<LI> The <B>ChangeLog</B> text area is intended for chronologicaly ordered\r\n technical change reports. It is intended for developpers to understand\r\n precisely what happened to the sources since the latest release. Be\r\n carefull: this box is not intended to contain the <b>full</b> ChangeLog\r\n content, only the diffs from the previous release.\r\n<LI> Click on the <B>Submit</B> button.\r\n</UL>\r\n\r\n<P><B>Modifying release information</B><P>\r\n\r\n<UL>\r\n<LI> Login as administrator of project <B>foo</B>\r\n<LI> Go to the <B>foo</B> project home page\r\n<LI> Click on <B>Project Admin</B>\r\n<LI> Click on <B>Edit File Releases</B>\r\n<LI> Choose the release for which you want to update information and\r\n click on the <B>Edit</B> next to it.\r\n<LI> The <B>File Status</B> popup menu allows you to delete a release.\r\n<LI> The <B>Filename</B> input box allows you to change the filename \r\n to which the release is related. Mainly usefull to fix mistakes.\r\n<LI> All the other fields are identical to the initial information form.\r\n<LI> Click on <B>Submit</B>\r\n</UL>\r\n\r\n',968797302,968794809,1458,806,'Release early, release often!');
+INSERT INTO doc_data VALUES (784,1,'SourceForge getting started guide (GERMAN)',' <p> <meta name="description" content="Kurze Anleitung, wie man bei www.sourceforge.net ein neues Projekt einrichtet">\r\n<meta name="author" content="Michael Renzmann">\r\n<meta name="generator" content="Ulli Meybohms HTML EDITOR">\r\n\r\n<center>\r\n <h3>oder: Wie man bei SourceForge ein neues Projekt einrichtet</h3>\r\n</center>\r\n\r\n<hr noshade size="1">\r\n\r\n<p>\r\nÜbersetzung: <a href="mailto:otaku at users.sourceforge.net">otaku</a><br>\r\nOriginaltext: <a href="mailto:prettypoly at users.sourceforge.net">prettypoly</a><br>\r\nStand: 29.12.1999\r\n</p>\r\n\r\n<p>\r\n<font size=-2><u>Anmerkung des Übersetzers:</u><br>\r\nEs gibt mit Sicherheit Leute, deren Englisch besser ist als meines.\r\nVon daher sind Hinweise auf (grobe) Übersetzungsfehler o.ä. natürlich gerne willkommen. Ich\r\nhabe versucht, die Anleitung von prettypoly nicht wortwörtlich zu übersetzen, daß\r\nklingt sonst alles so gestelzt :-)<br>\r\nDiese Version der HOWTO geht auch noch davon aus, daß man im Notfall auch ein paar Brocken Englisch\r\nversteht, um sich auf der SourceForge-Homepage zurechtzufinden. Später (wenn die Entwicklung bei SF mal\r\netwas langsamer voranschreitet) werde ich diese Anleitung auch noch ein wenig erweitern. Vielleicht findet sich\r\nbis dahin ja auch jemand, der sich die Mühe macht und eine deutsche Bedienungsanleitung für SF\r\nschreibt...<br>\r\nMan möge mir Flüchtigkeitsfehler bitte nachsehen, da ich diese Übersetzung spontan mitten in der\r\nNacht geschrieben habe. Da kann sich schon mal der eine oder andere Vertipper einschleichen... :-)\r\n</font>\r\n</p>\r\n<hr noshade size="1"><br>\r\n\r\n<p><b><u>Vorwort</u></b></p>\r\n\r\n<p>Hallo SourceForge-Neulinge!</p>\r\n<p>Ich habe diese Anleitung geschrieben, um die Einrichtung eines neuen Projektes und die ersten Schritte bei\r\nSourceForge zu vereinfachen. Das ganze ist noch unvollständig und wird (hoffentlich) mit SourceForge\r\nmitwachsen.</p>\r\n<p>Die folgende Situation dürfte auf die meisten Programmierer zutreffen:<br>\r\nEs ist ein Verzeichnis vorhanden, in dem der geschriebene Code liegt, vielleicht sogar ein aktuelles CVS repository.\r\nDie Features von SourceForge sollen genutzt werden, um das Projekt effizient weiterzuentwickeln, der Öffentlichkeit\r\nvorzustellen, vielleicht ein paar Helfer zu finden und natürlich auch neue Benutzer. Ich gehe im folgenden daher\r\neinfach mal von dieser Situation aus. Also los...\r\n</p>\r\n\r\n<p><b><u>Überblick</u></b></p>\r\n\r\n<p>Die folgende Liste zeigt, was zum Einrichten eines neuen Projektes bei SourceForge gemacht werden muß. Die\r\nErklärung dazu kommt gleich.\r\n\r\n<ol>\r\n <li><a href="#one">Als neuer User bei SourceForge anmelden</a></li>\r\n <li><a href="#two">Mit diesem Account einloggen und das neue Projekt anmelden</a></li>\r\n <li><a href="#three">Gruppen- und Projektinformationen anpassen</a></li>\r\n <li><a href="#four">CVS repository mit dem aktuellen Schnappschuß des Quellcodes einrichten</a></li>\r\n <li><a href="#five">Webseiten für das Projekt auf den Webserver laden</a></li>\r\n <li><a href="#six">Mailinglisten anlegen</a></li>\r\n <li><a href="#seven">ggf. mit CVS vertraut machen und mit der Arbeit loslegen (bzw. weitermachen)!</a></li>\r\n</ol>\r\n... außerdem könnte man noch folgendes brauchen:\r\n<ol start=8>\r\n <li>Ein Filemodul freigeben, damit man sich den Fortschritt des Projekts ansehen kann</li>\r\n <li>SourceForge "Site Documentation" und das Hilfe-Forum durchlesen</li>\r\n</ol></p>\r\n\r\n<p><b><u>An die Arbeit...</u></b></p>\r\n\r\n<p><b><a name="one">1. Als neuer User bei SourceForge anmelden</a></b></p>\r\n<p>Dazu muß man auf der <a href="http://www.sourceforge.net">SourceForge-Homepage</a> die Option\r\n"New User via SSL" anklicken. Damit der neue Account eingerichtet werden kann, werden einige persönliche\r\nDaten abgefragt. Hat man das hinter sich gebracht, kann man sich ab jetzt immer ¨ber die Option "Login via\r\nSSL" anmelden.</p>\r\n<p>Nach dem Login befindet man sich auf seiner persönlichen Seite. Hier wird beispielsweise aufgelistet, an\r\nwelchen Projekten man teilnimmt. Am linken Rand dieser Seite findet man einige Optionen, von denen uns vor allem\r\n"Register New Project" interessiert.</p>\r\n\r\n<p><b><a name="two">2. Das neue Projekt anmelden</a></b></p>\r\n<p>Nun muß man sich durch eine Reihe Seiten durcharbeiten und die gewünschten Informationen angeben. Das\r\nganze ist eigentlich recht verständlich geschrieben und einfach zu handhaben, daher gehe ich auf die einzelnen\r\nAngaben hier nicht weiter ein.</p>\r\n<p>Wenn man alle Angaben gemacht hat, schickt man die Beschreibung des Projekt an das SourceForge-Team. Das Projekt\r\nwird dann begutachtet und überprüft, ob es den Zielen von SourceForge entspricht. Keine Sorge, ich habe\r\nbis jetzt nicht gehört, daß ein Projekt abgelehnt wurde... wenn es unter einer OpenSource-Lizenz steht\r\nund frei verfügbar ist, sollte es klappen.</p>\r\n<p>Nun muß man ein wenig warten. In der Regel bekommt man innerhalb von 24 Stunden eine Mail mit dem Hinweis,\r\ndaß das Projekt eingerichtet wurde. Wenn man sich nun wieder einloggt, findet man am unteren Ende seiner\r\npersönlichen Seite einen Link zum Verwaltungsbereich des neuen Projekts.</p>\r\n\r\n<p><b><a name="three">3. Gruppen- und Projektinformationen anpassen</a></b></p>\r\n<p>Hat man den Link auf seiner persönlichen Seite angeklickt, kommt man also zum Verwaltungsbereich des neuen\r\nProjektes. Hier kann man zahlreiche Einstellungen vornehmen.</p>\r\n<p>Bis jetzt hat mal also folgendes:\r\n<ul>\r\n <li>eine Website unter http://<i>Projektname</i>.sourceforge.net</li>\r\n <li>ein CVS repository unter cvs.<i>Projektname</i>.sourceforge.net:/cvsroot/<i>Projektname</i></li>\r\n <li>einen anonymous FTP-Zugang unter ftp.<i>Projektname</i>.sourceforge.net</li>\r\n <li>und Zugriff auf einen Mailinglisten-Server</li>\r\n</ul>\r\n</p>\r\n<p>Als erstes sollte man eine Beschreibung des neuen Projektes angeben. Dazu klickt man auf "Project\r\nAdmin", dann auf "Edit Group Public Information and Categorization". Hier werden die gewünschten\r\nInformationen in die entsprechenden Felder eingegeben. Die Beschreibung und die Zielplattform(en) werden in der\r\nSoftware Map angezeigt, in der alle Projekte bestimmten Kategorien zugeordnet und beschrieben werden. Ein Link zur\r\nSoftware Map ist am linken Rand oben zu finden.</p>\r\n<p>Die nächste Frage, die interessiert, ist: gibt es weitere Entwickler, die an diesem Projekt mitarbeiten?\r\nWenn ja, dann müssen sie sich alle bei SourceForge wie unter 1. beschrieben anmelden und Ihnen die Usernamen\r\nmitteilen. Sie können dann die Namen in die Liste der Entwickler aufnehmen und ihnen Schreibzugriff auf den\r\nCVS-Server und die Website geben. Dazu wählt man im Verwaltungsbereich des Projektes "Add Group\r\nMember" und gibt die entsprechenden Namen ein.</p>\r\n<p>Der Rest der Einstellungen im Verwaltungsbereich wird später interessant. Nun sollte man erstmal etwas Code\r\nbereitstellen...</p>\r\n\r\n<p><b><a name="four">4. CVS repository mit dem aktuellen Schnappschuß des Quellcodes einrichten</a></b></p>\r\n<p>Wenn man mit CVS (wie ich) noch keine Erfahrung hat, braucht man ein bisschen Eingewöhnungszeit. Den\r\nNeulingen möchte ich kurz beschreiben, was CVS überhaupt macht:</p>\r\n<p>CVS führt Buch über die Veränderungen, die am Sourcecode vorgenommen wurden, zusammen mit einer\r\nBeschreibung dessen, was verändert wurde. Man kann sich zu jeder Zeit jede vorangegangene Version jeder\r\nDatei im repository ansehen. Durch CVS können mehrere Entwickler zur gleichen Zeit an der gleichen Datei\r\narbeiten und ihre Änderungen zusammenführen. Wenn zwei Änderungen sich gegenseitig beeinflussen,\r\nwerden die Entwickler darauf hingewiesen und sichergestellt, daß der Konflikt behoben wird, bevor die neue\r\nVersion der Datei im repository aufgenommen wird.</p>\r\n<p>Das ist eine schöne Sache, an die man sich zwar erst ein wenig gewöhnen muß, die man aber bald\r\nschätzen wird. Im Wesentlichen besteht der Entwicklungszyklus aus:</p>\r\n\r\n<ol>\r\n <li>\r\n Man importiert den kompletten Sourcecode ins repository; anschließend checkt jeder Entwickler eine\r\n Arbeitskopie aus dem Entwicklungsbaum aus.\r\n </li>\r\n <li>\r\n Nun arbeitet jeder Entwickler in seiner gewohnten Umgebung am Programm. Sobald ein neues Feature fertig ist,\r\n aktualisiert man zunächst die lokale Kopie, um auf dem laufenden zu sein und schreibt die veränderten\r\n Files zurück in den Entwicklungsbaum.\r\n </li>\r\n <li>\r\n Sollten beim zurückschreiben der Veränderungen irgendwelche Konflikte auftauchen, wird man darauf\r\n hingewiesen und muß anschließend manuell entsprechende Änderungen vornehmen. In den Dateien\r\n werden die veränderten Bereiche mit ">>>>>" hervorgehoben und beide Versionen angezeigt. Hier\r\n löscht man entweder einfach die alte Version oder paßt den Bereich an, damit er wie gewünscht\r\n arbeitet. Wenn alle Konflikte beseitigt sind, geht man wieder zurück zu Punkt 2 und setzt die Arbeit fort.\r\n </li>\r\n</ol>\r\n\r\n<p>Gut. Nun zu den Details, wie man den eigenen Source-Baum auf den CVS-Server von SourceForge lädt. Als erstes\r\nsollte man sich die "Site Documentation" zum Thema CVS ansehen. Will man mehr wissen, ist der Griff zum\r\n180 Seiten starken (und frei verfügbaren) CVS-Handbuch angesagt. Dann geht man wie folgt vor:</p>\r\n<p>SSH und CVS für das benutzte Betriebssystem besorgen. Für die Kombination Linux und bash gibt man nun\r\nein:</p>\r\n<code>\r\nexport CVS_RSH=ssh<br>\r\nexport CVSROOT=<i>Username</i>@cvs.<i>Projektname</i>.sourceforge.net:/cvsroot/<i>Projektname</i><br>\r\n</code>\r\n<p>Mit der ersten Zeile sagt man CVS, daß es mit Hilfe von SSH die Verbindung zum repository aufnehmen\r\nsoll. Das wird aus Sicherheitsgründen so gemacht. Die zweite Zeile teilt CVS mit, wo das repository genau zu\r\nfinden ist. Die kursiven Teile (Username und Projektname) müssen entsprechend angepaßt werden!</p>\r\n<p>Oft wird man nun den Sourcecode aus einem Verzeichnis-Baum in den CVS-Server importieren wollen. Dazu\r\nwechselt man in das Verzeichnis, daß übertragen werden soll, und gibt folgende Zeile ein:</p>\r\n<code>\r\ncvs import <i>Verzeichnisname</i> vendor start\r\n</code>\r\n<p><i>Verzeichnisname</i> ist der Name, unter dem das repository angesprochen werden soll. Wenn alles klappt, wird\r\nman nun nach seinem SourceForge User-Paßwort gefragt. Anschließend wird das Verzeichnis in den\r\nCVS-Server importiert, was ggf. ein Weilchen dauern kann.</p>\r\n<p>Jetzt legt man ein Backup des "alten" Codes an, den man gerade auf den CVS-Server kopiert hat. In\r\nZukunft arbeitet man nicht mehr mit dieser Version, sondern mit einer frisch ausgecheckten CVS-Version. Die\r\nerhält man mit</p>\r\n<code>\r\ncvs checkout <i>Verzeichnisname</i>\r\n</code>\r\n<p>Dadurch bekommt man eine Arbeitskopie des Sources in für CVS verdaulicher Form. Man sollte auf keinen Fall\r\nvergessen, daß jede neue oder gelöschte Datei bzw. Verzeichnis CVS bekanntgegeben werden muß.\r\nWeitere Informationen dazu gibts im oben genannten Buch.</p>\r\n\r\n<p><b><a name="five">5. Webseiten für das Projekt auf den Webserver laden</a></b></p>\r\n<p>Ich gehe davon aus, daß bereits ein paar Seiten zum Projekt existieren, die nun auch auf SourceForge\r\nzur Verfügung stehen sollen, damit man einen Eindruck von Ihrem Projekt gewinnen kann. Sollten Sie noch\r\nkeine Seiten erstellt haben und auch nicht wissen, wie Sie das am besten anstellen, dann ist\r\n<a href="http://www.teamone.de/selfhtml">SelfHTML</a> von Stefan Münz die richtige Adresse für Sie.</p>\r\n<p>Um auf dem Projektaccount zu arbeiten, loggt man sich per SSH auf SourceForge ein, z.B. mit</p>\r\n<code>\r\nssh -l <i>Username</i> <i>Projektname</i>.sourceforge.net\r\n</code>\r\n<p>Anschließend findet man sich im Home-Verzeichnis des Projektes wieder. Von hier aus werden alle\r\nProjektdateien im Verzeichnis <samp>/home/groups/<i>Projektname</i></samp> abgelegt. Dort sind alle Webseiten im\r\nVerzeichnis <samp>ht_docs</samp> untergebracht. Bisher befindet sich in diesem Verzeichnis nur eine Datei\r\n<samp>index.php</samp>, die besagt, daß bisher noch keine Webseiten zur Verfügung stehen.</p>\r\n<p>Die Webseiten werden mit dem Kommando <samp>scp</samp> übertragen, da&azlig; mit ssh ausgeliefert wird.\r\nEs wird folgendermaßen benutzt:</p>\r\n<code>\r\nscp <i>lokale_Dateien_zum_übertragen</i> <i>Username</i>@shell.sourceforge.net:/home/groups/<i>Projektname</i>/ht_docs\r\n</code>\r\n<p>Ich empfehle Ihnen, die Dateien mit gzip zu packen und mit scp zu übertragen. Loggen Sie sich\r\nanschlie&zlig;end mit ssh auf SourceForge ein und entpacken Sie das Archiv mit gunzip.</p>\r\n<p>Sie fragen Sich vielleicht, was Sie auf Ihre Webseiten schreiben sollen. Neben einer Beschreibung des\r\nProjekt könnten Sie folgendes unterbringen:</p>\r\n<ol>\r\n <li>ein Link auf die SourceForge-Projektseite</li>\r\n <li>Links zu den Mailinglisten (die wir gleich anlegen)</li>\r\n <li>ein SourceForge-Icon und einen Zugriffszähler; Informationen dazu gibts bei der "Site\r\n Documentation" von SourceForge</li>\r\n <li>ein Link zum Webinterface des CVS-Servers unter http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=<i>Projektname</i></li>\r\n <li>einige für Ihr Projekt spezifische Informationen, wie CVS benutzt werden kann/soll</li>\r\n</ol>\r\n<p>Das sind natürlich nur einige Anregungen. Lassen Sie Ihre Fantasie spielen und versuchen Sie sich\r\nvorzustellen, was Besucher Ihrer Seiten interessieren könnte.</p>\r\n\r\n<p><b><a name="six">6. Mailinglisten anlegen</a></b></p>\r\n<p>Auch, wenn sich bei einem Projekt noch nicht viel tut oder nur ein einzelner Entwickler daran arbeitet, sollte\r\nman in die Zukunft denken. Ich empfehle, drei Standardlisten für jedes Projekt anzulegen. Eine\r\n<i>devel</i>-Liste für Entwickler, eine <i>users</i>-Liste für die Benutzer und eine\r\n<i>announce</i>-Liste, auf der neue Versionen angekündigt werden.</p>\r\n<p>Die Listen können im Verwaltungsbereich des Projektes mit der Option "Mailing List Admin"\r\nangelegt werden. Das sollte keine Probleme bereiten, daher gehe ich darauf nicht weiter ein.</p>\r\n\r\n<p><b><a name="seven">7. Mit CVS vertraut machen</a></b></p>\r\n<p>Hier sind die wichtigsten Kommandos, die man eigentlich ständig braucht. Alles weitere muß man im\r\nschon genannten Handbuch nachschlagen.</p>\r\n<p>Die lokale Arbeitskopie des Sources mit der aktuellen Version auf dem Server zu synchronisieren:</p>\r\n<code>\r\ncvs -z3 update -Pd\r\n</code>\r\n<p>(dazu muß man CVSROOT und CVS_RSH wie oben beschrieben eingestellt haben).</p>\r\n<p>Die Änderungen an einer Datei auf den CVS-Server einspielen: </p>\r\n<code>\r\ncvs commit -m "Beschreibung der Veränderungen." <i>Dateiname</i>\r\n</code>\r\n<p>Eine neue Datei in das CVS repository aufnehmen:</p>\r\n<code>\r\ncvs add <i>Dateiname</i><br>\r\ncvs commit -m "<i>Dateiname</i> hinzugefügt" <i>Dateiname</i>\r\n</code>\r\n<p>... und nun kanns losgehen!</p>\r\n',968797312,968795045,1458,807,' ');
+INSERT INTO doc_data VALUES (785,1,'CVS HowTo (FRENCH)','<p> <B>Documentation CVS de SourceForge</B>\r\n\r\n<P>Cette documentation est vraiment limitée pour le moment, mais elle va déja vous permettre de démarrer.\r\n<P>Pour tout les accès développeurs (lecture/ecriture), vous devrez utiliser SSH.\r\nUn client SSH (1.x) doit etre disponible sur votre machine locale. La variable d\'environnement CVS_RSH doit contenir le chemin de ssh.\r\nCeci peut etre réalisé sur la plupart des systèmes Linux (bash) en tapant :\r\n<UL><B><I>export CVS_RSH=ssh</I></B>\r\n</UL>\r\n\r\n<P>L\'accès anonyme à CVS utilise le pserver CVS, et ne requiert pas SSH.\r\n\r\n<P>Si vous obtenez des erreurs du type \'permission denied\' sans qu\'on vous demande de saisir un mot de passe,\r\nla variable ne doit pas etre correctement initialisée, ou SSH n\'est pas disponible sur votre système.\r\nArrangez ceci, avant de suspecter un problème de mot de passe.\r\n\r\n<P><B>Comment importer du code source dans votre dépôt (repository)</B>\r\n<UL>\r\n<LI>Sur votre machine locale, allez dans le répertoire dans lequel se situent les fichiers (et sous répertoires) que vous\r\nvoulez importer.\r\nTout les fichiers qui se situent actuellement dans ce répertoire, ainsi que les sous répertoires, vont être importés dans l\'arbre CVS.\r\n<LI>Tapez ce qui suit où nomutilisateur est votre nom d\'utilisateur SourceForge,\r\nvotreprojet est le nom unix de votre projet, et\r\nnomrepertoire est le nom du nouveau repertoire racine pour CVS (ex : . pour le repertoire dans lequel vous vous situez.)\r\n<BR><B><I>cvs -dnomutilisateur at cvs.votreprojet.sourceforge.net:/cvsroot/votreprojet import nomrepertoire constructeur debut</I></B>\r\n</UL>\r\n\r\n<P><B>Comment récupérer les sources via SSH</B>\r\n<UL>\r\n<LI>Tapez ce qui suit, en effectuant les modifications nécessaires pour votre nom d\'utilisateur, et votre projet.\r\n<BR><B><I>cvs -dnomutilisateur at cvs.votreprojet.sourceforge.net:/cvsroot/votreprojet co nomrepertoire</I></B>\r\n<LI>Après la récupération intiale des fichiers sources, vous pouvez aller dans ce répertoire et éxecuter\r\nles commandes cvs, sans le marqueur -d. Par exemple :\r\n<BR><B><I>cvs update<BR>cvs commit -m "commentaires pour cette modification"<BR>cvs add monfichier.c</I></B>\r\n</UL>\r\n\r\n<P><B>Comment récupérer les sources de manière anonyme en passant par le pserver.</B>\r\n<UL>\r\n<LI>Tapez ce qui suit, en effectuant les modifications nécessaires pour votre nom d\'utilisateur, et votre projet.\r\n<BR><B><I>cvs -d:pserver:anonymous at cvs.votreprojet.sourceforge.net:/cvsroot/votreprojet login</I></B>\r\n<LI>Après vous être connecté de manière anonyme :\r\n<BR><B><I>cvs -d:pserver:anonymous at cvs.votreprojet.sourceforge.net:/cvsroot/votreprojet co nomrepertoire</I></B>\r\n<LI>Après la récupération intiale des fichiers sources, vous pouvez aller dans ce répertoire et éxecuter\r\nles commandes cvs, sans le marqueur -d. Par exemple :\r\n<BR><B><I>cvs update</I></B>\r\n</UL>\r\n\r\n<P><B>Comment utiliser CVS lorsque l\'on est connecté sur shell.sourceforge.net</B>\r\n<UL>\r\n<LI>Tapez ce qui suit, en effectuant les modifications nécessaires pour votre nom d\'utilisateur, et votre projet.\r\n<BR><B><I>cvs -dnomutilisateur at cvs1:/cvsroot/votreprojet login</I></B>\r\n</UL>\r\n<DD>Allez voire <a href=user/cvssshfaq.php#ssh-shell>CVS/SSH FAQ</a> pour plus dínformations.\r\n\r\n<P><B>Comment importer un "arbre CVS" existant</B>\r\n\r\nCeci doit être fait manuellement par un membre de l\'équipe SourceForge. Procédez comme ceci:\r\n<UL>\r\n<LI> Préparez un fichier tar/gzip de votre arbre CVS entier.\r\n<LI> Assurez vous que celui-ci contienne le répertoire CVSROOT si il contient des informations que vous désirez conserver. Si vous n\'en êtes pas sur, incluez le.\r\n<LI> Envoyez un mail à <a href=mailto:admin at sourceforge.net>admin at sourceforge.net</a> en demandant d\'inclure votre fichier tar/gzip au dépot CVS de votre projet. \r\nAssurez vous d\'avoir fourni les informations nécessaires dans votre mail:\r\n <UL>\r\n <LI> Le nom exact de votre projet, où l\'adresse de sa page principale.\r\nQuelque chose comme <a href=http://sourceforge.net/project/?group_id=1695>\r\n http://sourceforge.net/project/?group_id=1695</a>.\r\n <LI> La localisation ftp ou http du fichier tar/gzip, si vous ne l\'avez pas envoyé en fichier attaché à votre mail. Vérifiez avec votre navigateur que le fichier est bien accessible.\r\n <LI> Votre nom d\'utilisateur SourceForge.\r\n <LI> Votre adresse email.\r\n </UL>\r\n<LI> Vous recevrez un mail de l\'équipe SourceForge lorsque votre arbre CVS sera prêt à utiliser.\r\n</UL>\r\n\r\n<P><B>Comment récupérer votre arbre CVS.</B><P>\r\nDes archives tar/gzip quotidiennes du dépot CVS complet de votre projet \r\nsont disponibles pour archive ou duplicata. Ils sont disponibles à \r\nl\'adresse suivante :\r\nhttp://cvs.sourceforge.net/cvstarballs/nomprojet-cvsroot.tar.gz.\r\nOu <b>nomprojet</b> est le nom UNIX de votre projet.\r\n\r\n<P><B>Documentations complémentaires</B>\r\n<UL>\r\n<LI><A href="http://cvsbook.red-bean.com/">The CVS Book</A>\r\n<LI><A href="http://www.loria.fr/~molli/cvs/doc/cvs_toc.html">Docs CVS sur www.loria.fr</A>\r\n</UL>\r\n',968797324,968795068,1458,807,' ');
+INSERT INTO doc_data VALUES (786,1,'CVS HowTo (GERMAN)',' <p> <META NAME="description" CONTENT="Kurze Anleitung wie man CVS bei SourceForge benutzt">\r\n <META NAME="author" CONTENT="Uwe Hermann">\r\n <META NAME="generator" CONTENT="me and my vi :-)">\r\n\r\n\r\n <H1>Sourceforge CVS Dokumentation</H1>\r\n\r\n <SMALL>\r\n Originaltext: SourceForge Crew<BR>\r\n Übersetzung:\r\n <A HREF="mailto:uh1763 at users.sourceforge.net">Uwe Hermann</A><BR>\r\n Stand: 3.2.2000\r\n </SMALL>\r\n\r\n <P>\r\n\r\n Das hier ist nur eine Anleitung für die grundlegendsten Dinge, sollte aber\r\n für den Anfang reichen.<P>\r\n\r\n Alle Entwickler mit Read/Write-Rechten werden SSH(Secure Shell) benutzen.\r\n Der SSH(1.x) Client muss auf deinem lokalen Rechner verfügbar sein.<BR>\r\n Die Umgebungsvariable CVS_RSH muss den Pfad zu ssh enthalten. Dies kann\r\n man auf den meisten Linux-systemen(mit bash) folgendermaßen erreichen:\r\n\r\n <PRE>\r\n export CVS_RSH=ssh\r\n </PRE>\r\n\r\n Für anonymen CVS-Zugang wird CVS pserver verwendet und kein SSH benötigt.<P>\r\n\r\n Wenn du eine \'permission denied\'-Meldung bekommst, ohne dass du nach einem\r\n Passwort gefragt worden bist, hast du die CVS_SSH Umgebungsvariable nicht\r\n richtig gesetzt oder ssh ist auf deinem System nicht verfügbar.\r\n Das solltest du zuerst prüfen, bevor du ein Passwort-Problem vermutest.<P>\r\n \r\n \r\n <H1>Wie du deinen Quellcode ins repository <CODE>import</CODE>ierst</H1>\r\n\r\n Auf deiner lokalen Maschine wechselst du in das Verzeichnis dessen Dateien\r\n und Unterverzeichnisse du importieren möchstest. Alles was jetzt im aktuellen\r\n Verzeichnis und in allen Unterverzeichnissen ist wird ins repository\r\n importiert werden.<P>\r\n\r\n Tippe folgendes ein, um den Code zu importieren:<BR>\r\n\r\n <PRE>\r\n cvs -dloginname at cvs.deinprojekt.sourceforge.net:/cvsroot/deinprojekt import verzeichnisname vendor start\r\n </PRE>\r\n\r\n Du musst natürlich \'loginname\' durch deinen SourceForge Login-Namen,\r\n \'deinprojekt\' durch den Unix-Namen deines Projektes, und \'verzeichnisname\'\r\n durch den Namen des neuen CVS-Verzeichnisses ersetzen.\r\n\r\n\r\n <H1>Wie man einen Quellcode <CODE>checkout</CODE> mit SSH durchführt</H1>\r\n\r\n Tippe folgendes ein, wobei du natürlich wieder \'loginname\', \'deinprojekt\'\r\n und \'verzeichnisname\' ersetzt:\r\n\r\n <PRE>\r\n cvs -dloginname at cvs.deinprojekt.sourceforge.net:/cvsroot/deinprojekt co verzeichnisname \r\n </PRE>\r\n\r\n Nach dem ersten <CODE>checkout</CODE> kannst du in dieses Verzeichnis\r\n wechseln und CVS-Kommandos ohne den <CODE>-d</CODE> Parameter ausführen,\r\n zum Beispiel:\r\n\r\n <PRE>\r\n cvs update\r\n cvs commit -m "Kommentare für dieses commit"\r\n cvs add datei.c \r\n </PRE>\r\n\r\n\r\n <H1>Wie man einen anonymen Quellcode <CODE>checkout</CODE> durchführt</H1>\r\n\r\n Tippe folgendes ein, wobei du natürlich wieder \'loginname\', \'deinprojekt\'\r\n und \'verzeichnisname\' ersetzt:\r\n\r\n <PRE>\r\n cvs -d:pserver:anonymous at cvs.deinprojekt.sourceforge.net:/cvsroot/deinprojekt login\r\n </PRE>\r\n\r\n Nachdem du dich nun als \'anonymous\' eingeloggt hast, tippe folgendes:\r\n\r\n <PRE>\r\n cvs -d:pserver:anonymous at cvs.deinprojekt.sourceforge.net:/cvsroot/deinprojekt co verzeichnisname \r\n </PRE>\r\n\r\n Nach dem ersten <CODE>checkout</CODE> kannst du in dieses Verzeichnis \r\n wechseln und CVS-Kommandos ohne den <CODE>-d</CODE> Parameter ausführen,\r\n zum Beispiel:\r\n\r\n <PRE>\r\n cvs update\r\n </PRE>\r\n\r\n\r\n <H1>Wie man CVS benutzt wenn man auf shell.sourceforge.net eingeloggt ist</H1>\r\n\r\n Tippe folgendes ein, wobei du natürlich wieder \'loginname\' und \'deinprojekt\'\r\n ersetzt:\r\n\r\n <PRE>\r\n cvs -dloginname at cvs1:/cvsroot/deinprojekt login\r\n </PRE>\r\n\r\n Lies die <A HREF=user/cvssshfaq.php#ssh-shell>CVS/SSH FAQ</A> für nähere\r\n Informationen.\r\n\r\n\r\n <H1>Wie man einen schon existierenden CVS-tree <CODE>import</CODE>iert</H1>\r\n\r\n Diese Aufgabe muss von der SourceForge-crew manuell erledigt werden.\r\n Gehe wie folgt vor:\r\n\r\n <UL>\r\n <LI>erzeuge ein tar/gzip deines kompletten CVS-trees</LI>\r\n <LI>\r\n stelle sicher, dass du dein CVSROOT Verzeichnis mit in das Archiv packst,\r\n wenn es Informationen enthält, die du behalten möchtest. Wenn du dir\r\n nicht sicher bist, pack es sicherheitshalber mit ins tar/gzip.\r\n </LI>\r\n <LI>\r\n Sende eine mail an\r\n <A HREF=mailto:admin at sourceforge.net>admin at sourceforge.net</A> und bitte\r\n die Admins dort, das tar/gzip in das CVS repository deines Projektes\r\n einzuspielen. Stelle jedoch sicher, dass du folgende Informationen in\r\n deiner Mail angibst:\r\n <UL>\r\n <LI>\r\n Den exakten Namen deines Projektes oder die URL der Homepage, z.B.\r\n <A HREF=http://sourceforge.net/project/?group_id=1695>\r\n http://sourceforge.net/project/?group_id=1695\r\n </A>\r\n </LI>\r\n <LI>\r\n Die FTP- oder HTTP- Adresse deiner tar/gzip Datei, wenn du sie nicht\r\n als attachment mitgeschickt hast. Prüfe allerdings vorher ob man die\r\n Datei auch wirklich per FTP/HTTP downloaden kann!\r\n </LI>\r\n <LI>Deinen SourceForge Login-Namen</LI>\r\n <LI>Deine eMail-Adresse</LI>\r\n </UL>\r\n </LI>\r\n <LI>\r\n Du wirst eine eMail von den SourceForge Admins erhalten, sobald der\r\n CVS-tree zur Benutzung bereit steht.\r\n </LI>\r\n </UL>\r\n\r\n\r\n <H1>Wie du deinen CVS-tree downloaden kannst</H1>\r\n\r\n Täglich erstellte tarballs deines kompletten CVS-repository\'s sind auf\r\n http://cvs.sourceforge.net/cvstarballs/projektname-cvsroot.tar.gz für\r\n Backup- oder Mirroring-Zwecke erhältlich. \'projektname\' muss natürlich\r\n durch den Unix-Namen deines Projektes ersetzt werden.\r\n\r\n\r\n <H1>Weitere CVS-Dokumentation</H1>\r\n\r\n <UL>\r\n <LI><A HREF="user/cvssshfaq.php">SourceForge CVS/SSH FAQ</A>\r\n <LI><A HREF="http://cvsbook.red-bean.com/">Das CVS Buch</A></LI>\r\n <LI>\r\n <A HREF="http://www.loria.fr/~molli/cvs/doc/cvs_toc.html">\r\n CVS Dokumentation auf www.loria.fr\r\n </A>\r\n </LI>\r\n </UL>\r\n',968797318,968795114,1458,807,' ');
+INSERT INTO doc_data VALUES (787,1,'SourceForge Gettin Started Guide (HUNGARIAN)',' <p> \r\nÍrta (fordította): <A\r\n\r\nhref="http://sourceforge.net/developer/?form_dev=21822">Gyöngyösi Péter</A><br>\r\nEredeti szerzõ: <A href="http://sourceforge.net/developer/?form_dev=801">Joel Utting</A>\r\n<P>\r\n<FONT SIZE=+2>Bevezetés</FONT>\r\n<P><FONT SIZE=+1>Üdv új SourceForge-használó ! Ez a HOWTO azért\r\nszületett, hogy egyszerûbb legyen egy új projectet összehozni itt a\r\nSourceForge-on. Természetesen ez az írás nem teljes, és remélhetöleg\r\ntovább fog bõvülni, ahogy egyre újabb lehetõségek kerülnek a SourceForge-ba\r\n. A terv az, hogy lépésrõl-lépésre vezessen végig egy project\r\nlétrehozásának a kezdetein.\r\nElõször is, nézzük a legtipikusabb szituációt amivel egy új fejlesztõ\r\nszembesül: \r\nVan egy könyvtárnyi kódod, talán egy létezõ CVS-ed, és a SourceForge\r\nösszes lehetõségét ki akarod használni, hogy itt folytasd a\r\nfejlesztést a nagyközönség elõtt, szabadon, nyílt forrással, és\r\nremélhetõleg hogy idevonzz néhány új fejlesztõt, meg persze\r\nfelhasználót. Nos, vágjunk bele!\r\n<FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+2>Egy új project létrehozásának lépései</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Nagyjából ezekre fogunk kitérni:\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>1. Egy új felhasználó létrehozása a SourceForge-on. </FONT>\r\n<BR><FONT SIZE=+1>2. Egy új project létrehozása az elsõ lépésben\r\nlétrehozott userrel. \r\n</FONT>\r\n<BR><FONT SIZE=+1>3. A csapat- és projectinformációk beállítása.</FONT>\r\n<BR><FONT SIZE=+1>4. Egy CVS repository (nem tudok erre használható\r\nmagyar fordítást, az angol eredetit fogom használni ezután is)\r\nlétrehozása a forrásod legújabb változatával. \r\n</FONT>\r\n<BR><FONT SIZE=+1>5. A project weboldalának a létrehozása. </FONT>\r\n<BR><FONT SIZE=+1>6. Levelezõlista létrehozása.</FONT>\r\n<BR><FONT SIZE=+1>7. És vegül, szokjad meg a CVS használatát a\r\nfejleszésben, és láss munkához! \r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>...és néhány dolog, amire még szükséged lehet:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>8. Hozz létre egy file modult, hogy láthassák a\r\nmunkád!</FONT>\r\n<BR><FONT SIZE=+1>9. Olvasd végig a SourceForge dokumentációt és a\r\nhelp-fórumokat!\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+2>Kezdjünk hát neki...</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>1. Egy új felhasználó létrehozása a SourceForge-on.</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A <A HREF="http://www.sourceforge.net">SourceForge\r\nfõoldalon</A> klikkelj a "New User via SSL" linkre. Itt aztán\r\nmeg kell adnod pár adatot, információt, és létrehoz egy accountot\r\nneked. Gyakorlatilag minden interaktív tevékenységhez a SourceForge-on\r\nszükséged lesz rá. \r\nMiután ez megvan, bármikor bejelentkezhetsz ezzel a felhasználóval a\r\nfõoldalon a "Login via SSL" link segítségével.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Miután bejelentkeztél, kapsz egy személyes lapot: az\r\nösszes projectet kilistázza, amiben benne vagy, néhány egyéb infóval\r\negyütt.\r\nAz oldal szélén fel van sorolva pár lehetõség, és ott van egy, ami\r\nmost minket különösen érdekel: a "Register New Project"...\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>2. Egy új project létrehozása az elsõ lépésben\r\nlétrehozott userrel. </FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A "Register New Project" linkre klikkelve egy\r\nlapsorozathoz jutsz, amin csak szimplán végig kell menned, megadva az\r\nösszes kért információt. Eléggé magától értetõdõ és jól megcsinált ez a rész, \r\nehhez nem nagyon kell további magyarázat.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Ha ezzel megvagy, az adatokat megkapja valaki a\r\nSourceForge-tól, átnézik, hogy a projected belefér-e a SourceForge\r\ncéljaiba. Még nem hallottam olyanról, amit visszautasítottak volna, szóval\r\nne aggódj, ha nyílt forrású és szabad licenszelésû, szerintem hamar el\r\nfogják fogadni.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Most várj, és remélhetõleg 24 órán belül választ\r\nkapsz. (Ha több idõbe kerülne, írj nekik - volt pár probléma az új\r\nprojectekkel, de szerintem már kijavították õket.)\r\nHa minden jól megy, értesítenek, hogy a projected felrakták,\r\njelentkezz hát be SSL-el, és a személyes lapod alján ott lesz a link\r\naz új projected lapjára.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>3. A csapat- és projectinformációk beállítása.</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Klikkelj arra a linkre! A csapat SourceForge lapjára\r\njutsz (ez nem egyezik meg a weboldalával), itt lesz egy sor opció,\r\namelyekkel meg tudsz változtatni dolgokat, gyakorlatilag így tudod\r\nadminisztrálni a projected.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Mid van eddig?\r\n;</FONT>\r\n<BR><FONT SIZE=+1>egy weboldal a http://ateprojected.sourceforge.net\r\ncímen,</FONT>\r\n<BR><FONT SIZE=+1>egy CVS repository a\r\ncvs.ateprojected.sourceforge.net:/cvsroot/ateprojected címen\r\n,</FONT>\r\n<BR><FONT SIZE=+1>anonymous FTP az ateprojected.sourceforge.net címen,</FONT>\r\n<BR><FONT SIZE=+1>és hozzáférés levelezõlistákhoz, amivel majd késõbb\r\nfoglalkozunk.</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Az elsõ beírandó dolog, az a projected leírása a\r\ncsapat oldalához. Klikkelj a "Project Admin", utána meg az "Edit Group\r\npublic Information and Categorisation" linkre! Írd be a megfelelõ\r\ndolgokat a mezõkbe!\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A következõ kérdés, hogy vannak-e már magadon kívül\r\nfejlesztõid? Ha igen, mindannyiukniak be kell jelentkezniük\r\nfelhasználóként a SourceForge-ra, és szükséged lesz a\r\nfelhasználó-nevükre. A nevek alapján tudod hozzáadni õket a fejleszõid\r\nlistájához, írási jogosultságot adva ezzel a csapat CVS és\r\nweboldalára. Ehhez menj vissza a "Project Admin"\r\nrészhez, klikkelj az "Add Group Member" linkre, írd be a neveiket, és\r\nezzel kész is vagy.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A csapat oldalán körbenézhetsz, hogy mi minden van\r\nmég, szerintem a legfontosabbakkal már megvagyunk. Itt az idõ, hogy\r\nkirakjuk a forrást valahova, ahol mindenki elérheti...\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>4. Egy CVS repository \r\nlétrehozása a forrásod legújabb változatával.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Azoknak (mint én is), akiknek az internetes fejleszés\r\nmég új dolog, egy kis idõbe fog telni a CVS-hez hozzászokni. A\r\nkezdõknek itt van egy rövid leírás, hogy mit csinál és hogyan:\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Egy recordot õriz az összes változtatásáról a\r\nforráskódnak, a változtatáshoz kapcsolódó megjegyzésekkel együtt.\r\nBármikor megtalálhatod bármelyik korábbi verziót a repository-ban.\r\nLehetõvé teszi, hogy több ember dolgozzon ugyanazokon a fileokon\r\negyidõben, egyesítve a változtatásokat, amiket hozzáadnak.\r\nFigyelmeztet (elég világosan, hozzá kell tennem), ha a változások valamiért \r\nütköznek, és így biztos, hogy a különbséget valaki fejlesztõ\r\nészreveszi, mielõtt a file újabb verziója a repository-ba kerülhetne. \r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Ez király egy dolog, de beletelik egy kis idõbe, mire\r\nhozzászokik az ember. Alapvetõen így megy a fejlesztés:\r\n</FONT>\r\n<BR><FONT SIZE=+1>(1) Beimportálod az összes forrásod a CVS-be, aztán\r\nmindenki leszed ("check out"-ol) egy másolatot belõle, amin \r\ndolgozni fog.\r\n</FONT>\r\n<BR><FONT SIZE=+1>(2) Minden fejlesztõ a saját gépén, kényelmesen\r\ndolgozik, és ha van egy mûködõ, új hozzáadandó dolguk, frissítik\r\n("update"-elik) a helyi változatukat, hogy a központi, legfrissebb\r\nváltozattal annyira összhangban legyen, amennyire csak lehet, és utána\r\nvisszaküldik ("commit"-olják) a file-t, amit megváltoztattak a\r\nrepository-ba.\r\n</FONT>\r\n<BR><FONT SIZE=+1>(3) Bármilyen gondja van a CVS-nek az új változat\r\nfelküldésekor, szól, és akkor végig kell menned a problémás fileokon,\r\nés el kell döntened a változtatásokat kézzel. A fileokban a\r\nmegváltoztatott rész >>>>> -el van kiemelve, és mindkét verziót\r\nmutatja. Egyszerûen csak töröld ki a régit (vagy módosítsd, hogy úgy\r\nmûködjön, ahogy kell), és újra küldd föl a filet. Ha a CVS-nek már\r\nnincsenek további gondjai, térj vissza a kettes ponthoz, és\r\nfolytasd a programozást!\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Nos, tehát a forrásod a SourceForge-os CVS-be való\r\nfeltöltésének a részletei... Elõször is, olvasd el a CVS-rõl szóló SF\r\nleírást. Ha valami nem tiszta, beleolvashatsz az ingyenes 180 oldalas\r\n<A HREF="http://cvsbook.red-bean.com">CVS\r\nkönyvbe</A>. Aztán lássunk hozzá:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Keríts <A HREF="http://www.ssh.fi">SSH-t</A> és CVS-t\r\naz általad használt platformra. Ha Linuxot es Bash-t használsz, ezeket\r\nírd be:\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>export CVS_RSH=ssh</FONT>\r\n<BR><FONT SIZE=+1>export\r\nCVSROOT=loginname at cvs.ateprojected.sourceforge.net:/cvsroot/ateprojected</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Az elsõ sor mondja meg a CVS-nek, hogy SSH-t\r\nhasználjon a CVS-hez való kapcsolódáshoz. Erre biztonsági okokból van\r\nszükség. A második sor meg azt adja meg neki, hogy hol keresse a\r\nrepository-ját.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Nos, a legvalószínûbb szituáció az, hogy van pár\r\nforrásod egy könyvtárfában, amit fel akarsz tölteni (importálni) a\r\nCVS-be. Ment a legfelsõ könyvtárba, amit fel akarsz tölteni, és írd be\r\na következõt (értelemszerûen módosítva) :\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>cvs import konyvtarnev vendor start</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A könyvtárnév az a név, amivel ezt a forrásfát késõbb\r\na CVS-ben elérheted. Ha minden jól megy, meg fogja kérdezni a\r\nSourceForge user-jelszavad, és utána szépen sorban feltölti az egész\r\nforrásfád.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Következõnek, mentsd el a régi kódot valahova, mert\r\nnem akarsz már többet azzal dolgozni, és szedjél le ("chekout" -olj)\r\negy friss változatot a CVS-bõl a \r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>cvs checkout konyvtarnev</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>parancs segítségével. Ezzel kapsz egy "munkapéldányt"\r\na forrásból, CVS formában, amin aztán dolgozhatsz. Amire figyelned\r\nkell azért, hogy minden változtatást, új file vagy könyvtár\r\nhozzáadását vagy törlését külön meg kell mondanod a CVS-nek - olvasd\r\nel a fent említett könyvet a részletekhez.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>5. A project weboldalának a létrehozása.</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Tegyük fel, hogy már van valamilyen weboldalad készen,\r\namit felrakhatsz a SourceForge-ra, hogy legyen valamiféle külsõ arca a\r\nprojectnek. Jelentkezz be a SourceForge-ra SSH-val, pl.:\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>ssh -l loginnev ateprojected.sourceforge.net</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A saját home könyvtáradba kerülsz így. Innen az\r\nösszes csapat-file-t a /home/groups/ateprojected könyvtárban érheted\r\nel. Lépj át ide! Az összes weboldalad a htdocs könyvtárban van. Oda\r\nbenézve, csak az index.php-t tartalmazza, ami egy üres oldal, ami\r\nközli, hogy még nem töltöttél fel weboldalt. Jelentkezz ki, és másold\r\nfel a fileokat a weboldaladhoz scp-vel (egy program, az ssh-val együtt\r\nfelraktad valószínûleg). \r\nPl.:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>scp helyifile&nbsp;&nbsp;\r\nloginnev at shell.sourceforge.net:/home/groups/ateprojected/htdocs</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A legcélszerûbb, ha össze-gzippeled az oldalad, egy\r\nmenetben feltöltöd scp-vel, aztán bejelentkezel ssh-val és ott\r\nhelyben kibontod. \r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Nos, mi is legyen a weboldalon? A projectrõl szóló információkon kívül talán még ezek: \r\n</FONT>\r\n<BR><FONT SIZE=+1>(1) Egy link a csapat SourceForge oldalára </FONT>\r\n<BR><FONT SIZE=+1>(2) Link a levelezõlistá(k)ra (mindjárt létrehozzuk õket)</FONT>\r\n<BR><FONT SIZE=+1>(3) Egy SourceForge ikon és web-számláló - ezzel kapcsolatban lásd a SF dokumentációt. \r\n</FONT>\r\n<BR><FONT SIZE=+1>(4) Egy link a webes CVS felületre (http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=ateprojected) </FONT>\r\n<BR><FONT SIZE=+1>(5) Pár infó a CVS használatáról a projectedre vonatkozóan. </FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>6. Levelezõlista létrehozása.</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Ha a projected még nem túl aktív (vagy csak egy magányos fejleszõje van), a levelezõlistáid nagyon csendesek lesznek, de azért az javaslom, gondolj a jõvõre, és hozz létre három sztandard listát a projectednek: egy fejleszõi listát a fejlesztõknek, egy felhasználói listát a usereknek, és egy hirdetési listát az új verziók meghirdetésére.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Ezt a csapat oldalán keresztül teheted meg a "Mailing list Admin" link segítségével. Ez elég egyszerû, nem hiszem hogy lenne bármi gond vele...\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>7. És végül, szokd meg a CVS használatát a fejlesztésben, és láss munkához! \r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Adok pár tippet a fejleszés menetérõl, hogy hogyan láss neki, de persze lesznek dolgok, amiknek neked kell utánajárnod.\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A munkapéldányod frissítéséhez, a CVS repository-val való összhangba hozásához:\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>cvs -z3 update -Pd</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>(persze miután a leírtak szerint beállítottad a CVSROOT és CVS_RSH változókat)</FONT>\r\n<BR><FONT SIZE=+1>A változtatások hozzáadásához:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>cvs commit -m "megjegyzés a változtatásokról" filenév</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>Egy új file hozzáadásához:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>cvs add filenév</FONT>\r\n<BR><FONT SIZE=+1>cvs commit -m "filenév hozzáadva" filenév</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>...és már készen is állsz!</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+2>És még pár dolog, amire szükséged lehet:</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>8. Hozz létre egy file modult, hogy láthassák a munkádat!</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>9. Olvasd végig a SourceForge dokumentációt és a help-fórumokat!\r\n</FONT><FONT SIZE=+1></FONT>\r\n<P><FONT SIZE=+1>A homepage-rõl. Erõsen javasolt.</FONT><br>\r\n<A HREF="http://gyp.dunanet.hu/newproject-howto-hun.php">Alternate URL</A>\r\n\r\n',968797330,968795156,1458,807,' ');
+INSERT INTO doc_data VALUES (776,1,'Hosting Primary / Secondary DNS','<b>Hosting Primary / Secondary DNS</b><P>\r\nHosting Primary/Secondary DNS SourceForge is not hosting the Primary/Secondary DNS servers for projects just yet. We can arrange the\r\nwebserver to answer for your domain via HTTP. Point a CNAME for the hosts that you wish the webserver to respond for to shell1.sourceforge.net.\r\nAfter this is done, submit a support request to have the webserver respond for this domain. \r\n<P>\r\nIf you have any problems, please let the SourceForge staff <a href="http://sourceforge.net/support/?func=addsupport&group_id=1">know. </a>',968796850,968794153,1458,808,'We can answer for your domain via HTTP');
+INSERT INTO doc_data VALUES (777,1,'Responding for www.mydomain.org','<b>Responding for www.mydomain.org \r\n<P></b>\r\nThe httpd.conf on our end can be configured to answer for your domain. Ensure that yourdomain.org or www.yourdomain.org is a CNAME to\r\nshell1.sourceforge.net (198.186.203.36) NOT your projectname.sourceforge.net (198.186.203.44). Then submit a support request to have this added to\r\nour configuration. \r\n<P>\r\nFTP.yourdomain.org may point to download.sourceforge.net at any time. \r\n<P>\r\ncvs.yourdomain.org may point to cvs1.sourceforge.net at any time. \r\n<P>\r\nYou may <a href="http://sourceforge.net/support/?func=addsupport&group_id=1">request</a> to have the server answer for the domain, prior to you delegating the hosts to us to ensure minimal downtime. ',968796857,968794208,1458,808,'We can do this');
+INSERT INTO doc_data VALUES (789,1,'Using Webalizer','You can use webalizer on your subdomain web server logs.\r\n<P>\r\nFor more information, visit: http://mars.bingo-ev.de/webalizer-howto/webalizer-howto.html',968796883,968795449,1458,808,'Crunch your project\'s apache logs ');
+INSERT INTO doc_data VALUES (790,1,'Displaying the SourceForge logo on your web page',' <p> <B>Displaying the SourceForge Logo</B>\r\n\r\n<P>We ask that all projects hosted on SourceForge display a small\r\nSourceForge logo on their homepage.\r\n\r\n<P>The display of this logo serves two purposes. First, it drives\r\ntraffic to SourceForge, and ultimately back to the Open Source\r\nprojects that we host. SourceForge has a lot of potential for\r\n"cross linking" many OpenSource projects, and the logo display\r\nfacilitates this.\r\n\r\n<P>Second, when the logo is displayed, a log entry is generated\r\nfor your project that allows us to track hits to each of our hosted\r\nprojects. This information will be compiled and presented to\r\nour users in "top" activity lists for hosted projects. This will\r\nalso help us to identify projects that may require additional hosting\r\nresources due to large amounts of activity. \r\n\r\n<P>Please use the following URL to place the graphic on your page:\r\n<BR><B>http://sourceforge.net/sflogo.php?group_id=0&type=1</B>\r\n\r\n\r\n<P>In anchor and image tags, this would appear as follows:\r\n<BR><B>&lt;A href="http://sourceforge.net"&gt;\r\n<BR>&lt;IMG src="http://sourceforge.net/sflogo.php?group_id=0&type=1"\r\n\r\nwidth="88" height="31" border="0" alt="SourceForge Logo"&gt; &lt;/A&gt;\r\n</B>\r\n\r\n<P><B><I>Important!</I></B> Substitute the number after "group_id"\r\n(currently 0)\r\nwith your own project/group number, which is displayed at the top\r\nof your project page on SourceForge.\r\n\r\n<P>This is the image that we now display:\r\n<P><IMG src="/sflogo.php?group_id=873&type=1"\r\nwidth="88" height="31" alt="SourceForge Logo">\r\n<P>Please email <A href="mailto:staff at sourceforge.net">staff at sourceforge.net</A>\r\nwith any questions you may have.',968879782,968795499,1458,808,'If we host your subdomain, please display our logo');
+INSERT INTO doc_data VALUES (792,1,'Using anonymous FTP space','<b>Using anonymous FTP space \r\n<P></b>\r\nAnonymous FTP access is available for all projects on SourceForge. This is generally to be used for stuff like developer-only releases, etc. which\r\ncannot be released as a module. Heck, you can put anything here. \r\n<P>\r\nIt\'s easy to use this space. Your project\'s public FTP directory is on shell1.sourceforge.net at: /home/groups/ftp/pub/yourprojectname and everything\r\nin that directory is available to anonymous FTP users. \r\n<P>\r\nPeople can FTP anonymously (login as "ftp" or "anonymous" and give your e-mail address as the password) to yourprojectname.sourceforge.net and\r\ndownload files from the /pub/yourprojectname directory, i.e., \r\n<P>\r\nftp://yourproject.sourceforge.net/pub/yourprojectname \r\n<P>\r\nHow to put stuff in the directory? Simple! SCP your files to shell1. \r\n<P>\r\nscp filename.tar.gz yourusername at shell1.sourceforge.net:/home/groups/ftp/pub/yourprojectname \r\n\r\n',968796877,968795601,1458,808,'Share your files');
+
Added: trunk/gforge_base/evolvisforge/gforge/db/trove_cat.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/db/trove_cat.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/db/trove_cat.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,305 @@
+1 2000031601 0 0 audience Intended Audience The main class of people likely to be interested in this resource. 0 0 Intended Audience 1
+2 2000032401 1 1 endusers End Users/Desktop Programs and resources for software end users. Software for the desktop. 0 0 Intended Audience :: End Users/Desktop 1 :: 2
+3 2000041101 1 1 developers Developers Programs and resources for software developers, to include libraries. 0 0 Intended Audience :: Developers 1 :: 3
+4 2000031601 1 1 sysadmins System Administrators Programs and resources for people who administer computers and networks. 0 0 Intended Audience :: System Administrators 1 :: 4
+5 2000040701 1 1 other Other Audience Programs and resources for an unlisted audience. 0 0 Intended Audience :: Other Audience 1 :: 5
+6 2000031601 0 0 developmentstatus Development Status An indication of the development status of the software or resource. 0 0 Development Status 6
+7 2000040701 6 6 planning 1 - Planning This resource is in the planning stages only. There is no code. 0 0 Development Status :: 1 - Planning 6 :: 7
+8 2000040701 6 6 prealpha 2 - Pre-Alpha There is code for this project, but it is not usable except for further development. 0 0 Development Status :: 2 - Pre-Alpha 6 :: 8
+9 2000041101 6 6 alpha 3 - Alpha Resource is in early development, and probably incomplete and/or extremely buggy. 0 0 Development Status :: 3 - Alpha 6 :: 9
+10 2000040701 6 6 beta 4 - Beta Resource is in late phases of development. Deliverables are essentially complete, but may still have significant bugs. 0 0 Development Status :: 4 - Beta 6 :: 10
+11 2000040701 6 6 production 5 - Production/Stable Deliverables are complete and usable by the intended audience. 0 0 Development Status :: 5 - Production/Stable 6 :: 11
+12 2000040701 6 6 mature 6 - Mature This resource has an extensive history of successful use and has probably undergone several stable revisions. 0 0 Development Status :: 6 - Mature 6 :: 12
+13 2000031601 0 0 license License License terms under which the resource is distributed. 0 0 License 13
+197 2000032001 13 13 publicdomain Public Domain Public Domain. No author-retained rights. 0 0 License :: Public Domain 13 :: 197
+196 2000040701 13 13 other Other/Proprietary License Non OSI-Approved/Proprietary license. 0 0 License :: Other/Proprietary License 13 :: 196
+14 2000032401 13 13 osi OSI Approved Licenses that have been approved by OSI as approved 0 0 License :: OSI Approved 13 :: 14
+303 2001041701 14 13 nethack Nethack General Public License Nethack General Public License 0 0 License :: OSI Approved :: Nethack General Public License 13 :: 14 :: 303
+141 2000032001 136 18 clustering Clustering/Distributed Networks Tools for automatically distributing computation across a network. 0 0 Topic :: System :: Clustering/Distributed Networks 18 :: 136 :: 141
+139 2000032001 136 18 boot Boot Programs for bootstrapping your OS. 0 0 Topic :: System :: Boot 18 :: 136 :: 139
+140 2000032001 139 18 init Init Init-time programs to start system services after boot. 0 0 Topic :: System :: Boot :: Init 18 :: 136 :: 139 :: 140
+138 2000032001 136 18 benchmark Benchmark Programs for benchmarking system performance. 0 0 Topic :: System :: Benchmark 18 :: 136 :: 138
+74 2000042701 136 18 emulators Emulators Emulations of foreign operating systme and machines. 0 0 Topic :: System :: Emulators 18 :: 136 :: 74
+19 2000032001 136 18 archiving Archiving Tools for maintaining and searching software or document archives. 0 0 Topic :: System :: Archiving 18 :: 136 :: 19
+137 2000032001 19 18 backup Backup Programs to manage and sequence system backup. 0 0 Topic :: System :: Archiving :: Backup 18 :: 136 :: 19 :: 137
+42 2000031601 19 18 compression Compression Tools and libraries for data compression. 0 0 Topic :: System :: Archiving :: Compression 18 :: 136 :: 19 :: 42
+41 2000031601 19 18 packaging Packaging Tools for packing and unpacking multi-file formats. Includes data-only formats and software package systems. 0 0 Topic :: System :: Archiving :: Packaging 18 :: 136 :: 19 :: 41
+132 2000032001 18 18 religion Religion Programs relating to religion and sacred texts. 0 0 Topic :: Religion 18 :: 132
+129 2000031701 18 18 office Office/Business Software for assisting and organizing work at your desk. 0 0 Topic :: Office/Business 18 :: 129
+131 2000032001 129 18 suites Office Suites Integrated office suites (word processing, presentation, spreadsheet, database, etc). 0 0 Topic :: Office/Business :: Office Suites 18 :: 129 :: 131
+130 2000031701 129 18 scheduling Scheduling Projects for scheduling time, to include project management. 0 0 Topic :: Office/Business :: Scheduling 18 :: 129 :: 130
+75 2000031701 129 18 financial Financial Programs related to finance. 0 0 Topic :: Office/Business :: Financial 18 :: 129 :: 75
+79 2000031601 75 18 pointofsale Point-Of-Sale Point-Of-Sale applications. 0 0 Topic :: Office/Business :: Financial :: Point-Of-Sale 18 :: 129 :: 75 :: 79
+78 2000031601 75 18 spreadsheet Spreadsheet Spreadsheet applications. 0 0 Topic :: Office/Business :: Financial :: Spreadsheet 18 :: 129 :: 75 :: 78
+77 2000031601 75 18 investment Investment Programs for assisting in financial investment. 0 0 Topic :: Office/Business :: Financial :: Investment 18 :: 129 :: 75 :: 77
+76 2000031601 75 18 accounting Accounting Checkbook balancers and accounting programs. 0 0 Topic :: Office/Business :: Financial :: Accounting 18 :: 129 :: 75 :: 76
+234 2000040701 18 18 other Other/Nonlisted Topic Topic does not fit into any listed category. 0 0 Topic :: Other/Nonlisted Topic 18 :: 234
+156 2000032001 18 18 terminals Terminals Terminal emulators, terminal programs, and terminal session utilities. 0 0 Topic :: Terminals 18 :: 156
+159 2000032001 156 18 telnet Telnet Support for telnet; terminal sessions across Internet links. 0 0 Topic :: Terminals :: Telnet 18 :: 156 :: 159
+158 2000032001 156 18 virtual Terminal Emulators/X Terminals Programs to handle multiple terminal sessions. Includes terminal emulations for X and other window systems. 0 0 Topic :: Terminals :: Terminal Emulators/X Terminals 18 :: 156 :: 158
+157 2000032001 156 18 serial Serial Dialup, terminal emulation, and file transfer over serial lines. 0 0 Topic :: Terminals :: Serial 18 :: 156 :: 157
+115 2000031701 113 18 capture Capture/Recording Sound capture and recording. 0 0 Topic :: Multimedia :: Sound/Audio :: Capture/Recording 18 :: 99 :: 113 :: 115
+114 2000031701 113 18 analysis Analysis Sound analysis tools, to include frequency analysis. 0 0 Topic :: Multimedia :: Sound/Audio :: Analysis 18 :: 99 :: 113 :: 114
+100 2000031601 99 18 graphics Graphics Tools and resources for computer graphics. 0 0 Topic :: Multimedia :: Graphics 18 :: 99 :: 100
+112 2000031701 100 18 viewers Viewers Programs that can display various graphics formats. 0 0 Topic :: Multimedia :: Graphics :: Viewers 18 :: 99 :: 100 :: 112
+111 2000031701 100 18 presentation Presentation Tools for generating presentation graphics and slides. 0 0 Topic :: Multimedia :: Graphics :: Presentation 18 :: 99 :: 100 :: 111
+110 2000031701 100 18 3drendering 3D Rendering Programs which render 3D models. 0 0 Topic :: Multimedia :: Graphics :: 3D Rendering 18 :: 99 :: 100 :: 110
+109 2000031701 100 18 3dmodeling 3D Modeling Programs for working with 3D Models. 0 0 Topic :: Multimedia :: Graphics :: 3D Modeling 18 :: 99 :: 100 :: 109
+106 2000031701 100 18 editors Editors Drawing, painting, and structured editing programs. 0 0 Topic :: Multimedia :: Graphics :: Editors 18 :: 99 :: 100 :: 106
+108 2000031701 106 18 raster Raster-Based Raster/Bitmap based drawing programs. 0 0 Topic :: Multimedia :: Graphics :: Editors :: Raster-Based 18 :: 99 :: 100 :: 106 :: 108
+107 2000031701 106 18 vector Vector-Based Vector-Based drawing programs. 0 0 Topic :: Multimedia :: Graphics :: Editors :: Vector-Based 18 :: 99 :: 100 :: 106 :: 107
+105 2000031701 100 18 conversion Graphics Conversion Programs which convert between graphics formats. 0 0 Topic :: Multimedia :: Graphics :: Graphics Conversion 18 :: 99 :: 100 :: 105
+101 2000031601 100 18 capture Capture Support for scanners, cameras, and screen capture. 0 0 Topic :: Multimedia :: Graphics :: Capture 18 :: 99 :: 100 :: 101
+104 2000031601 101 18 screencapture Screen Capture Screen capture tools and processors. 0 0 Topic :: Multimedia :: Graphics :: Capture :: Screen Capture 18 :: 99 :: 100 :: 101 :: 104
+103 2000031601 101 18 cameras Digital Camera Digital Camera 0 0 Topic :: Multimedia :: Graphics :: Capture :: Digital Camera 18 :: 99 :: 100 :: 101 :: 103
+102 2000031601 101 18 scanners Scanners Support for graphic scanners. 0 0 Topic :: Multimedia :: Graphics :: Capture :: Scanners 18 :: 99 :: 100 :: 101 :: 102
+154 2000032001 18 18 printing Printing Tools, daemons, and utilities for printer control. 0 0 Topic :: Printing 18 :: 154
+136 2000032001 18 18 system System Operating system core and administration utilities. 0 0 Topic :: System 18 :: 136
+294 2001032001 136 18 shells System Shells System Shells 0 0 Topic :: System :: System Shells 18 :: 136 :: 294
+257 2000071101 136 18 softwaredist Software Distribution Systems software for distributing other software. 0 0 Topic :: System :: Software Distribution 18 :: 136 :: 257
+253 2000071101 136 18 sysadministration Systems Administration Systems Administration Software (e.g. configuration apps.) 0 0 Topic :: System :: Systems Administration 18 :: 136 :: 253
+289 2001032001 253 18 authentication Authentication/Directory Authentication and directory services 0 0 Topic :: System :: Systems Administration :: Authentication/Directory 18 :: 136 :: 253 :: 289
+291 2001032001 289 18 ldap LDAP Leightweight directory access protocol 0 0 Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP 18 :: 136 :: 253 :: 289 :: 291
+290 2001032001 289 18 nis NIS NIS services 0 0 Topic :: System :: Systems Administration :: Authentication/Directory :: NIS 18 :: 136 :: 253 :: 289 :: 290
+153 2000032001 136 18 power Power (UPS) Code for communication with uninterruptible power supplies. 0 0 Topic :: System :: Power (UPS) 18 :: 136 :: 153
+150 2000032001 136 18 networking Networking Network configuration and administration. 0 0 Topic :: System :: Networking 18 :: 136 :: 150
+152 2000032001 150 18 monitoring Monitoring System monitoring, traffic analysis, and sniffers. 0 0 Topic :: System :: Networking :: Monitoring 18 :: 136 :: 150 :: 152
+155 2000032001 152 18 watchdog Hardware Watchdog Software to monitor and perform actions or shutdown on hardware trouble detection. 0 0 Topic :: System :: Networking :: Monitoring :: Hardware Watchdog 18 :: 136 :: 150 :: 152 :: 155
+151 2000032001 150 18 firewalls Firewalls Firewalls and filtering systems. 0 0 Topic :: System :: Networking :: Firewalls 18 :: 136 :: 150 :: 151
+148 2000032001 136 18 logging Logging Utilities for clearing, rotating, and digesting system logs. 0 0 Topic :: System :: Logging 18 :: 136 :: 148
+147 2000032001 136 18 setup Installation/Setup Tools for installation and setup of the operating system and other programs. 0 0 Topic :: System :: Installation/Setup 18 :: 136 :: 147
+146 2000032001 136 18 hardware Hardware Tools for direct, non-kernel control and configuration of hardware. 0 0 Topic :: System :: Hardware 18 :: 136 :: 146
+292 2001032001 146 18 drivers Hardware Drivers Hardware Drivers 0 0 Topic :: System :: Hardware :: Hardware Drivers 18 :: 136 :: 146 :: 292
+144 2000032001 136 18 kernels Operating System Kernels OS Kernels, patches, modules, and tools. 0 0 Topic :: System :: Operating System Kernels 18 :: 136 :: 144
+239 2000041301 144 18 gnuhurd GNU Hurd Kernel code and modules for GNU Hurd. 0 0 Topic :: System :: Operating System Kernels :: GNU Hurd 18 :: 136 :: 144 :: 239
+145 2000032001 144 18 bsd BSD Code relating to any of the BSD kernels. 0 0 Topic :: System :: Operating System Kernels :: BSD 18 :: 136 :: 144 :: 145
+143 2000032001 144 18 linux Linux The Linux kernel, patches, and modules. 0 0 Topic :: System :: Operating System Kernels :: Linux 18 :: 136 :: 144 :: 143
+142 2000032001 136 18 filesystems Filesystems Support for creating, editing, reading, and writing file systems. 0 0 Topic :: System :: Filesystems 18 :: 136 :: 142
+287 2001032001 80 18 boardgames Board Games Board Games 0 0 Topic :: Games/Entertainment :: Board Games 18 :: 80 :: 287
+268 2000082101 80 18 Puzzles Puzzle Games Puzzle Games 0 0 Topic :: Games/Entertainment :: Puzzle Games 18 :: 80 :: 268
+86 2000031601 80 18 mud Multi-User Dungeons (MUD) Massively-multiplayer text based games. 0 0 Topic :: Games/Entertainment :: Multi-User Dungeons (MUD) 18 :: 80 :: 86
+85 2000031601 80 18 simulation Simulation Simulation games 0 0 Topic :: Games/Entertainment :: Simulation 18 :: 80 :: 85
+84 2000031601 80 18 rpg Role-Playing Role-Playing games 0 0 Topic :: Games/Entertainment :: Role-Playing 18 :: 80 :: 84
+83 2000032401 80 18 turnbasedstrategy Turn Based Strategy Turn Based Strategy 0 0 Topic :: Games/Entertainment :: Turn Based Strategy 18 :: 80 :: 83
+82 2000031601 80 18 firstpersonshooters First Person Shooters First Person Shooters. 0 0 Topic :: Games/Entertainment :: First Person Shooters 18 :: 80 :: 82
+81 2000031601 80 18 realtimestrategy Real Time Strategy Real Time strategy games 0 0 Topic :: Games/Entertainment :: Real Time Strategy 18 :: 80 :: 81
+288 2001032001 80 18 sidescrolling Side-Scrolling/Arcade Games Arcade-style side-scrolling games 0 0 Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games 18 :: 80 :: 288
+71 2000031601 18 18 education Education Programs and tools for educating yourself or others. 0 0 Topic :: Education 18 :: 71
+73 2000031601 71 18 testing Testing Tools for testing someone's knowledge on a subject. 0 0 Topic :: Education :: Testing 18 :: 71 :: 73
+72 2000031601 71 18 cai Computer Aided Instruction (CAI) Programs for authoring or using Computer Aided Instrution courses. 0 0 Topic :: Education :: Computer Aided Instruction (CAI) 18 :: 71 :: 72
+66 2000031601 18 18 database Database Front ends, engines, and tools for database work. 0 0 Topic :: Database 18 :: 66
+68 2000031601 66 18 frontends Front-Ends Clients and front-ends for generating queries to database engines. 0 0 Topic :: Database :: Front-Ends 18 :: 66 :: 68
+67 2000031601 66 18 engines Database Engines/Servers Programs that manage data and provide control via some query language. 0 0 Topic :: Database :: Database Engines/Servers 18 :: 66 :: 67
+63 2000032001 18 18 editors Text Editors Programs for editing code and documents. 0 0 Topic :: Text Editors 18 :: 63
+285 2001032001 63 18 textprocessing Text Processing Programs or libraries that are designed to batch process text documents 0 0 Topic :: Text Editors :: Text Processing 18 :: 63 :: 285
+70 2000031601 63 18 wordprocessors Word Processors WYSIWYG word processors. 0 0 Topic :: Text Editors :: Word Processors 18 :: 63 :: 70
+69 2000031601 63 18 documentation Documentation Tools for the creation and use of documentation. 0 0 Topic :: Text Editors :: Documentation 18 :: 63 :: 69
+65 2000031601 63 18 ide Integrated Development Environments (IDE) Complete editing environments for code, including cababilities such as compilation and code building assistance. 0 0 Topic :: Text Editors :: Integrated Development Environments (IDE) 18 :: 63 :: 65
+64 2000031601 63 18 emacs Emacs GNU Emacs and its imitators and tools. 0 0 Topic :: Text Editors :: Emacs 18 :: 63 :: 64
+125 2000031701 99 18 video Video Video capture, editing, and playback. 0 0 Topic :: Multimedia :: Video 18 :: 99 :: 125
+126 2000031701 125 18 capture Capture Video capture tools. 0 0 Topic :: Multimedia :: Video :: Capture 18 :: 99 :: 125 :: 126
+256 2000071101 125 18 nonlineareditor Non-Linear Editor Video Non-Linear Editors 0 0 Topic :: Multimedia :: Video :: Non-Linear Editor 18 :: 99 :: 125 :: 256
+128 2000031701 125 18 display Display Programs which display various video formats. 0 0 Topic :: Multimedia :: Video :: Display 18 :: 99 :: 125 :: 128
+127 2000031701 125 18 conversion Conversion Programs which convert between video formats. 0 0 Topic :: Multimedia :: Video :: Conversion 18 :: 99 :: 125 :: 127
+113 2000031701 99 18 sound Sound/Audio Tools for generating, editing, analyzing, and playing sound. 0 0 Topic :: Multimedia :: Sound/Audio 18 :: 99 :: 113
+249 2000042801 113 18 synthesis Sound Synthesis Software for creation and synthesis of sound. 0 0 Topic :: Multimedia :: Sound/Audio :: Sound Synthesis 18 :: 99 :: 113 :: 249
+248 2000042801 113 18 midi MIDI Software related to MIDI synthesis and playback. 0 0 Topic :: Multimedia :: Sound/Audio :: MIDI 18 :: 99 :: 113 :: 248
+124 2000031701 113 18 speech Speech Speech manipulation and intepretation tools. 0 0 Topic :: Multimedia :: Sound/Audio :: Speech 18 :: 99 :: 113 :: 124
+122 2000031701 113 18 players Players Programs to play audio files to a sound device. 0 0 Topic :: Multimedia :: Sound/Audio :: Players 18 :: 99 :: 113 :: 122
+123 2000031701 122 18 mp3 MP3 Programs to play MP3 audio files. 0 0 Topic :: Multimedia :: Sound/Audio :: Players :: MP3 18 :: 99 :: 113 :: 122 :: 123
+121 2000031701 113 18 mixers Mixers Programs to mix audio. 0 0 Topic :: Multimedia :: Sound/Audio :: Mixers 18 :: 99 :: 113 :: 121
+120 2000031701 113 18 editors Editors Programs to edit/manipulate sound data. 0 0 Topic :: Multimedia :: Sound/Audio :: Editors 18 :: 99 :: 113 :: 120
+119 2000031701 113 18 conversion Conversion Programs to convert between audio formats. 0 0 Topic :: Multimedia :: Sound/Audio :: Conversion 18 :: 99 :: 113 :: 119
+116 2000031701 113 18 cdaudio CD Audio Programs to play and manipulate audio CDs. 0 0 Topic :: Multimedia :: Sound/Audio :: CD Audio 18 :: 99 :: 113 :: 116
+88 2000031601 87 18 finger Finger The Finger protocol for getting information about users. 0 0 Topic :: Internet :: Finger 18 :: 87 :: 88
+118 2000031701 116 18 cdripping CD Ripping Software to convert CD Audio to other digital formats. 0 0 Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping 18 :: 99 :: 113 :: 116 :: 118
+117 2000031701 116 18 cdplay CD Playing CD Playing software, to include jukebox software. 0 0 Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing 18 :: 99 :: 113 :: 116 :: 117
+260 2000071401 52 18 SCCS SCCS SCCS 0 0 Topic :: Software Development :: Version Control :: SCCS 18 :: 45 :: 52 :: 260
+54 2000031601 52 18 rcs RCS Tools for RCS (Revision Control System). 0 0 Topic :: Software Development :: Version Control :: RCS 18 :: 45 :: 52 :: 54
+53 2000031601 52 18 cvs CVS Tools for CVS (Concurrent Versioning System). 0 0 Topic :: Software Development :: Version Control :: CVS 18 :: 45 :: 52 :: 53
+50 2000031601 45 18 objectbrokering Object Brokering Object brokering libraries and tools. 0 0 Topic :: Software Development :: Object Brokering 18 :: 45 :: 50
+51 2000031601 50 18 corba CORBA Tools for implementation and use of CORBA. 0 0 Topic :: Software Development :: Object Brokering :: CORBA 18 :: 45 :: 50 :: 51
+49 2000031601 45 18 interpreters Interpreters Programs for interpreting and executing high-level languages directly. 0 0 Topic :: Software Development :: Interpreters 18 :: 45 :: 49
+48 2000031601 45 18 compilers Compilers Programs for compiling high-level languges into machine code. 0 0 Topic :: Software Development :: Compilers 18 :: 45 :: 48
+47 2000031601 45 18 debuggers Debuggers Programs for controlling and monitoring the execution of compiled binaries. 0 0 Topic :: Software Development :: Debuggers 18 :: 45 :: 47
+46 2000031601 45 18 build Build Tools Software for the build process. 0 0 Topic :: Software Development :: Build Tools 18 :: 45 :: 46
+43 2000031601 18 18 security Security Security-related software, to include system administration and cryptography. 0 0 Topic :: Security 18 :: 43
+44 2000031601 43 18 cryptography Cryptography Cryptography programs, algorithms, and libraries. 0 0 Topic :: Security :: Cryptography 18 :: 43 :: 44
+97 2000042701 18 18 scientific Scientific/Engineering Scientific applications, to include research, applied and pure mathematics and sciences. 0 0 Topic :: Scientific/Engineering 18 :: 97
+98 2000031601 97 18 mathematics Mathematics Software to support pure and applied mathematics. 0 0 Topic :: Scientific/Engineering :: Mathematics 18 :: 97 :: 98
+272 2000100501 97 18 HMI Human Machine Interfaces This applies to the Factory/Machine control/Automation fields where there are already thousands of applications and millions of installations. 0 0 Topic :: Scientific/Engineering :: Human Machine Interfaces 18 :: 97 :: 272
+266 2000081601 97 18 medical Medical Science Apps. Medical / BioMedical Science Apps. 0 0 Topic :: Scientific/Engineering :: Medical Science Apps. 18 :: 97 :: 266
+252 2000071101 97 18 bioinformatics Bio-Informatics Category for gene software (e.g. Gene Ontology) 0 0 Topic :: Scientific/Engineering :: Bio-Informatics 18 :: 97 :: 252
+246 2000042701 97 18 eda Electronic Design Automation (EDA) Tools for circuit design, schematics, board layout, and more. 0 0 Topic :: Scientific/Engineering :: Electronic Design Automation (EDA) 18 :: 97 :: 246
+135 2000032001 97 18 visualization Visualization Software for scientific visualization. 0 0 Topic :: Scientific/Engineering :: Visualization 18 :: 97 :: 135
+134 2000032001 97 18 astronomy Astronomy Software and tools related to astronomy. 0 0 Topic :: Scientific/Engineering :: Astronomy 18 :: 97 :: 134
+133 2000032001 97 18 ai Artificial Intelligence Artificial Intelligence. 0 0 Topic :: Scientific/Engineering :: Artificial Intelligence 18 :: 97 :: 133
+87 2000031601 18 18 internet Internet Tools to assist human access to the Internet. 0 0 Topic :: Internet 18 :: 87
+270 2000083101 87 18 WAP WAP Wireless Access Protocol 0 0 Topic :: Internet :: WAP 18 :: 87 :: 270
+245 2000042701 87 18 loganalysis Log Analysis Software to help analyze various log files. 0 0 Topic :: Internet :: Log Analysis 18 :: 87 :: 245
+149 2000032001 87 18 dns Name Service (DNS) Domain name system servers and utilities. 0 0 Topic :: Internet :: Name Service (DNS) 18 :: 87 :: 149
+90 2000031601 87 18 www WWW/HTTP Programs and tools for the World Wide Web. 0 0 Topic :: Internet :: WWW/HTTP 18 :: 87 :: 90
+250 2000042801 90 18 httpservers HTTP Servers Software designed to serve content via the HTTP protocol. 0 0 Topic :: Internet :: WWW/HTTP :: HTTP Servers 18 :: 87 :: 90 :: 250
+243 2000042701 90 18 sitemanagement Site Management Tools for maintanance and management of web sites. 0 0 Topic :: Internet :: WWW/HTTP :: Site Management 18 :: 87 :: 90 :: 243
+244 2000042701 243 18 linkchecking Link Checking Tools to assist in checking for broken links. 0 0 Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking 18 :: 87 :: 90 :: 243 :: 244
+93 2000031601 90 18 indexing Indexing/Search Indexing and search tools for the Web. 0 0 Topic :: Internet :: WWW/HTTP :: Indexing/Search 18 :: 87 :: 90 :: 93
+92 2000031601 90 18 dynamic Dynamic Content Common Gateway Interface scripting and server-side parsing. 0 0 Topic :: Internet :: WWW/HTTP :: Dynamic Content 18 :: 87 :: 90 :: 92
+96 2000031601 92 18 cgi CGI Tools/Libraries Tools for the Common Gateway Interface 0 0 Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries 18 :: 87 :: 90 :: 92 :: 96
+95 2000031601 92 18 messageboards Message Boards Online message boards 0 0 Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards 18 :: 87 :: 90 :: 92 :: 95
+94 2000031601 92 18 counters Page Counters Scripts to count numbers of pageviews. 0 0 Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters 18 :: 87 :: 90 :: 92 :: 94
+91 2000031601 90 18 browsers Browsers Web Browsers 0 0 Topic :: Internet :: WWW/HTTP :: Browsers 18 :: 87 :: 90 :: 91
+89 2000031601 87 18 ftp File Transfer Protocol (FTP) Programs and tools for file transfer via FTP. 0 0 Topic :: Internet :: File Transfer Protocol (FTP) 18 :: 87 :: 89
+80 2000031601 18 18 games Games/Entertainment Games and Entertainment software. 0 0 Topic :: Games/Entertainment 18 :: 80
+18 2000031601 0 0 topic Topic Topic categorization. 0 0 Topic 18
+20 2000032401 18 18 communications Communications Programs intended to facilitate communication between people. 0 0 Topic :: Communications 18 :: 20
+27 2000031601 20 18 conferencing Conferencing Software to support real-time conferencing over the Internet. 0 0 Topic :: Communications :: Conferencing 18 :: 20 :: 27
+22 2000031601 20 18 chat Chat Programs to support real-time communication over the Internet. 0 0 Topic :: Communications :: Chat 18 :: 20 :: 22
+26 2000031601 22 18 aim AOL Instant Messanger Programs to support AOL Instant Messanger. 0 0 Topic :: Communications :: Chat :: AOL Instant Messanger 18 :: 20 :: 22 :: 26
+25 2000031601 22 18 talk Unix Talk Programs to support Unix Talk protocol. 0 0 Topic :: Communications :: Chat :: Unix Talk 18 :: 20 :: 22 :: 25
+24 2000041101 22 18 irc Internet Relay Chat Programs to support Internet Relay Chat. 0 0 Topic :: Communications :: Chat :: Internet Relay Chat 18 :: 20 :: 22 :: 24
+23 2000031601 22 18 icq ICQ Programs to support ICQ. 0 0 Topic :: Communications :: Chat :: ICQ 18 :: 20 :: 22 :: 23
+21 2000031601 20 18 bbs BBS Bulletin Board systems. 0 0 Topic :: Communications :: BBS 18 :: 20 :: 21
+251 2000050101 20 18 filesharing File Sharing Software for person-to-person online file sharing. 0 0 Topic :: Communications :: File Sharing 18 :: 20 :: 251
+241 2000050101 251 18 napster Napster Clients and servers for the Napster file sharing protocol. 0 0 Topic :: Communications :: File Sharing :: Napster 18 :: 20 :: 251 :: 241
+286 2001032001 251 18 gnutella Gnutella Projects based around the gnutella protocol. 0 0 Topic :: Communications :: File Sharing :: Gnutella 18 :: 20 :: 251 :: 286
+247 2000042701 20 18 telephony Telephony Telephony related applications, to include automated voice response systems. 0 0 Topic :: Communications :: Telephony 18 :: 20 :: 247
+40 2000031601 20 18 internetphone Internet Phone Software to support real-time speech communication over the Internet. 0 0 Topic :: Communications :: Internet Phone 18 :: 20 :: 40
+39 2000031601 20 18 usenet Usenet News Software to support USENET news. 0 0 Topic :: Communications :: Usenet News 18 :: 20 :: 39
+38 2000031601 20 18 hamradio Ham Radio Tools and resources for amateur radio. 0 0 Topic :: Communications :: Ham Radio 18 :: 20 :: 38
+37 2000031601 20 18 fido FIDO Tools for FIDOnet mail and echoes. 0 0 Topic :: Communications :: FIDO 18 :: 20 :: 37
+36 2000031601 20 18 fax Fax Tools for sending and receiving facsimile messages. 0 0 Topic :: Communications :: Fax 18 :: 20 :: 36
+28 2000031601 20 18 email Email Programs for sending, processing, and handling electronic mail. 0 0 Topic :: Communications :: Email 18 :: 20 :: 28
+33 2000031601 28 18 postoffice Post-Office Programs to support post-office protocols, including POP and IMAP. 0 0 Topic :: Communications :: Email :: Post-Office 18 :: 20 :: 28 :: 33
+35 2000031601 33 18 imap IMAP Programs to support IMAP protocol (Internet Message Access Protocol). 0 0 Topic :: Communications :: Email :: Post-Office :: IMAP 18 :: 20 :: 28 :: 33 :: 35
+34 2000031601 33 18 pop3 POP3 Programs to support POP3 (Post-Office Protocol, version 3). 0 0 Topic :: Communications :: Email :: Post-Office :: POP3 18 :: 20 :: 28 :: 33 :: 34
+32 2000031601 28 18 mta Mail Transport Agents Email transport and gatewaying software. 0 0 Topic :: Communications :: Email :: Mail Transport Agents 18 :: 20 :: 28 :: 32
+31 2000031601 28 18 mua Email Clients (MUA) Programs for interactively reading and sending Email. 0 0 Topic :: Communications :: Email :: Email Clients (MUA) 18 :: 20 :: 28 :: 31
+30 2000031601 28 18 listservers Mailing List Servers Tools for managing electronic mailing lists. 0 0 Topic :: Communications :: Email :: Mailing List Servers 18 :: 20 :: 28 :: 30
+29 2000031601 28 18 filters Filters Content-driven filters and dispatchers for Email. 0 0 Topic :: Communications :: Email :: Filters 18 :: 20 :: 28 :: 29
+301 2001041701 14 13 nosl Nokia Open Source License Nokia Open Source License 0 0 License :: OSI Approved :: Nokia Open Source License 13 :: 14 :: 301
+299 2001041701 14 13 iosl Intel Open Source License Intel Open Source License 0 0 License :: OSI Approved :: Intel Open Source License 13 :: 14 :: 299
+297 2001041701 14 13 vsl Vovida Software License Vovida Software License 0 0 License :: OSI Approved :: Vovida Software License 13 :: 14 :: 297
+195 2000032001 14 13 zlib zlib/libpng License zlib/libpng License 0 0 License :: OSI Approved :: zlib/libpng License 13 :: 14 :: 195
+194 2000032001 14 13 python Python License Python License 0 0 License :: OSI Approved :: Python License 13 :: 14 :: 194
+193 2000032001 14 13 ricoh Ricoh Source Code Public License Ricoh Source Code Public License 0 0 License :: OSI Approved :: Ricoh Source Code Public License 13 :: 14 :: 193
+192 2000032001 14 13 cvw MITRE Collaborative Virtual Workspace License (CVW) MITRE Collaborative Virtual Workspace License (CVW) 0 0 License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW) 13 :: 14 :: 192
+191 2000032001 14 13 ibm IBM Public License IBM Public License 0 0 License :: OSI Approved :: IBM Public License 13 :: 14 :: 191
+190 2000032001 14 13 qpl QT Public License (QPL) QT Public License 0 0 License :: OSI Approved :: QT Public License (QPL) 13 :: 14 :: 190
+189 2000032001 14 13 mpl Mozilla Public License (MPL) Mozilla Public License (MPL) 0 0 License :: OSI Approved :: Mozilla Public License (MPL) 13 :: 14 :: 189
+305 2001041701 189 13 mpl11 Mozilla Public License 1.1 Mozilla Public License 1.1 0 0 License :: OSI Approved :: Mozilla Public License (MPL) :: Mozilla Public License 1.1 13 :: 14 :: 189 :: 305
+199 2000032101 0 0 os Operating System What operating system the program requires to run, if any. 0 0 Operating System 199
+200 2000032101 199 199 posix POSIX POSIX plus standard Berkeley socket facilities. Don't list a more specific OS unless your program requires it. 0 0 Operating System :: POSIX 199 :: 200
+201 2000032101 200 199 linux Linux Any version of Linux. Don't specify a subcategory unless the program requires a particular distribution. 0 0 Operating System :: POSIX :: Linux 199 :: 200 :: 201
+202 2000032101 200 199 bsd BSD Any variant of BSD. Don't specify a subcategory unless the program requires a particular BSD flavor. 0 0 Operating System :: POSIX :: BSD 199 :: 200 :: 202
+203 2000041101 202 199 freebsd FreeBSD FreeBSD 0 0 Operating System :: POSIX :: BSD :: FreeBSD 199 :: 200 :: 202 :: 203
+204 2000032101 202 199 netbsd NetBSD NetBSD 0 0 Operating System :: POSIX :: BSD :: NetBSD 199 :: 200 :: 202 :: 204
+205 2000032101 202 199 openbsd OpenBSD OpenBSD 0 0 Operating System :: POSIX :: BSD :: OpenBSD 199 :: 200 :: 202 :: 205
+206 2000032101 202 199 bsdos BSD/OS BSD/OS 0 0 Operating System :: POSIX :: BSD :: BSD/OS 199 :: 200 :: 202 :: 206
+207 2000032101 200 199 sun SunOS/Solaris Any Sun Microsystems OS. 0 0 Operating System :: POSIX :: SunOS/Solaris 199 :: 200 :: 207
+208 2000032101 200 199 sco SCO SCO 0 0 Operating System :: POSIX :: SCO 199 :: 200 :: 208
+209 2000032101 200 199 hpux HP-UX HP-UX 0 0 Operating System :: POSIX :: HP-UX 199 :: 200 :: 209
+210 2000032101 200 199 aix AIX AIX 0 0 Operating System :: POSIX :: AIX 199 :: 200 :: 210
+211 2000032101 200 199 irix IRIX IRIX 0 0 Operating System :: POSIX :: IRIX 199 :: 200 :: 211
+212 2000032101 200 199 other Other Other specific POSIX OS, specified in description. 0 0 Operating System :: POSIX :: Other 199 :: 200 :: 212
+282 2000121901 18 18 Sociology Sociology Social / Informational - Family / etc. 0 0 Topic :: Sociology 18 :: 282
+214 2000032101 199 199 microsoft Microsoft Microsoft operating systems. 0 0 Operating System :: Microsoft 199 :: 214
+215 2000032101 214 199 msdos MS-DOS Microsoft Disk Operating System (DOS) 0 0 Operating System :: Microsoft :: MS-DOS 199 :: 214 :: 215
+216 2000032101 214 199 windows Windows Windows software, not specific to any particular version of Windows. 0 0 Operating System :: Microsoft :: Windows 199 :: 214 :: 216
+217 2000032101 216 199 win31 Windows 3.1 or Earlier Windows 3.1 or Earlier 0 0 Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier 199 :: 214 :: 216 :: 217
+218 2000032101 216 199 win95 Windows 95/98/2000 Windows 95, Windows 98, and Windows 2000. 0 0 Operating System :: Microsoft :: Windows :: Windows 95/98/2000 199 :: 214 :: 216 :: 218
+219 2000041101 216 199 winnt Windows NT/2000 Windows NT and Windows 2000. 0 0 Operating System :: Microsoft :: Windows :: Windows NT/2000 199 :: 214 :: 216 :: 219
+220 2000032101 199 199 os2 OS/2 OS/2 0 0 Operating System :: OS/2 199 :: 220
+221 2000032101 199 199 macos MacOS MacOS 0 0 Operating System :: MacOS 199 :: 221
+222 2000032101 216 199 wince Windows CE Windows CE 0 0 Operating System :: Microsoft :: Windows :: Windows CE 199 :: 214 :: 216 :: 222
+223 2000032101 199 199 palmos PalmOS PalmOS (for Palm Pilot) 0 0 Operating System :: PalmOS 199 :: 223
+224 2000032101 199 199 beos BeOS BeOS 0 0 Operating System :: BeOS 199 :: 224
+225 2000032101 0 0 environment Environment Run-time environment required for this program. 0 0 Environment 225
+226 2000041101 225 225 console Console (Text Based) Console-based programs. 0 0 Environment :: Console (Text Based) 225 :: 226
+227 2000032401 226 225 curses Curses Curses-based software. 0 0 Environment :: Console (Text Based) :: Curses 225 :: 226 :: 227
+228 2000040701 226 225 newt Newt Newt 0 0 Environment :: Console (Text Based) :: Newt 225 :: 226 :: 228
+229 2000040701 225 225 x11 X11 Applications Programs that run in an X windowing environment. 0 0 Environment :: X11 Applications 225 :: 229
+230 2000040701 225 225 win32 Win32 (MS Windows) Programs designed to run in a graphical Microsoft Windows environment. 0 0 Environment :: Win32 (MS Windows) 225 :: 230
+231 2000040701 229 225 gnome Gnome Programs designed to run in a Gnome environment. 0 0 Environment :: X11 Applications :: Gnome 225 :: 229 :: 231
+232 2000040701 229 225 kde KDE Programs designed to run in a KDE environment. 0 0 Environment :: X11 Applications :: KDE 225 :: 229 :: 232
+233 2000040701 225 225 other Other Environment Programs designed to run in an environment other than one listed. 0 0 Environment :: Other Environment 225 :: 233
+283 2000121901 282 18 History History History / Informational 0 0 Topic :: Sociology :: History 18 :: 282 :: 283
+235 2000041001 199 199 independent OS Independent This software does not depend on any particular operating system. 0 0 Operating System :: OS Independent 199 :: 235
+236 2000040701 199 199 other Other OS Program is designe for a nonlisted operating system. 0 0 Operating System :: Other OS 199 :: 236
+237 2000041001 225 225 web Web Environment This software is designed for a web environment. 0 0 Environment :: Web Environment 225 :: 237
+238 2000041101 225 225 daemon No Input/Output (Daemon) This program has no input or output, but is intended to run in the background as a daemon. 0 0 Environment :: No Input/Output (Daemon) 225 :: 238
+284 2000121901 282 18 Genealogy Genealogy Family History / Genealogy 0 0 Topic :: Sociology :: Genealogy 18 :: 282 :: 284
+240 2000041301 200 199 gnuhurd GNU Hurd GNU Hurd 0 0 Operating System :: POSIX :: GNU Hurd 199 :: 200 :: 240
+55 2000031601 18 18 desktop Desktop Environment Accessories, managers, and utilities for your GUI desktop. 0 0 Topic :: Desktop Environment 18 :: 55
+58 2000031601 55 18 gnome Gnome Software for the Gnome desktop. 0 0 Topic :: Desktop Environment :: Gnome 18 :: 55 :: 58
+57 2000031601 55 18 kde K Desktop Environment (KDE) Software for the KDE desktop. 0 0 Topic :: Desktop Environment :: K Desktop Environment (KDE) 18 :: 55 :: 57
+61 2000031601 57 18 themes Themes Themes for KDE. 0 0 Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes 18 :: 55 :: 57 :: 61
+56 2000031601 55 18 windowmanagers Window Managers Programs that provide window control and application launching. 0 0 Topic :: Desktop Environment :: Window Managers 18 :: 55 :: 56
+59 2000031601 56 18 enlightenment Enlightenment Software for the Enlightenment window manager. 0 0 Topic :: Desktop Environment :: Window Managers :: Enlightenment 18 :: 55 :: 56 :: 59
+60 2000031601 59 18 themes Themes Themes for the Enlightenment window manager. 0 0 Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes 18 :: 55 :: 56 :: 59 :: 60
+62 2000031601 55 18 screensavers Screen Savers Screen savers and lockers. 0 0 Topic :: Desktop Environment :: Screen Savers 18 :: 55 :: 62
+259 2000071401 45 18 codegen Code Generators Code Generators 0 0 Topic :: Software Development :: Code Generators 18 :: 45 :: 259
+52 2000031601 45 18 versioncontrol Version Control Tools for managing multiple versions of evolving sources or documents. 0 0 Topic :: Software Development :: Version Control 18 :: 45 :: 52
+160 2000032001 0 0 language Programming Language Language in which this program was written, or was meant to support. 0 0 Programming Language 160
+161 2000032001 160 160 apl APL APL 0 0 Programming Language :: APL 160 :: 161
+164 2000032001 160 160 c C C 0 0 Programming Language :: C 160 :: 164
+162 2000032001 160 160 assembly Assembly Assembly-level programs. Platform specific. 0 0 Programming Language :: Assembly 160 :: 162
+163 2000051001 160 160 ada Ada Ada 0 0 Programming Language :: Ada 160 :: 163
+165 2000032001 160 160 cpp C++ C++ 0 0 Programming Language :: C++ 160 :: 165
+166 2000032401 160 160 eiffel Eiffel Eiffel 0 0 Programming Language :: Eiffel 160 :: 166
+167 2000032001 160 160 euler Euler Euler 0 0 Programming Language :: Euler 160 :: 167
+168 2000032001 160 160 forth Forth Forth 0 0 Programming Language :: Forth 160 :: 168
+169 2000032001 160 160 fortran Fortran Fortran 0 0 Programming Language :: Fortran 160 :: 169
+170 2000032001 160 160 lisp Lisp Lisp 0 0 Programming Language :: Lisp 160 :: 170
+171 2000041101 160 160 logo Logo Logo 0 0 Programming Language :: Logo 160 :: 171
+172 2000032001 160 160 ml ML ML 0 0 Programming Language :: ML 160 :: 172
+173 2000032001 160 160 modula Modula Modula-2 or Modula-3 0 0 Programming Language :: Modula 160 :: 173
+174 2000032001 160 160 objectivec Objective C Objective C 0 0 Programming Language :: Objective C 160 :: 174
+175 2000032001 160 160 pascal Pascal Pascal 0 0 Programming Language :: Pascal 160 :: 175
+176 2000032001 160 160 perl Perl Perl 0 0 Programming Language :: Perl 160 :: 176
+177 2000032001 160 160 prolog Prolog Prolog 0 0 Programming Language :: Prolog 160 :: 177
+178 2000032001 160 160 python Python Python 0 0 Programming Language :: Python 160 :: 178
+179 2000032001 160 160 rexx Rexx Rexx 0 0 Programming Language :: Rexx 160 :: 179
+180 2000032001 160 160 simula Simula Simula 0 0 Programming Language :: Simula 160 :: 180
+181 2000032001 160 160 smalltalk Smalltalk Smalltalk 0 0 Programming Language :: Smalltalk 160 :: 181
+182 2000032001 160 160 tcl Tcl Tcl 0 0 Programming Language :: Tcl 160 :: 182
+183 2000032001 160 160 php PHP PHP 0 0 Programming Language :: PHP 160 :: 183
+263 2000080401 160 160 euphoria Euphoria Euphoria programming language - http://www.rapideuphoria.com/ 0 0 Programming Language :: Euphoria 160 :: 263
+264 2000080701 160 160 erlang Erlang Erlang - developed by Ericsson - http://www.erlang.org/ 0 0 Programming Language :: Erlang 160 :: 264
+267 2000082001 160 160 zope Zope Zope Object Publishing 0 0 Programming Language :: Zope 160 :: 267
+269 2000082801 160 160 asm Assembly ASM programming 0 0 Programming Language :: Assembly 160 :: 269
+271 2000092001 160 160 csharp C# Microsoft's C++/Java Language 0 0 Programming Language :: C# 160 :: 271
+273 2000102001 160 160 Pike Pike Pike, see http://pike.roxen.com/. 0 0 Programming Language :: Pike 160 :: 273
+184 2000032001 160 160 asp ASP Active Server Pages 0 0 Programming Language :: ASP 160 :: 184
+185 2000032001 160 160 shell Unix Shell Unix Shell 0 0 Programming Language :: Unix Shell 160 :: 185
+186 2000032001 160 160 visualbasic Visual Basic Visual Basic 0 0 Programming Language :: Visual Basic 160 :: 186
+198 2000032001 160 160 java Java Java 0 0 Programming Language :: Java 160 :: 198
+213 2000032101 160 160 other Other Other programming language, specified in description. 0 0 Programming Language :: Other 160 :: 213
+242 2000042701 160 160 scheme Scheme Scheme programming language. 0 0 Programming Language :: Scheme 160 :: 242
+254 2000071101 160 160 plsql PL/SQL PL/SQL Programming Language 0 0 Programming Language :: PL/SQL 160 :: 254
+255 2000071101 160 160 progress PROGRESS PROGRESS Programming Language 0 0 Programming Language :: PROGRESS 160 :: 255
+258 2000071101 160 160 objectpascal Object Pascal Object Pascal 0 0 Programming Language :: Object Pascal 160 :: 258
+261 2000072501 160 160 xbasic XBasic XBasic programming language 0 0 Programming Language :: XBasic 160 :: 261
+262 2000073101 160 160 coldfusion Cold Fusion Cold Fusion Language 0 0 Programming Language :: Cold Fusion 160 :: 262
+304 2001041701 189 13 mpl10 Mozilla Public License 1.0 Mozilla Public License 1.0 0 0 License :: OSI Approved :: Mozilla Public License (MPL) :: Mozilla Public License 1.0 13 :: 14 :: 189 :: 304
+188 2000032001 14 13 mit MIT/X Consortium License MIT License, also the X Consortium License. 0 0 License :: OSI Approved :: MIT/X Consortium License 13 :: 14 :: 188
+187 2000032001 14 13 bsd BSD License BSD License 0 0 License :: OSI Approved :: BSD License 13 :: 14 :: 187
+17 2000032001 14 13 artistic Artistic License The Perl Artistic License 0 0 License :: OSI Approved :: Artistic License 13 :: 14 :: 17
+16 2000050801 14 13 lgpl GNU Lesser General Public License (LGPL) GNU Lesser General Public License 0 0 License :: OSI Approved :: GNU Lesser General Public License (LGPL) 13 :: 14 :: 16
+15 2000032001 14 13 gpl GNU General Public License (GPL) GNU General Public License. 0 0 License :: OSI Approved :: GNU General Public License (GPL) 13 :: 14 :: 15
+280 2000110101 160 160 JavaScript JavaScript Java Scripting Language 0 0 Programming Language :: JavaScript 160 :: 280
+281 2000111401 160 160 REBOL REBOL REBOL Programming Language 0 0 Programming Language :: REBOL 160 :: 281
+265 2001032001 160 160 Delphi Delphi/Kylix Borland/Inprise Delphi or other Object-Pascal based languages 0 0 Programming Language :: Delphi/Kylix 160 :: 265
+293 2001032001 160 160 ruby Ruby Ruby programming language 0 0 Programming Language :: Ruby 160 :: 293
+45 2000031601 18 18 development Software Development Software used to aid software development. 0 0 Topic :: Software Development 18 :: 45
+99 2000031601 18 18 multimedia Multimedia Graphics, sound, video, and multimedia. 0 0 Topic :: Multimedia 18 :: 99
+296 2001041701 14 13 asl Apache Software License Apache Software License 0 0 License :: OSI Approved :: Apache Software License 13 :: 14 :: 296
+274 2000102401 0 0 natlanguage Natural Language The oral/written language for the development and use of this software. 0 0 Natural Language 274
+295 2001040601 274 274 russian Russian Projects having something to do with Russian Language 0 0 Natural Language :: Russian 274 :: 295
+275 2000102401 274 274 english English English 0 0 Natural Language :: English 274 :: 275
+276 2000102401 274 274 french French French 0 0 Natural Language :: French 274 :: 276
+277 2000102401 274 274 spanish Spanish Spanish 0 0 Natural Language :: Spanish 274 :: 277
+278 2000102601 274 274 japanese Japanese Projects using the Japanese language 0 0 Natural Language :: Japanese 274 :: 278
+279 2000102601 274 274 german German Projects using the German language 0 0 Natural Language :: German 274 :: 279
+298 2001041701 14 13 sissl Sun Internet Standards Source License Sun Internet Standards Source License 0 0 License :: OSI Approved :: Sun Internet Standards Source License 13 :: 14 :: 298
+300 2001041701 14 13 josl Jabber Open Source License Jabber Open Source License 0 0 License :: OSI Approved :: Jabber Open Source License 13 :: 14 :: 300
+302 2001041701 14 13 sleepycat Sleepycat License Sleepycat License 0 0 License :: OSI Approved :: Sleepycat License 13 :: 14 :: 302
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/coding_standards.html
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/coding_standards.html (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/coding_standards.html 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,479 @@
+<!-- ------------------------ HEADER ------------------------ -->
+<html>
+<head>
+ <title>SourceForge: PHP Coding Standards</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<table width="100%">
+ <tr>
+ <td>
+ <b><font size=+1>SourceForge: PHP Coding Standards</font></b><br>
+ <font size="-1">$Id: coding_standards.html,v 1.3 2001/05/17 17:19:37 dbrogdon Exp $<br>
+ SourceForge Engine Team [<a href="mailto:alexandria-devel at sourceforge.net">email</a>]</font>
+ </td>
+ <td>
+ <a href="http://sourceforge.net"><img src="/images/sflogo2-105a.png" width="108" height="53" border="0"></a>
+ </td>
+ </tr>
+</table>
+
+<!-- ------------------------ MENU ------------------------ -->
+<p><hr><p>
+
+<dd>
+ <a href="#0">0. Introduction</a>
+</dd>
+
+<dd>
+ <a href="#1">1. Comments</a>
+</dd>
+
+<dd>
+ <a href="#2">2. Formatting</a>
+</dd>
+
+<dd>
+ <a href="#3">3. Templating</a>
+</dd>
+
+<dd>
+ <a href="#4">4. Expressions</a>
+</dd>
+
+<dd>
+ <a href="#5">5. Functions</a>
+</dd>
+
+<dd>
+ <a href="#6">6. Objects</a>
+</dd>
+
+<dd>
+ <a href="#7">7. Naming</a>
+</dd>
+
+<dd>
+ <a href="#8">8. Control Statements</a>
+</dd>
+
+<dd>
+ <a href="#9">9. Including PHP Files</a>
+</dd>
+
+<!-- ------------------------ SECTION 0 ------------------------ -->
+<p><hr><p>
+
+<a NAME="0"></b></a><b>0. Introduction</b></a>
+
+<p>
+Coding Standards. Live them, love them.
+
+<p>
+Then come up with a new introduction...
+
+<!-- ------------------------ SECTION 1 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></b></a><b>1. Comments</b></a>
+
+<p>
+<b>Guidelines</b>
+
+<p>
+Non-documentation comments are strongly encouraged. A general rule of
+thumb is that if you look at a section of code and think "Wow, I don't
+want to try and describe that", you need to comment it before you
+forget how it works.
+
+<ul>
+ <li>C++ style comments (/* */) and standard C comments (//) are both acceptable.
+ <li>Use of perl/shell style comments (#) is prohibited.
+</ul>
+
+<p>
+<b>PHPdoc Tags</b>
+
+<p>
+Inline documentation for classes should follow the PHPDoc convention,
+similar to Javadoc. More information about PHPDoc can be found here:
+
+<p>
+<a href="http://www.phpdoc.de/">http://www.phpdoc.de/</a>
+
+<p>
+<b>File Comments:</b>
+
+<p>
+Every file should start with a comment block describing its purpose,
+version, author and a copyright message. The comment block should be a
+block comment in standard JavaDoc format along with a CVS Id tag.
+While all JavaDoc tags are allowed, only the tags in the examples
+below will be parsed by PHPdoc. The following header should be used in
+all PHP files:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+/**
+ *
+ * brief description.
+ * long description. more long description.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: coding_standards.html,v 1.3 2001/05/17 17:19:37 dbrogdon Exp $
+ *
+ */
+</pre>
+</td></tr>
+</table>
+
+<p>
+<b>Function and Class Comments:</b>
+
+<p>
+Similarly, every function should have a block comment specifying name,
+parameters, return values, and last change date.
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+/**
+ * brief description.
+ * long description. more long description.
+ *
+ * @author firstname lastname email
+ * @param variable description
+ * @return value description
+ * @date YYYY-MM-DD
+ * @deprecated
+ * @see
+ *
+ */
+</pre>
+</td></tr>
+</table>
+
+<p>
+<b>Note</b>
+
+<p>
+The placement of periods in the short and long descriptions is
+important to the PHPdoc parser. The first period always ends the
+short description. All future periods are part of the long
+description, ending with a blank comment line. The long comment is
+optional.
+
+<!-- ------------------------ SECTION 2 ------------------------ -->
+<p><hr><p>
+
+<a NAME="2"></b></a><b>2. Formatting</b></a>
+
+<p>
+<b>Indenting</b>
+
+<p>
+All indenting is done with TABS. Before committing any file to CVS, make sure
+you first replace spaces with tabs and verify the formatting.
+
+<p>
+<b>PHP Tags</b>
+
+<p>
+The use of <code><?php ?></code> to delimit PHP code is
+required. Using <code><? ?></code> is not valid. This is the
+most portable way to include PHP code on differing operating systems
+and webserver setups. Also, XML parsers are confused by the
+shorthand syntax.
+
+<!-- ------------------------ SECTION 3 ------------------------ -->
+<p><hr><p>
+
+<a NAME="3"></b></a><b>3. Templating</b></a>
+
+<p>
+In the SourceForge system, PHP itself is used as the template
+language. To make the templating clearer, template files should be
+separated out and included once objects and database results are
+established. Detailed examples are in the docs repository and online
+at:
+
+<p>
+<a href="http://webdev.docs.sourceforge.net/architecture/templating.php">http://webdev.docs.sourceforge.net/architecture/templating.php</a>
+
+<p>
+Variables in the templates are presented surrounded by <?php ?>
+tags instead of the {} tags that some other template libraries would
+use. The end result is the same, with less bloat and more efficient code.
+
+<!-- ------------------------ SECTION 4 ------------------------ -->
+<p><hr><p>
+
+<a NAME="4"></b></a><b>4. Expressions</b></a>
+
+<ul>
+ <li>Use parentheses liberally to resolve ambiguity.
+ <li>Using parentheses can force an order of evaluation. This saves the time a reader may spend remembering precedence of operators.
+ <li>Don't sacrifice clarity for cleverness.
+ <li>Write conditional expressions so that they read naturally aloud.
+ <li>Sometimes eliminating a not operator <code>(!)</code> will make an expression more understandable.
+ <li>Keep each line simple.
+ <li>The ternary operator <code>(x ? 1 : 2)</code> usually indicates too much code on one line. <code>if... else if... else</code> is usually more readable.
+</ul>
+
+<!-- ------------------------ SECTION 5 ------------------------ -->
+<p><hr><p>
+
+<a NAME="5"></b></a><b>5. Functions</b></a>
+
+<p>
+<b>Function Calls</b>
+
+<p>
+Functions shall be called with no spaces between the function name,
+the opening parenthesis, and the first parameter; spaces between
+commas and each parameter, and no space between the last parameter,
+the closing parenthesis, and the semicolon. Here's an example:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+$var = foo($bar, $baz, $quux);
+</pre>
+</td></tr>
+</table>
+
+<p>
+As displayed above, there should be one space on either side of an
+equals sign used to assign the return value of a function to a
+variable. In the case of a block of related assignments, more space
+may be inserted to promote readability:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+$short = foo($bar);
+$long_variable = foo($baz);
+</pre>
+</td></tr>
+</table>
+
+<p>
+<b>Function Definitions</b>
+
+<p>
+Function declarations follow the unix convention:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+function fooFunction($arg1, $arg2 = '') {
+ if (condition) {
+ statement;
+ }
+ return $val;
+}
+</pre>
+</td></tr>
+</table>
+
+<p>
+Arguments with default values go at the end of the argument list.
+Always attempt to return a meaningful value from a function if one is
+appropriate. Here is a slightly longer example:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+function connect(&$dsn, $persistent = false) {
+ if (is_array($dsn)) {
+ $dsninfo = &$dsn;
+ } else {
+ $dsninfo = DB::parseDSN($dsn);
+ }
+
+ if (!$dsninfo || !$dsninfo['phptype']) {
+ return $this->raiseError();
+ }
+
+ return true;
+}
+</pre>
+</td></tr>
+</table>
+
+<!-- ------------------------ SECTION 6 ------------------------ -->
+<p><hr><p>
+
+<a NAME="6"></b></a><b>6. Objects</b></a>
+
+<p>
+Objects should generally be "normalized" similar to a
+database so they contain only the attributes that make sense.
+
+<p>
+Each object should have Error.class as the abstract parent object
+unless the object or its subclasses will never produce errors.
+
+<p>
+Each object should also have a <code>create()</code> method which does
+the work of inserting a new row into the database table that this
+object represents.
+
+<p>
+An <code>update()</code> method is also required for any objects
+that can be changed. Individual <code>set()</code> methods are
+generally not a good idea as doing separate updates to each field in
+the database is a performance bottleneck.
+
+<p>
+Common sense about performance should be used when designing objects.
+
+<!-- ------------------------ SECTION 7 ------------------------ -->
+<p><hr><p>
+
+<a NAME="7"></b></a><b>7. Naming</b></a>
+
+<ul>
+
+<li>Constants should always be uppercase, with underscores to separate
+words. Prefix constant names with the name of the class/package they
+are used in. For example, the constants used by the DB:: package all
+begin with "DB_".
+
+<li>True and false are built in to the php language and behave like
+constants, but should be written in lowercase to distinguish them from
+user-defined constants.
+
+
+<li>Function names should suggest an action or verb:
+<code>updateAddress, makeStateSelector</code>
+
+<li>Variable names should suggest a property or noun: <code>UserName,
+Width</code>
+
+<li>Use pronounceable names. Common abbreviations are acceptable as
+long as they are used the same way throughout the project.
+
+<li>Be consistent, use parallelism. If you are abbreviating number as
+'num', always use that abbreviation. Don't switch to using
+<code>no</code> or <code>nmbr</code>.
+
+<li>
+Use descriptive names for variables used globally, use short names for
+variables used locally.</li>
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+$AddressInfo = array(...);
+
+for($i=0; $i < count($list); $i++)
+</pre>
+</td></tr>
+</table>
+
+</ul>
+
+<!-- ------------------------ SECTION 8 ------------------------ -->
+<p><hr><p>
+
+<a NAME="8"></b></a><b>8. Control Structures</b></a>
+
+<p>
+These include if, for, while, switch, etc. Here is an example if
+statement, since it is the most complicated form:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>
+if ((condition1) || (condition2)) {
+ action1;
+} elseif ((condition3) && (condition4)) {
+ action2;
+} else {
+ defaultaction;
+}
+</pre>
+</td></tr>
+</table>
+
+<p>
+Control statements shall have one space between the control
+keyword and opening parenthesis, to distinguish them from function
+calls.
+
+<p>
+You should use curly braces even in situations where they are
+technically optional. Having them increases readability and decreases
+the likelihood of logic errors being introduced when new lines are
+added.
+
+<p>
+For switch statements:
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>switch (condition) {
+ case 1: {
+ action1;
+ break;
+ }
+ case 2: {
+ action2;
+ break;
+ }
+ default: {
+ defaultaction;
+ break;
+ }
+}</pre>
+</td></tr>
+</table>
+
+<!-- ------------------------ SECTION 9 ------------------------ -->
+<p><hr><p>
+
+<a NAME="9"></b></a><b>9. Including PHP Files</b></a>
+
+<p>
+Anywhere you are unconditionally including a class file, use
+require_once. Anywhere you are conditionally including a class file
+(for example, factory methods), use include_once. Either of these will
+ensure that class files are included only once. They share the same
+file list, so you don't need to worry about mixing them - a file
+included with require_once will not be included again by include_once.
+
+Note: include_once and require_once are statements, not functions. You
+don't need parentheses around the filename to be included, however you
+should do it anyway and use ' (apostrophes) not " (quotes):
+
+<p>
+<table border="0" cellspacing="1" cellpadding="5" bgcolor="#CCCCCC">
+<tr><td>
+<pre>include('pre.php');</pre>
+</td></tr>
+</table>
+
+
+<!-- ------------------------ FOOTER ------------------------ -->
+<p><hr><p>
+
+<p align="right">
+ <font size="-1">
+ Copyright © 1999, 2000, 2001 <a href="http://www.valinux.com/">VA Linux Systems, Inc.</a>
+ </font>
+</body>
+</html>
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/sf2.sda
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/sf2.sda (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/sf2.sda 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,614 @@
+ÐÏࡱá ; þÿ ª þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿ
+
+ ! " # $ % & ' ( ) * + , - . / 0 þÿÿÿ2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ R o o t E n t r y ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ þÿÿÿþÿÿÿþÿÿÿ
+
+ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ
+ ÿÿÿÿ .½
ÑÐ )ä°± Drawing
+ StarDraw 5.0 ñÿÿÚ c Vk SfxDocumentInfo ë01¼Û] BU1¼? uKô Info 0 Info 1 Info 2 Info 3 ë01@`U 85#" < 1,,,1 þÿ à
òùOh« +'³Ù0 ø h
+ t
+ ¤ ° ¼ È Ô à ì 34 @ ó{ @ pJ2 @ ¹¿{T¦À@ ±¤3-À »» ÿÿ XOutdevItemPool 1 èèéêëìíîïðñòóôõö÷øùúûüý
+ è)èéêëìíîïðñùúûüýþ
+
+&'()*+,-./06789:;UVWXYZ[\] ècèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst ètèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef ¡ d î ì Ñ 0 ê ¹'è @ q X X º'é , @ ÿÿÿÿ X »'ê . @ ß 2 X X X ¼'ë @
+ ÿÿÿÿ X ½'ì å @ ø ÿÿÿÿ Arrowÿÿÿÿ
+ Arrowÿÿÿÿ d È d Arrowÿÿÿÿ } ú ú ú } X X XS X ¾'í ª @ ² ÿÿÿÿ Arrowÿÿÿÿ d È d Arrowÿÿÿÿ } ú ú ú } X X X_ ¿'î : @ ô , ¼ È ú X X X X& À'ï . @ 2 , È ú X X X Á'ð @ ^ X X Â'ñ @ X òò
+ @ óó
+ @ ± ôô
+ @ Ç õõ
+ @ Ý öö
+ @ ó ÷÷
+ @ øø
+ @ ´'ú @ A % ! X X µ'û @
+ A ÿÿÿÿ ¸¸ÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÌÌ ÿÿÿÿ ÿÿÿÿÿÿ
+ Light grayÿÿÿÿ ÀÀÀÀÀÀ
+ Gray 20%ÿÿÿÿ ÌÌÌÌÌÌ Gray 30%ÿÿÿÿ ³³³³³³ Red 4ÿÿÿÿ ÿÿ3333 Magenta 4ÿÿÿÿ ffÌÌ Blue 8ÿÿÿÿ ÌÌÿÿX X X2 XD XV Xr X X¦ X½ XØ ¶'ü 6 @ § ÿÿÿÿ ÿÿÿÿÿÿ 2 2 d d X ·'ý ( @ Û ÿÿÿÿ X ¸'þ " @
+ ÿÿÿÿ BMv v ( @ @ SD Ä @ x^íSI
+Ã0ô¯s½å\èzéü ÿ
+ª46Z
Bn8xÇ)1²Ì³.<è§B+ï ̨ޢÏ40:prf
+·í|q±ìüâÊ]~½+Háë~|ðWíF¼ðúúMñbÀö þâPÙ@úaüoÌCÄØ[½È¡z¼6~U{Ûß<ª½Õ?¥ ü{¿rü=+Îý÷ô|´¨ý¿.©MåÛxò³åG¦
+Ü«±X ÿÿ
+ @ #
+
+ @ 9
+
+ @ O
+
+ @ e
+
+ @ {
+
+ @
+
+ @ §
+
+ @ ½
+
+ @ Ó
+
+ @ é
+
+ @ ÿ
+
+
+
+ @
+ @ +
+ @ A
+
+
+ @ W
+ @ m
+ @
+ @
+ @ ¯
+ @ Å
+ @ Û
+ @ ñ
+ @
+ @ (
+ @ 3 (
+ @ I (
+ @ _ (
+ @ u (
+ @ (
+ @ ¡ (
+ @ · (
+ @ Í (
+ @ ã (!
+ @ ù ("
+ @
+ (#
+ @ %
+ $$
+ @ ;
+ %%
+ @ Q
+ &&
+ @ g
+ ''
+ @ }
+ ((
+ @
+ ))
+ @ ©
+ ;(+ @ É
+ X X ,, @ ù
+ ÿÿÿÿ X -- " @ # , È X X .. " @ Q , È X X //
+ @ o 00
+ @
11
+ @ 22
+ @ ± 33
+ @ Ç 44
+ @ Ý 55
+ @ ó 66
+ @ II @ '
+ ô X JJ : @ a ¸g A% \) X X X X& KK @ X X (L
+ @ ¯ MM
+ @ Å NN
+ @ Û OO
+ @ ñ PP
+ @ QQ @ # ? X RR
+ @ = SS " @ c
+ ÄK X X TT
+ @ UU @ X VV @ Â = X X WW
+ @ à XX
+ @ ö YY
+ @ ZZ
+ @ " [[
+ @ 8 \\
+ @ N ]]
+ @ d ^^
+ @ z __
+ @ ``
+ @ ¦ aa
+ @ ¼ bb
+ @ Ò cc
+ @ è dd
+ @ þ ee
+ @ gg @ 0 X hh
+ @ J ii
+ @ ` jj
+ @ v kk
+ @ ll
+ @ ¢ mm
+ @ ¸ nn
+ @ Î oo
+ @ ä pp
+ @ ú qq
+ @ rr
+ @ & ss
+ @ < tt
+ @ R uu
+ @ h vv
+ @ ~ ww
+ @ xx
+ @ ª yy
+ @ À
+ @ Ö
+ @ ì
+ @
+ @
+ @ .
+ @ D
+ @ Z ùù @ 0 è¹' è¹' è¹' ì½' í¾' î¿' ïÀ' è¹' ë¼' è¹' #
+ ì½' í¾' î¿' ïÀ' è¹' ë¼' í¾' ïÀ'
+ X X X X& X2 X> XD Xb Xt X X X¤ X¶ XÈ ¢ @ Â ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ'
+ ú´' ûµ' ú´' ûµ'
+ ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ûµ' X X X& X, X> XP Xb Xh Xz X X X° X¶ XÈ XÚ Xì Xþ X X" X4 XF ** Z @ \ ? X X X X X& X, X2 X8 77 Z @ Â ? X X X X X& X, X2 X8 HH î @ t £+' £+' £+' ¦' §' ©' £+' <( @' £+' ¦' §' ©' <( @' £+' ¦' §' ©'
+ ¦' §' <( @' ¦' §'
+ £+' ¦' §' ©' £+' <( @' £+' ¦' §' ©' <( @' £+' ¦' §' ©' <(
+( @' £+' <(
+( @' £+' ¦' §' £+' ¦' §' ¦' §' ¦' §' ©'
+ <( @' ¦' §'
+ ¦' §'
+ ¦' §' £+' ¦' §' ©' X X X X, X2 X8 XV Xb X XÂ XÈ XÚ Xþ X X" X. X^ X X² Xâ Xú X X$ XH XZ Xl ff ¢ @ N JJ KK QQ VV JJ KK JJ KK QQ VV JJ KK JJ KK
+ II QQ VV QQ VV JJ KK SS UU VV JJ JJ KK
+ II QQ VV . QQ VV JJ KK SS UU VV
+ JJ JJ KK SS UU VV X X, X> X\ Xn X X Xª XÎ XÚ Xì X X X: XF zz * @ ¸ gg gg X X @ â X X 8 p ª Ö Ç } Ã ý % D Z p ² È Þ ( j Ì â ø $ : P f | ¨ ¾ Ô ê , B X n ° Æ Ü ò 4 J ` v ¢ ¸ Î ä ú
+ &
+ <
+ R
+ h
+
+ ¼
+ ê
+ . D Z p ² È ê 0 X n ° Æ æ ü *
+ @
+ _
+
+
+ µ
+ Ë
+ á
+ ÷
+
+ # 9 O e { § ½ Ó ó 5 K a w £ ¹ Ï å û ' = S i « Á × í ' Õ ; ¡ I
+ P $ ' EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ï 0 / e@
+ @ R *
+ @ h
+ @ ~ g* J @ ¼8
+ , StarBats N ÿ - ¨ý°° , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ý` ` , StarBats N ÿ - ¨ý¸¸ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýhh , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýpp , StarBats N ÿ -
+ X , StarBats N ÿ - ¨ý°° , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ý` ` , StarBats N ÿ - ¨ý¸¸ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýhh , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýpp , StarBats N ÿ -
+ È È , StarBats N ÿ - ¨ý°° , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ý` ` , StarBats N ÿ - ¨ý¸¸ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýhh , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýpp , StarBats N ÿ -
+ Z ð d |ü°° , StarBats N ÿ - àü` ` , StarBats N ÿ K ¨ý , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ K ¨ýpp , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýÐ Ð , StarBats N ÿ - ¨ý%% , StarBats N ÿ - ¨ý0*0* , StarBats N ÿ - Z
+ , StarBats ÿ - èè , StarBats ÿ - ÐÐ , StarBats ÿ - ¸¸ , StarBats ÿ - , StarBats ÿ - , StarBats ÿ - pp , StarBats ÿ - XX , StarBats ÿ - @@ , StarBats ÿ - (#(# , StarBats ÿ - ¨ýXX , StarBats i ÿ - ¨ý°° , StarBats i ÿ - ¨ý , StarBats i ÿ - ¨ý` ` , StarBats i ÿ - ¨ý¸¸ , StarBats i ÿ - ¨ý , StarBats i ÿ - ¨ýhh , StarBats i ÿ - ¨ýÀÀ , StarBats i ÿ - ¨ý , StarBats i ÿ - X X. XN Xn X\ X|
+ @ ê8 @ 9 X X ! @ =9 ! d d üd x X <( @ ]9 " X
+( @ é9 StarBats ° ! - StarBats ! - X XG @' 5 @
+ þ: ! d d d d d Xd d È d d ,d d |üd ° @d d àüd ` ¸d d ¨ýd hd d ¨ýd À d d ¨ýd p Èd d ¨ýd xd d ¨ýd Ð
+ (#d d ¨ýd % Ø'd d ¨ýd 0* d d ¨ýd X X X! X4 XG XZ Xm X X X¦ X¹ XÌ Xß Xò A'¡ @ ¨; d d d d d d ¤d Ò d d ôd d d d ,d d È d d d d X X X& X2 X> XJ XV Xb 1'¢ @ é; d È X +'£ ( @ < ' X X X '¤
+ @ 7< !'¥ @ Y< X '¦ 8 @ < M helvetica timmons X X" '§ Ü @ M= `d
+ Nd
+ 4d
+ d
+ öd
+ {d
+ îd
+ ' §d
+ hd
+ Ûd
+
+ Ád
+ d
+ id
+
+ íd
+ `d
+ X X X" X, X6 X@ XJ XT X^ Xh Xr X| X X X ?(¨
+ @ = '© @ ¿= X X 'ª @ â= X '« @ > X '¬ @ %> X X ' @ H> X '® @ g> X %'¯
+ @ > S'°
+ @ > "'±
+ @ > '²
+ @ Ã> $'³
+ @ Ù> *´
+ @ ï> *µ
+ @ ? *¶
+ @ ? *·
+ @ 1? *¸
+ @ G? *¹
+ @ ]? *º
+ @ s? *»
+ @ ? *¼
+ @ ? *½
+ @ µ? *¾
+ @ Ë? ¿¿
+ @ á? ÀÀ
+ @ ÷? ÁÁ
+ @
+@ ÂÂ
+ @ #@ ÃÃ
+ @ 9@ *Ä
+ @ O@ {(Å
+ @ e@ $ : P ¦ ¼ æ 3 Ã ¿ ó / s [ q ¸ × ÿ = S i « Á × í / E [ q ³ É ß õ ! P
+ wF g*
+ ¨ýXX , StarBats N ÿ - ¨ý°° , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ý` ` , StarBats N ÿ - ¨ý¸¸ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýhh , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ - ¨ý , StarBats N ÿ - ¨ýpp , StarBats N ÿ -
+( StarBats ° ! - !'¥ '¦ times '§ Od
+ $'³ *´ *µ *¶ > Andale WT UI;MS Mincho;HG Mincho L;MS PGothic;Arial Unicode MS *· / Simplified Arabic;Andale WT UI;Arial Unicode MS *¸ Od
+ *¹ Od
+ 0 8 s § ¯ · > J ü 2 î + ÿT Standard Standard ¾é # è¹' éº' ê»' ë¼' ì½' í¾' î¿' ïÀ' ðÁ' ñÂ' ú´' ûµ' ü¶' ý·' þ¸' +;( ,, -- .. g*
+( @' ¡A' ¢1' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Object with arrow Standard Object with arrow ¿é è¹' ê»' ë¼' ì½' î¿' ïÀ' ðÁ' Object with shadow Standard Object with shadow Àé +;( ,, -- .. Object without fill Standard Object without fill Áé ú´' Text Standard Text Âé è¹' ú´' Text body Standard Text body Ãé è¹' ú´' §' Text body justfied Standard Text body justfied Äé è¹' ú´' £+' First line indent Standard First line indent Åé è¹' ú´' g* @' Title Standard Title Æé è¹' ú´' §' Title1 Standard Title1 Çé è¹' ú´' ûµ' +;( ,, -- .. £+' §' Title2 Standard Title2 Èé ê»' ûµ' +;( ,, -- .. g* @' ¡A' £+' §' Heading Standard Heading Éé è¹' ú´' ¡A' §' Heading1 Standard Heading1 Êé è¹' ú´' ¡A' §' ©' Heading2 Standard Heading2 Ëé è¹' ú´' ¡A' §' ©' ¬' Dimension Line Standard Dimension Line Ìé è¹' ì½' í¾' î¿' ïÀ' ú´' §' Home~LT~Gliederung 1 Home~LT~Gliederung 1þ¯ÿß Ïé è¹' ú´' g* @' ¡A' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Gliederung 2 Home~LT~Gliederung 1 Home~LT~Gliederung 2þ¯ÿß Ðé @' ¡A' §' Home~LT~Gliederung 3 Home~LT~Gliederung 2 Home~LT~Gliederung 3þ¯ÿß Ñé @' ¡A' §' Home~LT~Gliederung 4 Home~LT~Gliederung 3 Home~LT~Gliederung 4þ¯ÿß Òé @' ¡A' §'
+ Home~LT~Gliederung 5 Home~LT~Gliederung 4 Home~LT~Gliederung 5þ¯ÿß Óé @' ¡A' §'
+ Home~LT~Gliederung 6 Home~LT~Gliederung 5 Home~LT~Gliederung 6þ¯ÿß Ôé @' ¡A' §'
+ Home~LT~Gliederung 7 Home~LT~Gliederung 6 Home~LT~Gliederung 7þ¯ÿß Õé @' ¡A' §'
+ Home~LT~Gliederung 8 Home~LT~Gliederung 7 Home~LT~Gliederung 8þ¯ÿß Öé @'
+ ¡A' §'
+ Home~LT~Gliederung 9 Home~LT~Gliederung 8 Home~LT~Gliederung 9þ¯ÿß ×é @' ¡A' §'
+
+ Home~LT~Titel
+ Home~LT~Titelþ¯ÿß Íé è¹' ú´' QQ g* £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Untertitel Home~LT~Untertitelþ¯ÿß Ýé è¹' ú´' QQ g* @' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Notizen Home~LT~Notizenþ¯ÿß Úé è¹' ú´' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Hintergrundobjekte Home~LT~Hintergrundobjekteþ¯ÿß Øé +;( ,, -- .. Home~LT~Hintergrund Home~LT~Hintergrundþ¯ÿß Ùé è¹' ú´' Title Title @ Íé Subtitle Subtitle @ Ýé Background objects Background objects @ Øé
+ Background
+ Background @ Ùé Notes Notes @ Úé Outline 1 Outline 1 @ Ïé Outline 2 Outline 1 Outline 2 @ Ðé Outline 3 Outline 2 Outline 3 @ Ñé Outline 4 Outline 3 Outline 4 @ Òé Outline 5 Outline 4 Outline 5 @ Óé Outline 6 Outline 5 Outline 6 @ Ôé Outline 7 Outline 6 Outline 7 @ Õé Outline 8 Outline 7 Outline 8 @ Öé Outline 9 Outline 8 Outline 9 @ ×é t Ð P ê D â P ä 8 > ¤
+ p Ö < ¢ n ô
+ f ° Ò ú 6 b ® á
+ G
+ z
+
+ à
+ DrMd (ì ì JoeMp 0 ë01Ü_U BU1¼? AU1t.Ë
+ ÿÿ O ö DrLy LAYER_LAYOUT DrLy
+ LAYER_BCKGRND DrLy LAYER_BACKGRNDOBJ DrLy LAYER_CONTROLS DrLy ! LAYER_MEASURELINES DrMP ù ' JoeM Çl VT Ð Ð Ð Ð DrML DrOb < SVDr & ø Ð ( A& DrOb < SVDr & 3D Ð Í[ A& DrOb < SVDr & ø . ( L DrOb < SVDr & 3D . Í[ L DrXX gg Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrMP q · JoeM VT Çl { y DrML DrOb SVDr & { y ½Q 0j ' Home~LT~Hintergrundþ¯ { y ½Q 0j DrXX gg Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrMP î , JoeM VT Çl Ð Ð Ð Ð DrML DrOb õ SVDr & º ç
+ 8 '0 !
+ Home~LT~Titelþ¯ º ç
+ 8 '0 { xV4B1 f Z»» ÿÿ ÿ EditEngineItemPool è Q ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 < ! @ d d üd x X <( @ ¸ X
+( G @ StarBats ! - X @' ! @ 8 d d d X ; [ ®
+ P Z Click to move the slide
+ Home~LT~Titelþ¯ <(
+( @' DrOb SVDr & Ü Ç3 G "] # Home~LT~Notizenþ¯£ Ü Ç3 G "] xV4B1 o Z»» ÿÿ ÿ EditEngineItemPool è H ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 3
+ ! @ d d üd x X <( @ ¯ X
+( G @
+ StarBats X ! - X @' ! @ /
+ d d ¨ýd X X ; [ ®
+ P Q
+ Click to edit the notes format Home~LT~Notizenþ¯ <(
+( @' DrXX gg Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrPg c JoeM Çl VT Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrXX Handoutsgg ~ Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrPg sG ÁF JoeM VT Çl { y DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb SVDr & D# D ¹0 Q
+
+
+ Standard D# D ¹0 Q xV4B1 w Z»» ÿÿ EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 ÿ ! @ Ê d d üd x X <( @ ê X
+( G @ = StarBats ! - X @' ! @ j d d d X +'£ @ X '¦ " @ ¸ helvetica X '§ @ Ü §d
+ X '© @ û X ; [ ® Û û ) M
+ P - Master Standard <(
+( @' £+' ¦' §' © ¦ § Database Standard <(
+( @' £+' ¦' §' © ¦ § DrOb SVDr & ¾ ; fP @
+
+
+ Standard 3 ¾ ; fP @ xV4B1 ÿ Z»» ÿÿ | EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f d 0 â ! @ Í d d üd x X <( @ í X
+( G @ @ StarBats ! - X @' ! @ m d d d X '¦ " @ helvetica X '§ @ ¿ §d
+ X '© @ Þ X ; [ ® Û -
+ P Database Abstraction Standard <(
+( @' ¦' §' © § ¦ DrOb ð SVDr & ¾ 6 fP :
+
+
+ Standard ¾ 6 fP : { xV4B1 f Z»» ÿÿ ¯ EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 ! @ V d d üd x X <( @ v X
+( G @ É StarBats ! - X @' ! @ ö d d d X !'¥ @ ÿÿ X '¦ " @ J helvetica X '§ @ n §d
+ X '© @ X X ; [ ® Û / S
+ P È 8 Core Objects: User,Group,Project,Foundry,Permission,Pool Standard <(
+( @' ¦' §' © ) § 8 ¦ 8 ¥ ) 8 © ) 8 DrOb SVDr & ° y0 û7 ÿ4
+
+
+ Standard ³ ° y0 û7 ÿ4 xV4B1 } Z»» ÿÿ EditEngineItemPool è ÿ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 { ! @ F d d üd x X <( @ f X
+( G @ ¹ StarBats ! - X @' ! @ æ d d d X +'£ @ X '¦ " @ 4 helvetica X '§ @ X §d
+ X '© @ w X ; [ ® Û û ) M
+ P ©
+ Tool-specific Standard <(
+( @' £+' ¦' §' ©
+ §
+ ¦
+ objects Standard <(
+( @' £+' ¦' §' © § ¦ DrOb SVDr & C) [? Í* ÊD
+ Standard ÿÿÿÿ ¡ þ) D * @ DrCn $ DrCn $ ; (# xi ÿÿ DrOb SVDr & Æ8 x0 @P þ4
+ Standard È Æ8 x0 @P þ4 © xV4B1 Z»» ÿÿ EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 ! @ a d d üd x X <( @ X
+( G @ Ô StarBats ! - X @' ! @ d d d X +'£ @ ! X '¦ " @ O helvetica X '§ @ s §d
+ X '© @ X ; [ ® Û û ) M
+ P Ä HTML Utility Objects Standard <(
+( @' £+' ¦' §' © ¦ § Layout,Theme,Language Standard <(
+( @' £+' ¦' §' © ¦ § DrOb ² SVDr & x0 ã þ4
+
+ Standard \ x0 ã þ4 = xV4B1 ( Z»» ÿÿ EditEngineItemPool è 8# ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 ´$ ! @ # d d üd x X <( @ # X
+( G @ ò# StarBats ! - X @' ! @ $ d d d X +'£ @ ?$ X '¦ " @ m$ helvetica X '§ @ $ `d
+ X '© @ °$ X ; [ ® Û û ) M
+ P â$ XML Utility Objects Standard <(
+( @' £+' ¦' §' © ¦ § DrOb SVDr & û, $ uD )
+ Standard W û, $ uD ) 8 xV4B1 # Z»» ÿÿ EditEngineItemPool è ê& ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 f( ! @ 1' d d üd x X <( @ Q' X
+( G @ ¤' StarBats ! - X @' ! @ Ñ' d d d X +'£ @ ñ' X '¦ " @ ( helvetica X '§ @ C( §d
+ X '© @ b( X ; [ ® Û û ) M
+ P ( HTML Templates Standard <(
+( @' £+' ¦' §' © ¦ § DrOb ë SVDr & ' W( s9 41
+ Standard ø ü ÿÿÿÿ Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è * ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ô+ ! @ Þ* d d üd x X <( @ þ* X
+( G @ Q+ StarBats ! - X @' ! @ ~+ d d d X '¦ " @ ¬+ helvetica X '§ @ Ð+ §d
+ X ; [ ® Û
+ P ú+ Direct API Calls Standard <(
+( @' ¦ § ¡ U( y0 ¸8 ) DrCn $ DrCn $ ; (# xi ÿÿ DrOb ë SVDr & ý7 W( >E 31
+ Standard ø ü ÿÿÿÿ Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è . ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¿/ ! @ É. d d üd x X <( @ é. X
+( G @ </ StarBats ! - X @' ! @ i/ d d d X '¦ " @ / helvetica X '§ @ »/ §d
+ X ; [ ® Û
+ P å/ Direct API Calls Standard <(
+( @' ¦ § ¡ D x0 ¸8 ) DrCn $ DrCn $ ; (# xi ÿÿ DrOb ¬ SVDr & $ d$ )
+
+ Standard V $ d$ ) 7 xV4B1 " Z»» ÿÿ EditEngineItemPool è m2 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 é3 ! @ ´2 d d üd x X <( @ Ô2 X
+( G @ '3 StarBats ! - X @' ! @ T3 d d d X +'£ @ t3 X '¦ " @ ¢3 helvetica X '§ @ Æ3 `d
+ X '© @ å3 X ; [ ® Û û ) M
+ P 4
+ XML Templates Standard <(
+( @' £+' ¦' §' ©
+ ¦
+ §
+ DrOb ë SVDr & 9
+ c( 0 31
+ Standard ø ¼ p ÿÿÿÿ Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è 6 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 V7 ! @ `6 d d üd x X <( @ 6 X
+( G @ Ó6 StarBats ! - X @' ! @ 7 d d d X '¦ " @ .7 helvetica X '§ @ R7 §d
+ X ; [ ® Û
+ P |7 Direct API Calls Standard <(
+( @' ¦ § ¡ ô
+ x0 u ) DrCn $ DrCn $
+ ; (# xi ÿÿ DrOb ë SVDr & º c( ) 41
+ Standard ø ¼ p ÿÿÿÿ Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è : ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 A; ! @ K: d d üd x X <( @ k: X
+( G @ ¾: StarBats ! - X @' ! @ ë: d d d X '¦ " @ ; helvetica X '§ @ =; §d
+ X ; [ ® Û
+ P g; Direct API Calls Standard <(
+( @' ¦ § ¡ U( y0 u ) DrCn $ DrCn $
+ ; (# xi ÿÿ DrOb ä SVDr & º § Ê# S%
+ Standard ò N ßþÿÿÿÿÿÿ Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è ï= ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ,? ! @ 6> d d üd x X <( @ V> X
+( G @ ©> StarBats ! - X @' ! @ Ö> d d d X '¦ " @ ? helvetica X '§ @ (? §d
+ X ; [ ® Û
+ P R?
+ XML-RPC ?? Standard <(
+( @' ¦
+ §
+ u $ # b DrCn $
+ DrCn # ; (# ÿÿ DrOb SVDr & 80 Q s9 G%
+ Standard Tòÿÿÿÿÿÿ ¸8 $ ó0 DrCn $ DrCn # ; (# ÿÿ DrOb O SVDr & Õ h DJ Õ!
+ Standard ó Õ h DJ Õ! Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è äB ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 !D ! @ +C d d üd x X <( @ KC X
+( G @ C StarBats ! - X @' ! @ ËC d d d X '¦ " @ ùC helvetica X '§ @ D §d
+ X ; [ ® Û
+ P GD Cache Server(s) Standard <(
+( @' ¦' §' DrOb u SVDr & î Standard î DrOb H SVDr & ç è ä Standard ò ç è ä Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è ¨F ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 åG ! @ ïF d d üd x X <( @ G X
+( G @ bG StarBats ! - X @' ! @ G d d d X '¦ " @ ½G helvetica X '§ @ áG §d
+ X ; [ ® Û
+ P H Immediate Term Standard <(
+( @' ¦' §' DrOb u SVDr & Õ «
+ Standard Õ « DrOb E SVDr & ¤ ¡ Standard ï ¤ ¡ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è eJ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¢K ! @ ¬J d d üd x X <( @ ÌJ X
+( G @ K StarBats ! - X @' ! @ LK d d d X '¦ " @ zK helvetica X '§ @ K §d
+ X ; [ ® Û
+ P ÈK Medium Term Standard <(
+( @' ¦' §' DrOb u SVDr & h Standard h DrOb C SVDr & a ñ ^ Standard í a ñ ^ Î xV4B1 ¹ Z»» ÿÿ Y EditEngineItemPool è N ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 \O ! @ fN d d üd x X <( @ N X
+( G @ ÙN StarBats ! - X @' ! @ O d d d X '¦ " @ 4O helvetica X '§ @ XO §d
+ X ; [ ® Û
+ P O Long Term Standard <(
+( @' ¦' §' DrOb SVDr & g } p4 C Standard ) g } p4 C
+ xV4B1 õ Z»» ÿÿ | EditEngineItemPool è bQ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f d 0 ¾R ! @ ©Q d d üd x X <( @ ÉQ X
+( G @ R StarBats ! - X @' ! @ IR d d d X '¦ " @ wR helvetica X '§ @ R `d
+ X '© @ ºR X ; [ ® Û -
+ P èR System Model Standard <(
+( @' ¦' §' ©' © § DrXX gg ~ Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrPg U JoeM VT Çl Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & º ç
+ 8 '0 DrOb ô SVDr & Ü Ç3 G #] #
+ Home~LT~Notizenþ¯ Ü Ç3 G #] x xV4B1 c Z»» ÿÿ ÿ EditEngineItemPool è 9V ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 $W ! @ V d d üd x X <( @ V X
+( G @ óV StarBats X ! - X @' ! @ W d d ¨ýd X X ; [ ®
+ P BW Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg Home~LT~Gliederung sourceforge-architecture.sda sourceforge-architecture.sda ÿ DrPg 3J ¹I JoeM VT Çl { y DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb I SVDr & x" yV ³/ ;Z Standard ó x" yV ³/ ;Z Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è KZ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 [ ! @ Z d d üd x X <( @ ²Z X
+( G @ [ StarBats ! - X @' ! @ 2[ d d d X '¦ " @ `[ helvetica X '§ @ [ íd
+ X ; [ ® Û
+ P ®[ Error.class Standard <(
+( @' ¦ § DrOb L SVDr & v Ð7 6 > Standard ö v Ð7 6 > × xV4B1  Z»» ÿÿ Y EditEngineItemPool è ] ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ñ^ ! @ Û] d d üd x X <( @ û] X
+( G @ N^ StarBats ! - X @' ! @ {^ d d d X '¦ " @ ©^ helvetica X '§ @ Í^ íd
+ X ; [ ® Û
+ P ÷^ Artifact.class Standard <(
+( @' ¦ § DrOb P SVDr & á
+ + Ä Standard ú á
+ + Ä Û xV4B1 Æ Z»» ÿÿ Y EditEngineItemPool è à` ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 b ! @ 'a d d üd x X <( @ Ga X
+( G @ a StarBats ! - X @' ! @ Ça d d d X '¦ " @ õa helvetica X '§ @ b íd
+ X ; [ ® Û
+ P Cb ArtifactHtml.class Standard <(
+( @' ¦ § DrOb O SVDr & p, M Ä Standard ù p, M Ä Ú xV4B1 Å Z»» ÿÿ Y EditEngineItemPool è 0d ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 me ! @ wd d d üd x X <( @ d X
+( G @ êd StarBats ! - X @' ! @ e d d d X '¦ " @ Ee helvetica X '§ @ ie íd
+ X ; [ ® Û
+ P e ArtifactXML.class Standard <(
+( @' ¦ § DrOb â SVDr & P ã * ±8 Standard ï Ä ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è g ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¼h ! @ Æg d d üd x X <( @ æg X
+( G @ 9h StarBats ! - X @' ! @ fh d d d X '¦ " @ h helvetica X '§ @ ¸h §d
+ X ; [ ® Û
+ P âh Extends Standard <(
+( @' ¦ § ¡ 1 Ä =) Ð7 DrCn $ DrCn $ ; xi (# ÿÿ DrOb â SVDr & \( ã ¡= ±8 Standard ï á ¥
+ ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è ak ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 l ! @ ¨k d d üd x X <( @ Èk X
+( G @ l StarBats ! - X @' ! @ Hl d d d X '¦ " @ vl helvetica X '§ @ l §d
+ X ; [ ® Û
+ P Äl Extends Standard <(
+( @' ¦ § ¡ À< Ä =) Ð7 DrCn $ DrCn $ ; xi (# ÿÿ DrOb â SVDr & <& ³= , ZW Standard ï á ¥
+ ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è Co ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 p ! @ o d d üd x X <( @ ªo X
+( G @ ýo StarBats ! - X @' ! @ *p d d d X '¦ " @ Xp helvetica X '§ @ |p §d
+ X ; [ ® Û
+ P ¦p Extends Standard <(
+( @' ¦ § ¡ =) > ) yV DrCn $ DrCn $ ; xi (# ÿÿ DrOb SVDr & _ Ë; ß Standard 1 _ Ë; ß xV4B1 ý Z»» ÿÿ | EditEngineItemPool è %s ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f d 0 t ! @ ls d d üd x X <( @ s X
+( G @ ßs StarBats ! - X @' ! @ t d d d X '¦ " @ :t helvetica X '§ @ ^t `d
+ X '© @ }t X ; [ ® Û -
+ P «t Example System Model Standard <(
+( @' ¦' §' ©' © § DrOb O SVDr & è _
+ ( # Standard ù è _
+ ( # Ú xV4B1 Å Z»» ÿÿ Y EditEngineItemPool è ¬v ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 éw ! @ óv d d üd x X <( @ w X
+( G @ fw StarBats ! - X @' ! @ w d d d X '¦ " @ Áw helvetica X '§ @ åw íd
+ X ; [ ® Û
+ P x Html-template.tpl Standard <(
+( @' ¦ § DrOb ç SVDr & B Ó á Standard ô }üÿÿEýÿÿÿÿÿÿ Õ xV4B1 À Z»» ÿÿ Y EditEngineItemPool è ûy ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 8{ ! @ Bz d d üd x X <( @ bz X
+( G @ µz StarBats ! - X @' ! @ âz d d d X '¦ " @ { helvetica X '§ @ 4{ §d
+ X ; [ ® Û
+ P ^{ Instantiates Standard <(
+( @' ¦ § ¡ 8 # 1 DrCn $ DrCn $ ; xi (# ÿÿ DrOb N SVDr &
/ _
+ %P # Standard ø
/ _
+ %P # Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è â} ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ! @ )~ d d üd x X <( @ I~ X
+( G @ ~ StarBats ! - X @' ! @ É~ d d d X '¦ " @ ÷~ helvetica X '§ @ íd
+ X ; [ ® Û
+ P E Xml-template.tpl Standard <(
+( @' ¦ § DrOb ç SVDr & -: B iB á Standard ô ^( ýÿÿÿÿÿÿ Õ xV4B1 À Z»» ÿÿ Y EditEngineItemPool è 0 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 m ! @ w d d üd x X <( @ X
+( G @ ê StarBats ! - X @' ! @ d d d X '¦ " @ E helvetica X '§ @ i §d
+ X ; [ ® Û
+ P Instantiates Standard <(
+( @' ¦ § ¡ Õ? # À< DrCn $
+ DrCn $ ; xi (# ÿÿ DrOb SVDr & 6 H 6 g Standard , ÿÿÿÿØÜÿÿ 6 H 6 g DrOb SVDr & 7 ï& QK ï& Standard ÿÿÿÿ 7 ï& QK ï& DrOb SVDr & 7 §K QK §K Standard ¸$ ÿÿÿÿ 7 §K QK §K DrOb ± SVDr & C ñ- ©, Ç6 Standard [ C ñ- ©, Ç6 < xV4B1 ! Z»» ÿÿ g EditEngineItemPool è Ä ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f O 0 ! @ d d üd x X <( @ + X
+( G @ ~ StarBats ! - X @' ! @ « d d d X '¦ " @ Ù helvetica X '§ & @ {d
+ §d
+ X X ; [ ® Û
+ P 5 Core Tool Objects: Standard <(
+( @' ¦' §' - -Objects common to any presentation interface Standard <(
+( @' ¦' §' § - 7 -Core logic such as permissions, creation, updates, etc Standard <(
+( @' ¦' §' § 7 3 -standard create(), update(), fetchdata() functions Standard <(
+( @' ¦' §' § 3 DrOb â SVDr & ï b R: @% Standard ï b R: @% m xV4B1 V Z»» ÿÿ g EditEngineItemPool è u ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f O 0 À ! @ ¼ d d üd x X <( @ Ü X
+( G @ / StarBats ! - X @' ! @ \ d d d X '¦ " @ helvetica X '§ & @ ¸ {d
+ §d
+ X X ; [ ® Û
+ P æ
+ Presentation: Standard <(
+( @' ¦' §' M Templates and interface-specific reusable libraries, error handling/reporting Standard <(
+( @' ¦' §' § M DrOb Ù SVDr & i ùO à0 ×T Standard i ùO à0 ×T d xV4B1 M Z»» ÿÿ g EditEngineItemPool è W ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f O 0 ¢ ! @ d d üd x X <( @ ¾ X
+( G @ StarBats ! - X @' ! @ > d d d X '¦ " @ l helvetica X '§ & @ {d
+ §d
+ X X ; [ ® Û
+ P È Core System Objects: Standard <(
+( @' ¦' §' = -Libraries and objects that are used by all systems and tools Standard <(
+( @' ¦' §' § = DrOb K SVDr & ë ºX & |\ Standard õ ë ºX & |\ Ö xV4B1 Á Z»» ÿÿ Y EditEngineItemPool è 0 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 m ! @ w d d üd x X <( @ X
+( G @ ê StarBats ! - X @' ! @ d d d X '¦ " @ E helvetica X '§ @ i íd
+ X ; [ ® Û
+ P
+ Project.class Standard <(
+( @' ¦
+ §
+ DrOb I SVDr & [ °] ' ra Standard ó [ °] ' ra Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è { ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¸ ! @  d d üd x X <( @ â X
+( G @ 5 StarBats ! - X @' ! @ b d d d X '¦ " @ helvetica X '§ @ ´ íd
+ X ; [ ® Û
+ P Þ Group.class Standard <(
+( @' ¦ § DrOb H SVDr & #2 º\ ^? |` Standard ò #2 º\ ^? |` Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è Ä ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ! @ d d üd x X <( @ + X
+( G @ ~ StarBats ! - X @' ! @ « d d d X '¦ " @ Ù helvetica X '§ @ ý íd
+ X ; [ ® Û
+ P '
+ User.class Standard <(
+( @' ¦
+ §
+ DrOb N SVDr & k< ÄS OJ W Standard ø ¿< ÄS úI W Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 I ! @ S d d üd x X <( @ s X
+( G @ Æ StarBats ! - X @' ! @ ó d d d X '¦ ýÿÿÿ
¡ ¢ £ ¤ ¥ ¦ § ¨ © þÿÿÿ« ¬ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ" @ ! helvetica X '§ @ E íd
+ X ; [ ® Û
+ P o Permission.class Standard <(
+( @' ¦ § DrOb G SVDr & ½* ³c ø7 ug Standard ñ ½* ³c ø7 ug Ò xV4B1 ½ Z»» ÿÿ Y EditEngineItemPool è Z ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¡ ! @ ¡ d d üd x X <( @ Á X
+( G @ ¡ StarBats ! - X @' ! @ A¡ d d d X '¦ " @ o¡ helvetica X '§ @ ¡ íd
+ X ; [ ® Û
+ P ½¡ Foo.class Standard <(
+( @' ¦ § DrXX gg F Home~LT~Gliederung ÿ DrPg JoeM VT Çl Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & º ç
+ 8 '0 DrOb ô SVDr & Ü Ç3 G #] #
+
+ Home~LT~Notizenþ¯ Ü Ç3 G #] x xV4B1 c Z»» ÿÿ ÿ EditEngineItemPool è Á¤ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 ¬¥ ! @ ¥ d d üd x X <( @ (¥ X
+( G @ {¥ StarBats X ! - X @' ! @ ¨¥ d d ¨ýd X X ; [ ®
+ P Ê¥ Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrPg á@ g@ JoeM VT Çl { y DrLy Layout DrLy
+ Background DrLy ! Background objects DrLy Controls DrLy Dimension Lines DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb I SVDr & ¹\ M' {` Standard ó ¹\ M' {` Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è © ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 \ª ! @ f© d d üd x X <( @ © X
+( G @ Ù© StarBats ! - X @' ! @ ª d d d X '¦ " @ 4ª helvetica X '§ @ Xª íd
+ X ; [ ® Û
+ P ª Error.class Standard <(
+( @' ¦ § DrOb Q SVDr & ¤) ¨= h0 Standard û ¤) ¨= h0 Ü xV4B1 Ç Z»» ÿÿ Y EditEngineItemPool è h¬ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¥ ! @ ¯¬ d d üd x X <( @ Ϭ X
+( G @ " StarBats ! - X @' ! @ O d d d X '¦ " @ } helvetica X '§ @ ¡ íd
+ X ; [ ® Û
+ P Ë Member (user_group) Standard <(
+( @' ¦ § DrOb â SVDr & ¹ S # ] Standard ï øÿÿå ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è ¹¯ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ö° ! @ ° d d üd x X <( @ ° X
+( G @ s° StarBats ! - X @' ! @ ° d d d X '¦ " @ ΰ helvetica X '§ @ ò° §d
+ X ; [ ® Û
+ P ± Extends Standard <(
+( @' ¦ § ¡ þS ¯ ¹\ DrCn $ DrCn $ ; xi (# ÿÿ DrOb º SVDr & \ P Ë Standard d \ P Ë E xV4B1 & Z»» ÿÿ · EditEngineItemPool è ³ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 .µ ! @ â³ d d üd x X <( @ ´ X
+( G @ U´ StarBats ! - X @' ! @ ´ d d d X +'£ @ ¢´ X '¦ " @ д helvetica X '§ & @ þ´ `d
+ §d
+ X X '© @ &µ X X ; [ ® Û û ) [
+ P \µ Permissions Model Standard <(
+( @' £+' ¦' §' ©' © § Standard <(
+( @' £+' ¦' §' ©' § © b SourceForge's permission model is group-based. To have any permissions, you must be a member of a Standard <(
+( @' £+' ¦' §' ©' § b © b g group (a corresponding entry in the user_group table in the database). You then have permission levels Standard <(
+( @' £+' ¦' §' ©' § g © g 3 for that group's objects only (tracker, docs, etc). Standard <(
+( @' £+' ¦' §' ©' § 3 © 3 U There is currently no concept of cross-group permissions except as a site super-user. Standard <(
+( @' £+' ¦' §' ©' § U © U DrOb J SVDr & ¼ O \' Standard ô ¼ O \' Õ xV4B1 À Z»» ÿÿ Y EditEngineItemPool è Uº ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 » ! @ º d d üd x X <( @ ¼º X
+( G @ » StarBats ! - X @' ! @ <» d d d X '¦ " @ j» helvetica X '§ @ » íd
+ X ; [ ® Û
+ P ¸» User (users) Standard <(
+( @' ¦ § DrOb Ý SVDr & + 2 9.
* Standard ê }üÿÿEýÿÿÿÿÿÿ Ë xV4B1 ¶ Z»» ÿÿ Y EditEngineItemPool è ½ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ܾ ! @ æ½ d d üd x X <( @ ¾ X
+( G @ Y¾ StarBats ! - X @' ! @ ¾ d d d X '¦ " @ ´¾ helvetica X '§ @ ؾ §d
+ X ; [ ® Û
+ P ¿ Is Standard <(
+( @' ¦ § ¡ X- ¤) DrCn $ DrCn $ ; xi (# ÿÿ DrOb K SVDr & ½C Æ G Standard õ ½C Æ G Ö xV4B1 Á Z»» ÿÿ Y EditEngineItemPool è |Á ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¹Â ! @ ÃÁ d d üd x X <( @ ãÁ X
+( G @ 6 StarBats ! - X @' ! @ c d d d X '¦ " @  helvetica X '§ @ µÂ íd
+ X ; [ ® Û
+ P ßÂ
+ Project.class Standard <(
+( @' ¦
+ §
+ DrOb I SVDr & <P ;' þS Standard ó <P ;' þS Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è ÇÄ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Æ ! @ Å d d üd x X <( @ .Å X
+( G @ Å StarBats ! - X @' ! @ ®Å d d d X '¦ " @ ÜÅ helvetica X '§ @ Æ íd
+ X ; [ ® Û
+ P *Æ Group.class Standard <(
+( @' ¦ § DrOb H SVDr & P; 'P H éS Standard ò P; 'P H éS Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è È ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 MÉ ! @ WÈ d d üd x X <( @ wÈ X
+( G @ ÊÈ StarBats ! - X @' ! @ ÷È d d d X '¦ " @ %É helvetica X '§ @ IÉ íd
+ X ; [ ® Û
+ P sÉ
+ User.class Standard <(
+( @' ¦
+ §
+ DrOb N SVDr & Ç3 \\ PD ` Standard ø Ç3 \\ PD ` Ù xV4B1 Ä Z»» ÿÿ Y EditEngineItemPool è XË ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ì ! @ Ë d d üd x X <( @ ¿Ë X
+( G @ Ì StarBats ! - X @' ! @ ?Ì d d d X '¦ " @ mÌ helvetica X '§ @ Ì íd
+ X ; [ ® Û
+ P »Ì Permission.class Standard <(
+( @' ¦ § DrOb K SVDr & þ" ÅC 90 G Standard õ þ" ÅC 90 G Ö xV4B1 Á Z»» ÿÿ Y EditEngineItemPool è ¦Î ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ãÏ ! @ íÎ d d üd x X <( @
+Ï X
+( G @ `Ï StarBats ! - X @' ! @ Ï d d d X '¦ " @ »Ï helvetica X '§ @ ßÏ íd
+ X ; [ ® Û
+ P Ð
+ Foundry.class Standard <(
+( @' ¦
+ §
+ DrOb â SVDr & G F ~! Q Standard ï qïÿÿô ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è ñÑ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 .Ó ! @ 8Ò d d üd x X <( @ XÒ X
+( G @ «Ò StarBats ! - X @' ! @ ØÒ d d d X '¦ " @ Ó helvetica X '§ @ *Ó §d
+ X ; [ ® Û
+ P TÓ Extends Standard <(
+( @' ¦ § ¡ ( G <P DrCn $ DrCn $ ; xi (# ÿÿ DrOb â SVDr & ¼ ¦F |* Q Standard ï yûÿÿÇ ÿÿÿÿ Ð xV4B1 » Z»» ÿÿ Y EditEngineItemPool è ÓÕ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 × ! @ Ö d d üd x X <( @ :Ö X
+( G @ Ö StarBats ! - X @' ! @ ºÖ d d d X '¦ " @ èÖ helvetica X '§ @ × §d
+ X ; [ ® Û
+ P 6× Extends Standard <(
+( @' ¦ § ¡ ) G <P DrCn $
+ DrCn $ ; xi (# ÿÿ DrOb à SVDr & ¼ S ì< =] Standard í SðÿÿÖ ÿÿÿÿ Î xV4B1 ¹ Z»» ÿÿ Y EditEngineItemPool è µÙ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 òÚ ! @ üÙ d d üd x X <( @ Ú X
+( G @ oÚ StarBats ! - X @' ! @ Ú d d d X '¦ " @ ÊÚ helvetica X '§ @ îÚ §d
+ X ; [ ® Û
+ P Û Param Standard <(
+( @' ¦ § ¡ þS < \\ DrCn $ DrCn $ ; xi (# ÿÿ DrOb à SVDr & *; S ÎB =] Standard í 4ñÿÿ· ÿÿÿÿ Î xV4B1 ¹ Z»» ÿÿ Y EditEngineItemPool è Ý ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ÒÞ ! @ ÜÝ d d üd x X <( @ üÝ X
+( G @ OÞ StarBats ! - X @' ! @ |Þ d d d X '¦ " @ ªÞ helvetica X '§ @ ÎÞ §d
+ X ; [ ® Û
+ P øÞ Param Standard <(
+( @' ¦ § ¡ íA éS < \\ DrCn $ DrCn $ ; xi (# ÿÿ DrOb L SVDr & ø- O N Standard ö ø- O N × xV4B1  Z»» ÿÿ Y EditEngineItemPool è uá ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ²â ! @ ¼á d d üd x X <( @ Üá X
+( G @ /â StarBats ! - X @' ! @ \â d d d X '¦ " @ â helvetica X '§ @ ®â íd
+ X ; [ ® Û
+ P Øâ Group (groups) Standard <(
+( @' ¦ § DrOb Þ SVDr & w, 2 )?
* Standard ë Ñ Eýÿÿÿÿÿÿ Ì xV4B1 · Z»» ÿÿ Y EditEngineItemPool è Áä ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 þå ! @ å d d üd x X <( @ (å X
+( G @ {å StarBats ! - X @' ! @ ¨å d d d X '¦ " @ Öå helvetica X '§ @ úå §d
+ X ; [ ® Û
+ P $æ Has Standard <(
+( @' ¦ § ¡ H> X- ¤) DrCn $ DrCn $ ; xi (# ÿÿ DrXX gg F Home~LT~Gliederung ÿ DrPg JoeM VT Çl Ð Ð Ð Ð DrLy Layout DrLy
+ Background DrLy ! Background objects DrLy Controls DrLy Dimension Lines DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & º ç
+ 8 '0 DrOb ô SVDr & Ü Ç3 G #] #
+
+ Home~LT~Notizenþ¯ Ü Ç3 G #] x xV4B1 c Z»» ÿÿ ÿ EditEngineItemPool è Cê ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 .ë ! @ ê d d üd x X <( @ ªê X
+( G @ ýê StarBats X ! - X @' ! @ *ë d d ¨ýd X X ; [ ®
+ P Lë Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg N Home~LT~Gliederung ÿ DrXX þ º þÿ DrVw P SVDr
+ SVDr : SVDr ö ö þ þ ö ö SVDrA Layout : SVDr è è þ þ SVDr Ü # SVDr SVDr# SVDr0 SVDr1 SVDr3 SVDr4 SVDr@ SVDr SVDrD SVDrP SVDrQ Â ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrHL DrHL DrHL ñÿÿÚ c Vk
+ R o o t E n t r y ÿÿÿÿÿÿÿÿ .½
ÑÐ )ä°± À C o m p O b j ÿÿÿÿ = O l e
+ ÿÿÿÿÿÿÿÿÿÿÿÿ p e r s i s t e l e m e n t s " ÿÿÿÿ S f x D o c u m e n t I n f o ÿÿÿÿÿÿÿÿ u S f x W i n d o w s ÿÿÿÿ ÿÿÿÿ S f x S t y l e S h e e t s ÿÿÿÿÿÿÿÿÿÿÿÿ «U S u m m a r y I n f o r m a t i o n ( ÿÿÿÿÿÿÿÿ ( S t a r D r a w D o c u m e n t 3 $ ÿÿÿÿÿÿÿÿÿÿÿÿ 1 &ï ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,288 @@
+GIF89a¢Mð ÿ ÿÿ, ¢M ÿÿÿ33ææÿÿÿÿ ÿÿÿ ÿ H° Á*\È°¡Ã#JH±¢Å3jÜȱ£Ç CI²¤É(Sª\ɲ¥Ë0cÊI³¦Í8sº,À³§Ï@
+J´¨Ñ£H*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÃK¶¬Ù³hÓª]˶۷pãÊkv Ý»xóêÝË·¯ß¿L¸°áÃ+^̸ñU»#KL¹²åË3kÞ̹³çÏ Cÿ
,º´éÓ¨S«^ͺµë×°cËÆLz¶íÛ¸sëÞÍ»·ïßÀï®-¼¸ñãÈ+_μ¹óçCN½ºõëسkßÎý³ôîàÃÿO¾¼ùóèOϾ½û÷ðãËO¿ëúúøóëßÏ¿¿ÿÿ²Ýàhà&¨ V.èàF(áf×`
f¨ávè¡c~(â$hâ(.b,¶èâ0Æß2Öhã8æ¨#o4îèã@)äõHäH&©äLBedPF)åTÆødXf©å\xe| )ædiæh¦©æl¶éæpÆIftÖi'ræ©çeæõ%{c è jè¡&ªè¢6êè£F*i¡sÞ)fªé¦vêé§ Vúb¨¤jꩨ¦ªêª~褰Æÿ*«¡cÎõ'z ̪뮼öêë¯`iSµëT±%"klg¢V&°ÐFKhqÝZÞ³Òf«í¶Ü.*ìg¬êµËRE®ß{ZºæÚí»³Ëµã¹ï½øæ+«¼½ªo¤Ê®Ë®ºSñ¡Á6ð±ÿ6ì(Âuõg¯ÃWÜðÂakñ¤b®pVGñÇ
+|Ƨ,hÈbÑÞÄ*Ç,ó¯&'ò̲|Î$?Å35÷.±8ËôW.ssÑL7ýèÑ-ít£PKVµÐÇRx5Öm]ÔSÿë5VIkvØh£=ö^7§ÍèÏÍuRrëW·ÙDÝÍÞJ+ÿu¶ÛïòUÙØý
+øá3áÓºâfõÙâ_U9c·.¦ie¾\º55~W3Þx¶'Eøu¦îºØµþ:©ßU;XÃ=ú¥rÝ~ïbù«vÀ^oÜØrßÔ²ÏNóY«W×¼óÔo«<îÕ¿Ùõ[a\;å½»Æ}÷Ô_?~kÍ~}nÂæ¾÷ÞÍnÇ?u|þlGO}¼Ðקÿþ ôÕý@@E
+ð,tVPr·>Ìï}È¿Òg?¡ÄO^í 1¨> HpaîÀýiÊ+¡iÜ÷¾~'í«¿Å¡Î
/ßµrÂJjÑNÿW&¦`!jbd¢TضiÝMÓZÙõõ,w
+1g¹"âT.òn0cqHÃñc!½ç@12T£Á(ÇÂÑñ"Ñ 8Bbçb¼!Gâ05¬WÞ|È- ú/V(³â¥E#VÒÁZÆ6IÊpZü¤%CIµÂpz,)
+FDº-ä!ÇZº²i$$.M&Ë[Ò²Ì)qv»T
+lrÔåéÁCöÒ©á%#1úPj¼$6-yIÚݤ$¥À3hi²[ÐdÊ0Q9tú,,# ãéÌ>ÓÍÜ%.©ÿOVÒsîìÞ_ÖILY! _Çå<hi:MëUS>=üÛ9Å©MZ
£Û§G¥è/{´DD"íøÉ"fs¥0ÇCдIÔ\Yôgá8ÏÖSMdý>X,3¾±R¼üi"ûHB¿Ô´ X¹ifþÏeõÌSª-¹ÀZ,A|Î5½5R¤z©HÉ)ÎHRR¥hm«Z;9Jnô£X$¡WÓjµVµ1t¨V#:Xfn5êVûùK`2U|y*T-תơWÝ`V ËÙvu¯Òº_X3V²²µ0E)[ë:ÉÕÞµ/}7aÛÑÖÿz2¦q
T ZÇe̯µìËYZ¶d,,÷yY2¶¹ÛzK»¨Vö°u$úP¾r·Có u£%Zkêömx
éZs;Ò³áv½ïµbHgËÚ¶¦µñ%%x?É%bû}ç*±ëÝV´#³[Hú8©u|crÛ9]êV.Àý²è&HÜ¥Â2oõ µ0Ì×eíòÎ^úÞ÷´«}ëaLÎؾ×ųÅFñ[&Lò/0W¼ñà Ù+ûíwé[#ìS%uÄ&®f¨Xd:¹
+5XÕ÷XÈæE²M»°¾+ñøy`5/
+hÖùnÔÿ¬ì¥q7ãK+ÙÒ9;1[º/½î묨`cddâÌN\¡£èÅÇÄgtçÑoêÙµrÞ³ç[ãõæ8·²½tJÙ¬ç;Ã9¯ÂW{WI¸¶ºÎ&Uí"¡îìËnô´|¦1׳´¤Ç¢âëÖÕ´tq¼IMÆZÙÌilÁig@5Õq)ýLdmº:Ôà¶ë°³héýz{¸Îµ¡kD¼?YØ»*¯ûËÉNÊÓ£N+j£NlËÕù3(ë«^'î{Û@7-íNó{åæ!Ú}ëC|s³
+¤á+ySã .Z¹<ã;®EÿtÆgñ¯{å°Ù8È!âGÎ\l"§©ª[kò¾
+å¼8a»«»`D×»o>ÓIé÷:xÅF¾seè5¹î*£=*BçzÑëuÝÖÜæewÄIÎó«7¶)Ø'çõ3.ìs§;ÙÓ°³£ïã:Û¡mûûÔ4{Þ
+Z÷ß}ñ«9àµçô¿OÞ«a¼µeÓ¶ý[êOS9ä)k;?~ô¨üåùZùy¯¾¢w¢C¯xÔ+°ôjGºíW¸ô×Ñï¤óý4ñ>{ÓXôèÚÆrÓâ'Z÷U¾¸¾,ý<Q¿úqYï
O)àû|DÿóK~1äãNù·)
+¯,PÜ»üVQ¢)ÀO-Éhé¿ÕeÞG:ã÷Öw{#6è-æ×=ö/ü7Q hN]ÍgzÐgBåÃE 7<j±a3E¾ElÑ}&*t#§c0dµÇ1Ã~X= 8tts`~ùÇã»Ó*,h.Ch@~GØ_ã´}ë·.ä9{ðx85x,JNç
¨T7þ÷g9Kø{ý×
gø6[xN¸uõ¢aHznh
`w)°Ç|{ØE}¨NÛGek8iH
,Eo(]Qÿ¥Ãó:îµV÷æV çR$kÈöi
+Ø}W¸G89{B§(`Bxè,8-ír²8p²3÷v'çiø¦-xnz¨
ÌZºv·ÈppÆ-nuojTýØyÓXdXóD>vS×su¨³;Ø8½Òoqp'jÖbgjð¨QìH½e</À³ø<Ø~hÜX]ÞøFâØfÐÆæ
®ea/×;ä'_¦V<¹Öy8Âè*ùX<%ÙI5/V|X÷U$H@s&ÆG4³4ivÿù}×F_ßÆåÚVpÇ¡hO¸¯#6äx÷¨9éc>R¦C
+9WH8êH\áü¸{wl|öÿEjÖVç?ô46©m?$>ßhi¹n$EmFçv5mÏøçÛÃX¹8O©D7¸èVÉz!©NI>Zyacoòx( 0lÙn¹qÇJÙ5¶ÅöeÞ¤YË ÎsYAhé
+¹qÖBf>C_IÅUvwd· :&WOZ?WRB¹iÏÂ aõ?Ø$7ÇipUªÿ
DZZ§¶9StWçÄåo ÈèpøåS\ ;9îHD vxò¨Hm¹²¹YyÈfÈ ÝµåÔ©@_ Zxdù0Úheyr
¡ofËm˦9¢xïÉ¢ñ¹ÔyGI÷ÙN39J2 EQÙh9î×RUÔj÷¤{öyØØKùuè¤é 6¸m·õ§æwFçÆÙ¡´¥éf Zjã}·¢wy¦.ʦI~¹øQÐùѤÑi&Bºo`_s£'§üv h4I{z2ÿÄNÊù9nQqiÁÖm¯u[!*¨ '¦°uJ Y¤ WpÎx¥Ùgjêz«
+ºh±ºd§~óx
¦ÚqqªYÇ£A·¨í8uZ<TnC
llHyONz¬¾¡¡© E¤V¤[ÚcÐÚ¥Hó¥Èúz:®«mo¬z¢)«¯Iºªm¬) ®õ[^¹z¾J§º©Ýêlu)¤Òê
zêUª¨XÚ¬0Y°Ñª
+J¸ê¯Âz6-ÆGªt £ªJªñÚ2æ:d³ê©*Û¢ ;§ðxòÿª°Úo¾©ogIj9Äé±Y
+°Þ9h³Áú¯é¢Ð
+±°è£Ä({EIÉJ¬¼UdE°ÔÉ[øj¹xµy¤ä)uög¶ëèZ®©±z©k6³ê¥ª¥Ú·+£,{±`Êõq·='¡·Z±7£CK´{k¯eúlÆ´q©âê¯Û©é
+{7Uø~ZÛ¤\}Y¦ä¶¢*msË®P»°ý
+0=i¸»áµ§.§f»'µz¹äêÙ±sV ¼ª;§|y¯¾;;Ô²âw»{êyxʧ~ÿ;ôÙz¤«;¶UʺµA·³òZ®K¨s²y76Óʼ
»|À»Ê¸SzÝWI«D%_U°ÝI¶
+¼öѲè«À⩤ȶy6¨¢6Ö
+¸Ö¢+H¹ )´wúºN;²ø«¾LnL¨mÙ:¢Û¼Õ˾üÙ;û²+L¿ýû,½ÿ«¿º¾4ê¿¡¯ãho¬¹ü§KªÜ{~ú¾ðñ¸ûb¶¢h«øرE¾óËÂ[Gåk°Æ=Ì®N?꾧kAÌúªaÜjÉ©¬ù¿ÙûpË¿uÄ,ÑËb²F¼`TªR¯ÿXÅoüX86ųaÆþÙÂ.L¯0,2¾L·9\¬¦ÛÈ"µ<¬·[¿Fû|½ù±k{Àðè¹K,ÄûÄ)ª,׫ &|ÂÖJÉß$R+°el¿Ä¼ æãËÆíÌT *Ç\¨?ÜåiËIĵÊS¼CÜûkË5ÌJv;|ÄÈÈ˹ì¬È£ÂE¼»Î<Æd¬ÉæÃâì³F
+´ ÍÑ|VÇ;|ÏDɺt<©Lô¦åÜLÝ|ÇÏÌÎ.Ñ{VùêcÚi©,ëì3i+1ͯô,¬Ë_Ð [ÅñÄÿÊ¢ìƤ¼ÇÖ³/¸ZoªÌDîªÀ×ÍÓ9ÑLÒ¤)d ýÐg¼
+|K]U!-ºÒkèÎÓüËÖÌÂLL¨f5èøÁú¬7Ó9ÎÆÚÙuË£ËTÕ½Õ¾ÒÔØ«ÝÖkÒd
$|ÖhRÚÕz1fÍ}ÌqýÖ¸²:-|#-½Üª^íC¬h18ØÚ«èøÓÚkÃýÕÃ8÷×hÖØÿøج-Íè|ÕÙ¸Ëárk&{yíÖùîÌÙ1(ÚmÓ7ÒÍ_¸ÛÃ
+ÙãÚ}=ÜlÀ¬h×LØö\¾·]©7 3½²øÿÉÜjÆ}Ú½Øs]ÛæÞ{]·²-ÔmÙTäÅüÝiºÝÜÝݸÛ5AÞâÝÞÇíúÍØçÚPÊÞ¦-ßÝP<Ý´Õl&ÛÜÍæ½ uCgÜí1¢ÜqÝ@Öß÷Wb#Yà¥
+(¿jàÃÞë-Ùl-Òñ=¹Þ¹I¼»PãÌ|¡}ß^fÕLz¸º¿-â4õ¨ ^Øm¬ÙÖÖ^Ý~×Ð-ä
+®Î5N±çccsãá8»
Ì6±Íà¿;P¼Ai2Q 3àN >vXaD
\.ËÕìAݹäUÉòüÜq
+ÉÙ:ãXýàVÿ^r^þ©¯æÛÊdÎNEÜh®\mæÇñ=r8QS¨}NçÇÆxRnÊ{Nè¯ÍÁ£¹jÎËN -ÝZèT^Á"êÒû©Õ;ZÑÞ=9äX2ØL¤dQemÄ~òÃeOÖ@¿ìAU7¾Ýä6ê1)ê¥âuÞÅ}n¿¥NÕ
+áã}æYÈ[>겺è§å¯|Íù;DæF%?f$K°¤]ÜeAHûn`k$ðÒ~<ÅÅÁsÜÖå
íl¨w·3ܶx_=j ä¬.g¹þ³IM°{ñÎY«§Áái+¿GÁ|Ññ9ÿ'ë
+>îþÉyÍÍë6+ñËaÉÞOu`Ý
+5aÐ5KÇUðÅB® ylÎ&]5OâQy¾Îû¼©ß¬¯M<µ§®ÑÇ8á-éõzóØÄÜhÏooÍçò=Ú%ó¸JNëlïÌLüö?>Ö[¹`F7M06OE/äÞ£ïKvnKÎ|d!}á±vâ7õjrù[oó~öcîÉÓs9öfä3æ÷+µÛá5¿+¬«$¿Æè÷9Hó6ÞîÞÓHú=½³Q-Îf¢>/ð?sïÂÅXUèv4bJOT28ù
Vù*=âøÝTìÿ¾ãÜÜCmÌîTú9ñáêoè²oþ;÷ï*öX5cߺÿùÖº]F
+ô5ð Q
+$h¡Á.<°!Ä%>|Xñ"F=~RäH%MB<RåJ-º ²bL5mÞt9çÎ<}þì §Î ET)R F*uêô)¨TJ4ëÔ«R~eZÓ«V°]ZE;µéÚ³`·^5ˮշTÇj¥yë\»gëFeÛ*WÀçý«ªÈË>YòdÊ)õ9 §cË=Ì4U¡ND]ÔáÆÔ(M¿$¸6äÿkÚmm¼¥PÞ½wböÜ7páªGÞxòÙÌË|Ó¤è²mÇþ}8-Úë|½wµ¼¼¤bÇÝ·s¿ü½.YíäõY~ðyìç«o_®[Îð0@+8Ín¢@´o@ø¤s©Ûvè¶j
+¶6 Ã
+-Ú-C?hÄ ¢Cñ¸SdѸ+|1FuÑÅ[qƪ̫úÌÛO;µæ3ÏÇðÄrë>²èSOÉ"ç¿%I¾%¼ÊÁd®ö¦l°@è2b°L3ÜÑ¥mJðL7Ã33MdpC:=²°D ADhO×(ì(6?û°ÐÕÿî$FA3¼±Ñ*
4#Hå´R-=Ó(eqÇ6½«/- ±$©·>%ͯ¬/Á°L°R¤õ»TóâoÖVE
ÕVS¹J üuÌÕÞD6ÙÐ[Ie
62N5.S¦M [j1Õv[ º-Í[q¤Üq=×ÓðÖÚ?Y]%RKv±b·GW}L®WýÒêÝUïòÑß^ûõ·XÈëªyéÒ¬Xå¸Ý¾ú¯Âh/VÖ\Åc/Öø\ݹ9O¾åKÞLeÇ+÷e±Ò= Õó
+°dÓ»Ù^gÚY˥̡e8®20§:j©ÿ§¦ºj«¯Æ:°£æmPB¶Ö'¥eNnl²anÔì³cT{¨µ/õ6Í oö3i·TŷǼõºh£'\²¶1búmŤÃid|ÛÇ#¼ÆÉ)ÇQÓË5§yºÂ¸3¥ç÷ó½ïÎÐM_(ÒMÇxsǼöe·]qÜ)ßíÜ]î}¥à>¯a¯®Þ¤sPyäÅüÌÐÞ`#ª¾zÜiÿ½û¸½ÿÑðÝÞz|¯Ùü;/{7Gw?ÎÍâ/³õ@é/|wîÕçíþÿ7 ŧ#r®Rè+ûÚ?íuÄó 3ß
+n=Ó_5Ø©ÿ
+v0lÿ@¶vp[àAã@fl¼`î9ûa[¦Ãÿpm>eDcs^
+E÷-%IlMôãÅgBÄ"KŲqQCôb¶Ä
+±Zs¢¢áºÆXùJÞø&+Ñ-1㻦ÇÌÉc@Èo«Zã!ÇDER©×j$sÅ?VPÔ&Ñ%FMªÈrä ³É«ÖÊ)å$ò2Å£d'ïJY¬"-9D]¦¨×3¤"eGÃçmÈ[¥ã\):Æò\üå3ã(M;¡ÿ(<¢×FxÍõiñÚLäÁÉHqRJÇlâ8ãLjòí <õ4¼wðlæɺÕJÒH?c¨Åýs꼡<+YO
v³¡_ËZD%:QVÔ¢ÅhF5ºQ°Ù¡uÂ#hPº=¤Ã9©I|¾-#Lõ)SÒM6 (µ¸ÒìiÍ<Õ^KM
+Ôb
+9áhR9z£â´µ)T½(UõQ5|VeRµjT^nU«[óêWg@õ5Õ©ÞÚY-eU,²õªj%èL'õG·vÑr«kKÌ
+×Üq¯Äûëp{ÔÁ~Q®iËkæ<@n%v%ÿ{-,ã Ù»RVl5,fñ¤2PÆ
+N ¹ Z@¶(aEmj-ÚÃj6®½)l)[¡Õ#i÷XY²u3 np
;\â׸ÇEnr»\æ6¹º-(WiÈ鵺d¼î%W>è*g±,WwKbZ<9×¼çEozÕ^ñGºÙN{í ßÆe7¯¢½d[¿Æðþ¼Zo<`?×¢oqäÛÃtºÍ#¸`r·¿ýûïµ
+¼awعfB¼©g«ÄÚŬcE¬XçÄÖc=qË¿WÈÃ7Æq_ÜÇǷǤïmû¶l:8BÆÿ#ãdÔ8#ÍZr`Ü)çX U&.«e3y?ö.sb/K·+õ{äAͶsòjØe*[ùÊu>.>ÕöÙÏe«ãÙ`@owqoWm'ÏRÑsDæÌ\=·Ò¾´7Ü;¹,MïUk¡m'êóÁ·½ ³¢-D>#ØÌ-óoÏ[éÀwÊk®që]W×¹¶ô{ë¦ØZØÅ^/îêi=Z¤Æ´_mß¾þÙÚ×Æv¶µ½ílmÆ4µyõÌå*#ûÎÁF÷¹Õ½ît¯»Ü¿V7ß
+lõÙÑvM]DB¹Ù¯ÿó-hGzC~n»Ï]n_·ÖÆN7¹Ñ-q×{8'½w¾Îâ}yÄl;¾hVkR¾E©Ìpz³âæÆó®åÝð
oæéÆ3N´Pw|¶þ¦¶È±ËæcòÛàNù¬·kOÜÒNãuíò7âWgo8w»ûÜãº4]ðmvòè(gÊnugÚÖ¾õáýr
¯=ÙZß:¾»îõ¡÷ûº Yß.p³Ã:ÖIwi^u»»»Îq»ÓÙwzãÜyGéYÿÃoÞÂÏÄç¿îAÑQÚGÚÝ=ï_}æX¿yÅéÞúÉßæùîÿP°ÿ]è¼|ÙMßð¡~ ª?ö!sb»×6oüìþzØûö¸Ï=NK;fUÕÜêëïOxòøà3¾Ûí¼~öçùúØÖöÉG[gWHÆåw!ë$Ãï¯5übÿ¹iK´Øù+|K¿öSÀ4°'¿ÌªÂË¿R©ïIµÍ¦ú2<a(3@Ã@à鿸ê¿:47dATOé´0 ¢Ê¡bAÔA<óÀ1ÁÙ¸¿Í¸ò©yúè*|bB=Á@ÔÐ&Ù¸;BAIB;Dñ@j"Ò
+Bý²áÛÀÚIÀDCd!ÿÃá©xñÐ'é@*B:©B=t5\*)tBD,TE9",+´,ï«-ù9 HTG¤D0ÚÄM´?L5.ÀBD$L!ô#\B>'Cü%Dÿ@D¼4´Es at 9Ìa©Ã]ÄÁ$Y|¹Ã©¢DUóÄ0DA:?fìÄjJÄHäÀgF>Ñ
+«FȡƯÛÆ×hG
+»¹
+oDÆfô6ñ=Y¤E³DìJFÙFhÖHÅÞZ(eô3¼Å~ô°5ÔEaƸ ÂØ¿L
i£î¸ÿwEr´Kì£GÜXFéH:¹¦¿{dÆAëÆÊ)GqdIÄ¥ÃÉÞÅ{¼ÈfoÌÉìHs92,CH[A4ÊH%Qʽ ¬`Ê<)<I53ÉhÂlÜHÉLÙ(Ô@¼Äß0Ç&GVÒÆcÔÊv\ɸ|D@I(<ÂsÊR@ÓÈI,KØÄ:KTIÀ¼~<ÊÆ´½ùÈeF`ééRùÅRºÊÜJKºÄ
+ÿpKe4¹Ë¹<ÍÆ°Ké
+KIƤGÞKÉ·,ÄÂLÍܼÍOD±×<´ÿä˾,ͧÂÊQËѤÍJÄôAÅ\Ì¢tÌèT<*K%ÉÔÌ8$ª:,Ëìù"±¬D¡ ÍlÌJúK<áHåÄÍÝ|ÉÞlÏ*ÏkÄHntG¼lOý¼OIt,@àERÆ
+DyäÍÿËÃäæ8ÆÎT?èÛ²êH`¤l}aÊôÍË H+ж\ƤO\ÏEM÷ÄÈåôM¸)Ïd¡ëF|ÅFåÔQ®ÄQ"P?ÃôÊE=Q¼Ë^Ï|PèPöÐé¬P½N:8H`Ã9ôNZ©»°JÏÉÿEQ ÒíÏhäQ7}SjSØô±B6UDû¤GCéCÛ°K?¼M*ÌÓѼÓ;=FEÐÃK4]Ó$Ò9=ÉôÜÊ Ê(E_cc3·çk¸O
¹é[½_ëT^3Õw¶U·bË´¤\ÊÍÌ-L/ÅL0ý8ôÐà UG2ÓY"Ô$LEMD3ð¬?=EÔ)<Ô?4Tc
+-ü¿AÂaªª½ìJ¼ºÔaõ`EÂaÝSfQqeÇætNÆPØc=Ú˲¹sWê7wu=êc×x«¼Q͵\[%SìL]qY½U©X§ä×E2FÌV|P {B»Ö
MÎÿs%¬·bÔF%=áqØ@JUt¹Ê«;Çk¹Å3ÙEY<³×YKÓWiá©V2¤
¦¤LP~1È2ÅÔu$1ä?ä¼eÏ43³ÉÊÀElHP´Ø[²5Ae¬LÝ mW»9e<9°µº¨«×°>[Û &¶´¡5´TÚuô+ÂÍ©=-EEÚ¼ÅV=´¹\«?æ4×ÓÚä3ÛäUºÚc\d«ºÇu>W×ZÜ+ÅRµ
+\m#ÉC<
+]b]WLTeEÆ(äÖEY±@=ÄAmÖ{]hMiR£
+W
+>ÍzÒÿà,ܪXjýYKªQÿRÈ<©;[äUYɳÒÌ¥We·|}YεÎE$%£OoÇÕÓÔí}ÓnºÑJeÒÚËùô[1ëݾ%O¡Úùz_5C;±hÞÅ=¯=YésÞþÅßØS×è˲÷³^ËÙìÕÞ Ñë°<iÒjì£5Òlàõɧ6Ak_ü«%¹Ùݧ¤_E%¶è; W×`v¼O½×{}U.`ùÝÌBªàGÏ9ÀýlÉd½VÉÚΣ¿Å]l &kÓlÑ$+áãU\ËåÔWm×V¥<Rma.^;¦×·ÓâéE[®áÿf#Ð<Mää·`â´)V ÖM6]Í÷¨(ìáÖà$Ú¥>ؼb
=ĵÅ*R½¼3®=ÒK±t`à+ÐfÑ ®ãüË6Æ`ìcØÚ`KÞäh+ÅUìÖÕ
(¦ÝÓWTTXDÖAd5ìÚEn at 3väå¹Úù\`"uãÔ|àÅäa6æýb&=e0e¼íØ%nbùea.MóÄØ,^µÇ'fZn¿äÅe÷û]¦ ÃÑ__VSHíÞú*ßIMÓúßi¼Û#FbQþãªu1idkÆOtVfoþæÆ
+gêT¿ú+oeÂÿïE5XÎf¾E]B»DOÕÅ-ÓV$ÔhµèAff|Îg at 6eþ¡0=þçkÑ NK`¦cí
+Nèè´7r¶!#"aC<kÝ¥PæÝß¹NG~6³h;èÙâ56ÖæF±énLecèsè^}bMÞ.i×Rj}<£lT at K«õíN6ÏøÐÄ}këd**¶êå´¬V¥ö¶É2êñô+$ýä^ö5i´Z±Lk\Å^TjNfx4_lv°cán&Bnãì¤ì,à¦á²%Bé°6¡kæË
+\TåcåybêWnec¿¦åãÿÈvÏðEÏJý^b¦çH¾Ô»Þ=<êìä¦?>n³ºûÍ7®æßþËþ>m.Gnæ,Ýnë¶.Eà^åÛþèµ]é^2¾æ¦.õ^ìã^mNêLîÉÖÀyè¬äOçÖ'ÑæÄÔo pãfo½pÃvoÕ&ëÀugütiÊ6ßóâMöOÉe®îàÀ<ëÁ¥ê'pÿjõ~ïײ,ñZj¦ðólÍåÊ©kú&²ïç#{ìëþðRÞpïïæÖqkJpÞQRçÄîzÖãê~VëÎl'åÇñ¸}ò®Þ½÷qèoÉp¯Çá¼ìk<ò×^gO¶þïÿ}r(?óçq£r;A®gãìItëéÂÞ[åÖs2ð,Gi{¦itMst
+góC·rÝùn }3®úÃBuÆòÅóFªÖé}Åm³dPhÖ2ïô.ôùuÂÝ·6×·_)&ÍJ¿ô8iÝÑmS|/ó6EÁ\°!PulÜu&Gð_Guÿ>ªU¾nuubg,¯èî@/! ]ïu7ö 7¡=Çöl×ömçözvlñ&7,·
âVÇ7\MëÌöôÿ]¤«öÏwqob7\¡®¶LGí|¼rw/s÷CµÑ_ñ²Ìo<'ÚM7ÞysWøÿã,¯+3{_rj/íݶøxÂcê/â&ñwwq¯ø¼+S?õ¤ÖÛ/dPô1Ï/)ïM¤k _Î7öhGyøúÇxDôÑæô
+:j)çí>)¿ùúîy^w ösxz_Úz¢'jøz÷C#]ØmÙvåZÔXFDw÷ö~z¨¿ùdïSJ
g°ÔîÃÊúïz»êûó°çéþD_öað½ìnöÀß¡*{åGwÖHç[Z_I·×)ÿiï{Cgø|;3¾|ÂOwÂçûÎd OÇƯùÇ|ßõõ¿]Ù×úÎ_ï¿üÿ¢esþ^TºNÏtÖò!j«_}^û9zcw¡Ø÷|Ú/þ½ç{Û×Ý®6wSl¤/ñ<f%5¶sWÐ/7zã÷¦,íÅÏ©ÁÍægÿvÏ|gtéç¸6/c2»~{vkwÅk" XÀ A2lèð!Ä':THñbBèèñcG Aiò$Ê*Q\ù±¥Ë2eZlXS#ÃuâìéóçD<-jç£J2mêô)Ô¨A¥Rjõ*VY·*ÊU*°bÃ~-kölαdѲ½¸¶ ܸsn\ð®Â»÷Ú¥;·ï_¾m¡ÿz5ZØ-I±!»8ìc&{T\Ò²JÊ3Ö|cg)1oÌÙôæÊ!O¬;øõU¡°gKLJû6îÜëîí*ïßOߨ¶8rÝj'wWîs¹£~k]°ÞÙǽ޼'sð]_OÍyñêôê'4í¾=üÑåÛWÏ2>LÉõÑçï~¾}!¹öÒùU Y¶!¸ Ê5ø EØÕÆU!M¡sJgÝ[Z´Ö
$`¡(¡A*È!wÕ~ú¥vÙLóé¨K©G£|<âأ奤yIYñÄd)%3ø1JhVÿUVÕe`b¹¢eîä¡?YÌÜ;Íj4Rf'j÷
V$zyZAÙ§|®G¡JÊf[O2zÔJúPNåP²-úå¤vº©h~j&£^Ê¥a8ÅYܪÎÉÞÂz_¢®7¢CºäöJ¨¿:©\9Z,RÈZ©§2%«ìVÒBho¥R&¶v¹¶ ª©*©±F¤®ÂFä µÒÔn ¼îÚËkcÓn¾ûF©¿ÜªW¸éáÚXpE$Ú
×)¼èâZÚmÀmËqnw\!È$Õ&ÿ¹e|¥OéÚúÞFÎ
+s4¶# ü}`´Öü}4Û¼äÈ2ºZ´C #!^'n©_ÛAÝ©'Ä,˧ø!ÕÐa}¥wZ.m)µ+ãföµàª½6Ûm»ý6ÜqË=7Ý G
¶Äc·lî¹õåùhA3kàG}n£jߺ3½ñzFZà4ö«wªGc^Òq^QwlukNpÔ¦ç½××û5úêÝy¾ÞÈ}[7î¹ë¾;ïmchÁ?<ñÅO¨´<;Ff¯ÉøñÆ×=õÐJ¼¤3¿÷åcw¾½í¯hpìZ{ÝüêM»%¾vé³?5Ô¬Ïæÿ¾nzF=þùë¿ÝÏZ¿? (@ý(µßüʾ
+yþáY3ó?
+/{§K úº·´ïa°7 qÆW"æ&Rk³þ~._Åó±æý/6¼aþ
+¨¦â°>´¡eXëw¯ Ú'ø,GzàòYdîä¸
+NF1´¢Ø6xE8½/k
+KÇL(:W,¡ë¶ÖÊn,EòôÃ9Ò±xfDLó¨ÇÞ1Ës£3=²4 ãw5!|MU§È4;cÜZزȢ6Âï¡+`$HS<åû8T²²ÿ¤ßEY»ç¹²
Ô(8±þ͹dú2y:J¢°tO;ĤvI®5y¦Ó:ùKE"Kt¶¼f$Glr`"b 8ËAv³$Ú4u¹6Ìù2\"K¥-ÁçÃ2¶Â;2y ¢Îây1wR³XK2'Bù¨ª2ßBU"'S6´¢UÄb.ÅÈË^4àÔ:;: e=©Û<EgRv½2¶\)JÓë Z¤DýgÑÆÄýP6ÊQf4[£$ª$II©î
+{2L«WS<:u%3e¾ D©b/S7u#[uRò´?íTÿPñ°v"u6ëÚü8¸Æfm-¨R+ÂT«Võq}% WsÄ¥*e)aGX_ÙÑ^eD¿b±5¡ª<+Z
+¦V±õ®Ã,,=«Ë¼æĪâi;3Eö@Æ1C^äw(iOt#âî÷ ¨4µÔâøZ[Ë`fµzRRdFÚ-?÷ËqY2.ÈâT²wnek¼ºsIªÜWgE«7Ð÷YõÓ«¯tÅ=¦9ó«b÷3%hG+¬z5AÞöt^øeoaË«§]É
}{&,õ®ëpúmiʬ[]ê^·w¾03üݤNÓ»ÛoyÿFÞ7¥×|¯ç2¾8À
+Fð[Ü®õÆYÝíNÞ%㯱=aü²çêÅöE°)£õÕ+~tÄmurB:;¸cP®òtMlÓÒh£èß#ÿjO at VW¼ü³.Êâx=Þ¬¬cØz6^³lë,ä¦J¦0e«\¹9>ôr¼DåAÏÑ;﹬ÜÜ&¦¿D2<dñr/fskrÜÛOSÚË,¦ó}|+M§xÆníªM
+a
+º?-twg§Û9§r»Z´£«láèÝý+àSß·½FÖ}éÕ"Úu¾6RÓÿdïXg7Sv«ÓüìX¯FÚO¥v¢2½ìfÙXõ°Í9l7Õ¡Å.
+°ã
+T}s±ÑþviÜlø*7ÕµvãJsî=ùÎ.µ¶ëpÓ?8À®ðØ6Ü·U+a[ovüÆÔ¼ùwÊ{%ß'Ë_~Ì}Û$ÈÜîÙ+_qçÇx[}à=ü%.øÀíjUÏVg5|ïÀÃýñý?E¸Ý÷:Iæò^½-½ò'ËëE#»ÌÑ®õ+±Ò§)ÜéíÜÒ5¶¥øÂëÜÖ×ÁØ,lçþv3q¤ÞÏkßÌñÕêùÈStmßd¯ÿ\ïºÙ3'bÀô×ÚOz̳½Í.Ö#^ÙÓ£>õ®¼å=òÏsoóïü\Nû(ÑlöRMßúèÙoõï^ha/N¡z÷íýþX/SéÞùÞ²~£èJÚcãpmâ®-:z¯·Þñ«yåÏù|ÃþúlÃköþ!Õÿê?híTÔôOPY`=¼mû5þ¥EýåÞNÊïE Èð¹f×Lv`}(ÏìmÝ
+bImÕ2ÈýàX ~IÂ\PHߪÔ]
+"ÔnÑàÎÜÇ8 6éC¬ÿ`Ú&a
ý`¸
+æ aúI¡úZòUËy
+jRÙ `ª`J!£GZáaW Æ¡æ¿ Í!æ!ÝÀ¦ ¡Þ!bË8!ïí."#Ö!¢Eev±aðLê[VKTÞâ#ÞÆ%~âL&â/EbÈD!%^])þÎa ¢· "-^Ý¢.Sâ*n¢J¥Ýب"Áá^xâ.Ó+*G#6£3>£ïÄ_2ÞâYþâaUâ2Ê0Æ" 2Nã`X9#:¦£:®#;¶£;¾#<Æÿ£<Î#=Ö£=Îcn£8ê±¹6S b"Øy£,#B#B&d#ÂÕ=6¤C>$DF¤DN$>JÙ>!fA1þ£³±Ûþ}
+ô¡9õa8×XP$J¦¤J®$Kªc( ´¤LÎ$MÖdDâÒE$îGdWaA~cs¤g£M&¥R.%KÚ¢v0%TF¥T¢$(åämdOcÈePÕP¾Ô,âRN¥Y%Z£ÆdZ%[Æã[¶eMU¾ S`£l¥O$ñ¿£V*Ô1¥\¦a*åÆ%T*f;2¦J:&;Bæa¦$NÖ¥õi$Oê¥ -ÿ>¦ÍWJ HäX:_YN¦i&UdÚäj¢ckJäkª%j¶¤Yæe^VßfjÏeF-!)f9äeJ¥ZÌ&rÎä`-åI@s§Z
96ç;R§bÆ$vftb§;f'cBçtãuj'u²fÙ¦+Þ%Ì÷Y6íeU]U_¾ä Î_æh~^l6e:Æelîgr"g !¦kN§lè:'6&^§s¾¥gwBè¨JhRh§ ç°Ñ'$æ%cõ\Â'õ¦oVSL=\ØO$íèc®£Vgæhws6(fh
Ú¨h^ÿèºd2hF¨2¥*$F©N)R)«hddéàmiø5mE L¬iiY1BÕË|v&¡µ(|i¥ô§~N¥c²åsZ§t>¨v6&R.i£tÚéng
+êçF0çwFfb(\.*&©
©¤Rª.©¤î)b&#fhõØ{¥éÐNêyÛºiÑñ©b\§.zJoÕjùVá!Û
+×JÉ©§ºewé6j°(©bhik¦Þ(¢RJT.«kj¡¨´Fêi²nèIrg¶.Ç´>+5z(§@¢³eO¸éê½8^z¥ÿ+mÕX±\Ö«½¾
+91ÛÍ%]GV\ÔÁhʨ+¢¥¦)N*±Ff2«¥ê¤ì
+²2çtЩ >¬ÁÖ©µ^¬lbêÄ
++Èzì.æ.ƪ0ÓmËx©ié¡»&XÆmÚ·ÅðÀ¨5N¢fîÔÒí+ÕÙÜÄõëE lÚÉå¡Bltf¨µn+6íb,ÇZ¨¶F+´öè:kÆr+fíÂVjÕV*Â~m¶fêÇ*gÉ«É+9_±Ù®ÆlÍÆ,»6áYÈëAb`î¬Iß©¬A¤ÐìweFfÂv«°þ§Óö'äF-ÄNmÄÕVÿFkÂnëå.mYúéÈ>lç"¬çr¦Ú
+ÊÊkÓ¡«Î%XݪËËÖnÙ|å®úARßúv
GJáV¹ÚÎnÒ5Ѭ%âÊÒYÖ)K¶&dzëôv×låJíójîbjêéêé/µz§g°&-ùªV.y²oRì¼µ®ë²-íî.Í¢(ªÖõYªú¯ªºÝßØ©*Ø6aåï/ý©æ¶ ÀÕHÑlbùêÑëÁ©È~nSíÖ6¬ö~®åp÷Úê(îiÒïxÙïz²§ß(Ý Îßñá©9êîãéªÂ¸eä3ÿ07]¯ýIûëìm0¦×¥0m³®ê«_+Æ:- íÒº¯Òf®]p¦pØN&££®\ýaeñVÐCðà*ñÌ
++ö®Ñ^[gwëÓgÁNoØçzëwƯú*¨üqBñ"«L²M=r°i1Ø¥±@Ò-ð5*
+^£ûñÑñÎR
+äé¯ÜÖà²2%0«pZ>Ó-¨=*2jr²yò×q=QâÄ0øÅ2Ü"s½nAOã¯*ë¥5Ïæ§-÷ò&cnCæ2Mò2739óÙ3^s5¿ñ®Pÿó:sä5³³ei3¿3.«ÍMâ³&ߣ=_² 3@ß²9:Mf¾³<;#ô?TB·ò
+æ×s at 3n$ó3ãþsEotr´t2C7GrÉHkfI=´h:ñs´K¯°F¿´L¦G"H¯ßAt%.¯&êtO¦4oVT-SôLu Ç4ãÊc?ªQCdMÿåMgaNû4¯I×B3Ôïf`´E
+5&6µXÓ)Ræ~.5öu&ëâSåÙduCK:«ÜÆ'VÓõ
+µ7XÇZ«5`Ó£8w3\6Ò²uTrPuUïd(nõpâu^ûì^cÿ5=µa§ua¶Ârö.õ\þé±²/µ*o綱F2úNkÒ¶!Kî!Sì¸&öóÑÆ(´4ñÝj®r©În)Ý|è0rÛlróp)«®,ÑòôA¨ôJO´foö~qwövë2Á¶rRnÄNqkp¸:êÛ©&S1÷¢nô~°["6n×3îv5FnõË(ºQЪ²ÛíÌp\oö/«reIÞ~u',vswvããgOøaçÄæf¯{°xwÃ^lqènøk·mÓb[ÿ&Ü+»ÍbcsdJÁ®ÌºÛ®û+Àö7¼ÄiWïtY=ÿø¯dúimÇ6y¾¯·¶zkèb1ù§õ¾ïÓBùÏ6lÿµK÷%C*§7ØV¨Ær¸¥87¨Sdçâ|¿Ñ#Æ\)Ërë×p3ßM"¹,ø)ó»FÏ9¼Ney6g¶_ר±í¿÷øzq!£7÷Ö+¥n3,|«9+§··Ä¾·¤öcn3r³
+rm¸)®¹IÞvÈDß~§Û ïLß±Ïå/®ôùÝÜïº s¡;¸¡(ey¹±Gº¤y¤§îg:ûöB{«å¦óy{gú¸¢k»7Y»zK£(Ò+
+jÆÕÿËþ
+-®ÃXóºÂõ9ï"ß76fyKO$ôº·;¬¥z£Vº7ò·S1Vûc8ÖF{Gü¨7®§o;ÀC»Ä||{¹3 !Â9÷8ø/Øÿr #øËÒ:² ·¼½ß;µ9UFîy{·È.»êNºúÁg,Åow£Sæµ9åï¥c:·.<{=Ó2úÙn*Çw<b¤Urß0
+[bÕw0Üí0Ë7ñ¶¬ßõ:Jñ`yÍï;l*lõö;©W±´°Ö*ëÅ}#k<À缦;¼¢.+Ðö#c9Þú zjKyvêjÓ6Ã;ÿ$«_ Ös×'¢{\VÛ'ñ¹}6
+»¾¿Ã6³ýö¾9yWm¶GûOûÁWþ`Gx±?då³|g¾æ¿ùÖw>²Íú1P)¾ë ÚüÍ£îÐg0Ó?ÿÐGÿêCºõ»oz9¦ï³î=îc´gW½÷¾ïàU¿79s6
+·)ï3'Ѩżè3[¾7HóF'9å/2mK1@ ÀÀxpáA &lø C
+
+R´x£DN)dI¤T9òdK/aÆ9fB.CÞ¬¹§A?:hQ£G&UºiS§C<:ÿjU«W±f½UkW¯_Á
+ÊUìT ЦU»m[·oáÆ;n]»wñæÕKìѳuÿî<8mß²bV¼±Q=!G<reË0
+x|sçÊMBíyræƧQ§vjZ,kÕ¯aÇN)Z´lÛ·O»¾poß¿~W·PÞpW^wÕÄÍ¡GMzuë×±Û{wïß_>¾5RñDÏkMO}{ ´!º?¬ûäËñç׿ß÷ú÷Ù?Âüsï9úk4ðlÐÁÈ2[ðÁ )¬¤Ì=óÂÐ*5±1øD,±9pÀYlQ?UDÿ+FézÈÄ ¼QG¥$´ÐÇÁÈ!Å£«m¶ø4S²I¶Þ£I&«ÄR3$¹LÄ.Á,ëÈÅ¢ÑÌ3ÑÜÊU1ͶÆ/Ç0éì±È;ñ,m»<ùì³8éT/²r6*ÝQÃm4Ñ
+=4ÐI½ÒK?¯Ì79í4Í5©ÐMOe¤sNLu´ÓÏUY½pÏ;UuP§XûUÅ}ÔÐ-%íªÿ|åUØa#4ÔÖ[)uÙe:ö°MIVÚá@ý"µFýTÙ.OeVCZ[
+·ÖW7ÈÐÄ
+Ï[òª
+ÒDÛE¯X`}ÍuWI]K-õíÿ^ú®Và7+øNXá
nxÛ@»õW>sÓHÓ(Æ.cîÛxÈ|%ƪÚAãô]¿ü·W{ÝeÔÝû5æeA&3`qÆùáòf-â¥óø:¡5F×â0Ƴ FêX£
*É& þj)¢©ù¬h³LvùeWæJlbUÖì¯ýõmMMtXî¹é®Ûî»ñÎ[ï/Qsûí£~þÛ6¢«#ܺYFÚ8¥-º!¤3jëÜñ(ß¡Ê»ÜËM^ùÑâì=åaÕ~¹ç½YoÝõ×aÝïT=?qöo¯¨ÀuÍpÏ~'ãÄ=Jiª)7ÿúñçóä'oþñÎ{'ôÑÃN»¾Eÿe³³ÿZ4âÉ_s¯Þ±ôCf¿wÞÕÏ-Ï¥)ºs²¦_ê鯦ÿù2ÇÿËx°ýøæqÍy´ßMê׸qÅïYüRmÖtÁóEYÝõ¶¤%÷Ù§~å3!u6¨/ðP}Qaáº^è9øQLóà §ÁBoy¼ÜFx¿àuÆ5Cüò2<FOì7µ$ú)4<WÂn±pU߬E/"kla[3?"n ÔÜ'çCÂñ~, ·´4ÐAâ<#þ ]ò[ÿÙ5H..k0TX!ÁâBHòhZ9c%Õ£Æ6ÖÑ;¤ã'ØÇiNÑM)!G-"ñ|\ÕøÆ RKêÔó6T2ñÖ#k¹ÕÄtÊ%Y]¦zT^+)Ë7ªRÎ_ð(GNÆQ9ÄåBÉÍzVÉÑ!Ù¶Ì^ò}C9¥:x¶hÈg<
+Çmþs®å4£¹¹ E4ñß
¿Q6í"aÒªÙPmâñ¢'ª
+ºÎE^tDªèRä9Ï6Å#eJFgBÍ=:Ñá¬+]:ËkUªòØQºÔ1<Í©F·¸ÿS¥§÷j&ÙåJ-GþéðÍ&9)Ê£ê'0å NgÊTöµN at 5káI¶¤ídõ×RÅJP<V%£i(FWgtwIÔæx±¦lU&«\{ò;ÃþHq[
+yVÉO
5é¼*
+Y}ÁÕ±w¬AK<Zxã£aÔÙöhvG¨li+«Z]±¶µ²
+gmÛ=*v_-¬´Ø×%¹
+ÚH]{8²êÝs¡]¢Òî^"5îOp{Ýé0.<½õíe[!Ë'¯Ä]§GµÚÞhB©¹bE¸äîq+7ËÙ}±5Ýoÿ¹éMIvÓÞU6´@ï`¥`/Áèõï{Äîî´Î*Øðá¸xµüí¯ì_·~ðÿ¶ÞÀ¦¥
+HR^ZM t£a&cüY®OíñTµÈW¬1O#nIp5ä
+«øWfAÆdòøÁ&1#wb-·ð£´Ú¡6}UüåðËS5³ãÜ94ûaVs?É|æÀ([JƯի¨'ë*SÕ-æI+Ie-7Ð
6tÞ¶èBJù[\õ¦ò亲¥²<lU1
+æv¥ÞÅÌjìj¹0ºíë
+fù<Ø@+Õvõ »¬S&ÿÌ=ôXni7ùa¨Î¢Ö°K)'°QéYöÁx¹TÔÎàt'èWoÛÝ£-ØÿÌiæ5¥áX»6/Ýmn7°÷îQ¦ò¤Æ¶7r FPeÓË{©6*¼¾
t!ý¶½p
/\bàNPÆJèkNøÖdã®kêú×¾ôu
+Ò{NpÓs²ø
+píý;u¢«×ö¸ò÷á·ùÍq&?|Îúds¤yé`²¥ïøKîq¡»TÌêâÉ¡¾Ö£'é0f,ë[æ1÷÷Ìjs±ì&ÏlÏÝO7süÍÿ: ×<aÀòðÇi_ûÜË÷ÀâäéQ÷{©Ø
²[U^`QK6[Öñ~®gÙ!yÉÇ
+Éôr^\cÀZ]4^(q¼J#ûÕÆÞõüþªzrr¾°}Or±-·Jéksùj¶®ò÷ W9Ø'|á<7æ|îèv=¼ì}ÀȾøÂhׯÞSÝþö¸ô½× ³°üå7?AßÙVM~wù
+òó7Ü)é×úIjÖà±B®ß>øt_îñί
+ð ÅÁ,Bf0C2PVܯYF4d¤1ZÞ£LãZÚ¤5ÿEðùøbS£M<PFNð¡þøâ
ÊÙÈKHRͬÍFúoI¸ÏÚÒfmôKü°ðÑ/Ë/æùþAhð/¤°/ð
+áD
+µ°
+[°Ýb»ÁPdSpÇðÇ[¸ÏxFðº¬Ï(I}Æ íð¹MÍÉ ¯Ì8äáä
+¥o
+C0¿
+ñÑ#1Õ0ÏîïÃBÐè9±ÉO °E14@êfO³°Q]1 at Z1%1kñw¤Zè¬/}q=±±ìøpÅk°ÿÂ
+'QêT©i 1añÑ¥n
+1±Þï²i«§qÙqvnÅ¡ÐCñÁñ7ð³qñQõ9$ñ,L°±Q+16
+äD!QEÛñ!!r+åcèq6t±
+³q¥Q#=Ò_Q?R$ÑMò×IR$ñ
+ç0·Ì!#r&iRdí&q2'ñ±(²"Q(¸ìK2
+U±ÒÇQ ÒS1)Mоøq3²óK)c°%±Ha2&k²+½'B Är,ɲ,Íò,Ñ2-Õr-Ù²-Ýò-á2.å.Aq¨zÒ'ÿ!+ãMîcþð±?bO0¤ð±T
+µL&¿21sIæ²1ó1!32%s2ßÒ
+¿B'133íÔhd%Á0/H²7²#A4ÏwVÃ
+1³5g2,)36es6i³6!Ð/«6#(37G
+*¥>J²QQ8ñB 25U+]ó9¡Áls:©³:2-3:ñïHn`¤9S;Ås<ÿã:Íó<Ñ3=Í7P7¹S¼3Àó0ɳ>Å Ô3?õs?g=ÍÏ=ßMâ³C|ÕXÓ>ôùsA´AÝÒ?ÿ3 at CÍk>é3A1ô+ñÓA9´C;BË@ÿ%E@
+3<34E#rC«6±S,YT?ÃrCcÔC%D?QDG4?²óMôD/TE
kÔ6ôFat-t=os,iÔFeG?qG¦G}ôG·r5tKqIû6T-½,ÇTIJ±KIG©T4)N¤ô¸Zí@Õ´N]L±" ?aS4tFFõTPûÔO FULõ4L õOµQctQÏ3Nst4ÛGõ2+
1KµÔN=µñôEÕIÉ-Y´O5UOµ,W5U÷ÔTIõUUVKUU[uOC5M?5T4³WaçDäSQtWørI]5RÍ´VÿUVõLUYUVõYÛ²Z±uRm
R!ÌÕèt[ÅU¶52oW+UÕEku=o]iZ]ÕZ4[µ\Íu\ðX¼XÁU_ìð2ÏuTãu]É´F#URç^Ó²U6La¶aѳ_¶wºµ@ÿ5c=áö1ÖIË´béÕEvdÑuZÃ_MöeÕU[?6DEcçtfq¶ÛB¶Iµ]Ñfõ]c6Z}ögcÕ^6f6VÍcshÅigÛÂõivÑ&i6^QukgdVZÅôhÃö`Qlmõb¯Vò¢Öfovmá¶Ê²¶aUQÿùÔVáµPgôT#6T!6asÕOQPIöne6nÅ._¤vj_j÷qggÑtrÁÔhrAöÔ,TÑs=w(7t/Viö:÷s'%ÊÜömQ·uJ?cw.g×r¿v^ót]LTws;uw×òDwxM·n
+Um÷N+eu
+4y·$x¥wzÉôyft6²I:×z½·µ¨7|Å.¿Å¼f{¥Ûº·|Ù÷[Æ÷}á÷,Ñ·}Ç*·yé7S,~ù7~çW¿õ2}s¸WGFUr[. ÖpýÖvmô
+0íww1øxlé5]åÕÿóo¶h?4jv$xD¼m}M¸
ûfG?øAEZ=4
]8E\2³Vx8u/pq5QÔdåp
+·pOÏØ·t8Z
+M7}XS
µcµøÁ·iÑhwÓöd¡ø±¸]õ\ŶkIu[-ï,øé8-J¡øÛ«Õk©ømwÙXk;x£7õzå~Y·%YSL
+ÖyiÑöÉÖ¿Ö^ÅÖáxåR'Yñ÷Y]*)vV½Teý>z¸³¸(}LW
ùãÿ;¹WuI÷a}yh1¹ti¹ÓsùSHwÁ!aomyµ6©Ùa_u¶ns7u}´¹Õõ97øxe=9l97Y©ùvzkyuÉzîz¢Å¤i{yQ¥¡Ý5£YUTKv«X/zo5:ï¢ÃOs#Uú¥·bxIy2gúK¦ÑU9qº§ÍBtkÚ\#ø¦}:fTx§W¹¨z°&³9¨ó4Z
r©zª±Ú1úw«)7¥)ÊÊ«5ijZ¡«ÑúFËfú&¬¬×:ÿé:wÅz¢_è®÷㺯奮»¡ýúRbH¯Yzáàz°wx®»±oÓ°÷¹°Ý¯»²»Ç±1[d!;²Óת¯Ú²+ûx3{´ØJA{bP³¥?û´-ÛW]ûµYµ÷³U[¢eû¶Ï´qÛ¶JÔóy·;uW:¸O¬6»fo.±{¹;eûzµw²mN¹»º±ôϬ;·[º);»½;ßvﻯëM¹±Åû¼;ÌÉÐ;®ÈÛ³½x½á»¡â¸ãû`·¶W»¾õû¨On¿%ò¾}ûý{Àù»¿ 辯tº¼Áíx}Áå¿ó;Â-Ü,^òÂiè¢<Xÿ\ÃA|SÉ+ĹÌ)ܶI<Å3Uü¡M<Àº[µé±Ã|§l\Ä{Æy|ÿ
+³ÇÎþÜû¼È¿nÄüüÄ+<ÉINäÉQ<Ê[PtÛÊÓ;a<ƵÇùõËjÉ©Ü¥Å\ã6ǽ¬Ô\>ÉNÆÏ|©{7ÎW,ðjéüÉ+¥Í{öÖªìà<Ï{Úmø|·!«Ð|ì]Ðaúý´5ëÑÑQÑͼÒÉ|Ê˼Ê1ÀsGÒ;ÒÿÐ;=Â
Ô×zêÊ[ì½Ô9¢]=µ·¼ËÍ;Ö=½£l½ícÔI=×ý;¯}Ög½s®ÕgÿmoÂqÕUZÅ{ýØ[9Ùu¼É|<7ݡף]ÚOÚ1Ú
+<E²]·}ÕYÝÛ%9ñBh¼¢ÙÙÏÁØݽ۬Äñ]ÝÅ}Ø·8òßÕQ»?¨ûþïåøÌtN&à"dëx [ݬܯýÍ¿o¥¿GÏúíÈñÅXülã/Èñ2Ù¸½Û3~±Eþ÷$Þä¯íåMþd6þÞ» Ùjå
+¾úîÜËu^®[äeXêQxÏ% uÀ÷¾à'Þ×I-åUþç3¸æÏÿ>¼>èC^{¬^æ-å-Jê1ê]øë}ëýïtZí°í³þäÿÏì)ÝìÏæPeÖ~í½¾{
+ïï0 {ÜÂÞÚ%/àíKÙðýB¾à¥-ç#¿ÿÞÞ#ÅñþPêêçÝË~ñEæX|çm}ç_½^ô»ù¸ÞæWÜé]õé>ô]¿oÏÓñ?~æßå;ýWßô?÷ûýtÐ`òð<¿ÎA÷·£>õÙëöë~ú
+ý[ÿy²û
?ݵû?Óü
¾ØÇüÏ ýQ7ÝõÕýoûüþ±_ú鿵S%þã=@<0¡Â
:|1"A+Z¼1£Æpü2¤È$ÿK<2¥Ê,[º| 3¦Ì)Òió¦Î<{úüy3'PBÅXô¨Ò¥=2}
+5ªÔ©T«Z½5«Á¤WpÕ
+6¬Ø±¿R5K¶'Ú´l-:m7®Ü¹tëÚ½«ríY¼|ûúÍ;Vïß·}k8±âÅ;~¼WÈ+Ó-ü³å7KEì9´èѤKæ·óéÕ¬Gª>úºuزu®;·îݼaÇÜ;¸p´?}|¸ÊÛÊ;Ýyò¥Ó£[\]íõÙÛ{2ï>¼øñu³û&±ùëC·Oïð;üùôëÛù(ðûü%ûß_É'`ÿ`dv`®µÅ d
+H ^atú´_âjTá&¢c^Èâ{-µ¡ú¥X_/Ù¨¨c>þHÖ+¶UNÓéeS<áäcL¶ô¤aQÎÇcV^¥QBæT!)ãY^7åJeúu&zUÉfnæõ¢I]N4
+±8Ñuê¹'Ex6Ôb9{4(¦ù&Vô(^·f£^)gÊ^( õ)w¢Þ)c¥Ú¹ª¡Öyj¦MJ¤V*k®ºfºiù&BFÆj¬|:ª¤þªl³¯î*á\´ÿ^)®Ð^r*l²Ïv:§°«
+(°¯.¬¹¢¢íbÓô®´Õ¶Ko½mo§Þnx:*©]©®·ì[°©Û¦¼¶ÞÊpÄëhçÌî1q«ûëÂè~¬©ë:ËïÄÔ:Læ¼&¯Ì²
+rÆï°È ÃXsÂ:Ïl0É2·áÉ)«tÑFS·eÒJ/ÍtÓN?
+uÔROM5Æ\Üj§f
++ÍÊÖ|tåuïvÖvÚ!±(@Ûn¿
+wÜrÏMwÝvßwÞzïÍwßw¹P¡«:(¢
|,Èøª
+VÙù>1ãO/ ~_yæoÎyçvÿWÌsàú*å-H¶¬gÎ:ë^y{ì²ÏN{ß pÆäBäx먡yä¾O|µ|òÊo®´ÖßÞÜíïÅïuWïAgºúôÚKüúòÞ~øÜ0¾Û.úöRY/ûÿ~üa[.~ýößïùZäˤ©«Î¿ ~ø+ ø7¸OfâËO@J0bD /x@$=pó_ðÇÁB«,¡ Ã'
+p#*üÒÿ"¸ÂbÌ£¡æègÃê°s
Ù³ÒB~?,ârx9$fÃwAÌÑéëË¥«ìQq
+z¢ífÇÄÿºyq|P,£Û¤xE.LhC¡ß¢1êmëÛøº0oEgäãýøGòsyl[ 8H2qb¼cëø6>ÊqI#-YºüÐ$óHDFòo}4¤)ÏÊS¦ªd¥K¹ÇQªReeéÊîåòN´;)¦¿`z¹Ò"0I^²|"-YÙÌUÆÍ®¬¦ÜMYbn¼Ôã)?¤ ó<
+Ó$öÆN)sÕÔ%;¿YËkÎM¡#7yOkzÓl%4ó »Øü2,f&x)ct¡ÊYç-ùéNºmÒ¤£4cùÎ^ÿtý$ýÙÑØÇ $©8JDª4²£&7OÒs£ç+µKxâ4§òÜi*ÁÎ4~Cõ%xZ
®t©¸qèMÛÉÓiƳ¨KaêS}t«OÕéOT2µA*SÌÚ¥u¦qªD+U©ÚÔÔlf]ãjÕæ2¬©\mºËUFsÕA«ïË;snmhK7ÊHrµ£$ëHPNV¦ý(#;ÏË>²
+èÚ;9Ô*ð¨×Rkc_[·ñx²õgþæÙÒÂö ee-´\»Ûàºk¶*æjËUã¶rÂ5ª»»ØæJ·4ÿÈ=îð4¨ö×}«`ñzCnMY9BiBÇ^ê·¸ MbþéHBJµ,£ïCìË!l7½üMÍzÿ`¿½¬¿¸ë-tÏIà;)Àn°á`ü®Ö¼çU°
ëàk8FnWKGá^xÄÒ°l£õÃ nãoIc+"«N
+ã'«»¼â87.[¬¡ví7ÆDVÊ{êÝ{ÕÄÕ1va¢â
þ¸.~q¯üò¸KΨxdÛÉdÊn"3ª4°]
+ËlfKÛ¢¯*w´|é`M È9×
+e6å\Y;SÖ`å!~Ì%D:½jÿm-0cv¢|ök`!×jÉÅ¥K¡yUOwTÏK
+[=4ÇÉÊnuWDZè¯jÉý+'JëMÿ¹Ëzý´÷Û ºGÃFßp¶ähW+û,°Î´«ä.cÔ»²Î5®u=Õ¬Îж].{ZlcpÉ^¶¹¡²cpZtÖ¶õ¬_Jíª9ÛµÎê»ÕíÙÏ1¿
+wÓh5{àg
+(½u*ÊyÛÞîNx¼ï}ðwCÜÞ¶Zü!¯±9çc5Á?þtGüÙ{~ø>µ[h?ªÕæõ¦[NÙ}ÏhßxC£ì¦5|çei6Fíºd¬þÜÖ6Ô´¥ÿÛëöUÚæ+xÃkHê1³ÎsÎó¬ëDÒp-]=Ê碷÷2»Äÿhç°£½Ûù¦ã§ÃjNR½êA®Îµ÷ûZ0ÌîÝrùkæuîô!<©øÄ+¾ãº{Þ§½gð¡Ýþ"e5Þ+"ç?úÐ~ô¤/½éOzÔ3þ>¼ë·ÂÞØS¾º\Ç<º LÑtØ+©ï½ïüàþêf{½ñSøs÷Î}/cqÜã÷¯¾õ¯/|âG§õÇ}òþR[Eû%}ýô«ý¤'s¸ß}×?üô§$E}úRýüï?öÝ/ÿðÇ|õgµ7AÐGwáÕÇ)!HówXT8nm%-!zhh)PfFè
~"(3z$X&x(¨;(`0(?X1HC(688X<È«!FÈDH
"
Iè}Ç
]è
_'LÓ#
r!Uþw
ZèÇ´º·uihì$ò{Xd-H/6Hw(x¨&|h1Ñ2f8ø
xxa~¸+F8
ÁÑèE´;õÕ¥ø{è¨ÿÖ*¨X=²A¦(§ç;²·È_R(³¿1¿Xz»Å(AÇ0WxÀÈ'AÆ(?ØTØÙøñ1ÝØXä×ÙÈÛØÑèéè:Èf/qäØæÈè¨õ¨6ÍÓ¹ñðò¸ôhÉ8ÕXúxüØäÉè ½ªUþ¨©@é !é
+9bqÆ Fæ·§8 .û×5#Iéµ'¸å¡~9zBi
ÖG¦!EbM><Yÿ?<º¡A9üxÁ¨QçaIö1Ty?Vi §ØyÇ"prI}sðpBx9|4IÎت÷ÒbUHe gO6+lÙ½w|éÃwzÁhrYYé9§Xìq©D¨iDùi¨x~. Áx¢9Y½9u©)zYI«©4h® ±Ù³µé{I ÉéÃùÝ IÚé§Iâ¹ç Íé&YÍ¡uvXáÓ§ÂY÷{¹ÞÙÿÁ)-rÿYäè v¨ë)¸õXWy±fOÒænÚUßãoµhÙø9 yþ©Üù¡%ê#h 1a Ê¢È *¥pîIyçwj£7út3¦"ÇV=¶IûÙ¡º": $ºEj¢H¢7Ò¢MJ
ú¢Z
dY;Ig³g~dÅ¥´Y|eWôäNw´¥^´¥%¦7l¸¡ùß¹pJAú¦¢)§?ªKê+ê¤}*Q*eÔft¥A÷]W¥G¡v¨Ðs
+t:OåÕ=êYúÉÃ9»Ùù© ª*|êÿ§©
+|P
+¨MõT»&t¨Ê¨¯êr«·Lסöª/y}Á}zZPª¬Èª
+¶JQecE
:¡¥n4UyܦYõvt㣿*)å8¬/i¬f¬çÚËʬsè¬NÌTë¦OrdKT¦ØJZ_JHú
+sJdfà®4'ê£EX®y® ë
+:+Qw5«ç¬'רʫmàõ¯Òá@âÊ¡¬y°(A¬
+k²êÊ°må°
+±_«¡t\lrÜ¡pk²égªÚ³A»ª)L¿rzi.[³ÓV«+³(÷g at Gÿ¨R{iUËMR²³<+´:ÄX²[¬(K´£a´Ô^Óįñõs¢5Wg;«iJ±U¥´nw¥w;Mýµ¶yÚµ@[¤úµëg Ú·8¶pôÐipÑvFz»·z¸¦ù·c¶ªk
©Y¸ü9¹Ã¸´¸+`#·ËqhÒ¹+^{¹Â¹¹ü÷ºÙ~Û·bû¹ºg]B]ÝÅ^ºoMkHXËh¨º9²Òº§vÉ{sI
˼ѻI½»Bk»·ë¢»Cjë½:i?³u*ºuÅKÇ+'É * Ó+ Ï+Îû"t)½ô»¼í˹`½Ú;ÿ+¡Ë½"Õ±t$F^PV¾æ«¤èK[該;½¼¼³ÁûÌ©ùi¸\»ü+wþû¿7ä«if&ÜcAÀ \¹*ÊÀÍëÀ£Á<ÃC¿LÃöÁ×»µûëÁ!@)éAs8ÜâÒÀÑ+Âx8c>G0
Ó'tÄk³Â^©ÀðòÂ1¿ó¿aƼ¾8¢*ÆîK»-êÃ?l~")ÇsìN¾Çâû<[Ã11ã1}Ì5]c8[3,Ì m|®Pʺn©3ÁKÆciÁÔÆËÃ'Ç|øÆ5qÇ#óo{¬Çc,äÿ2vÊ lsȪʪ¸ÆhLƱËÁ̾Ë\¼¼ÉlâË'Õ8>Ó:Îc3W£1ºÃÌéÒÌãÅ[\é˹Ëj,¿ HÍ;\¿l¬¼ßÜÿüÁì\aÊzlÌÆB0åsÌW¼3U
+CÌÒÊNº¬Õ<ª¼¿ÚÌÍÛ¬©\Áî+ªÿÜÁä¬
æLbs.âV$|ü,S2éLϨ\ÏÍL²ÒT¸É=Ð@BÒ÷EÂMe¤,Ñ~\Ñ*
+ÍÏÈ'ÍêªÏ
+zÏ"͵%}']ÀÝ5|f^c5,m3©fÈÈì*cÔ
+6ÈÿÀ({ÓÒ:m
<>Me$|Är_Q<Åâ<ÛòÿB8~,ÅÀbÅÅrÓ«ÙIõÑ7ùÖVí·X=Z½h¾%Ì!£iR×a׸1Õv¬z×&Øïlu
+ýÐ-=½>\تØÙ«\=ìèÖàÔÐÃØC-l
+;Ø»QÙݧÙÂÚªçmU8éÑ«ÚèÊÚí
+¥RHÇÃÛöÚj½íÛ ÙÁ}mwsÁªÜÝãÜÜÞ§ÙéÁªø81Çí×}Ý ÊÜÛ=u²¬¹j4â¡z¿BÚ©yiíGÐùÿ©úÉÕ«¿è-7òØÞa6ð
+ÐZ§×y§
+¼ÏL§?áåç
+àߪÎ"½èÇVÅm2>¢Î@¤ÙM ¡y¤x
+ B°~áÂ;À?½×îDÜÖF#â'®â-¾âáÙ$¾âä ãèTÂç¼Õ5¾§ÈQxsXà3 ã@ÑãANßÞ¾B®z)®Ãþ[åI¾ ]íÞå²Ä¢(z"ÛJ¬$í'T*VLÖgþ\N¶D,(cnWî¡?º)èIêåGνi¤HNæo´ÔB½×MmÔ
;ãBÈSéëòÔåçô©çJ?~^âYnäÿè¸i§'>êaîâ¼½è«Ò¤éGm5¡üت,32ѦãîÒéT@~æ£þãÃ>èÅYè©ÞàûiÚÎè¯Þ/È LììÏ\íVdØÑëw²ãÓê¡*ªômú}îßØiî¶ÏÌ®y×..þçò<ÏÏ1
+ÓÍ^Û8Ý®> n»m|Îî)]ë¾Î9SÑ;òëÖ~ðÅ|QüæEð(ð¥HðA¶.ñ³NÔ-Íðó\ï~}ï´ÎFúnÄߧÍ8}>»%¿Ócë¥<òI-ò·ðJ-ô>ïðDíÑí(.Ï;þB2ÏÿÈ6ÿ8¿EpîÕ//0ôÞèæãæ,Åò)UoíL=HSî0ï;Wõ·-õ'PNNÛFö°¡ô¾$ö?¤ök/Ømn=tíq¯ë5ruoÂwOEy¯÷MÙñ|_æ ]9ï/<ïÿØ_hÏ?ø5¹øï±KÿæIø>÷eöfbøÄùÜ ¯lbÛÉ/ù_²úÇÔú®Ï°ïj(ëËëúP¦ù1ûºOÏûêÝrÁ¯¢·¿PNÎá~<Ìß~9ß#ýêºÈüM4ã̱]ûý+%ýD.ìÄ©àcì5LáMêýß_á}êdÿõÃ_øó?éè>$8@Á
+\ÈÐ!Á
+¤XÑâE5näØ#!E$YÒäI)U®dÙÒåK1eΤYÓæM9uîäÙÓçO A
%*ÀQ¤G.edS¨Q>%T©ÔI±nåÚÕë׶JÔ(1"Y³3¦h¡Úl=Î¥[×îݵ`õîåÛ×ï_À&<ØêÕÂYRUÜX'ÈÃÿju\Ùòåb±]ûÖ`ÃÈp/²í´g¼©U¯fÍókرeϦ]Ûvâ÷KÖ97nĽ
ÿ«Y*gr?v[Ö4ÄçÐÛ6o]Ýúuÿ¼oçÞÝûwðáRÏU{y°¿CçKý{ø4GE>:zÜûÉó®û Uc/>4ð@¼É=°AÔ+éÁ®ðÂ÷檾ì HºéâÄ£D:
ÎB1@[ôBcqFk)Êq<QqCwr8
+±¢¤BD
+¡WL®Ä4kÉtñJ,órK.»ôòKs¥½¦2
+rL6-+©#³ìL at 9ë´¢6óÔsO>ÃKóË?m<¦@#\³ODëÎü³+NF#eÐD+µôRá"ÓtSN;õôSPCuTRK%Õ¼ÿ1#ûRzÄôU¬Þ\
+R 7îV¼ht×GaõõW`a³J b5öXdUvYfuöYh£vZj¥µjÃ-uHVõÖ&YÒµÎ$'åõ\ìºýv]vÛmjãw^zëµ÷ÞiÅJÐkéõPwö)\5Ñ5ø`xa&^|#xb+¦WßÔåN[§Øak"x¨q6ùd5ye
Øbcyæ1Ö1A+\Õæ{fid£Pzh;Uöùh¤w|f¦vúéc®ªÀ÷º WÖº$ §"úk°¼zk²Ëoi¨ÓV{í¯»±ª'{gÿ³ÍîÚÁºL9l¾ÿ{»nÀÏôÙ£$m¶q¨þ0U_ëöcÁ¿{UºJ¾Kó¾;rÐC§poqdQW<jÒO_]ãÇõÛ²@³½ìË#ÌKÎ=÷ÏÛ~ãÖ
+'Võã_}Yäm^çi½¶Ù
uÉöáÉÎ=ã¹<¨ÉrõÓÛJ¸Èg(üõ>¿÷ß]={øãßp¤ þðúé×ôãó¿¿ðÿ0ýàé
+g:úÏ~ÆB`â<æoXÉ3 ÿ·@bðt6yß¿°w
+QN~uÛOJ&¢9I$¢N
+q%µ¸°}ëàmxÃDÿ d ³^@þQp¬âÒ÷Cüõ°Dä¡ó¨Á2ÑuOD¢û·8BU¦zÃ9Ïq´æpwåQV%Gá§9i¡¤jøE8Æ1+³¢5,´ñÏuL]÷Ȭ<Ú1wâí8De²u$áfòF°<ñ¢ÆÇñVêÔ¨Bð¡5m<$-yJTêW#YIÄÔEñ>"èJ*ÚR±<¤©HUÊ2Ùâ$×C7TjoQÝs'͸¾rÅ*<4MR¢kÉäæ
+iËû)ïlä w9KæÕòë$¤aiÄú)ñÿdg97&Ùólì&îù"¦¨¸Zã3¾llýdhötxNrNÑkb;{N@ªÓ¢¸t';WIÁæq¤°ô!>ÇÒ¯¡´¡Ã¤S4Y¢?ü)hMcP9-t¥;ÝCùøÇt*±»lä9CªQ3
¨<IªÔ>y&
JùÅòQ-mÕKË8"¹¸P¬ÖÜdqZJ¦U"ñ© Tµ£¯4*-YYÔ&Ñsý(%Ñõ¡TuUsÔ£¬®5O\]W¯y$´¨4ô4§Ä¾³V'±ålË¢×T2ïE´ ãYÅêªÌ#ÿ=íÚ𮧽ã<Äý3·¼¡*!Ûm¶³`b,3{\¢ w¸Ë]*3çÂõ¹¤.oId¦#Q.s·TÜ`¹ãwÍ+ÇèN·^öWzÔÏöúÑvMÒÝó漦Èû_
åWÀ6to"5ŶMAñ^¦V¥[WÊw1Óo§6àí÷ æ0¯ðaWÁêmphå5b=P·G|Éè{Xû)Ä+Ó01;|cF}xÆ;ÖIüc ·2M¤pb,a/¬Æ1/ܽ$GYp²
+r\ìN¨È=>2a¥Ü®%£éÉcvßÍÿl6*_YÍkÚ^Ü%3ùÌsÉ|çZÍYÏZ ýüã-cM¥:ÞN9¸gvÕùzykrðÜ>B#ZÒÚ5U¥-}iLgZÓ>Iäî¨8/hÒÞRtV4©YæÒ>.Ú¨]ýê<%Òjt¬ùêÁV¥^Ì©[C®Õ9Õu±u-ë\Û>fϬecèUûU¼&S÷¨$ÐôAêÚJ°mh~¤é6Lj¾'¡{Ûë#(ï¤ýnI#»U×¥µ
»È&\GÞ¢v^*CÈ.§-æadêó%ܬÄv»U-VçxßO2}dòP¥±U#gñÿ «"5d²Ü |ïâ[ýgG ^F$EàÂ~¹~}F³qÕ4Mõ½r ó%g«¾£'*#WöÐ9®tÞ fé#_ÓÏ!wòãOýµcÞ(s9ã8Øoóü8<;À¸ª³duÇ=dD:wÃd÷º:ïL÷ÑoèµãýèD¼à!r8É}±-ÿH3ãÄsÊ>ÖàdhÛqþB§û{hùÛÿyµþýï}×»¡Þé3]EôOzÝWoø![ ×}äõÚܦe/xÁ¿l`óÜò7Å|ñuÞ"¸Ó^ùÞz}ëIox,½*¾Rä=xÖçÿÝõܽ¾ö íô,ÿK¶ï4îÍ
+üON¾øêW;çÝþö?íÎøíÊLÒ÷¾ô5uw¼k>ï+<ìCºî#À÷=¹¿ïb<³++âSô+Þ;¸NB(*鹯¸¢¿Ìa@ü"DÀÒ#@þsº á»NË?=7̾ïPÀ¯H¾ò»/Ü·F7¢,Ëj¸Pr¦µÛ<R·mû#D* ÂM·VËA*©;&ç;Áô´4ÁºÓÛ;þº¢Ã.ì´*Ô/6¨t 6Ï[C:<[Ák¾+$¹ ³¾©îÄí;Bÿ,<ÃAÂ:ÇPÄ:7\¿\1³{ÃyDMì§7ÛÀ,ôB.¿FÜÄĪè¯Ð[9¿J¤[6öÁ4E[!ê[ÀÌÂ{ûDÝHCÂpÄ[6¼3ôI
+ú;Æc$alÆâ£ø?<ÅfËF
+atƦ@EîDp¬?nÇ£éÄWº¦ÓFRÔFr<od«pG{G{l®@óm¯v¤{,x\zH-ùG|sÌâèÇ_<HøH¬!HD¬H.ÆÞØÇcH
´HñHZôCÒH<ÉôÈG¡\Hÿ´ÄÊÓ&#/|I¬7ôv¼ÉÉIîÉÕx<É/J¥ä L)aiIðHÊ¥t ¡|ò¦ðÁÊ&!DBv«kE)L°»J·sB$dBj¹*ÙʲJ¸üŦÜI}K")FY¤À
@YT?²û½£Å
+ÄD"Ì<ÛÀº¼À¬E¼|ÌFK8Ó¢lT©L¨ÊÆëKXäÌqa;ÐáMÝû¤»ÄÑDÌzÄLÖôm´Kô¸ÌÖ$ ÍüÁÁÌ= d´÷?ÒLÍÒ¾ÓÜ=à<¾Ï©Mä<ÉÜEMø ÍäÛ·Qò3Ò¶%?ÑÿÔNJÌM#JÔäNãÌè,ÏYN¨<<óét9¾\L±¬¼ß<ËK>øKOâOû,ÈöP4AOXq6çDèÎ÷,ÍøÌÎ{¸ÞÔÏâüÏÌC7ôóËüTÍP5
+B;PËìP7ÑKÏÆtÅÎ,ÌÃÌ%̯ó½ùÔÐĬPRLÎIPÝ·×ÑÔQÅ Rä\PÍ˽ʸeDKµüÊ°ÔOv($JÕìRÉkËÞÒµeåQÑÒÖ$ÒÎ;ëÉ,Ê¡ÜRÈìRI,0uJ6M2àÜ
+}ËÓÍDÆ9J7u
ÓÃÿúS:5Ñò¯½´ÀX(°RT'ËÐPQ=CuÈ\aZÏ»T¨S;UB·´ÊQõ9ÅSKõTnT¡ÆÊ,PUPÈIÓXå&VE³ÂzÕ_±Õ1ETZÕ[¥Â\2ßB_eÍY
+VVKÖab·áT_qVÈ\VfÅ3k}ÖÀVhmuInõl¥¿ÌlõqåÑÅU¦W4\×¾(Wt}C}ÀtÕ,yuµLõ.J!ÔjÝ×½ W_ÃW8ÌW}X3óVüÛH^õ,
Õý¶'7¯T#õÍ°R£4Æ1e(7{Ørüد ×°êËNÍ@¿ÿ,Õ|
WeÎvͯXwÙ¸$Xÿ4MÀú|P
+½±.¢VÑÙÖ'é¹âË=Ê;Z,Ú
+Yæ:¦
ËÒ
!¿íN«%Z¬E¯£]Xlص
+M»9· ϪM[µ[øéWk[iå[¹uZ¶t¿±Ûµ¹¼Õ[×ÜÛÑÚ(SÚÊùZ°%ÜýÙD\ÃÏíX2£\ÇKå±èÛ)Ð]Ê°
(´&W¬ÔÀÈZYÆUÐå3À=6Cä©ÓUJ}»Z]¨]Ü9C,ÝÞn´Ü;IF>Yä}ÓÛ}7~ÚÝúzÞ¥è]÷ÿÝÃÀWÏý\ëÑè
·¢ÞêýÞ¡ÀÞ2=ÕÙ%_óÕIɶßbß_D_àM(úmßÇ_ ¿ü½ÿ=Iû½_R
+`ýÐÑ
µ|3`;à `!vàûâ߸SÀ FP
+
+àßÉà&ÞãT½
+þ
Ùÿb;ï=á}J`ñUÚ6aæuCnÞ6a¬õÛftN¦ÎåÝ\Ó¶#bláþíZ£[« ¾G½Jɨõ6ÎÎr+\rY²¥bþ`%îÉ÷½?Bb!ã¸aí=Þ»WQLí8®)ÍEJ5¦L&¾à2nAÎBc{dcùÿ»<uÒ ìYâC#µÉ<6^Ã>@ÅäwdÈCó3düP¡µc±KâF¶G¦Ã=E¢dr´äýÀ䯢O2ºOÒÜ9Ê3b eóå:,e=["f¿MfeüËàCdLdáÆdä^v_'^Õf~åBåTþe7ÆP=æUåµãEÆãeÎ\¶E]öãáæqä9ÖÀa6[²QunQÅ}e³-ào^p¾Åq^ÇÎ2gnDg²¼N)ÌäLKIåʶSßûPÆîõ°PæU6ÅHN¶}®gùøå¢TÓ´ågÅËÃ|&Öf¥èè`rÑáLWÖº"{èaÿìh/h Nÿ¢ÔzåʶnbsiHþhOÜÚNÔ0F8«Ýé¿Fj£8/¥Æ¢ö`¾jùÙ4¬ÎjöôéCê¡i¦jzJc³È.¯þc§
+k±Þ²3«~\K>S¯g^ؽV÷ë°ë¹4@½ëçJ³Ã®ëTiëkÀ¦J>êÁ¦¡4ì?{øeìÍ0ŶEìª~IľlÒ¾WÓl]tìÇnÏm°él4+mÙª=[kqÁ0ØÞÄ)Þâ»]ÙÃ-B×N´ìÙ>l¾îk¸AÚÕl¹f¦6&än{Ýà~$îâÿ6nÒEn-RîåfmjfL..äéNXL½nóÆ#¤Em¹áîî^ UÏE¶éñÇ´îóÆnUoõÙöþï~¿]çùÎò¾og hÖîgãïþvïÿdwç'ðú>pIÖoÜ`ðO÷îÏøîä _M´o§±o_¯SÖðäæð? t.[µæwÌL¯£z¯û«Vò!:kÚYïÈËmÏ~ðĽ,¯èß
+ßñ
+²·¿«{J%¿#OÀW©nò]ÙrÏòqÓ*sü1s×ñý9sÁ 4¯®Ô" 6°½$K²í ¸.÷pÁó¢|r:ÿ¬»ú)@Ò«Øô¸2t§*C**W°+÷¦!¯A=ßóÌìs?G1^¿(¨ú¦¨"ôÕrª)wô>"sQ·s\ÌrÚØôÙ´ôKoîLßa@
+ ¡2±·²òÂuR¨>;kçâõ ×TV·
+WuX7/õ)¼ñÅ ¢&bÑt R*jÇ£)ºuDïqHWui=öÜeqLwv´*ñG0ÔA?ºv=ÒöPªkw8õzF#Ovc*w®9wtó¿wioô:§nOtRôwÓÚ«R'vôîVq/´/ã÷:löw·Z·-xÊ sêRó6«( ?yÕÁDÿ Bws+<ç"·õwÛxG]èÇxA}öºðÔÙʧùhö©ÝÓÅG°÷y_Ú çÉ¡'zé´ùñÞxßù÷Jk±°¿Ïú~zªO]²S] ÄbQ¥&ÏhLq§oGà=³»_ù¥cætNz¨îº/í½ß¿IÏâ¥úõJ
+pµZÁü¹/|Ò>ü
+NüÉ\|Æ ôÅ@ÌQ3|ʯ|ËGëÕ|@Ñ3̧BµÇÏÀ·N{½m}¡ûÓouùeýÎ/ú"¾ÓÍáyösÛ¿}ÜÏ}±?|ÞgÏÚþ}Ï~î|Øÿ'þ?þ©vå?ñ½7{Áþ»þªw|îeZÒ/}ÔõíÕ?<ïÓçÿxý±L8{µå¤ÿ¹c p Á"L¨p!à Å/b̨q#Ç?)ò¢Ä#O¢L©r%ËMº)s&Í6ovs'Ï>
+*t(QR@`)Ó¦NB*u*ÕªV¯bͪu+×®Su"
++v,Ù²1K¢M«v-Û¶nßÂ+÷Ùº@%ÚÍ«$ؽ~ÿÆØ70áÂ#&z©R¯C,y2åÇcάyóÎ?õztÍˤO£ÿz5ëÖ®[..Ú¸2íÚ¶oã®lú5ïÞ¾¢ý-£èáÆwO^¹òæÎMtvîêÖ¯c·Í:÷î¿{?]<|ëíäÏË4~={ïÒRÏ.>ýúOշϯðøý{ñú'^ª"Ù{BÅgB¨[R8xÞ ¸a~z¢?-T¢¢U8¢/ft!)õ7ã_-Ú9òØ£F%Þµ¢C¹Ô>"IaI&ü=ùaSRÀew"ZÙåUÉ9.¦X_i²©ß>qY[TÍi$Wuv¹âmòùÿÜÙçtêH¨¡¾Ù⹨SæÉ表RÊX¦ÇmÚ©ò)JIÔ©³ÊT|©ª¬BU²¾êꨦFꥧ»¶÷çzòÚY°½í9¬±ÚV¶Þ:+®vB-u¨ªjµÏNÛ¬¶¹Yì±ßræ«sÀ[Z¹¬y{®º~%¨«F»m³×V+ocJu/®úr[dºë\¹®a°°ö/ÂÕîMï>/¼ÚN¬%¾±Þ¯¨ýʧ0Ã/7ðg"\`Éy|²Ê59lÄØ>[/ªiÅóWº:íÌs]Ê+=É
+´H?=ÿÒI3RË¥-ñ¶×{_TÛ{©5÷âÒMínÁ6K_Úi³]ÀÓ4½,³ÍóV
+-Õ,ÖMwµôvíuÛ\´ÐNÞÒÚ
{t8âI¿ô²ôNLqÌÙJkmݶfKyß.Þùe3ºç!)>ºj¦£>RãéE
+k®?Êl±³qζó÷æõºï ~á¿Ô»ïÆoðêgEíÏ»Cï|òÓ%nz¢S¿ò©o}¹Ë»÷Ñ_]÷Þ'üKØ£ÿRûp¾?=ø7ßÕó8Ó\>ùçÇO¼õÄ
+¯¤ »è»ù~ÓådÀ*ÊRêëÿÿFWAN
++¹_;è bÐ AØ9°O,[Ø/¦{i!_hx"n
4r!óC®lÿáÄÂéPm=\b·èD¾°Ï"$ôßMVÅ´%±xz²Þø "^Qe¢iÑFN
±xi[GÂA9qN^üâ¨! ég<ãpøØ6?ÖqFm<Úµ3Ç25Âã
+À¤ÄJd
+)i´A®u²Õëdw*ÍjW]æDyÈÜHÒZ¤EGÂdnåGÆÜR5HqxùÈ¥2mÁT%0ÉJìrUcäÿtgµe¾Ê§Ô1Û'ºXâ1bE´ÉÍÌ°9!8TNpöexØü¦:y4Ì°½³2f-¨7¹Á,eÍrǵi:P"ü%9ÙYPí}
$-
+ÄH&ôËC%ê¢x
+£%=gOÞÓnRéøRy4 õÉ(ÊP/Fë;'áÊÎNô hN#:"6
+¨+ÝOGsòQNÒênøTûéÔâF¨C}Ñ+OWN&«
+Ý)Eæ*4¬0Å*Yu*"©
+SeOQsT>õnqSê?¡:µ®UIUuDaª=oõ¥!¨-qÿVîÔ°`ÅkY»2ÇæÕ=Õ{+]Oʯ}Æ*o$µëm YýL1±UÅ
+XÁJ9jQ,kͺØÖþô³~-¸Úª=dNMÒjfåÚÛPJ³ñ,mɳףu3³(`qÙ\67¬7ÛÙZëƶÄ-®rlûMv2¼ûò$Î,WÞ½R¸Ù.wÚ´UíOMo¹NtxÌæxrÓ]ÔìTqÜÞßx7FötnÔ»¥«ë½ÝQ:Ýh#3Ã~M³à8ÞÕÁtÜ°±+¦ ã÷æ5LbÖtØÃXycp¿²¸Øg/öCµÿ¯v¡¨Mî-LÕïø[1&IVh\×;99ÇÒK²¡z|úͦõÖe*fÉR2f>Y&Ô¿|æϹe3Þ¦5³IËrsÀølgÍÄ9)tôÕþü¤4ßÑÜñ3ÀmhÄZÐô¨Ý#E
+Óh°£-]HÒî´§]ßéÙ¸$&u©êPzάnµáðü±Tëų¦µ^^
+ëXçx×¼¢jmVcóFØàRö°Ëâë([Ìæ5èm6\lÇÓnöX|ýëhsvÛ§iiÛò6:Á
+ÕS«;9l±!¶ÃdqÇ[ÿ1yI¯»]ïR¹õ&Û½óÂÏõ{ð6¸p~ÈsËÊÿfxtní{má§Ñ\:îñ<ä¿6Äá'ñ§Ýëã7Æ}Xn;"9ÍkN´Ø<ç3/ù*y·3Oæ;Q9|Enô£#=éJ_ºÃ
.<C=êRzÔ54
+èNÑ·NAª=ìb»@ÞG¬s¹ö:ºÎvïÉìr;Ýbõ ¢$§-øÛäö¾§¯î<áË.û_o6;àcò÷Æs¯ðüØ¿h|£5
|ÏyR>ô¢¯zö_é®:ïoçWÄÑÃ>ö;ÿßÐzNÜõ.j½îÿ(ûßÿ -°Xyûöæ¾÷"â½òáüçCøú
ßâÌ7¿=ÌÏ~Ò ýï_ú²ï
TCìs=ÛOÿÕÁ¿s÷Äû¤â¼§ô³?<ëÏ?ªk.ÿüßà CàÜý_ú_É0Ý2`_£!ÿ&.ÝJøED|_ZÀ â_ÐD æÇþ© Âp DÙ Î`Ò`Üà
+f
+Ê àö üÙ ðñ`áÖ zÞà :áè1a ^`
+ÂSzba£]àÍ]
+¡îàÿ"DÜáÊàá¦!Va!Æ¡Ê¡Ú! FXRá
+ø9àb
+¢õm!Kha!" ává`$ª¡$Òaü=b%6â$z!&n¢Þ²y"büÝâ)ß bá!"â²AF¢
+Æ"a'n¢&6¡¡Bx .ú"ö¢"~K(¢â1ZaÃÑâ12ãó©¢²b+êbcò¢-á5Vâ-zã.rb7f"7£A,£ðc3ª#¢Ç9®ã;Ê^2"b4Jã°xb&R"#f#$zc#.¢6æ 0Þá8âã7:":N#<*¤9ÿ1.äCÊ<®b=æ#Âá6ZäÆbF®!G#8ö"c8þ¢"¦#DB$«9¤Jº¤ØI$Ò#Eò"2á.!Hº£Â")ú Ò¢)î¤IþàO¡ÌQbBDB¾äCvZK6eTNBÐLÒ$m`ÎA%*RåH¥B>åWeáu¥YåU®RVÚÜVbYÊÆXÂ#£±%\ÒåR¢åEå]RÊ\îZt#nåZ¸[¾%3&WK]*¦êeEäec
+_.&Y2%Ø)¢e¤Ýùß+å& rHædæBæcBf&fabæ>vàZn¦kã_Ò
fÿjNæj¢if¦á&üé&|@,&!NáP¥'rbâM'^ä6~æq´å:ÞæTgiöf
+]çoN¥+j%@d0Òf?ú"IÖâGdfdR®¥¼a§lV{ªæïç{ê%ongt§wê\p
+ç£%$Dì"yZä¨ "èü5\|äk"£}Jçt¢¥~î'õ§>DLæYÕõdr¤gc%åªèûäRgm>ç*åòbO.çe:gg.arÞ"a5VèZ#æäqî¨òbcbh¢²&
+ãHb£Ýùc¦§Qö(}*(vèv¨ÿxr¤FÊæÖ¡ éxäz¢) t©zÊ)áæ'*Ò:ira|6hyjÞç>º'?)j%©9f©2ê£þizf&A²)5§kR©¡§AÚÝâi2çúß3¦ TFçir#"çäejj vjeáê6ç0èÖ`'âªjAFh¦¤@:*1^è§Òß :ë³ÒE
+§söà"©°²êµåGvfê([vY`⣱n©n*k¬dê/>j8*9*;Þå2+úðRê§èºr)«fªk¥è°"áÿ%+¥¬
^¥½ÞkéÅ©^¿FhÖ¦zd¨Êiºª¦)§bd2g0ì¥&+BÖëÄn\±Yìßð+à´ÞìúeÝÙæ¨v«ªi®Úªqvarë®Î".ãª,"*Rlz*Ì~ ßâÔ,ÆÎÆÒeKfmÖ&ÄR-q¾Ò¬ÖÆ£tmΡ-LjgÙæ[=àºÄÚ*+×JáÎê, Þãµöaβ«
+îÎ-ݪ[º\m÷éè
åãî©ØÊâÆÛÏ4®I®ä±äæú'åV®årÛÚÜ-åÚ¢-i®çgoèZlî^²nÿضcí&è.ìRYd.Þ®îçN[ðâîÚnçëò.ÖîÛÌÚ#ñæfêóïäAoú!oò_üî4níÎnbHïô
+ ^/öÒ¬aloóBëúB«^¯JVoþ¯ù²Í;¥/ýHø¾ïTÆ/ÿÍ/þ^áÈ0/ ?L÷îo<0ûý/3
+^Ý/0ûJðS°îV%ÿq=0÷Ês°X,ðg !é&°Ç÷¢ðÐð¾nÔRkÊàôoGï Ûp·å°Ù®Évøpõø®
+ïpñ÷DñôÅBÍ×P/=ñ#
+)qS/áqwFÿ{±O q÷JrÓëÔs%ÔiáRiSWLÅñUí]þÖ0s1ã1ìqý¢t¥ñr©1N1ÇkV
õUO©pèqë;2»Dr _Yɱ%±i]F±]%U"Ö4²â$Çr¡²#ÖWqoÕ!Ãh}ò"ò§2,Ypò¢r.»×Û2¿ñW,tÕ²"oÙ1&ë
±3ûòfôr4o22sÑÔA±±1³5#r%¯2 1A²¢Hc)SswLs:7c
+s`aW±ÑTsU× OTó5¸ìB3;Æ:´oøÿ×Wå«ýÕWì~Y±sUñ2A3([Ñóä:´ú
tn´'Y[ôÝAñC×ßÀØÒ;Òo±8iqFØ(ô§åt©2s%;ós Ù=k1qh³0ß=Ïñ>3À
+ôN÷AKõ¸4]£sGw4 #uPsWµUiSÑ2buòW7[TWµpPõZÚÑ0ôé4pt³?g2WÏ3E/Üæ¡5-×õ.ó'N»5²ö=å_/tû×!OqW±O»qY3³¶©ua³eWä¢!6e31_rDó5d»ÖY?õgU6fCG[£6hv_ËTgËrX«ÿGǶY×öf_`¯6í6
+Ú}½3_µsÁ¶]˳ItS+WXÖPOÕi÷öy¨vtÊUæ+tVIqC«SCk·/qtsv߶MÓnS·oLwzïYòL¾Vti314{3ÉzÛwXw¹sÍ5}£w~wÇO}Gý{c3!÷¯xàw×d\orv7
ÏãkïJt8¢xé¸úâ2Öx4OÏ"gØ˸öåxúløkxâø»m Ùx¦ü8÷È+9Tðÿ!÷øçy[yipñV¹ÿw$y|yû_þ>oOy99Ógg"v¹¹s_ÿfOIs8ãù¦`y [毹{ù9¡·É 3zNz¢Z¢ûø?:8ú¥ÇH¤ËícYº]X¸¦3¨W
+§W^:|¤:©w«W¸©w:<QzÈ̺«ºïëm[\gȪãzÛ{¯ÀzDº¸¯+
+°{d:©ë:áÅÀ&ªé,úUû²«K³zÍÂ*´ÇæÆÊjmò¸Dzcûû^·&l»¸ïkíY]
+zºS¶_úuÞ¨î{6Ú¨¦è·
+ëà«¿7ÿûHP]»½«¾?úmêx¦ªÈ)ªZkÇRü,¼9a¯,<ÃÃ3:Ä/¨¦ZêÁj¼¶¬6B<w~ÕíV½<º×|bv æâ@j+@¾ê
+,ÓÊâÆo-½5ß| <¡o(å"&¨Êãâ?¾kƯª¤ßk}Ò%½Ù,} ëiÁÎfÔþ|ª½Ï¬»:(>»áü¯;²wýϽ{µæyÆ©Ç.Z<Éj|zdhòú·}F!Üe¹×}Ê-þ¿RP§µ¦¬:¢®Òèå·*Rîè»Û©»6þÇ|=Øfx6ãàÃMáyè+ë?躻ÿaò÷çk%ê»>ËÜþw §_c¨zk°/xÒþ´ç¾?B¿ÁòsüñËè<óJJ?Ä:¿§@?ÓW¿õêOîõKökÿöÓëòç§ÿøÿÞVfû}úgÊú3½÷+¦â_ÚéGÝÙ¾üýD 4xaB
6tøbD)V´xcF9v|@@H#I4yeJ+Y¶tù²$ 3iÖ´É$L9QòÔ3¤ÏCEòJ´çM¥K6uújT©S©Vµzâ ¬[¹võúlX±c=8mZµkW%ûëY¤r²k¦ÿQ¼1áöõûp`Á sÕZqbÅ7kÖì^É),ÓqætY^
+ùsdGÞiztiѤ{þl5HÓe͹³fÝ»y÷öýûïaàÃ7~êeåË7wþztéÓ©WGþwJ9rç~7¨vËáS¿vÝÓ;ùÕéÏw7¿}îuùóé×·Xø}ýûù÷÷ÿÀÇæ2I®ïÈëÀákMÁË[P¯»²{ ³ -¼ÃËOÃ=üÄELlBíbm6³cÍ@ÕPK°ÁòÔOÆ]L«ÂuÜÇiâÐÇ
È"E,±mk¶VÁ!ÿ¤1BÍ#*G#µÜKìÌ0ÅÌ±Ü ÊOBÒÀ*ÛÉ8Ó<ëL¾Ê¼Ï<ûRÏ>ýüÐ?ë¤qÆ÷$ÆBÝ;oM8
+uðP Õ)Ë@-½ÓøÌÓN=ýt¿AUlRµö¼³
+½%:·*»SNÙem¨JA½×[7Í×^}ýõ-Q+ØamÙd»ÜUÙf}Ú-ÚjÑ:6ÚlµõrÛn½ýöÙi÷jîZæ¬e[pÕ]8fÙ}Þx»÷Üzí%PÞ|õuÌÝ}ýýàÿè½`{Ó
+á«êWá~رØ!¾cÎã=ÿÆJbEÆËâM>¹ Q^å¥æKvæU®çk9æóYç ÷½Y袾UÌ£F觥:ߤ¾z. ©Þ:Ú¨¹þìl_ÄìÎmo½Ní¶y¥µì¸]tî®ë¾og«Ûï¾ýþº¼OvíÁ
+?\a_ãÂruò¯óÌ\óÎÕ½ÜóÐE·óÑMwôÓU_}^Ö]ÿ6õ×eýHÚmo6öÛuß¿Òyÿ½ÌÜxà|/ù"
Oùæ;ÞùèE\^úêÿ
+úëµúí½ÿ¾©ìÁ¾îÉ?ýÄÿOýßÌoþøZ_þú÷´à1£_#þ'ò?Ì 8»ýõ¯!àf
+ØÀ¥¼ÏäÚ3R2Ve 5ØÁ A¦ aGÂ*g
+S9¡AdRÂðl5<yxö(«PÓr¶p
"ØD%>ÑE\a¥¤hÂ#ZÑAâµØEeLtáo8Æ(ÑY,#iE6Q^Ô åXǽñ ÙaS¸Ä)Î'albã(È5BѤc"©/<"R!{áÕ(IRòd,d%9ÙH.Ò¡\W&ù¨Gÿ?Âñ4<¥&yEBvj%þ@9K[j+¨$W ÇUönd0]9Ì[ʯÇTf³¸?`¶b¬¢K9I^RÓtã3ɾdv¾Â$ÂÂ>NÑ-9tæ¥BuÖéD¢©YL³}ßÄç>wfvBó#ü´>ZÐi-Td AáGP>TιDõFVÊr!èìºQÞq3÷4§13úÑóuÔ¤)u¤JR¾´[Ïi8]:S«97]fMuÚÓ_åÔ§·äiPz+æuCEêR1µ¦R©Oª^8U;FÕªY%ÓHµÚE¬vÿ¬\ºgX{øU²UH{D«ÍºV·êH£oµ^[åZ׫ ¯yÕë^ej×ÌÑÕ¯e
+ÜäVت
+öpEìb;bµÂ>6&qe,Ë;Y˾²ÝÉeïVYÎ~6@Ë6ϵ0íjµZ°Öµ¥åk{&ÙØ&¶·åìli3Ûê`¹.cyÛ[ß×iÂEn`kÜã.WhÊ
n]ë\ývºïnv×Z]ë^»8ÛnxÉêÝIÁ.yÕÆ^÷6¶`B$#c½weãÅïTÍû&ñl¾öÌz÷û,ý©ýÕLÂFVUN$`õ"øcÿÆpQ)±ÇMRس&Ów2Þ0²4¼âvÅJR£Iý7½vqãvÜcZE*Ó!¡WYÈ
*}«7ù¥0&É®cFFÉl22Så=ÙË*2À£¦Dù7RQRµfOÙÍ
ñM5§ÿ®ùQèyÇg¨ùÙÅR¦Õzjc(ÇN¹Â¦:4\ce¦:¸Þð¿[¯6K:PpÆ´A)]i6ozh .p§×B®¬-Gf¢Î¦U½OR{ú«eÎWÃdµµ®Ý{k\£×Ú
+6{}ýëk
+]´Fö1mì\zÙdRÿv´m¹hgÚÔÓ´µ=Ëf_»µÝ·ÅJkÛ`Ù.7ȽnO>Ý㪻µÕnz¯ùÖ÷¾wïuÙÛß8ê^p'öà W¸Û ¾p?<O
+øÄ)Î%WãïÑÅ5ÞqwãùÈûrå×1yÊYÞòÞ¬Üå1¹b`>sßÜ/5ÇùÎyî÷èAÊÏ
^t£ÛèGWúÒ1t¦?êqzÔ©^uLÝêY:ÖµÞõ£sÝëa:ØÅ^öÝìiw9ÚÕÞö³Ýíq÷8Üå^÷ÓÝîyw8ÞõÞwóÝï÷7à_ørÞð6âÿßx^3ÞñW5ä%_yISÞòw3æ5ßysÞó¡ß0èE_züÞô©/êUßúå²Þõ±¿-ìe_ûÒÒÞö¹·,îuß{ÁòÞ÷Á+ð
_ü³ßøÉ×*òßü§2ßùÑ'*ô¥_ýRßúÙg)öµß}rßûá7(øÅ_~|ßüéW&úÕß~Q²ßýñO$üå_¯Úÿâ¦þù¯Èþÿ?Øö Ð AM PÑ'п§Pçj+ÐÅ"Ð3°x0P;w8ÐCv at PKuHÐSptPP[PsXÐc0r`PkqhÐs0opP{á|ßÝ·f + Pª °f
+§0¿¨Ð
+mJ
+¯Pyl»ðû¼*ÃCÏÆ
+×ðsØÐ
+ê
+ã°ÔPëPYèÐóÐWðPûPWüý/øÑOñN1L'QK$/QH,7qG4?D<G1CDO@LWq?T_±|`QOpkÑt\Ñsñåt1{ï'áÑwð±n~QQ,Ñ£±+ !ÿSTARDIV 5.0 y¨ =m ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.sda
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.sda (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/stats/stats-process.sda 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,657 @@
+ÐÏࡱá ; þÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿ
+
+ ! " # $ % & ' ( ) * + , - . / 0 þÿÿÿ2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ R o o t E n t r y ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ þÿÿÿþÿÿÿþÿÿÿ
+
+ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ
+ ÿÿÿÿ .½
ÑÐ )ä°± Drawing
+ StarDraw 5.0 |& ýùÿÿ« iG SfxDocumentInfo LU1,Ì ¹U1x'¡ uKô Info 0 Info 1 Info 2 Info 3 LU1,Ì °í4 < 1,,,1 þÿ à
òùOh« +'³Ù0 ø h
+ t
+ ¤ ° ¼ È Ô à ì 18 @ ":Þ @ Öè) @ ãFA ÍÀ@ ßbÓ!®À »» ÿÿ ¨ XOutdevItemPool 1 èèéêëìíîïðñòóôõö÷øùúûüý
+ è)èéêëìíîïðñùúûüýþ
+
+&'()*+,-./06789:;UVWXYZ[\] ècèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst ètèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef ¡ d î ì c 0 ¹'è @ q X X º'é 6 @ ·
+ Standard 1ÿÿÿÿ X »'ê . @ é 2 X X X ¼'ë @ ÿÿÿÿ X ½'ì ¨ @ É
+ Standard 1ÿÿÿÿ Arrowÿÿÿÿ
+ Arrowÿÿÿÿ d È d X X& X] ¾'í ´ @
+ Standard 1ÿÿÿÿ Arrowÿÿÿÿ d È d Arrowÿÿÿÿ } ú ú ú } X X& Xi ¿'î . @ Ã , ¼ È X X X À'ï . @ ý , È ú X X X Á'ð @ ) X X Â'ñ @ L X òò
+ @ f óó
+ @ | ôô
+ @ õõ
+ @ ¨ öö
+ @ ¾ ÷÷
+ @ Ô øø
+ @ ê ´'ú @ + X X µ'û Û @ Û ÿÿÿÿ ¸¸ÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÌÌ ÿÿÿÿ ÿÿÿÿÿÿ Blue grayÿÿÿÿ ææææÿÿ
+ Red 4ÿÿÿÿ ÿÿ3333 Magenta 8ÿÿÿÿ ^^¦¦
+ Light cyanÿÿÿÿ ÿÿÿÿX X X2 XD XV Xq X X£ ¶'ü @ @ C
+ Standard 1ÿÿÿÿ ÿÿÿÿÿÿ 2 2 d d X ·'ý 2 @
+ Standard 1ÿÿÿÿ X ¸'þ , @ ¹
+ Standard 1ÿÿÿÿ BMv v ( @ @ SD Ä @ x^íSI
+Ã0ô¯s½å\èzéü ÿ
+ª46Z
Bn8xÇ)1²Ì³.<è§B+ï ̨ޢÏ40:prf
+·í|q±ìüâÊ]~½+Háë~|ðWíF¼ðúúMñbÀö þâPÙ@úaüoÌCÄØ[½È¡z¼6~U{Ûß<ª½Õ?¥ ü{¿rü=+Îý÷ô|´¨ý¿.©MåÛxò³åG¦
+Ü«±X ÿÿ
+ @ Ó
+ @ é
+ @ ÿ
+ @
+
+ @ +
+
+ @ A
+
+ @ W
+
+ @ m
+
+ @
+
+ @
+
+ @ ¯
+
+
+
+ @ Å
+
+ @ Û
+
+ @ ñ
+
+
+
+ @
+ @
+ @ 3
+ @ I
+ @ _
+ @ u
+ @
+ @ ¡
+ @ ·
+ @ Í (
+ @ ã (
+ @ ù (
+ @ (
+ @ % (
+ @ ; (
+ @ Q (
+ @ g (
+ @ } (
+ @ (!
+ @ © ("
+ @ ¿ (#
+ @ Õ $$
+ @ ë %%
+ @
+ &&
+ @
+ ''
+ @ -
+ ((
+ @ C
+ ))
+ @ Y
+ ;(+ @ y
+ X X ,, @ ©
+ ÿÿÿÿ X -- " @ Ó
+ , È X X .. " @ , È X X //
+ @ 00
+ @ 5 11
+ @ K 22
+ @ a 33
+ @ w 44
+ @ 55
+ @ £ 66
+ @ ¹ II @ × ( ô X JJ . @ '( , X X X KK @ 5 X X (L
+ @ S MM
+ @ i NN
+ @ OO
+ @ PP
+ @ « QQ @ Ç J X RR
+ @ á SS @ ÿ X TT
+ @ UU @ 4 X VV @ Z H X X WW
+ @ x XX
+ @ YY
+ @ ¤ ZZ
+ @ º [[
+ @ Ð \\
+ @ æ ]]
+ @ ü ^^
+ @ __
+ @ ( ``
+ @ > aa
+ @ T bb
+ @ j cc
+ @ dd
+ @ ee
+ @ ¬ gg @ È X hh
+ @ â ii
+ @ ø jj
+ @ kk
+ @ $ ll
+ @ : mm
+ @ P nn
+ @ f oo
+ @ | pp
+ @ qq
+ @ ¨ rr
+ @ ¾ ss
+ @ Ô tt
+ @ ê uu
+ @ vv
+ @ ww
+ @ , xx
+ @ B yy
+ @ X ùù Þ @
+ è¹' è¹' # í¾' ïÀ' è¹' ë¼' è¹' è¹'
+ # í¾' ïÀ'
+ è¹' ë¼' X X X X, X2 XD XJ X\ Xb Xn Xz X X X Z @ ` ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ûµ' ú´' ú´' ûµ' ú´' ûµ'
+ ú´' ûµ' ú´' ûµ'
+ ú´' ûµ' ú´' ú´' ûµ' ú´' ûµ' ú´' ûµ' X X X& X8 XJ XP Xb Xn X X X Xª X¼ XÂ XÔ Xà Xò X **
+ n @
+ ú > > X X X X X& X, X2 X8 X> XD 77
+ n @
+ t > > X X X X X& X, X2 X8 X> XD HH @ L £+' £+' ¦' §' <( @' £+' ¦' §' <(
+( @' £+' ¦' §' <( @' £+' ¦' §'
+ £+' ¦' §' £+' £+'
+ £+' ¦' §'
+ <( @' £+' ¦' §' <(
+( @' £+' ¦' §' <( @' £+' ¦' §'
+ £+' ¦' §' £+' ¦' §' £+' ¦' §' £+' <( @' ¦' §' <( @' £+' ¦' §' <( @' ¢1' £+' ¦' §' <( @' ¢1' £+' ¦' §' X X X X& X> Xh X XÂ XÚ Xæ Xò Xø Xþ X X@ Xp X X² X¾ XÐ XÜ Xî Xú X XH Xx ff ¦ @ & QQ VV JJ KK JJ KK ! II QQ VV QQ VV II QQ VV JJ KK SS UU VV JJ KK QQ VV JJ KK
+ JJ KK ! II QQ VV QQ VV
+ II QQ VV JJ KK SS UU VV JJ KK X X X2 XD X\ Xn X Xª X¼ XÎ Xà Xò X
+ X X4 XX zz * @ gg gg X X 8 z ´ à T È ð % ; Q g } © Ó º D | ¨ ¾ Ô ê , B X n ° Æ Ü ò 4 J ` v ¢ ¸ Î ä ú & < R h ~ ª À Ö ì
+
+ @
+ l
+
+ È
+ Þ
+ ô
+
+ 6 L b x Ô ü ( > T j Â Ø ÷ !
+ 7
+ M
+ c
+ y
+
+ ¥
+ »
+ Ñ
+ ç
+ ý
+ ) ? U k ¡ · Í ã ù % ; Q g } © ¿ Õ ë g á [ s %
+ P ¶ ( EditEngineItemPool è ° ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ~! 0 / ?
+ @ ä *
+ @ ú
+ @ g* | @ 7
+ "ð , StarBats N
+ ÿ - "ð¨ý°° , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ý` ` , StarBats N
+ ÿ - "ð¨ý¸¸ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýhh , StarBats N
+ ÿ - "ð¨ýÀÀ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýpp , StarBats N
+ ÿ -
+ "ðX , StarBats N
+ ÿ - "ð¨ý°° , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ý` ` , StarBats N
+ ÿ - "ð¨ý¸¸ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýhh , StarBats N
+ ÿ - "ð¨ýÀÀ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýpp , StarBats N
+ ÿ -
+ "ð È È , StarBats N
+ ÿ - "ð¨ý°° , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ý` ` , StarBats N
+ ÿ - "ð¨ý¸¸ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýhh , StarBats N
+ ÿ - "ð¨ýÀÀ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýpp , StarBats N
+ ÿ -
+ Z "ð|ü°° , StarBats N
+ ÿ - "ð|ü°° , StarBats N
+ ÿ - ðàü` ` , StarBats N
+ ÿ K "ð¨ý , StarBats N
+ ÿ - ð¨ýÀÀ , StarBats N
+ ÿ K "ð¨ýpp , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýÐ Ð , StarBats N
+ ÿ - "ð¨ý%% , StarBats N
+ ÿ - "ð¨ý0*0* , StarBats N
+ ÿ - Z
+ rð , StarBats
+ ÿ - rð èè , StarBats
+ ÿ - rð ÐÐ , StarBats
+ ÿ - r𠸸 , StarBats
+ ÿ - rð , StarBats
+ ÿ - rð , StarBats
+ ÿ - rð pp , StarBats
+ ÿ - rð XX , StarBats
+ ÿ - rð @@ , StarBats
+ ÿ - rð (#(# , StarBats
+ ÿ - "ð¨ýXX , StarBats i
+ ÿ - "ð¨ý°° , StarBats i
+ ÿ - "ð¨ý , StarBats i
+ ÿ - "ð¨ý` ` , StarBats i
+ ÿ - "ð¨ý¸¸ , StarBats i
+ ÿ - "ð¨ý , StarBats i
+ ÿ - "ð¨ýhh , StarBats i
+ ÿ - "ð¨ýÀÀ , StarBats i
+ ÿ - "ð¨ý , StarBats i
+ ÿ - X X. XN Xn X X®
+ @ ®7 @ Ð7 X X ! @ 8 P d d üd x X <( @ !8 Q X
+( Á @ æ8
+ StarBats ° !"-
+ StarBats !"-
+ StarBats !"- X XG X @' L @ : P d d d d d Xd d È d d ,d d |üd ° @d d àüd ` ¸d d ¨ýd hd d ¨ýd À d d ¨ýd p Èd d ¨ýd xd d ¨ýd Ð
+ (#d d ¨ýd % Ø'd d ¨ýd 0* ¨ýd d ¨ýd
+ d d ¨ýd X X X! X4 XG XZ Xm X X X¦ X¹ XÌ Xß Xò X A'¡ @ À: d d d d d d ¤d Ò d d ôd d d d ,d d È d d d d X X X& X2 X> XJ XV Xb 1'¢ ( @ ; d È d X X +'£ ( @ <; ] X X X '¤
+ @ ^; !'¥ @ ; X '¦ N @ Ò; Times @ Helvetica ' helvetica X X X2 '§ À @
+ v< Nd
+ 4d
+ d
+ öd
+ {d
+ îd
+ [ §d
+ hd
+ Ûd
+ Ád
+
+ d
+ id
+
+
+ `d
+ X X X" X, X6 X@ XJ XT X^ Xh Xr X| X ?(¨
+ @ À< '© @ à< X X 'ª @ = X '« @ "= X '¬ @ F= X X ' @ i= X '® @ = X %'¯
+ @ ¢= S'°
+ @ ¸= "'±
+ @ Î= '²
+ @ ä= $'³
+ @ ú= *´
+ @ > *µ
+ @ &> *¶
+ @ <> *·
+ @ R> *¸
+ @ h> *¹
+ @ ~> *º
+ @ > *»
+ @ ª> *¼
+ @ À> *½
+ @ Ö> *¾
+ @ ì> ¿¿
+ @ ? ÀÀ
+ @ ? ÁÁ
+ @ .? ÂÂ
+ @ D? ÃÃ
+ @ Z? *Ä
+ @ p? {(Å
+ @ ? $ : P Ø î E e 2 T Ä ê ( G f Ì â ø $ : P f | ¨ ¾ Ô ê , B X n ° P
+ E g*
+ "ð¨ýXX , StarBats N
+ ÿ - "ð¨ý°° , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ý` ` , StarBats N
+ ÿ - "ð¨ý¸¸ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýhh , StarBats N
+ ÿ - "ð¨ýÀÀ , StarBats N
+ ÿ - "ð¨ý , StarBats N
+ ÿ - "ð¨ýpp , StarBats N
+ ÿ -
+(
+ StarBats ° !"- !'¥ '¦ Times '§ Od
+ $'³ *´ *µ *¶ > Andale WT UI;MS Mincho;HG Mincho L;MS PGothic;Arial Unicode MS *· / Simplified Arabic;Andale WT UI;Arial Unicode MS *¸ Od
+ *¹ Od
+ 0 8 s § ¯ · > J 2 + 2T Standard Standard ¾é # è¹' éº' ê»' ë¼' ì½' í¾' î¿' ïÀ' ðÁ' ñÂ' ú´' ûµ' ü¶' ý·' þ¸' +;( ,, -- .. g*
+( @' ¡A' ¢1' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Object with arrow Standard Object with arrow ¿é è¹' ê»' ë¼' ì½' î¿' ïÀ' ðÁ' Object with shadow Standard Object with shadow Àé +;( ,, -- .. Object without fill Standard Object without fill Áé ú´' Text Standard Text Âé è¹' ú´' Text body Standard Text body Ãé è¹' ú´' §' Text body justfied Standard Text body justfied Äé è¹' ú´' £+' First line indent Standard First line indent Åé è¹' ú´' g* @' Title Standard Title Æé è¹' ú´' §' Title1 Standard Title1 Çé è¹' ú´' ûµ' +;( ,, -- .. £+' §' Title2 Standard Title2 Èé ê»' ûµ' +;( ,, -- .. g* @' ¡A' £+' §' Heading Standard Heading Éé è¹' ú´' ¡A' §' Heading1 Standard Heading1 Êé è¹' ú´' ¡A' §' ©' Heading2 Standard Heading2 Ëé è¹' ú´' ¡A' §' ©' ¬' Dimension Line Standard Dimension Line Ìé è¹' ì½' í¾' î¿' ïÀ' ú´' §' Home~LT~Gliederung 1 Home~LT~Gliederung 1þ¯ÿß Ïé è¹' ú´' g* @' ¡A' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Gliederung 2 Home~LT~Gliederung 1 Home~LT~Gliederung 2þ¯ÿß Ðé @' ¡A' §' Home~LT~Gliederung 3 Home~LT~Gliederung 2 Home~LT~Gliederung 3þ¯ÿß Ñé @' ¡A' §' Home~LT~Gliederung 4 Home~LT~Gliederung 3 Home~LT~Gliederung 4þ¯ÿß Òé @' ¡A' §' Home~LT~Gliederung 5 Home~LT~Gliederung 4 Home~LT~Gliederung 5þ¯ÿß Óé @' ¡A' §' Home~LT~Gliederung 6 Home~LT~Gliederung 5 Home~LT~Gliederung 6þ¯ÿß Ôé @' ¡A' §' Home~LT~Gliederung 7 Home~LT~Gliederung 6 Home~LT~Gliederung 7þ¯ÿß Õé @' ¡A' §' Home~LT~Gliederung 8 Home~LT~Gliederung 7 Home~LT~Gliederung 8þ¯ÿß Öé @'
+ ¡A' §' Home~LT~Gliederung 9 Home~LT~Gliederung 8 Home~LT~Gliederung 9þ¯ÿß ×é @' ¡A' §'
+ Home~LT~Titel
+ Home~LT~Titelþ¯ÿß Íé è¹' ú´' QQ g* £+' ¥!' ¦' §'
+ ©' ª' «' ¬' ' ®' Home~LT~Untertitel Home~LT~Untertitelþ¯ÿß Ýé è¹' ú´' QQ g* @' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Notizen Home~LT~Notizenþ¯ÿß Úé è¹' ú´' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Hintergrundobjekte Home~LT~Hintergrundobjekteþ¯ÿß Øé +;( ,, -- .. Home~LT~Hintergrund Home~LT~Hintergrundþ¯ÿß Ùé è¹' ú´' Title Title @ Íé Subtitle Subtitle @ Ýé Background objects Background objects @ Øé
+ Background
+ Background @ Ùé Notes Notes @ Úé Outline 1 Outline 1 @ Ïé Outline 2 Outline 1 Outline 2 @ Ðé Outline 3 Outline 2 Outline 3 @ Ñé Outline 4 Outline 3 Outline 4 @ Òé Outline 5 Outline 4 Outline 5 @ Óé Outline 6 Outline 5 Outline 6 @ Ôé Outline 7 Outline 6 Outline 7 @ Õé Outline 8 Outline 7 Outline 8 @ Öé Outline 9 Outline 8 Outline 9 @ ×é t Ð P ê D â P ä 8 > ¤
+ p Ö < ¢ n ú
+ x  ä H t À ó &
+ Y
+
+ ¿
+ ò
+ % DrMd Ï Ï JoeMp 0 LU1 µ ¹U1x'¡ ¹U1j
+ ÿÿ O â DrLy LAYER_LAYOUT DrLy
+ LAYER_BCKGRND DrLy LAYER_BACKGRNDOBJ DrLy LAYER_CONTROLS DrLy ! LAYER_MEASURELINES DrMP Á ' JoeM t R Ð Ð Ð Ð DrML DrOb < SVDr & Ð Á( % DrOb < SVDr & BK Ð ø_ % DrOb < SVDr & ì, Á( 7J DrOb < SVDr & BK ì, ø_ 7J DrXX gg f Home~LT~Gliederung ÿ DrMP 9 · JoeM y¨ =m DrML DrOb SVDr & y¨ =m ' Home~LT~Hintergrundþ¯ y¨ =m DrXX gg N Home~LT~Gliederung ÿ DrMP ¶ , JoeM R t Ð Ð Ð Ð DrML DrOb õ SVDr & Ò % 57 K3 !
+ Home~LT~Titelþ¯ Ò % 57 K3 { xV4B1 f Z»» ÿÿ ÿ EditEngineItemPool è á ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 Ì ! @ ( d d üd x X <( @ H X
+( G @
+ StarBats !r- X @' ! @ È d d d X ; [ ®
+ P ê Click to move the slide
+ Home~LT~Titelþ¯ <(
+( @' DrOb SVDr & ± 27 eE Ãc # Home~LT~Notizenþ¯£ ± 27 eE Ãc xV4B1 o Z»» ÿÿ ÿ EditEngineItemPool è Ø ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 à ! @ d d üd x X <( @ ? X
+( G @
+ StarBats X !"- X @' ! @ ¿ d d ¨ýd X X ; [ ®
+ P á Click to edit the notes format Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrPg å c JoeM t R Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrXX Handoutsgg F Home~LT~Gliederung ÿ DrPg K¿ Ѿ JoeM y¨ =m DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb ß SVDr & 4A ] VI 9 Standard 4A ] VI 9 j xV4B1 U Z FTP logs Standard <(
+( @' ¦ § DrOb º SVDr & £, b t6 ¯ Standard d £, b t6 ¯ E xV4B1 . Z»» ÿÿ } EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 ß ! @ É d d üd x X <( @ é X
+( G @ <
+ StarBats !"- X @' ! @ i d d d X +'£ @ X '¦ " @ · Helvetica X '§ @ Û §d
+ X ; [ ® Û û )
+ P Project Standard <(
+( @' £+' ¦ § WWW Logs Standard <(
+( @' £+' ¦ § DrOb ê SVDr & º< O âM Standard º< O âM u xV4B1 ` Z stats_ftp_downloads Standard <(
+( @' ¦ § DrOb ð SVDr & å= X ®L 0 Standard ý Y; E ÿÿÿÿ Þ xV4B1 É Z»» ÿÿ Y EditEngineItemPool è & ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 c ! @ m d d üd x X <( @ X
+( G @ à
+ StarBats !"- X @' ! @
+ d d d X '¦ " @ ; helvetica X '§ @ _ §d
+ X ; [ ® Û
+ P stats_ftp_logparse.pl Standard <(
+( @' ¦ § ¡ EE 9 NE O DrCn $ DrCn $ ; xi (# ÿÿ DrOb K SVDr & e =- Ú¡ 3 Standard õ e =- Ú¡ 3 Ö xV4B1 Á Z»» ÿÿ Y EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 S ! @ ] d d üd x X <( @ } X
+( G @ Ð
+ StarBats !"- X @' ! @ ý d d d X '¦ " @ + Helvetica X '§ @ O §d
+ X ; [ ® Û
+ P y
+ stats_project Standard <(
+( @' ¦
+ §
+ DrOb H SVDr & m¡ é Standard ò m¡ é Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è a ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ! @ ¨ d d üd x X <( @ È X
+( G @
+ StarBats !"- X @' ! @ H d d d X '¦ " @ v Helvetica X '§ @ §d
+ X ; [ ® Û
+ P Ä
+ stats_site Standard <(
+( @' ¦
+ §
+ DrOb V SVDr & ZX hM _h ìP Standard ZX hM _h ìP á xV4B1 Ì Z»» ÿÿ Y EditEngineItemPool è © ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 æ ! @ ð d d üd x X <( @ X
+( G @ c
+ StarBats !"- X @' ! @ d d d X '¦ " @ ¾ Helvetica X '§ @ â `d
+ X ; [ ® Û
+ P stats_site_last_30 Standard <(
+( @' §' ¦ § DrOb U SVDr & ZX YV _h ÝY Standard ÿ ZX YV _h ÝY à xV4B1 Ë Z»» ÿÿ Y EditEngineItemPool è ÿ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 <" ! @ F! d d üd x X <( @ f! X
+( G @ ¹!
+ StarBats !"- X @' ! @ æ! d d d X '¦ " @ " Helvetica X '§ @ 8" `d
+ X ; [ ® Û
+ P b" stats_site_months Standard <(
+( @' §' ¦ § DrOb Y SVDr & $8 C )H F Standard $8 C )H F ä xV4B1 Ï Z»» ÿÿ Y EditEngineItemPool è T$ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 % ! @ $ d d üd x X <( @ »$ X
+( G @ %
+ StarBats !"- X @' ! @ ;% d d d X '¦ " @ i% Helvetica X '§ @ % `d
+ X ; [ ® Û
+ P ·% stats_project_last_30 Standard <(
+( @' §' ¦ § DrOb ç SVDr & E? ©2 ãC Standard ô Ê2 ÿÿÿÿ Õ xV4B1 À Z»» ÿÿ Y EditEngineItemPool è ' ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ê( ! @ ô' d d üd x X <( @ ( X
+( G @ g(
+ StarBats !"- X @' ! @ ( d d d X '¦ " @ Â( helvetica X '§ @ æ( §d
+ X ; [ ® Û
+ P ) db_stats_agg.php Standard <(
+( @' ¦' §' ¡ 3 &@ C DrCn $ DrCn $ ; xi (# ÿÿ DrOb X SVDr & $8 L )H O Standard $8 L )H O ã xV4B1 Î Z»» ÿÿ Y EditEngineItemPool è + ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ñ, ! @ Û+ d d üd x X <( @ û+ X
+( G @ N,
+ StarBats !"- X @' ! @ {, d d d X '¦ " @ ©, Helvetica X '§ @ Í, `d
+ X ; [ ® Û
+ P ÷, stats_project_months Standard <(
+( @' §' ¦ § DrOb SVDr & E? ©2 ùL Standard ï 07 ÿÿÿÿ ¡ 3 &@ L DrCn $ DrCn $
+ ; xi (# ÿÿ DrOb , SVDr & Hr 9 | Standard Ö Hr 9 | · xV4B1 Z Logo Standard <(
+( @' £+' ¦ § showings Standard <(
+( @' £+' ¦ § DrOb 3 SVDr & 9 í Standard Ý 9 í ¾ xV4B1 § Z
+ Group .net Standard <(
+( @' £+' ¦
+ §
+
+ Page Views Standard <(
+( @' £+' ¦
+ §
+ DrOb 3 SVDr & Ð 9 ¡ Standard Ý Ð 9 ¡ ¾ xV4B1 § Z
+ .net total Standard <(
+( @' £+' ¦
+ §
+
+ page views Standard <(
+( @' £+' ¦
+ §
+ DrOb Y SVDr &
+m á } K Standard
+m á } K ä xV4B1 Ï Z»» ÿÿ Y EditEngineItemPool è 3 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Í4 ! @ ×3 d d üd x X <( @ ÷3 X
+( G @ J4
+ StarBats !"- X @' ! @ w4 d d d X '¦ " @ ¥4 Helvetica X '§ @ É4 `d
+ X ; [ ® Û
+ P ó4 stats_agg_logo_by_day Standard <(
+( @' §' ¦ § DrOb é SVDr & *q ¥
+ {  Standard ö h_ ÿÿÿÿ × xV4B1  Z»» ÿÿ Y EditEngineItemPool è é6 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 &8 ! @ 07 d d üd x X <( @ P7 X
+( G @ £7
+ StarBats !"- X @' ! @ Ð7 d d d X '¦ " @ þ7 helvetica X '§ @ "8 §d
+ X ; [ ® Û
+ P L8 site_stats.php Standard <(
+( @' § ¦ ¡ 0w u á DrCn $ DrCn $ ; xi (# ÿÿ DrOb [ SVDr & çs V y ¾ Standard -t V 2 ¾ æ xV4B1 Ñ Z»» ÿÿ Y EditEngineItemPool è Ò: ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 < ! @ ; d d üd x X <( @ 9; X
+( G @ ;
+ StarBats !"- X @' ! @ ¹; d d d X '¦ " @ ç; Helvetica X '§ @ < `d
+ X ; [ ® Û
+ P 5< stats_agg_logo_by_group Standard <(
+( @' §' ¦ § DrOb SVDr & Ov ¥
+ } 7 Standard p ÿÿÿÿ ¡ 0w /| V DrCn $ DrCn $ ; xi (# ÿÿ DrOb å SVDr & f ¥
+ R q Standard ò y îþÿÿÿÿÿÿ Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è ?? ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 |@ ! @ ? d d üd x X <( @ ¦? X
+( G @ ù?
+ StarBats !"- X @' ! @ &@ d d d X '¦ " @ T@ helvetica X '§ @ x@ §d
+ X ; [ ® Û
+ P ¢@ site_stats.php Standard <(
+( @' ¦' §' ¡ ¸ ÿ DrCn $ DrCn $ 3 ; xi (# ÿÿ DrOb [ SVDr & â{ Ö t Standard â{ Ö t æ xV4B1 Ñ Z»» ÿÿ Y EditEngineItemPool è $C ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 aD ! @ kC d d üd x X <( @ C X
+( G @ ÞC
+ StarBats !"- X @' ! @ D d d d X '¦ " @ 9D Helvetica X '§ @ ]D `d
+ X ; [ ® Û
+ P D stats_agg_site_by_group Standard <(
+( @' §' ¦ § DrOb é SVDr & : ¥
+ & ÷ Standard ö ?| £ÿÿÿÿÿÿÿ × xV4B1  Z»» ÿÿ Y EditEngineItemPool è F ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¼G ! @ ÆF d d üd x X <( @ æF X
+( G @ 9G
+ StarBats !"- X @' ! @ fG d d d X '¦ " @ G helvetica X '§ @ ¸G §d
+ X ; [ ® Û
+ P âG site_stats.php Standard <(
+( @' § ¦ ¡ \ DrCn $
+ DrCn $ ; xi (# ÿÿ DrOb SVDr & jp ) Î ' Object without fill jp ) Î DrOb ß SVDr & { ~ T { Standard { ~ T { j xV4B1 U Z activity_log Standard <(
+( @' ¦' §' DrOb à SVDr & ÎQ K ª[ ' Standard ÎQ K ª[ ' k xV4B1 V Z HTTP logs Standard <(
+( @' ¦ § DrOb ë SVDr & O = ©a ÷ Standard O = ©a ÷ v xV4B1 a Z stats_http_downloads Standard <(
+( @' ¦ § DrOb ñ SVDr & µO F b_ Standard þ M 3 ÿÿÿÿ ß xV4B1 Ê Z»» ÿÿ Y EditEngineItemPool è M ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ÏN ! @ ÙM d d üd x X <( @ ùM X
+( G @ LN
+ StarBats !"- X @' ! @ yN d d d X '¦ " @ §N helvetica X '§ @ ËN §d
+ X ; [ ® Û
+ P õN stats_http_logparse.pl Standard <(
+( @' ¦ § ¡ ¼V ' [X = DrCn $ DrCn $ ; xi (# ÿÿ DrOb SVDr & Ú] X3 §j 9 Standard äÿÿ}% ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è Q ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 àR ! @ ÊQ d d üd x X <( @ êQ X
+( G @ =R
+ StarBats !"- X @' ! @ jR d d d X +'£ @ R X '¦ " @ ¸R helvetica X '§ @ ÜR §d
+ X ; [ ® Û û )
+ P
+S db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ 8d 94 Id ·8 DrCn $ ! DrCn $ ; xi (# ÿÿ DrOb SVDr & º> 2 ^ J ' Object without fill º> 2 ^ J DrOb SVDr & < } ¹c G ' Object without fill < } ¹c G DrOb ç SVDr & .F U Standard .F U r xV4B1 ] Z Download server logs Standard <(
+( @' ¦' §' DrOb SVDr & ãN ¡" e `2 Standard Þ÷ÿÿá) ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è {W ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 ØX ! @ ÂW d d üd x X <( @ âW X
+( G @ 5X
+ StarBats !"- X @' ! @ bX d d d X +'£ @ X X '¦ " @ °X helvetica X '§ @ ÔX §d
+ X ; [ ® Û û )
+ P Y Db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ ÄO # 8d 1 DrCn $ ' DrCn $ ! ; xi (# ÿÿ DrOb X SVDr & pY ·8 "o q; Standard pY ·8 "o q; ã xV4B1 Î Z»» ÿÿ Y EditEngineItemPool è [ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 É\ ! @ Ó[ d d üd x X <( @ ó[ X
+( G @ F\
+ StarBats !"- X @' ! @ s\ d d d X '¦ " @ ¡\ Helvetica X '§ @ Å\ §d
+ X ; [ ® Û
+ P ï\ frs_dlstats_grouptotal_agg Standard <(
+( @' ¦ § DrOb W SVDr & ëZ 1 m 94 Standard ëZ 1 m 94 â xV4B1 Í Z»» ÿÿ Y EditEngineItemPool è ä^ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 !` ! @ +_ d d üd x X <( @ K_ X
+( G @ _
+ StarBats !"- X @' ! @ Ë_ d d d X '¦ " @ ù_ Helvetica X '§ @ ` §d
+ X ; [ ® Û
+ P G` frs_dlstats_filetotal_agg Standard <(
+( @' ¦ § DrOb ì SVDr & ô % î Standard ô % î w xV4B1 b Z CVSROOT/history files Standard <(
+( @' ¦ § DrOb é SVDr & ¿ ¢" m Standard ¿ ¢" m t xV4B1 _ Z CVS "traffic" logs Standard <(
+( @' ¦ § DrOb ï SVDr &
+ n" r
+ Standard ü ëþÿÿ ÿÿÿÿ Ý xV4B1 È Z»» ÿÿ Y EditEngineItemPool è d ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Me ! @ Wd d d üd x X <( @ wd X
+( G @ Êd
+ StarBats !"- X @' ! @ ÷d d d d X '¦ " @ %e helvetica X '§ @ Ie §d
+ X ; [ ® Û
+ P se cvs_history_parse.pl Standard <(
+( @' ¦ § ¡ I î 0 DrCn $ " DrCn $ # ; xi (# ÿÿ DrOb SVDr & OK f VT M Standard *
+ v- ÿÿÿÿ xV4B1 ö Z»» ÿÿ } EditEngineItemPool è ÿg ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 \i ! @ Fh d d üd x X <( @ fh X
+( G @ ¹h
+ StarBats !"- X @' ! @ æh d d d X +'£ @ i X '¦ " @ 4i helvetica X '§ @ Xi §d
+ X ; [ ® Û û )
+ P i stats_sum.pl Standard <(
+( @' £+' ¦' §' § ¦ ¡ áO G ÄO l DrCn $ DrCn $ ' ; xi (# ÿÿ DrOb ¦ SVDr & E Ý* ¶Z 0 Standard P E Ý* ¶Z 0 1 xV4B1 Z»» ÿÿ Y EditEngineItemPool è l ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ym ! @ cl d d üd x X <( @ l X
+( G @ Öl
+ StarBats !"- X @' ! @ m d d d X '¦ " @ 1m Helvetica X '§ @ Um §d
+ X ; [ ® Û
+ P m frs_dlstats_group_agg Standard <(
+( @' ¦ § daily dl's by group/day Standard <(
+( @' ¦ § DrOb ¤ SVDr & ëD l Z # Standard N ëD l Z # / xV4B1 Z»» ÿÿ Y EditEngineItemPool è Âo ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ÿp ! @ p d d üd x X <( @ )p X
+( G @ |p
+ StarBats !"- X @' ! @ ©p d d d X '¦ " @ ×p Helvetica X '§ @ ûp §d
+ X ; [ ® Û
+ P %q frs_dlstats_file_agg Standard <(
+( @' ¦ § daily dl's by file/day Standard <(
+( @' ¦ § DrOb SVDr & jI ¡" 7V ¾+ Standard è O/ ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è fs ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 Ãt ! @ s d d üd x X <( @ Ís X
+( G @ t
+ StarBats !"- X @' ! @ Mt d d d X +'£ @ mt X '¦ " @ t helvetica X '§ @ ¿t §d
+ X ; [ ® Û û )
+ P ít db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ ÄO # ÝO Ý* DrCn $ ' DrCn $ & ; xi (# ÿÿ DrOb I SVDr & Ï #¤ f Standard ó Ï #¤ f Ô xV4B1 ¿ Z»» ÿÿ Y EditEngineItemPool è ww ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ´x ! @ ¾w d d üd x X <( @ Þw X
+( G @ 1x
+ StarBats !"- X @' ! @ ^x d d d X '¦ " @ x Helvetica X '§ @ °x §d
+ X ; [ ® Û
+ P Úx Misc tables Standard <(
+( @' ¦ § DrOb é SVDr & I
+ 5¢ } Standard ö êöÿÿmx ÿÿÿÿ × xV4B1  Z»» ÿÿ Y EditEngineItemPool è Àz ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ý{ ! @ { d d üd x X <( @ '{ X
+( G @ z{
+ StarBats !"- X @' ! @ §{ d d d X '¦ " @ Õ{ helvetica X '§ @ ù{ §d
+ X ; [ ® Û
+ P #| site_stats.php Standard <(
+( @' § ¦ ¡ ù f DrCn $ ) DrCn $ ; xi (# ÿÿ DrOb U SVDr & $8 iT )H íW Standard ÿ $8 iT )H íW à xV4B1 Ë Z»» ÿÿ Y EditEngineItemPool è ©~ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 æ ! @ ð~ d d üd x X <( @ X
+( G @ c
+ StarBats !"- X @' ! @ d d d X '¦ " @ ¾ Helvetica X '§ @ â `d
+ X ; [ ® Û
+ P stats_project_all Standard <(
+( @' §' ¦ § DrOb SVDr & À9 »N F JU Standard æ ¥9 ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è þ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 [ ! @ E d d üd x X <( @ e X
+( G @ ¸
+ StarBats !"- X @' ! @ å d d d X +'£ @ X '¦ " @ 3 helvetica X '§ @ W §d
+ X ; [ ® Û û )
+ P
db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ &@ O &@ iT DrCn $
+ DrCn $ + ; xi (# ÿÿ DrOb SVDr & E? ¥E =a IN Standard ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 l ! @ V d d üd x X <( @ v X
+( G @ É
+ StarBats !"- X @' ! @ ö d d d X +'£ @ X '¦ " @ D helvetica X '§ @ h §d
+ X ; [ ® Û û )
+ P db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ &@ F \` hM DrCn $ DrCn $ ; xi (# ÿÿ DrOb SVDr & E? »N =a :W Standard $úÿÿÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 } ! @ g d d üd x X <( @ X
+( G @ Ú
+ StarBats !"- X @' ! @ d d d X +'£ @ ' X '¦ " @ U helvetica X '§ @ y §d
+ X ; [ ® Û û )
+ P § db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ &@ O \` YV DrCn $
+ DrCn $ ; xi (# ÿÿ DrOb R SVDr & ZX ö] _h za Standard ü ZX ö] _h za Ý xV4B1 È Z»» ÿÿ Y EditEngineItemPool è 1 ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 n ! @ x d d üd x X <( @ X
+( G @ ë
+ StarBats !"- X @' ! @ d d d X '¦ " @ F Helvetica X '§ @ j `d
+ X ; [ ® Û
+ P stats_site_all Standard <(
+( @' §' ¦ § DrOb SVDr & öY üX Ãf ×^ Standard 8 B ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 à ! @ Ê d d üd x X <( @ ê X
+( G @ =
+ StarBats !"- X @' ! @ j d d d X +'£ @ X '¦ " @ ¸ helvetica X '§ @ Ü §d
+ X ; [ ® Û û )
+ P
+ db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ \` ÝY \` ö] DrCn $ DrCn $ / ; xi (# ÿÿ DrOb ] SVDr & Oq µM Ò 9Q Standard Oq µM Ò 9Q è xV4B1 Ó Z»» ÿÿ Y EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ñ ! @ Û d d üd x X <( @ û X
+( G @ N
+ StarBats !"- X @' ! @ { d d d X '¦ " @ © Helvetica X '§ @ Í `d
+ X ; [ ® Û
+ P ÷ stats_site_pages_by_month Standard <(
+( @' §' ¦ § DrOb SVDr & /{ 3 à N Standard á â ÿÿÿÿ ÿ xV4B1 ê Z»» ÿÿ } EditEngineItemPool è ñ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 N ! @ 8 d d üd x X <( @ X X
+( G @ «
+ StarBats !"- X @' ! @ Ø d d d X +'£ @ ø X '¦ " @ & helvetica X '§ @ J §d
+ X ; [ ® Û û )
+ P x db_stats_agg.php Standard <(
+( @' £+' ¦' §' ¡ ÿ | µM DrCn $ 3 DrCn $ 1 ; xi (# ÿÿ DrOb [ SVDr & > Á Standard > Á æ xV4B1 Ñ Z»» ÿÿ Y EditEngineItemPool è ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ? ! @ I d d üd x X <( @ i X
+( G @ ¼
+ StarBats !"- X @' ! @ é d d d X '¦ " @ ýÿÿÿ
þÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Helvetica X '§ @ ; `d
+ X ; [ ® Û
+ P e stats_site_pages_by_day Standard <(
+( @' §' ¦ § DrOb SVDr & {_ 3 à IN Standard ÿÿÿÿ ¡ ÿ \` hM DrCn $ 3 DrCn $ ; xi (# ÿÿ DrOb SVDr & {_ XP ñ| :W Standard ÿÿÿÿ ¡ | 9Q \` YV DrCn $ 1 DrCn $ ; xi (# ÿÿ DrOb SVDr & Â& J q< Standard  Â& J q< £ xV4B1 Z»» ÿÿ } EditEngineItemPool è ¢ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 Þ£ ! @ È¢ d d üd x X <( @ è¢ X
+( G @ ;£
+ StarBats !"- X @' ! @ h£ d d d X +'£ @ £ X '¦ " @ ¶£ Helvetica X '§ @ Ú£ §d
+ X ; [ ® Û û )
+ P ¤ stats_subd_pages Standard <(
+( @' £+' ¦ § subdomain pages Standard <(
+( @' £+' ¦ § by group/day Standard <(
+( @' £+' ¦ § DrOb õ SVDr & K( Î Ù: + Standard :ýÿÿ ÿÿÿÿ ã xV4B1 Î Z»» ÿÿ Y EditEngineItemPool è ¦ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Ö§ ! @ ঠd d üd x X <( @ § X
+( G @ S§
+ StarBats !"- X @' ! @ § d d d X '¦ " @ ®§ helvetica X '§ @ Ò§ §d
+ X ; [ ® Û
+ P ü§ stats_projects_logparse.pl Standard <(
+( @' § ¦ ¡ 1 ¯ 1 J DrCn $ DrCn $ 6 ; xi (# ÿÿ DrOb SVDr & s "& Ü Standard Å s "& Ü ¦ xV4B1 Z»» ÿÿ } EditEngineItemPool è ª ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 ë« ! @ Õª d d üd x X <( @ õª X
+( G @ H«
+ StarBats !"- X @' ! @ u« d d d X +'£ @ « X '¦ " @ ë Helvetica X '§ @ ç« §d
+ X ; [ ® Û û )
+ P ¬ Stats_cvs_group Standard <(
+( @' £+' ¦ § cvs commits/adds/cos Standard <(
+( @' £+' ¦ § by group/day Standard <(
+( @' £+' ¦ § DrOb ò SVDr & ô # p Standard ÿ þóÿÿÉ5 ÿÿÿÿ à xV4B1 Ë Z»» ÿÿ Y EditEngineItemPool è ©® ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 æ¯ ! @ ð® d d üd x X <( @ ¯ X
+( G @ c¯
+ StarBats !"- X @' ! @ ¯ d d d X '¦ " @ ¾¯ helvetica X '§ @ ⯠§d
+ X ; [ ® Û
+ P ° db_stats_cvs_history.pl Standard <(
+( @' § ¦ ¡ 0 m J DrCn $ # DrCn $ 8 ; xi (# ÿÿ DrOb V SVDr & %] 6 Ôr « Standard %] 6 Ôr « á xV4B1 Ì Z»» ÿÿ Y EditEngineItemPool è ² ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 س ! @ â² d d üd x X <( @ ³ X
+( G @ U³
+ StarBats !"- X @' ! @ ³ d d d X '¦ " @ °³ Helvetica X '§ @ Ô³ §d
+ X ; [ ® Û
+ P þ³ stats_project_developers Standard <(
+( @' ¦ § DrOb SVDr & N ;
+ Standard = N ;
+ xV4B1 Z»» ÿÿ Y EditEngineItemPool è ñµ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 .· ! @ 8¶ d d üd x X <( @ X¶ X
+( G @ Ǧ
+ StarBats !"- X @' ! @ ض d d d X '¦ " @ · helvetica X '§ @ *· §d
+ X ; [ ® Û
+ P T·
+ Tables which Standard <(
+( @' ¦
+ §
+ must be kept Standard <(
+( @' ¦ § DrOb û SVDr & O à < b Standard ¥ O à < b xV4B1 o Z»» ÿÿ ¦ EditEngineItemPool è ¹ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f 0 » ! @ ˹ d d üd x X <( @ ë¹ X
+( G @ >º
+ StarBats !"- X @' ! @ kº d d d X 1'¢ @ º d X +'£ @ °º X '¦ " @ Þº helvetica X '§ @ » §d
+ X ; [ ® Û N
+ P 4»
+ Tables which Standard <(
+( @' ¢1' £+' ¦
+ §
+ are regenerated Standard <(
+( @' ¢1' £+' ¦ § DrOb å SVDr & }c e im Standard ò øk ÿÿÿÿ Ó xV4B1 ¾ Z»» ÿÿ Y EditEngineItemPool è ½ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 ¼¾ ! @ ƽ d d üd x X <( @ æ½ X
+( G @ 9¾
+ StarBats !"- X @' ! @ f¾ d d d X '¦ " @ ¾ helvetica X '§ @ ¸¾ §d
+ X ; [ ® Û
+ P â¾ site_stats.php Standard <(
+( @' ¦' §' ¡ éh F üg 6 DrCn $ > DrCn $ : ; xi (# ÿÿ DrOb r SVDr & d ù Òm F Standard d ù Òm F ý xV4B1 è Z»» ÿÿ } EditEngineItemPool è dÁ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f e 0 Á ! @ «Á d d üd x X <( @ ËÁ X
+( G @ Â
+ StarBats !"- X @' ! @ K d d d X +'£ @ k X '¦ " @  Helvetica X '§ @ ½Â §d
+ X ; [ ® Û û )
+ P ëÂ
+ user_group Standard <(
+( @' £+' ¦
+ §
+ DrOb é SVDr & Ö
+ ¡ . Standard ö %ûÿÿNy ÿÿÿÿ × xV4B1  Z»» ÿÿ Y EditEngineItemPool è ÖÄ ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 Æ ! @ Å d d üd x X <( @ =Å X
+( G @ Å
+ StarBats !"- X @' ! @ ½Å d d d X '¦ " @ ëÅ helvetica X '§ @ Æ §d
+ X ; [ ® Û
+ P 9Æ site_stats.php Standard <(
+( @' § ¦ ¡ ù f =- DrCn $ ) DrCn $ ; xi (# ÿÿ DrOb R SVDr & s Ñ! } ( Standard ü s Ñ! } ( Ý xV4B1 È Z»» ÿÿ Y EditEngineItemPool è ¿È ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f A 0 üÉ ! @ É d d üd x X <( @ &É X
+( G @ yÉ
+ StarBats !"- X @' ! @ ¦É d d d X '¦ " @ ÔÉ Helvetica X '§ @ øÉ §d
+ X ; [ ® Û
+ P "Ê stats_project_metric Standard <(
+( @' ¦ § DrXX gg F Home~LT~Gliederung ÿ DrPg JoeM R t Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & Ò % 57 K3 DrOb ô SVDr & ± 27 eE Äc # Home~LT~Notizenþ¯ ± 27 eE Äc x xV4B1 c Z»» ÿÿ ÿ EditEngineItemPool è 1Í ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ ¶ ¡¢£¤¥¦§¨©ª«¬®¯°±²ÂÃÄÅ 6 f ç 0 Î ! @ xÍ d d üd x X <( @ Í X
+( G @ ëÍ
+ StarBats X !"- X @' ! @ Î d d ¨ýd X X ; [ ®
+ P :Î Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrXX F DrVw P SVDr
+ SVDr : SVDr è è ô ô è è SVDrA Layout : SVDr è è ô ô SVDr Ü # SVDr SVDr# SVDr0 SVDr1 SVDr3 SVDr4 SVDr@ SVDr SVDrD SVDrP SVDrQ Â ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrHL DrHL DrHL |& ýùÿÿ« iG
+ R o o t E n t r y ÿÿÿÿÿÿÿÿ .½
ÑÐ )ä°± À C o m p O b j ÿÿÿÿ = O l e
+ ÿÿÿÿÿÿÿÿÿÿÿÿ p e r s i s t e l e m e n t s " ÿÿÿÿ S f x D o c u m e n t I n f o ÿÿÿÿÿÿÿÿ u S f x W i n d o w s ÿÿÿÿ ÿÿÿÿ S f x S t y l e S h e e t s ÿÿÿÿÿÿÿÿÿÿÿÿ ÞT S u m m a r y I n f o r m a t i o n ( ÿÿÿÿÿÿÿÿ ( S t a r D r a w D o c u m e n t 3 $ ÿÿÿÿÿÿÿÿÿÿÿÿ 1 dÑ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/templating.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/templating.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/templating.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,170 @@
+<HTML>
+<HEAD>
+<TITLE>Templating Standards</TITLE>
+</HEAD>
+<BODY BGCOLOR="WHITE">
+
+<H3>Coding Example:</H3>
+<P>
+The following code examples demonstrate how all coding on SourceForge
+is going to be done in the future. The first example shows the "switchbox"
+page (taken from www/tracker/index.php) - where the various objects
+are included, instantiated and checked for errors every step of the way.
+<P>
+Once the objects are instantiated, the template file can be included. In this
+example, the template file is detail.php (example2).
+<P>
+<?php
+#highlight_string($string);
+
+$example ='<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id: templating.php,v 1.2 2001/03/06 16:04:31 tperdue Exp $
+
+
+//
+// Include core objects
+//
+require(\'pre.php\');
+require_once(\'common/tracker/Artifact.class\');
+require_once(\'common/tracker/ArtifactFile.class\');
+
+//
+// Verify proper params passed in
+//
+if ($group_id && $atid) {
+
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+ }
+
+ //
+ // Create the ArtifactType object
+ //
+ $ath = new ArtifactTypeHtml($group,$atid);
+ if (!$ath || !is_object($ath)) {
+ exit_error(\'Error\',\'ArtifactType could not be created\');
+ }
+ if ($ath->isError()) {
+ exit_error(\'Error\',$ath->getErrorMessage());
+ }
+
+ //
+ // Fusebox-like architecture
+ //
+ switch ($func) {
+
+ case \'detail\' : {
+ //
+ // users can modify their own tickets if they submitted them
+ // even if they are not artifact admins
+ //
+ $ah=new ArtifactHtml($ath,$aid);
+ if (!$ah || !is_object($ah)) {
+ exit_error(\'ERROR\',\'Artifact Could Not Be Created\');
+ } else if ($ah->isError()) {
+ exit_error(\'ERROR\',$ah->getErrorMessage());
+ } else {
+ //
+ // Include the template file
+ //
+ include \'../tracker/detail.php\';
+ }
+ break;
+ }
+ default : {
+ //foo
+ }
+
+ }
+
+} else {
+ exit_missing_params();
+}
+
+?>';
+
+$example2='<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id: templating.php,v 1.2 2001/03/06 16:04:31 tperdue Exp $
+
+echo $ath->header(array (\'title\'=>\'Detail: \'.$ah->getID(). \' \'.$ah->getSummary()));
+
+?>
+ <H2>[ #<?php echo $ah->getID(); ?> ] <?php echo $ah->getSummary(); ?></H2>
+
+ <TABLE CELLPADDING="0" WIDTH="100%">
+ <FORM ACTION="<?php echo $PHP_SELF; ?>?group_id=<?php echo $group_id; ?>&atid=<?php echo $ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="monitor">
+ <INPUT TYPE="HIDDEN" NAME="artifact_id" VALUE="<?php echo $ah->getID(); ?>">
+ <TR>
+ <TD COLSPAN=2">
+ <?php
+ if (!user_isloggedin()) {
+ ?>
+ <B>Email:</B>
+ <INPUT TYPE="TEXT" NAME="user_email" SIZE="20" MAXLENGTH="40">
+ <?php
+ }
+ ?>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Monitor">
+ </FORM>
+ </TD>
+ </TR>
+ <TR>
+ <TD><B>Date:</B><BR><?php echo date( $sys_datefmt, $ah->getOpenDate() ); ?></TD>
+ <TD><B>Priority:</B><BR><?php echo $ah->getPriority(); ?></TD>
+ </TR>
+
+ <TR>
+ <TD><B>Submitted By:</B><BR><?php echo $ah->getSubmittedRealName(); ?> (<?php echo $ah->getSubmittedUnixName(); ?>)</TD>
+ <TD><B>Assigned To:</B><BR><?php echo $ah->getAssignedRealName(); ?> (<?php echo $ah->getAssignedUnixName(); ?>)</TD>
+ </TR>
+
+ <TR>
+ <TD><B>Category:</B><BR><?php echo $ah->getCategoryName(); ?></TD>
+ <TD><B>Status:</B><BR><?php echo $ah->getStatusName(); ?></TD>
+ </TR>
+
+ <TR><TD COLSPAN="2">
+ <P>
+ <H3>DO NOT enter passwords or confidential information in your message!</H3>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="SUBMIT">
+ </FORM>
+ </TD></TR>
+
+ </TABLE>
+ </FORM>
+<?php
+
+$ath->footer(array());
+
+?>';
+
+echo '<H4>Switchbox page:</H4><P>';
+
+echo highlight_string($example);
+
+
+echo '<H4>Template page (detail.php):</H4><P>';
+
+echo highlight_string($example2);
+
+?>
+
+
+</BODY>
+</HTML>
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first0.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first0.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first0.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,4 @@
+GIF89a ð ÿ ÿÿ!ù , $$$(((LLLBYYPPP]]]eeebuuvvvzzzo¥¥v©©xªª
££¨¨¹¹¿¿¦¦¦µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÃÙÙÊääÒèèÿÿÿüû ÿÿÿ ÿ AHÐ0XÐ@ÂJ8°C 2jÜH B=\ @4h¨ð@A :F)0 PØÀ³§O
+ @f8ðÉ©1N<À@
¦X{V8DªZÈJv®f
+ `ÀÕ²d+@P¥XdÕÛÓ A°=°÷dÓ{r
ÂÒ$îxò
+P ïIËC3à M)ÍSõÖ= @/eìEÃæù Þ¶N,Ú5oË* ` \COãÇ@ß°{ p~2õÕ ¼W¯¿Î<øÏðÑ/£ÿn§rj3¥ @/kúö÷vx:5xÛ®U qk!ØÞ Ñcé'Y{i& y¶ {>qE
×a{ùä`±å\qÍUÐMÅ"S0ZqU3je#RIdS[#ÂõTTFÝNe%^ÑÔØH%ÕÒJ-S8JiF
I I9Aü¶ s\ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first1.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first1.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/first1.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5 @@
+GIF89a ð ÿ ÿÿ!ù " , $$$(((666GGGLLLBYYPPP^^^Oeeeeebuuexxyyyo¥¥v©©xªª¤¤¨¨°°··¿¿ µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÍææÿÿÿüû ÿÿÿ ÿ EH
+ <pPÁÂ J8
2jÜBD- @ <xÈ ¡A x9°
+$|Øɳ'0t Ùc=&P @¡@A©U8
ZqÁT
+WÃ~Ð À) (PÕ*«o?HhJ¡¢ H ïÎ|T«à*JèY¶.»:gôËó0 Êr$0à^+Nz ÀA
+$k¤lyrÒ ,z£ßÖ®{J `á¶;q»~9i |{¨½ñ2ñâ== w `yðæcþ áïÄù7 áì¤Âo7ß¾Û!jÕ¹?àÞûáÚÏñå¯NÚb àZmI YD PØgÛé7à ô^W½ÔO 6Zl]µ Rqe at WA^! XVi ÕYIEÆiõERã_MÍR^X eW DÒ'¥´RKÀ$Z4IHÁHØiôdErp8@e@ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.htm
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.htm (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.htm 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>Slide 1</title>
+</head>
+<body text=#000000 bgcolor=#FFFFFF link=#000080 vlink=#800000 alink=#000080>
+<center>
+<img src="first0.gif" border=0 alt="First page"> <img src="prev0.gif" border=0 alt="Back"> <a href="img1.htm"><img src="next1.gif" border=0 alt="Continue"></a> <a href="img2.htm"><img src="last1.gif" border=0 alt="Last page"></a> <a href="standards.htm"><img src="index.gif" border=0 alt="Overview"></a> </center><br>
+<center><img src="img0.jpg"></center>
+</body>
+</html>
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.jpg
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.jpg (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img0.jpg 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,326 @@
+ÿØÿà JFIF ÿÛ C
+
+ $.' ",#(7),01444'9=82<.342ÿÛ C
+
+2!!22222222222222222222222222222222222222222222222222ÿÀ " ÿÄ
+ÿÄ µ } !1AQa"q2¡#B±ÁRÑð$3br
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ÿÄ µ w !1AQaq"2B¡±Á #3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ? ÷ú(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¯¼ñ×µZæ'ì|c¦æ8VòÖ9ç
+ùóï®|Í@áEpþÔü]¥èz»|A×Lß*jp²0¹nfo.1´/($0rt.>"xVÓÂö%UÙ¤]Êaãìòî6
Ü>ãu¾ÔQ\ß|}á\Ao®êÑÚÏ:1ÈÛAÆHE$äqt5Åøóã5á-7WðÝ¡5íÛÄ«<R÷R¬EÃc!òЬQ\úøãÃMáxüJÚ¼éïÜL?0©`UUbß#a@ÉÇ ÔzO¼/®èÚ¦êÑÏg§#=ÛÝZ%
+X
Cc àÎ ÐIEpéñÀ2Kkñ®±å@,Wç%q ýìqÐZ?Ä_ëúãèº^·ÍúïÄj®íûÛ¯Üü¤äG4ÔQ\Å-oQðçÃ[VÒn>Ï}å˱_néO<9_À<·ñÃTñ£>É,"tÔa;^%˾Fr¸|(8Ý(¸¢¼à×5ê>(S6°ËÙÛìOôts)Ù¹TÀU>õÔÂÔð7öÇö_ü$Ö?hþþãäýÝßë±åôÿ k¯x ÂÃñ/4ÛÁ>½©Gf¹HFvrNA8dã#ÔWá]øã.³¦ÙêÑÞxm4Ĺ³D D;¶Î]ÁV< z¥ÉÁñ7Áw^ C·ñ¤×ò¸HÖ=ͱ JÂOLnëÇ^+FñN³wñçÄ>ó~i§¤Ð[ùH69X ;Ü~ûu=þéQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE á~!ñï|k¬h¿´+KXí>{¼Áæ3
Ý$lX!ó WºQ@7ð&»¯ëöóEw7¥¸)¥G¨ª6øq #¡lÉ»~9Ý\G|1«ÝxóOøo~òM§øSRÌáâÜ`Â[ 7¦X´6G
+¦ëðåðþ±ªë¶ý³ê^ZIxÖØÑ@
+ª¹Æp3µxÈÉ ó_èþø¹¨ßCâWÂú½Å¢»%/-®#ÛQ0ûÊ°ÈÆ1⵿ÙâÆîÿ FÓ:ÚÜ+ÚY%¸ftf '\~¢<?ãïâïøgÄþ{ÍÞîY.|FOúæÀVTòå~ÍMdiNÄþ8×[¾×[þ«»WÔÿ °ÖÊÚBnðÙi Àà 8p~¢>\×`ÙÃQ£Í¬;ÊÊ lÜ.[ÔíU=«¿Ö ×öðu½¼QÃZ;$qÆ¡U%È À qöJ(Ïþ6ÿ É!×íßÿ J#¯4KÕìôÝ/ºZI´Í=Òxe-E}¬ùyýáxÀf9]Û±ó_EÑ@ðÛMMgâæ£4v3µÃÛÙ´dÄ°6ëB6¨Sq\§öÿ
+_þÿ ö÷ü&_kßöìæó·oó|îÿ Sògïcmæ¾¢</ÆÜøGÆÿ 5ÏM%îcd¶w2ó¬wºc¸u,QÃ}ó娪|KñÇ2øpI§CBìR¼mnw¸lü
+À3062CÆM}E |c²xJ?ßêZ¬¦ì»øz$·*ÛKV?&r`§5êþÿ ¡ñgý£ÿ ÐmkØ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ¹+´¼¸µþçÍ·á&rà:1V2#ÚºÚùÒïþC:Ïý
oô¦JƽWJ7G§`#¬éÉÚÊÿ ÿ 3ÖáiøGþ¯?ðWuÿ Æê[o»¼·µþç͸!>r»°U0IÞ¼v¤´ÿ Îÿ a[/ý)¹¡¤·=¬OR£Fuߺûô<sÃ3ÌK¼/²UV£m
+ô;YNbz¼¿[±Ö×Ä%º±UÊöòÌÛ4¨Ü¥¥*¿,¿2Ê0`pãZË_·¾Õ¡²}pÛéÓieg÷Ì!³x1$ÏûƸ\¸8eÁÞ|êÓÃlç8º g` ³0U÷,@¹ WêöÚä}í
¥Æ¥o¬*yÌ7RýÚ+ü¦7´62È?"²Õ;Ûmvym"ÔW\¹ÔPÒÜâllÒ´ª
¡V Xì&AÏ Lxn⸷9 Ç$l]HÈ #ÑðÝ[Åqo,sA*HØ2ºAG9¯/ð~ g³·ÖF³7aövÏÆÔ1¿îBA3~è ²£á*?vzýµÎòê¶öÚEØîm'À[(}Ï#L\ïÂ2à.ÓäDĺ
+¶¨4¹õ½6-@º ´{¤YK66ç'#äV¥aÝA3xëI¸X¤0&z SµY¥µ* è
+ÄûO¥qz]·ÃW)w¨ê¢þ[½8LÑÚ¼mo1¸OµÌûÔ)ä¢}£å Ô(¯+L×,´ëÇ´Ä
+<vúÅÌ;îîe&x.Ù36`°|=R
+(¢
+(¢
+(¢
+(¢
+yyeHdÑ,Qäº72zr@õ"¤¬½RMÒØÙ¬rj-ì£3ð¥9(¼»ãçµ q~øªxâF¡áûû2ÆÖÒiÎ;æã¸Ü͹Ü]Øe?1¯HªzV¥ÛØ@Ò:B2JAy[«;çf%÷$õr
+(¢
+(¢
+(¢
+(¢
+¯kg}çýî"Vo&@þ\÷±ÑFAäUò{/×øÞ#>%¾[
+cPåÙDQ¬®ÌÑ$Û+Æw<`á[{Ç·È õ(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+ómCGøUý©x׺½7q#ÜFuù"+)b_(&Nâr00kÒkÀdÿ ¯ÿ a[ïý)¶¡AW+f´y¹½×c¬þÇøCÿ AÝ?ÿ
+YøõYÓô
_Úme«ØMx½¼c_RÒ0bî&¸ª#ÿ ÿ a[ý)ºgFr¾ÞFòuy]æÏzxfy)cw
öJªÀm¡°Þk)ÁìAïDÃuoż±Í¨9#`ÊêFApAæ¼îï÷,×Y";MsPÂüù$¬¶«iîÝü+ò\AÇÍqîEcøÏƶ7ú=R=Há³Ñ£H¦
+¯Ï+ùeV4 dùÇxà8ÏXû}ööwÚàûwçýÌg»öõÛ3Ó5b¼m ÖSâ×<^'"éæ]¬ùqüo*ÿ ½r#3á2ÎdBÚsQîõÏâ·VæÜM©Ü¤¿»ÈÁÍ$nv0Û@¨O<6¶òÜ\K0D
äF
+¨ dO Îj®èúßýªØßù8ó>ÉpìÎq¤ã8=}
+WðÇÛc½óüÈ®î¡ÏæEÜ·îÂ|Ç%ºIÉäïu¼#6Íwgk·ÏxÑÛÏ$Ý®.YHY&!ÂsÝD¢¼ÎßGׯõ[_í{ï2N(§TíSÊ`gÜ6 kò)ùvç?¶Únÿ HÒ¬o&û^óÉ<ß<
+ßscýÚáS*çÂ( ( ( ( ( ¹ý'þ'äú÷Þ³/²i®:ImyfSÆUÙQFA:²s'gKx4k9dóTs&*ðBfÊ_[ x5±ÚÛÅoopÁ8Ô*¢ (¢ (¢ (¢ (¢ (¢ *«¦Ã«éw´&&ꮵÕe=µ\¢2ô
+JmKKSx±Ç¨[¹·½0B¬ÉÃä#péJ:õ©\þ«ÿ Ùk#{¿/M½öÜçìïÜñ#´x´nc®
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+òCÃþMVüÍñìsÉw4³[hY*G×
+a'r+ÕëÌ´õZý
uý+·ÃÂR¢ìgV³¤¹ýà/ú)¿ùQ°ÿ ãUcOðÿ _U°0üAûdñÝÃ,6ßÚGÍ$VEÂÆåàÛ¬ícýVÿ a]?ÿ J⮩Ѩ¢Ûþ¾f1ÆÊMFÛùEpðÃ¥ßxæÞÎæÒ]x\5ÅÎ[]>¡c;T=
+gØk®ã¨ô-'Æ^è¦ItúQ[M!KÑ@¨(H(Çýä)çG¦Q^Woã]^ößL¼TÎîêãKQ¦Çjf¶[4³è7Ë,^ab.Ìy5t
£Ïñ;H¼J±é´û¹Úg·BæHä´¹lgr@=Fx Âòý/ÄÞ)»ðÕÍÌ×ö1ß=Þ
+¦²K5Â$ÐH¾\avÊ,Ò¦Nçå
+G&¹â?N¼¸:ýÝËÛÛë&Üû
+À8ÎØ×äul¾0ÙQµ@=R( ( ( +?[¼¸ÓôyïmöË Â)XpÄ`}¥PØÜ@Í hQ\?ü&÷â.7µèÚ·ä¬Ð*<Æd\®%d)Ê7l(âxÞóÄ~#ÔÚÁ
+}¦KgK7BsÆõºf*@#* 丢²áñ.sª.
+oMPÈméPËÃ`9ÈÁÈÇ5åw>;Õµï5¼²XË#h®]Àtë@D_¼fÉ!TbSÊ9. ôÄÇí^$~µ6}ÚÍ3äÿ ß[^@açm?pWA\=¿5ùÞÌ,eíÚÛÛêéSÚ¢·4®¦ÚW6*7U>oÆÀõhÔÝTÒYÕÈYmQ£Y ä£(A$csg ägh ¹Eqÿ ÛÚßØõ]*$·í˲ÄK#5Äá#Ü¥74CÔXMqq§[MyköK©"GßÌyN@,
+×b( ( ( ( (
+÷ö6úsaykuÃ2n#r0!G# _\IÚf£'©éû"¸hQr
+³ªa_1ë"Û2v+׿âS¨Ùø
>Xbÿ EÔ1À6îxôÿ TømÌp´ç© ( ( ( ( ( ( ( ( ( ( ( ( ( ¹àYî^ßÄZÍ´sÜKpa[FÚFt$ãs¤×_E8ÉÇTì'-9øA$ÿ ¡¯\ÿ ¾-?øÅÀ(ÓÛ=ǵà¸àC ¶
+í¬ØAÆ宾§VoFÙ*© ¢²õ/è:5ÂÛêÞc; uêé"b¹# 1gØÖ|ÿ |-!ñ6.:GotHÇ
+K1ö ÍKÊûQöågHvÜÉäåNåcï-C$¤¨Æ
q²|Pð¸RêHÙé
+\öP]Fze¤jü-{úuÏüÿ ãõ¢¥Qí÷ö;ú+Ì?áikô-Xÿ àÙÿ øÅð´µú¬ðlÿ üb¯êÕ¿¯g.ǧÑ^Y?ÄízhZ;}M´ýÙ¤¼{
_¬b8÷g§ßÎyÆ
+?øX0ÿ Úþæÿ ãôÖ³û!ìåØõú+È?á`xÃþ{hø/ÿ Ódñïå£7ZDA_2 ®{®ér;eHÏPzSúnßýûÃExü$¾+ÿ ¡ªûÿ ?øÍðø¯þ«ïü´ÿ ã5Q¬?c#ÛꩦëX5ÃH wC"¡¼UpÅ ÖÕw¯ÿ Åô5_à5§ÿ ¨.µMrÿ gÛ|EªË³;<©Å®3×>@MÝÞÎ;c'"ÀÕòc#Ô¯<¦Þ¾¢^{´Kë{»v7P-ÊÄ%(6ðKC¿¿Í#Ü^]n]bÓWÔ´ûÉ^Fw·òXéÄ°Æ-£>¹ÝÎùßô×?ðosÿ Ç(ó/¿è5®àÞçÿ UgÕýv¿¾·Ó4ëûÉ<»[Xii;QA,p98 ô®/@øym
aµÔ^î+»2{+!dIÚHYãc ØX®Z¼æhî.P$ú®³*W
+úË ÊÁó'PÀ{
+Iæ_Ðk\ÿ Á½Ïÿ £û>¯uý|ØÈöí[IMV(?Ògµ¸¶Î·¹nøk! :²£ºüÊ~öFI¦Ø6nÑÉ}w{+¹wé³ 0*(
P:I>æ_Ðk\ÿ Á½Ïÿ £Ì¾ÿ Ö¹ÿ {þ9Gö}^ëúù±íßÙ}ì¾Oµý¯>L_{Îó±~÷ñcwñnßóV
|óu©µÏµøU·ß¾n·p±×¢«(¯öh´úÌìþÐî¼¼õÛæÛãÀÏABÀM»]±}Ï¡¨¯Î¢ 3¦iáØä&HÉÆ;d~bý£ÿ Ð&Çÿ Óü*¿³åüÃö¹ôuó\Úgä9ìt¸S¶5x£Rç #£ó©¿°túØÿ à:
Ùòþa{Üú:ùÇûGÿ Mþ§øQý£ÿ Ð&Çÿ Óü(þÏóØ>çÑÔWÏqÎðÙ,kZ6idòuYã
#¡\*¨ ÀÚ¦ó/¿è5®àÞçÿ TýB§uý|
ìd{õà>e÷ýµÏüÜÿ ñÊ<Ëïú
+kø7¹ÿ ãgÕ{ýQÏ7VòÛÜEÐJ
$E®¤`Æ+Á|Ëïú
+kø7¹ÿ ãyßô×?ðosÿ Ç(þÏ«Ý_ ö2=@h./ôK¹d{1fÖBÆ"IÉÊ,±,ÞNó÷ÅnWϦ;¸KÕu:#"Hu[ʬA` U$wÚ=*O2ûþZçþ
+îøåÙõ{¯ëäÆG¿Q^»âKHV_jQ¿udÎÃ<¼±³}Xã À Tðø¯þ«ïü´ÿ ã5?Qª/c#Ûè¯ÿ Åô5_à5§ÿ © ñg-¦YGd¹+ÿ ,®í 17oFÞã9¨È+ê5»²ítWÂÀñüöÐÿ ð_7ÿ £þ?ç¶ÿ ù¿øýOÔë/â
ì§Øõú+È£øâÔZOìIH-ÚKqÜó[nzgkc®J½ÿ KXÿ ¡jÇÿ Ïÿ Æ)<-eöEìåØôú+Ì?áikô-Xÿ àÙÿ øÅXµø«*ïþÑðÜã8ÙývýwyV;c³Îqxj«ì°äcÑ论SÌ«u¤k6½<Ç"¯¦V)ÎO)ëÎH»Äß¼©K buc<®¼îWêH¨tæ·LVºuÏÿ Âwàÿ úô?üÃÿ ÅVÅý§gå
Üv²gdÐH$FÁ áøT±EPEPEPEPEPEP^Uã_x£TÖ.7ÙÞjöÝÁosV«ÁUx¤C8lHoá ?U¢ªpwCNÎçbj/ú3x_R³-ûÏ.ÖÄΧ<d´Ô:#4£Ö´©dXãÔìÜ
UYÔO@kèÊx!º·Þâ(æT)$r(eu#x 1]ÇÍ+4Uf¢½rOxBHÙ4Ë7Ãgn¾êê)ô ÕøVÿ KïüÝÿ ñÚÙf+¬Jöë±æ4W§Â°ð§üú_àÖïÿ Õk
z3È
+£«ØGbáfÿ {3¬è08éK0TÇí×cΨ®öO
qG5§5 ½"ã%cHØã¨Ã@ÎFA£ÿ
+·Xÿ ¡Çÿ /ÿ ÇêÖ>î?m¢ºÿ øUºÇý¶?ø)þ?Gü+
+b?ûzÆão>OØ3ý3Í}é»kc®ÓÒר¶ÈQ]-Ï|NÒki¤DäKªÈç?Ql¿Ê¡ÿ
ãùã¡ÿ àÂoþ1T±{þcö°î`Q[ÿ ð¯üaÿ <t?üMÿ Æ(ÿ
ãùã¡ÿ àÂoþ1G×(ÿ 7àÃÚùEoÿ ¿ñüñÐÿ ða7ÿ ¬t/ËqwZ^-´æqewBì Ü¥hÉÚÄ¡ùpXg Ö.ûCö°îV¢¯ÿ Â5â¿úo¿ð&Óÿ Qÿ ×ÿ èU¾ÿ ÀOþ=Oë4=¤{(«ÿ ðx¯þ
[ïü ´ÿ ãÔÂ5â¿úo¿ð&Óÿ Qõ?ÌÒ=ÎrY
³=ÄÑNbÞ$Fi h8ûë×®xèk.í(fº[8'·o*ÅnÊ̱J9XÇ.xS¶»øF¼Wÿ B÷þÚñê?áñ_ý
+·ßøiÿ Ç«7VûbæsÌ]ê6»RKEqºVtcqýày §øx¨ü2uiM©Ë?ñ,o"©ÈÙÉm¹ÛG}Ü]ü#^+ÿ ¡Vûÿ m?øõðx¯þ
[ïü ´ÿ ãÔJ<×æ4o{¦°§óe·"ó#¹ ¶#;nëÈsÏËÅ;Xõc¦H³\Ýý¡å¶V&SùÍÚX¶á¸<Þ®ßþ¯ÿ Ы}ÿ 6üzøF¼Wÿ B÷þÚñêZ-ß9£Üâ5}N)#³YÅ2^|Í$
[jå3á÷àÉÏÍN¿ñ¢ï&¹0Ggoöp¨à³É/<)=F2BÚÿ Â5â¿úo¿ð&Óÿ Qÿ ×ÿ èU¾ÿ ÀOþ=G´£¯¼ÐîsVBäkw[å¡!²%RFÜrU²3À>XäM¡ÿ È
+¿ê~o#þ¸î>_þ9·¯>¼æ¶ÿ áñ/ÙþÏÿ
ß³gçÚmÛcv11RÂ5â¿úo¿ð&Óÿ UF½$ïÌ58÷(QWÿ áñ_ý
+·ßøiÿ Ǩÿ kÅô*ßàM§ÿ «úÍæ´r
þ¯ÿ Ы}ÿ 6üzøF¼Wÿ B÷þÚñê>³GùÚG¹BÛÀ¾/¹
em°oùew|D«ÛæÆëî0Ç:Oà?Co,©g£Nè
(õ9îÐÓ©?\£üß½¬;V½<O©éÖ×ök¡ÉkuMýºa¹§ß# µcþÿ ?çÿ ¿øÅ\£üßkæ¿ÿ
+ÿ ÆóÇCÿ Áßüb¯Gðû[5Hôû7 nº[ç¹
+{â"<ç§úÁç`§¢ºµÉQ]ü*Ýcþ[ü¿ÿ £þn±ÿ C-þ
+_ÿ Òúõ{h
ÚÛ|0ÔRB.uû)bqµ¶i® õdo<Àt,¬¹ê§¥Zÿ
Qcÿ C¹ÿ ßüb¥ãé.áí¢pW¥Að»Ãi
+×öÜÃïO&¡4lÞX`qÂää?áXxSþ}/¿ðkwÿ Çj?´!Ø^Ýv<Æ£xmai®%(ï<GnI¯X¶øsáki
+>Y×êö{uÃG#²7 p@#
+iXøOÃzeäwÒ.£ÎÉ ²7\GãRóÑüDëù#k{þÿ ìåQÙÿ Ùð=×¼°Ûsã88èjÜÖîf]NǺLßrö7Îà ÁyUã#2=AçÞè¬g´²!Õlæ|gâK-)ÓÄWk1%M´LâIaM£å@ cÛøA&GÜ1ÓQEq·ws ¢) QE QE QE QE QE QE QE QE QEcë>*дòõ=Nn
+[`KÎêN2±.]AäØÐÅÇÿ ÂÏð§üýßàªïÿ Qÿ ?Âó÷}ÿ «¿þ5UÉ.ó;
++ÿ
áOùû¾ÿ ÁUßÿ £þ
?çîûÿ WüjIv3°¢¸ÿ øYþÿ »ïü]ÿ ñª?ágøSþ~ï¿ðUwÿ ƨä`³6<I}qk§Gka'©jKGÚì i0x>Z,m8ݳnr´,lmôë8ímcòáL$K31Éf$XI$I¯ð.¥g¥|Fñõ-_Rµ°öìÙÙ.pât@ÆFýÙHøbPg a½Oþ
?çîûÿ WüjIv3°¢¸ÿ øYþÿ »ïü]ÿ ñª?ágøSþ~ï¿ðUwÿ ƨä`³;
++ÿ
áOùû¾ÿ ÁUßÿ £þ
?çîûÿ WüjIv3°¢¹½;ÇÞÔîÞY"ÝR8ï#{VàĪ¥Îp0¹ÆG¨®MhÄQE
+(¢
+(¢
+(®RëâW-e5¹ÈÎûdºAì^%eØò9Kr£IÚ*çWEq¿ð´ü#ÿ ?×ø+ºÿ ãtÂÓðüÿ ^à®ëÿ ÒçsO«ÖþG÷3²¢¸ßøZ~ÿ ëÏüÝñº?áiøGþ¯?ðWuÿ Æèçpú½oäs;*+ÿ
§áùþ¼ÿ Á]×ÿ £þçúóÿ w_ünx÷«ÖþG÷3KJÿ GotcŽߩY{nqöîxÖLÏÚ6¨ÂWA^ñ[_Ò¼]áæ]Ĥ7Vÿ ¼Ëû2ts±Ñÿ $2³$¼¶Â8 d°ïÿ áiøGþ¯?ðWuÿ Æèçpú½oäs;*+ÿ
§áùþ¼ÿ Á]×ÿ £þçúóÿ w_ünx÷«ÖþG÷3²¢¸ßøZ~ÿ ëÏüÝñº?áiøGþ¯?ðWuÿ Æèçpú½oäs;*+ÿ
§áùþ¼ÿ Á]×ÿ £þçúóÿ w_ünx÷«ÖþG÷3²¢¹+¾¸bþÕh7g÷v[ƼwDU_lÔ×SðÝ[Åqo,sA*HØ2ºAG9¦{Ê´(¢d
Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¿5û@Ù6ËÛÛ
µR¡d«;6· ÛrÍy,PGóá¤s$NZG=YòÌ{{×gñKþF/×¥ïþm\
zø%n¬é¢®QEw®}³÷cóÿ ÕKçyyÿ WòîÙùmÓfxûÕNìê¿Úó$Owöf»UùB©·ïÿ µåSúåc¤¢³ì¦ûOQQ?úÐñ¶lòã+coÞÝÀ>µN5¾³Ð.M¸îEÄ|çwaW#vãÄc#¸là¾×ðÍÊ+ï\:r9ÄJmñ" ÄewõO9èE7Ï¿½g at g%½ÃC
eÚ
BÃ`bÇ-¼Þ}²ì.c¨¢¹Z½´³ÅrPNÒDF>``}¾a( |áà/=U]jOm¦¬2¼¤J&RP62Ìñ>^H*Ý#¡dú¹EV¥
+46DWGYXdz+·øm®Nòxnfi-ØÜXägÉTeW?Ýde8ùÆB
«þÿ ÷Ã_õ÷7þÏ\¸È)Rmô3ªíôQEx QE QEã¿uÉumzëÃçþA>ZÏ/ÌÊ$ËuܯÇ͸v¡Iwÿ !gþ·¿úS%G^>"nUÏÒ2<(àáʵi7óÔ(¢ÄôÆA ²`H\ò@ÆN?ùÕoí=?Ïò>ÝmçnÙåùË»vqg9ÏjòÚiõkVi U`ÒDªy-Üçòªúm¼Ñ]Ûù)
+/;®3Ôp äÿ *ÑEZíÿ Zs¯QTäÒûÿ à>~¬fDòSËMÛpÂã®Ol`çéNGIr2°©Ï àÀ+ºÓnÂþ_*àÝ\<b2wH®Û9ëóf21ÿ <úƶ´©B¬ÖÍË"Ï;üðº©V#F
+JéG)Ôäm§ãÿ
+óû6ú
Ü;kËyUb®«5qÒꣽÌd0RIM ÀoºsÇÕyã¿û,²]¼Z\H
C¦\2ùy\ñÉ<äg4r'³.¥Û·¼ýN.äe` SAÁW=)T[JúØ×ÍÚ"wf+¶ #ç`3»fº¤öo4wÜ,óa]jåÉ»pÈý¹ÔÜyv½þVüï§{3ªWGfUe%÷NÁü?:¹{{ÈõKÁl÷q+Ì_pI$å#Ù¾`äí¸Û[Ap5{ÍpÑr$*¸ä«dgq>l±á8$¯sJx©JN.;;~×ßØÓ¢+3´*ί\xBìêvrHþmíªc<#lÈ_7hÈnUA;r
+j*¡7tsâpÔñ4Ý:÷ü<Ï£è®ÀòO<5ÿ `«_ýµÐW¸~XQE QE QE QE QE QE QE QE QE QE QE s>9ðüºþ¦æ¾±ÝÚÄi:ùdcpv ä`N@ ù*8I«+)VVXAAäA¯ +ÕüáÝrðÞ^éøºoõ[Í%»ËÀ{FÊ_ 7g±]xlS£tÕÑ¥:§Ñ^ÿ
+ÃÂóé}ÿ [¿þ;Gü+
+Ï¥÷þ
+nÿ øíuhGùM}ºìyéßð¬<)ÿ >ßø5»ÿ ã´Â°ð§üú_àÖïÿ Ñý¡ån»cEzwü+
+Ï¥÷þ
+nÿ øíyG>ê·4×ð=Öº4+ÉVFÜã&HÚG
+$emܡ8
+ìX*ÚþPöë±fMwá~»§üEÓ¢Ó»¨øi¢iÄwcyòð²FYåA¹Î9\y´W¦x/ÀzǶI|ÓC:ÞMJö)¡Îvù<Ó 7ÈÈ£ûB?ÊÝv8+Ó¿áXxSþ}/¿ðkwÿ Çhÿ
aáOùô¾ÿ Áßÿ £ûB?ÊÝv<ÆôïøVÿ KïüÝÿ ñÚ?áXxSþ}/¿ðkwÿ ÇhþÐò·]1®ßá¶
$2xq$hÑ5µãhXÆí/® Ó
-¸Ùáã\Ø\ȲmBæDofF«PApEuÕÏÆ{XòÅXÎuyQEÄdQE QE xÿ Ľ ´f_ca~A»ðÚUD2{+ªO;ÔB¾®Rëá¯.¥4d¶ÀÆˤµCîR&U'ÜðxÉ[Ï.dì}]¼-%F¤yØñº+×áVxGþ|o?ðiuÿ Ç(ÿ
Yáùñ¼ÿ Á¥×ÿ ¬~¥.ç£þ´Qÿ oïGQ^»ÿ
+³Â?óãyÿ K¯þ9Gü*Ïÿ Ïçþ
+.¿øåRpÿ Z(ÿ Ï·÷£È¨¯]ÿ
Yáùñ¼ÿ Á¥×ÿ ¬½KÁ~ÓnÌÙê: xìmu+¹'e$ÅD¿"|Ç*}J]Ãýh£ÿ >ßÞ6¢ºKàþ¥«øMÎ[EtcwjR\Jª¤åWT¨Üå¹òÈÖ¾ëzwÄØE¿ö½ÇÅÔã
Jù¹\ »©Êïe"©K¸çÛûÑL¢
Tºc23øÊ^«cðïÀºw -ݬÙ4ÅÌØ$0øUøUÿ Ïü]ñÊ>¥.áþ³Ñÿ oð<õßøUÿ Ïü]ñÊ?áVxGþ|o?ðiuÿ Ç(ú»úÑGþ}¿½EEzïü*Ïÿ Ïçþ
+.¿øåð«<#ÿ >7ø4ºÿ ã}J]Ãýh£ÿ >ßÞ"«'u¥À³/õäIÊü¾aʨ\7*@ úµ¿Ã/[βÿ e4ûsû»»¹®#n;Ç#²·¶AÁÁê+©mmâ··8`GjQ@À Vðj.òg3åV§F¿VIEWióEPEPEPEPEPEPEPEPEPEPEÇÞxX´¹ñ ^Å´\Kl-ßÏ1mÎË/·pó
+Sh;aEppüQÒHêê²J@3G´O,°$êªÒK±IGcç'-ýË?YêlNg}].!ghËÌÀ«4l§Ì°o:
++Ò|PÓ|>±ñ.¥i$RÍeÃÛÄ´ÀmXãì@E''rÅsúukN{K=Bá.¡¼Oì»Òn`1ec'ÚU-ÉaÀÍ z%cßkéävö§<ÛxeUÀU§bv§#3¨ÛN0쮼GâfãLÕ=l®¤·°¸ó§ÍiT£LT DAòÆìତѤÕ#±}ÏJHµ»¹·H·´ò¤aÏÌb¬à'iaÌ¡ÿ ßö¯ï¼I'Û·óý»6q³³ÎÆî7Ì»cÎÑÐW¿Ä¾¸Ó¿±ÖiD7"FYLoö«(°'d?»º-ò³`í2×Q øÏÄ?lû$s§ÙeòÍQÉü ÚÜsíxÜ
+ÏÔôM;XòößtÐçɸÚ)¡Î7ltÈ ¤dpr+B¸ûÏë>#Ôض¡Ëm
»ùòÆ-¢Ùeó6îcaJ`í ²çp Ðÿ Fÿ ¨ý ÿ ®p^/þ¼úeµWøØÖ¦ªØêöí=
Ìs¢9@¼4N %O(ã#*ÀÜ
+ãáø£¥&
+ÕÔ7dZf;hY`IÕU¤bÇÎ6NZ=ö&¿Ñ|Kt/tÛJk·_#VÓÔDûBxà,Ä
+º¾ÙWÉ%1ÝòÐiEyþ
âÏZøL×uÍ;ûFH¥/eåÅs¹À
+<¦}¸à¢ süwusáîÎHúãP}:ÿ t÷&cVp¶èÂQÁ`; zÍøs\Ôµ-JâÏPµ
+Ù÷Ëpʱ%,(áÌʱ$Tv/ÖãSµ2ØÃwqn4á äÊñ1YÌ7
À(!K¾ :+ÏßâB_\ißØëÃ4¢#,¦7ûUX²ÝÝùY°vk¨Ð|Igâ¶}9Óì²ùOæ¨äþín9öȼnEÈÈÅQ@â}BóLÑDöºîÖÙx̾lñÄX¨e'ÉÆGJçî¼rþ×ÿ ±uÑöíé¤Óì[àóÝ@pòPqEqöÿ 4K«»0³í¶Úî¤i|ÕÅ
s±²$y}ªIܬÈøîoi:bé7q[^Y\Ï4ª+C$Oí#~H%CßRWq %Íê^+MñÛÎcK
^ÞɼÎDBv¨Ú79ß~¸¹~$øH5{Í/MQ±¶úhî¾Ç$6ÇȨßi20NÈпï®Ö X¬9üKÙèÖòj×¹A,ÇåR§nV½¥_ÊÚe¾¡ª}²ïQ»6È
$Æ"VÝo¦VXvFbF(n'
î4ÍZÒ!pëoeseåÃ䪪,
+!H,« bÊ sû+XÕùÖoþÇnåÇJÓ?ïÜadn at a°Emâµ4Ý'MÑÚßKÓí,`g.ÑÚ±)l 3ì+Ðþ#ùÚ=½æ±m.%¶1hÒÞvûíó6é,iºFåF*ƽ
+(®nòÿ ^ÅWzv.YÙ[Ý4wP;4í#Ì»àF1ù¶>7ÚIy&£¦Oý©É6â
È YÔÞ(Àç*àd+®ãàñ[ÜEi¯ZÇ¥ÜLâ8$7%½ËÂG!
+Kò>WT$îÚ)5ÍÚüWÑåmAä·¾ÛEir] HÒ(î"F^C&ÝÅØ.IP7áGlhú¶hðÙÏ©Ûê1L^ÞlCç,7U)/8æ:+Юõûm[Äöv·wz~z¶ñÚßÝ+HSÉBÑLYÝÜc¶RFDZ©¿Äø¯,uFÓ%\G-k-³É!µdÌhÙ-"¨ÆRXWÅ zEÉØxUs£¥Üâ÷S{O=$¶3D-¥zÃ!/Ì99
+XpËÿ ^Ô5mR=.]6(4Ë
·h. vk0Ç6DªàD/Ü|m-ógh é(®?QñÜú¤úDPùZ7v±§)7Ã%Ì13ÉòÌ¥|À¤îO
+xÖdiwHºî
+ì40^0ç
+X¾Îqæ`Ç~ÿ :Ê(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+çåðêw÷ê7Íg¨J³]iÇÊò&aGù<ͤF]û[Tz
+(²ð-¥Åge{}KÐ]¤
ã¶K`@d(sw)åØbäz%u6©ý¡wojçO×_º.üé¾v"4Pw1_1ê'ñÏq-
zôNR\HÉo)ùI°W,|²¡rÀë=ÄWÚì±êwÑ8x³%¼§åhá,Á\r|ÂYòÌÂn
+]cÃÚ_ ¾%Ô7¼H<j¿fhþ}¹ãÍT7Ä t<7ð×ÃþñÞÅu-¡¶7(B\;I°(
+Ĩáv ØQ@ãÓaY¹Õ¤óî-á·u$mHÊGÎelóØtïsàÛk¤º´RÔ¿².ÞWLI"s#çTac¿wå® äÿ á²}IuOR¹¹Þ;Èbd,!c ZÀS¦âXìiZ:UÅÅÀº»ºdH¼Ë©²B
q ,»Í¹Îã¹jQ@sòøN õ;ûuæ³Ô%Y®´ãåy0#Ã|fÒ#L®ý*H=ËÙxÃNÒâ³²½¾H%h.FÒBñÛ%° 29;òìF1¡gáÛ{LÞ[Ýß*6Ö{v¸,J# ]]ÛËU\38
+·Í[P?,ÃÚ^
u,÷ÖvÐ"º²Ü"£*$ª+ªåHãïFFN|¿
+ôDÖ"Õ4CºaA¦,QÇYWq£#1Yne$ 0G9ì( N7Ô´=fçSÖ,¤¼ðÛ½î:ªÆÒ2¶ù¥RLÅ~F8Ü|°(ÃV»a?Ù5Û»¯ß¼Ï%¥Äg»±¢ù¸2$ 1WîüµÖV=÷æ¼R°o°jÍn¡ (e mÃr
Ì 2ÿ á²}IuOR¹¹Þ;Èbd,!c ZÀS¦âXìiZ:UÅÅÀº»ºdH¼Ë©²B
q ,»Í¹Îã¹SþÞ¼Ò~OÙyP?´ØïH>üc¸4h1IÈ'êÞ+yc P<rFÁÔà9Í IEP~µ¤¦·¦).g¶ýìS$ÐmÞ"¹Y~ò Ö<°¸¿·Ô.ïo®µ¶º£(Yá P¡ PBÎ71jÔÔ¼G¤i7kw}¼t@Ëq"ä¤(°àä
8
+O at jÿ ê¼ÆhV§'U¹»`x$o*&%Nf 0TSÕtmKµ¸{ýVîÚÚâã̵Íå¥óó
+̲´«¼+ AUP¤©§©©j:eîoÅSÄu
+e?ãäLQ6ä,çqñ°:|µÒiºp×d¹Ô
+I}tÞdì¤T1ûXnòÐ*NV¥ qiðÃAk»ûÉ.ïµuÁO´C¸ä4eP*ºQöîPBÇðÝÔt3$ÿ eÔ>Õæ¸a½~Ðîï´ã Îkb ÏÕ´Õbý&{[i|ë{6ïö²«)Ê;¯Ì§ïd`F<¾ yZyµVK©|³<îñ3DÅà%|½©å¹Ü*«¾'=EÉÛü?ÓmtÒâ¾ÔÒTX®Î\O(n6ã¦X àÚÊë(¢
+ÿðнÖdÔ£Õµ+3=¼v×Ú´j³F# X¡t?½q¹O#
+nQ@¼~Ñà¼Ö.mÌð6§öC²"Íjb]¸J©ÃnS´c ÜÃÎdê:Ü[¤µÒγG#+JØùC2)Ìa
+m
++r Ç>@ÚéP¾ûcO)ÕM»ùKø.åm¨Ø*åê?¼=tÿ ÙöèÁqÀ¸Ò`r¹Uò2n
+ÛH#(§µuP'{5ÍÖ?Ä~E
Á¸Q°Ä[ÌRF|øÈc
+ýì¿!,ÉÂ
+ ¯înmõmJÆ;ÇwojѪÎÁ .PÈ¢"åq´É;Ïÿ Â<ú?ï|2ÐY/ñéòû$sPq3G8À{Ø\_ÇsöÛèÖ+¿µE4{ÖâEBÅ^hÑÎI#nª¦Æá=1´±åôÐi"[[Í(dWX¼/ÝÈc*T1m»ê¹¦ëßÜ5¶·vê
ÚÖî0¬W#e%$+Ûw(lÔ ( ( ( ( ( ( ( +Ç<câ)<O{u§2mÒ-.$Û¸ÏÚ$Ê3È:§jôà1çhMhÒYrĨÅÉÙ¼ÿ ¼'ÍÔä¸þZÚYÏq»$hÊÞàäu£ÿ
áOùû¾ÿ ÁUßÿ ¯1¢½ìøÿ 1·°]ÏNÿ
áOùû¾ÿ ÁUßÿ £þ
?çîûÿ Wüj¼Æ?³ãüÃö¹éßð³ü)ÿ ?wßø*»ÿ ãTÂÏð§üýßàªïÿ WÑGö|=îwÚçÅ}ÓC½H[ëÝIbo³@t»CÂî,6y ã
+æ<1ãñ®èp¯o¯ xÿ w>2¥ØÅ+ª¾õ<«åó«+!²(£û>?ÌÁw=*µ·ÞÞk¸`GzEÒª( Tð³ü)ÿ ?wßø*»ÿ ãUæ4Qýæ`»ÿ ?Âó÷}ÿ «¿þ5Gü,ÿ
+ÏÝ÷þ
+®ÿ øÕygÇùØ.ç§ÂÏð§üýßàªïÿ WI¦êÚn³n×^¡i}¹FÖeC`¤àq^Nîÿ Lºû~pÐ_ ùAvMáeQï,9]Ä©SÍDòû+Áèé£=ò©êZ¶£[Æ©¨ZXÀÎdºbRØ' ±8ãØÕ?øI,ÿ á
+ÿ £Ëì?Ùÿ Ú^Ñæy~_g±Û8Ïzã-¥q©êb)µc<ê2pLq2±8_øËcæü,×Uÿ Á5çÿ £þëªÿ àóÿ VE¯ÿ @õÕðMyÿ ƨÿ
zê¿ø&¼ÿ ãUE kÿ ÂÁÐ=u_ü^ñª?á`躯þ ¯?øÕdQ@ÿ ð°t]Wÿ ×üjøX:®«ÿ kÏþ5YÇÛîÒ%Öæk¹dPÆÜ]^M2F%[q¬ç8iv$dd@ÿ @õÕðMyÿ Æ«¿ñ-~Ó¨èm®X_ó4v-×w',D<b6f8Ë墰bÕõkQôXå²KÈZS%Û[»Fê`Eæ¤ý ï?pñó|°ø[Ä7þ³ÔÆ{x×\ÈV)b&ój#¦@·/
þ.ø4}Kþo j²ênËì"O¹¸ðvmÏÞç*rÃçÃ>9Õõ½/eÕtyYXè×dêX°Äªåǵ¶a@1ó5}âÝFÇÏX,¡²òª¢x¢<Ì2¾f»` @,¼S«Üiio:ØMoÝÒmO¤(W=\|ßi¾,ðnÐX[jP#¹Bº-ái\»²îp2ÌI=É«ð°t]Wÿ ×üj¼îMoP¹Õ4øãÊ$º¾»·¿
&BÌ¡ÀK $|¡r$\¯øU{[F£ké®n@
Ò2¹äÜ}åù)">p =gþëªÿ àóÿ Qÿ @õÕðMyÿ Æ«" ×ÿ
zê¿ø&¼ÿ ãTÂÁÐ=u_ü^ñªÈ¢5ÿ á`躯þ ¯?øÕð°t]Wÿ ×üj²(
+øX:®«ÿ kÏþ5Wtßh:ÒZ[jåÚ]#[Îà±HÙpÌ8<ðqÍÔWñ]ÀÐ̤¡ ä1VRC)«`"=æü-Ü_Mw¥_7ycR£¸BÀ`Ìl´ðF7l^âN¹.¯]x|ÿ È2ÇËYáeâyDn»UãÀ8ù·Ô"*TTãÌάxºÊ7gouñ+²Ê\äg}2] ö/²ìNyþçúóÿ w_ün¼áúì»P¸^µ¨þã×áiøGþ¯?ðWuÿ Æèÿ
§áùþ¼ÿ Á]×ÿ ¯¼é5kT¶TtI%(§
+
+rF};¡r\Ï-ÂÉ%ìñH±]Hh38#¡QÎÀJµ¯cy
+7'ç[yýÿ OÂ?óýyÿ »¯þ7Gü-?ÿ Ïõçþ
+î¿øÝx#Üß&¥R1YæX '¹- ¿)fÇOÝã«T¾[
+ÚK<¯,¿.ìX»o%k!SÈèN·²Rõèº4¿[Õ©xûÀZ½ºÁ-Ìè$¶v' èÂ<£2Gb+Í&ø¯â+/¶×
+oSðͦè
+Éf±Kt÷¥`¨«¸6
+ð¿*vrp.¦l5öY\4[¼²å?pNI5%ýô+??Ñ´Íg@@\¦PÀÏÊ
+8â&ÕìgW&ÃÓ+ü;µúGÂÓðüÿ ^à®ëÿ Ñÿ OÂ?óýyÿ »¯þ7^úí¦£}I¤ypnFe+EÎî9$~V#ÐhÞ/Ú5+kWyV&YFBYJÊz1ã§ä*^*JÚÇ!¡%+MÝ;tïcÛáiøGþ¯?ðWuÿ Æèÿ
§áùþ¼ÿ Á]×ÿ ¯âÔ® ô¬ÈëmÉåÊÅ9f\z9è2jÌ:µ×ÚÄ)´K3 ]tiÞ1Ë6F6ç 6z ¼U<D×Dg+{ò×È÷¿øZ~ÿ ëÏüÝñº?áiøGþ¯?ðWuÿ ÆëÁ%½½¹Òá9íâyd¶B,©#µá®Fá¸`u«Úmì×RLP²'r
+6pA>SÁ=Õx̼TÒ½¬2<æ §-UÖÏümÿ
§áùþ¼ÿ Á]×ÿ ©mþ&øBâuûU ÝÞ]ÚMoñÞIU}²FNS^;EG×eØè|/JÚTqô\Ãuoż±Í¨9#`ÊêFApA椯
+ðwn¼=¯Ù@³LÚmíÊ[MjX²£HÛQãRpÌp[3¶ãÜ«¶ER<Èù~
+x*ÞÊzõOº
+(¢´8Â( ¾qÐä]Ó?ëÒ/ý WÑÕã+Фð÷gâF±Ô%æ ÜËgwy"$w°Î2§ ÕÛK>¦´]¥c"(¯`ê1ÿ Ó?·ÿ å¿Ø|ß|ùWåäãñó+ÜëgOJ÷ÅÓLS*C<¸XKîgQßäõÜOaEdé_©.&}ìÒO¦,ö¢qcr<¶Gز)ßt7ç¶sXº^Ý\ÙÝEËÃý¯$o ;bòÕY°Êaàñ×>ºª)Î6ì¹Ä¢jn?,FÖæÑù O²¨aÓ%Ýçï0^Ã×?lû
+¹ºóÂ5õÂÁ1b;Ê/îþlå·=$dÖÅ£Kú^×ûB-Udï.¢+ÄJ¼Bi~ûËË'®Oí*óX{0g$ËåW-Hè¯ÌX¸À$ôFÆÑÈèà«+PE:
I®¡ËæswKt'µ¼·»¾p®ù-~bKÆ *#È'±Ûü àÁ·ÆÊp¬³×ÌV`Hls @METag{+ToçMq
úÛ¢l± n s±s¹è ©IE]»+³«°ÿ -mÿ aµÿ Ó°éÿ á³ÿ 7þ2°ÿ gÿ gùåù~^snÇ|c=«Ó§[võQ/íÁvQ*ðJÎÆá×<e=ëç$îÛ8n(¤EPEPPµ¥³ÇqÛÄÉs=J%Ê
;ñ| { *j(*÷NÐ-tq
+ýnÛÂOklIÁA%ýõïE³¤Ípö³[ÆÆb#Udá40Ì1($ú}Ëõ{;±¸´<öWug(²f7À1^$'¡éùÞáJÎ{ÿ 4éþ^£ªG¨Ë${¼Ø¶:KåçoïàÊ3· ä¶Ð¶"ѵb
+¼7km~ëÇçH±º´lÅIÜ ¹ õ ½ð¾w¥ÚĺbÊ.¥´µÙå*K¨þá<)º9¬ß
+øRëNN¹ºDÝ0Èá®d&)VÙ`(#SåÁ>g'®:0xðΤ,4Ë_+J°ì·Ý*³yЬŹÆ9ÿ [+ ùÿ ¡´I½íK(ì§i?ÚáTbì ;ÇReëÀ$SƦãiö"%|Â:¨U`1Á
+ ¨
+ éÓéÖ³æÍس4ÅÕ\\ü¹ËBV QE QE QE QLhíái¤HâK»» ª dO@(ú/ü;û^èÛZó;¿ùë?ö½ÿ Ò+ؼ¥ÏÚõ«¸äâýR$·uÚc6Ë,!ÛÌf à¨eRROñG}3ŨÍk« ÛÏ!'
+g cTe$íô¹±qr§§CÜáêñ¥´¾Òkò¡ÊÔî%hìòbY]Ø¡Inÿ ð³n-ï¾ß<¶¦Y H¼Çsº"¥Îà»Ho¾8$t¯.)=Ϻ«)E'ýYþ¶-Ç5¬þTñËòH¬îä)ï÷yû¾ÕºÓchÔÏh¤<`º$¸úÇ?ZÊK»KWHËG<·ãdå1O-fÁ8L°$p;
+ÒßèÝ[^XBaÖé÷æ-ª(@0GÈ;½8çNXßsÖ¯ÊÚ¿oMW]®/]Ýéö*g¤Nª[*\÷
+yï·Ú ZXjom£ùrH§CJ
+»Þ ²ñ¦ic{%µÓ2[¬òÝÅp¨%b¸O/ÛsÎÃÛ½Y
%¹¼·½hü¥X¦MÄ3¦Óq ò34H§Í9ímÓÎÏ+>n4{ÈãÔ%ã97ͳ|!¾eÉþ¼SåM äe±YAÕÂqËzð_'ÐzÎÃóy:@ÊÂWD¢Þì2â9ïӹţ¤È»V6"ÇhGú©{9>þ´ß/GýZÅÖw榯߾ÿ í~WÙ¤Y1iï{op4¹xöb³Õ°¤ã¶éÝ-ÌñYÜÛ¤ÛÕ¥Q"Q´¨={üÿ γDoDÎQÊ\5ÀP&yå~p9û¤gfQ{. ·VöÑIJÑïË;Ê{«|84¬¯£4S#ç
®Ö¿kôíþ[ÇýqKØå6DG]¬Ü ö#wý®:ÓRM%[B3,È]ORL
I?\ã¥Q-Ìh¸h¦DI·äÜNÒ07ß à`uÉÅmWN¸YµR¤ßÚj¨cwØQ ÀÀ%R@\Ï 5·kNXGÓ_Õíù%êïÓ]²ÞUìkÏ(}¡Y ÄçC`{â¥G²·dâKVRª%vîñúÖsiw¢vòäcQ6ÇÁÌd*p>^]ÀÎ@íPµÖñ3¢H?}B²N6ÊÁÉ )-ÁÆ8¥Ê-Õ©ÛI-þëüµðnmÃuopÌ°Ï
BààN=G"¥¬hÓiAçªïHJçÍf9bÜí\3»ã¡Þ¨IÙ3«
+R¥JjU#gÛúþºu¯ùjõí'þkéÚðoéGÄ0³¶FÌ6¥íÛ¡ÿ Wå°hÓ8 3>Ó¢É+ÞkÑÁŨ]õ>3+Ʀ%B?ekêQEu<QE ^úÂÏS³ÎþÒ»Y1¾ã#`2§ü*Åyõþ¯uâYíïnm4ì-¬¾[Ý
ly¦UùO-W,jM?Â)æfµÕõHOÝ9£W×
+,nç'Xõã Gÿ
+¢Çþ-sÿ %¿øÅd7
|?#E°V9yg·Y$sÝØf=I$y4ðøoþ
ý+ÿ £ÿ
+ÓÛTþg÷Í.æÇü*úµÏüÿ 㨱ÿ ¡\ÿ Éoþ1Xÿ ðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþýµ_æxs˹±ÿ
+¢Çþ-sÿ %¿øÅðª,èb×?ò[ÿ V?ü"~ÿ ¡Jÿ À(ÿ ÂøDü7ÿ Bþÿ Qÿ
Ú¯ó?¼9åÜØÿ
Qcÿ C¹ÿ ßübøU?ô1kù-ÿ Æ+þ?
+ÿ п¥àáGü"~ÿ ¡Jÿ À(ÿ ÂmWùÞòîl¨±ÿ ¡\ÿ Éoþ1Gü*úµÏüÿ ãÿ ÿ è_Ò¿ð
+?ð£þ?
+ÿ п¥àáG¶«üÏïyw6?áTXÿ ÐÅ®ä·ÿ £þEýZçþKñÇÿ OÃô/é_øøQÿ ÿ è_Ò¿ð
+?ð£ÛUþg÷<»ðª,èb×?ò[ÿ WS¡økIðäs&jÑ2<<ÎØè¹-I>ÿ OÃô/é_øøQÿ ÿ è_Ò¿ð
+?ð©IËâmɽÏW¬[Ã>·2Ï{h~Òª\Á+Á6ÀIÙæFUd·8Ï8ȯ?ÿ OÃô/é_øøQÿ ÿ è_Ò¿ð
+?ð¨Óÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ £þ7ÿ ¡«\ÿ ¾-?øÅsðøoþ
ý+ÿ £ÿ
+?áðßýúWþGþÓÿ Âÿ ô5k÷ŧÿ «v Ónbº»º¿Ôî!pñ½ÜØE#ýÔa#$1BÀàç
Çÿ ÿ è_Ò¿ð
+?ð£þ?
+ÿ п¥àá@¯Uï¬,õ;9,ïí »µá1"6#*x8 ¼Ãþ?
+ÿ п¥àáGü"~ÿ ¡Jÿ À(ÿ Â6®¾èRÊÎÿ V°1Ep²½FÏAqÇLä?áPé¿ô0k·ÿ ¬ÏøDü7ÿ Bþÿ Qÿ
ðøoþ
ý+ÿ £ÿ
+eöQԱب«*²ûßùð¨tßú5ÏÎÛÿ Ñÿ
+Mÿ ¡\üí¿øÍfÂ'á¿úô¯üü(ÿ OÃô/é_øøRöTÿ }ÃþÐÅÿ ÏÙàOüÍ?øT:oýççmÿ Æhÿ
C¦ÿ ÐÁ®~vßüf³?áðßýúWþGþÂ'á¿úô¯üü(öTÿ }Áý¡ÿ ²ÿ Àùð¨tßú5ÏÎÛÿ Ñÿ
+Mÿ ¡\üí¿øÍfÂ'á¿úô¯üü(ÿ OÃô/é_øøQì©ÿ *ûûCÿ ?eÿ ?ó4ÿ áPé¿ô0k·ÿ £þÿ C¹ùÛñÌÿ OÃô/é_øøQÿ ÿ è_Ò¿ð
+?ð£ÙSþU÷ö/þ~Ëÿ æiÿ ¡Óè`×?;oþ3Gü*7þ
+só¶ÿ ã5ÿ ÿ è_Ò¿ð
+?ð£þ?
+ÿ п¥àáG²§ü«îí_üýþÿ ÌÓÿ
C¦ÿ ÐÁ®~vßüføT:oýççmÿ Æk3þ?
+ÿ п¥àáGü"~ÿ ¡Jÿ À(ÿ ÂeOùWÜÚ¿ùû/ü ÿ §ÿ
+Mÿ ¡\üí¿øÍKoðFukWX»gtMjÜq4qÏ:sXÿ ðøoþ
ý+ÿ £ÿ
+Uð¯ã`ðè¶J§),ë{2ºÊè "eå_p<~)«:²ÿ Àù¦é¶zF
+
´#ß$y$I'$I$µ^cÞxm£7Ow¢ïUÜ»I=¶æ Èfv;£Rw0~UK6ü(Jô
+ÐäÜ(¢ (¢ ÇñeõÆàÝrþÎO.ê×O¸Ú×XØ©ÁààÖ¹+KXll ´¶MAÅdª£ dòxÞßØÛêzuÍ
ä~eÔOɸÈÀzWi2\·¿mÚ¡6×nÜÊ3
nxWS ½EPEPEPEPEPYZÔ÷&iopöæöèÂóFª]E$.àW$Æ ðO|«U¯l-õDW
+ä+oGFÑ°FUÔSGpHèM b\ê÷º/Û!sý£
¸¼¹fJ!;øP¶GýÜ£Ø2NZ«OãIáhÑn%kA i^E_-ÙU°NShm À²¥õáÒ;Á)-þµÌ¤ÜIìÊ àÜ $t8©¥Ð4É¢X¤¶Ê,I#
+Þc[æFc*p28 Íj{
M´·¸{s{tay£U."Op+cx'¾ÄWÖañé0í'Ï@×nÂZÈFTãs¨Øår:°éïl-õDW
+ä+oGFÑ°FUÔSGpHèMPoéå3A)-û.>Ó/mÜ|ÍÛòB*ç9Ú6ýÜ ÄµñÒÍ¢é÷Öú}íÙ¾kR
äÇ.Ò Íó( á{3繪ëÚðö·{ah´7"Þá¦29e*pr¬T
+ÁüÅ3WâðÆVfÌI+¢°Ë´d.*B®AÅLú'Û7Ûd^FñJ¾cckýð£8MÇÛÇäó@5«Ùïîl&ÓR¨á2DvÙ#ó\°Ã&üóbÙêdñ5¢¾ ÎâWLY^§=xßÒ}OµóL1Ê$f2ßh²ûÅIl¡b3.0I<Ô×ú]®£åĪñçdNð¸ n_ͤéïw}i,ö±Ü^ .µcDE^6äQó²g#nö$UÈüMy%¥£.(º¸¼6)â\ùM pdEb. Ø
+د¿ôR4É$D]¬ÌË(ÉoÞq)ÜY²ûf-ÔSA£X[6Då¡Î²I+»
+ÜÌÄ;¯ÌNa
+ó]\ë7v©¨]ÙAggÁ6p¤!vC#ÀPIëÆ)Úø²æíãÒÊ+¯2Hàé¥0Å;µºÜgnlßÔÁÎX¦øvÖhíï-Ôÿ 7þk¢Ì¶2ÃF0T}À)#¾?iPØý+w ÈêcÕÑ5J¸mÊv(^ÈÎs
+_?´g/-Æ©&'ïw ñÀÒ3Få*:0xûµ6âµ_°?ìþÏívãΣ`mØ d]¸'#9
+~Z³4«k¸.¡·t.¸ö³*deÝ »Ç<§§xNßK°°·µãÝbIfBÀº¦.â#:©|g9$0 Ç\×-[ó
+íå²êRZ´rtÜPC? OõRò2¦®_x®îßI¸»Å"Ì1<;¤Âá£Ú0ɵ¾lü¤ É¡þʲû/Ù|Üý£í;wõo»9Ïßç;tâ©ÞxcL½í^9WíQÈfÛJ»¢Q\l°\Íî9 §£2j¯&v¶|sÉç¬oòX«®YBdv
fÈvÒ1ORÖÅ6W6vööïkpò¹ó2´Xe; onK?U-¤º.³\ËöTcp¬#ɵ\9Uyl¸òrjÇ,Ú-d¸¶¹"¡q+K¶@¡ÉbÙfÚª¶í¥Pò@W:üƵs4Ú¨Ó´É7l¶¾NÅ·VFÞ<ÂI$qÇÌ95×®tëÛÛí6%ºµÒæÔÈèº2!WqE9'vxÀ uÉ¡}¦/ou¿̲Æ6ªtâ³fðqÍ
+ÄE(ò½äÆVB9È_yõÙ¹ç
+z¯ÛHÌúk¶¦LO:L7¹tbc `Ç Bþ"Õí¼BÖiÒÊ°G)r¦0Ì·.dT1\B åAmªÜnÞ¹ÑtëÈn¡¹µIb»'²:
+HôýÚqÐãrs
+·4«Kµ»ÝÍʲ¿$Ï#³*ºÌÌK²¸ç<?
pFÓÄrjº
+åõ´Oaû÷îÙ3Åæð@ÎÕhÎzøìEQÄ:
¢ÛM*\]Ás*X|¼Nää).ÐO»zÖ·#Ý iÿ vóOqx±'ö©evÜÛ
+r~Xþo4ËIl¡´xs;|
~éA¹ÍcR¼]KÃR§ÉZ5ßÞO{üÑ'çU
+ºT«0´7rG4^ÅRÁ³Æz¨ÇîϪ×~2X¦²:¨Ø,pF^2R3ÁÈäÛ«m4=65*ª Û\+û²rG^ä¾õÒ&£{L£yycÿ ^ý"³p¯m%ý}ÇU<FT¥yÒvÿ ¿½ÚåDñÑ=Oã¹"³fRpÆ0JOUn|ZÑYç´Ýâº%wmd-sØ=lJ/56ÅT
+Ä!AUܤáH&<;¤DFÍY&Ù²Tm\y qǵ7
+öÒ_×ÜÄeiÞTOÏ_µÛËî3áñgËlÏ,1
å{d9Æz8ê3Ò®Ë7ßW²Ý¬nàió¼ÿ ýjÐ@Ó!TT¶û¤ªLNä^IÉ pOjøvÁ¡KVý853b[9<ªãñëZÖi¾^ß,U#(A¤¥ïÒÝY·»¶ý:MâÝ:æx¥k¨[sÛIr¾C2¤{äÈÚ |¼äóÅZ_D÷Юa C#0e,¿/B0N{ô5}¦ZjJuýÚC 28#:aÑ´ãwÏÙPIÝ»r*S´pHqÚ%dôýg.S&¥kiµú=×MôZëg±_ÃWín®¤ó&}û g@àqÐVµAggo§Ú%¬~\)«qÉç©©ëh&¢·<ÜTáR¼çMZ-¶e}QEFEPEPEPEP7v°ßYOirà6DÉÈäpkðõƧàÝþòO2êëO·gÚçhÔ±ÀàdÒ¸ZKbÖö
+·Q»"ÚÌíÝ_
b0r«Ë·
+pq^aco¦iÖÖqùv¶±$0¦âv¢dòp ë@(¢ (¢ +Ö¼+öû·¿ÓoN|ày¤Ä%r È°^+)áC
+tuÄj"Ô5K©í´k±ce¯b%y¤«ÃåQU©,»æÀPØм][MuS)¿"ãûÛ<Û»w6:dõ¤þÅñý´?üÍÿ ÈÕA´³#VÖä]Æqf=NÔuUú( v qIýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «?û!?è%®àêïÿ Ñýô×?ðuwÿ ÇhCûÆôÐÿ ðk7ÿ #R®
âé#Zh+Eü²ÞÙä®ìuÛ¹sÓ#gd'ýµÏü]ÿ ñÚUÒÌl[[U9G:µÄXt;]Ù[èÀÜÅ u/
#°¹PÔ.>ß©¦BJ£ F?wf
+pH.Ic¹à¤(è«ÒüK¦\Ai¬IöËI¥XcÔÕd¢É(R¡×Ü ®I]µ QE QE eøRF𮯪[¬m=׬,X2=Eqzuzfia;Em
+B
È,UTwâ»wLþÛðö§¤ùÞOÛ%¶óvîÙ½
+îÆFqã"¸].ôêeµÛÂ`DX ËC'G¸2°*A @ tQE QE QE QE QE QE QE QE QE QE QE svÚΤ¨×÷mhö-¨=(YeOô6âä7!r0¼Aã
+
+Ïfû
+²^Û^[ÛÜ[!vI(NJÈTP7d6 ¼Ö·¢·ïnî-þÐ÷)i/å$æMß*l3Áê¿áµ[sW÷±¨XR2¦2bHdB«9C`¶IwùpYüiP[ÛÚÊnóì×6 Ç,«¥e ÆìªKŸ ÛF®7,cÆ9¢¼À#Ä6ÌÆÑíß½|)*¬¼dÔ?ðY¬¶ÒG¨Dmv.DZ¢ºÄ¿w$ ñîÜCï3xR̪ùwWq1ÃJêP¤YUvÊ
+Êìà(
+IÁp´6Ò¢²åÖTÜ}VF7¾ Ææ`¨p¬J9W ¨, íèZO¦G©$è,Þ8þEݸçç|3s7Û¯~Ö¬¦¦ui!Uª£rÀ dpÌwI ~çMëM[ _ l.ªAÚŲX0[9Ü ÏZ ç¼]vú½º]Ã\KÓý"Û6ÝÑ4Dî`ª6HÊÅdlªr /Õ|mmo§ÝI§A-Ìë§ØÀfàÅK+ìÇ%° ïùjãxCJö+Í6?ìãxÄ|qǸ1Rw
+¤?ÝÀ'ÁϬ.mí,ÜÁ¸+b0ïRÀ°>[ÆvòNÝÇ4ZOÙÁiöË«ÛkEàiÌ(±ÈÊË̤þì>z@Õma>Ýqk
+ÝÃAgWo°H#É#©qÂrìñTÛÂoc¬Wo=e
+<s¾ùQ°¸9P¬00G9¹m£¥µñºnÍ(Ye#ó(;T
+¿sväf14/Í©éмuÄ×ò*·ÙmÒ4!|]i\ÌÉ
+oÊM_Ò|[a}KHnÅÔ2Eµ%w »Flãn
+¨l<o¦@g©êOÊ·?ºgì6`ÆW>vîÊõäææá«
+2ËN´´óR
+>âK¾p\H
+FHVÇ~Iç QE QE QE QE QE QE QE QE QE QE QE VÔl£ÔôË» Ö+^(@`¬¤g¿5ÚxkRYð®ª\,k=í7,`
èN2}Mq:¥éÓôË´Ï,hLPNð~fb $]Ö
¦bx{LÒ|ï;ì6[y»vïØwc'Æq@QE QE Éjþ»[©ot-PÌÆIìnw,RHO. ÉfùX1Âf=mç-cbáKùNÁsjcb;©iUúeTã¨)6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ £n¿ÿ B«ÿ ü~½ óºÿ ý
+:¯þYÿ ñú6ëÿ ô(ê¿øgÿ ÇëÑè 8Û¯ÿ Уªÿ àEÿ ªz®§¨èz]Ƨ©økR¶³·MòÊ÷xQÿ òI8 I ^§\_ÅmwáήÝ]Àvò^
·(¢QòäÝU#·_ÿ ¡GUÿ À?þ?FÝþ
Wÿ ,ÿ øývúe¤Ås=Ä6q,1É>Ýû
j¨à`tíÎNMhPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ñ·_ÿ ¡GUÿ À?þ?^E yÆÝþ
Wÿ ,ÿ øýuÿ úu_ü³ÿ ãõèôPm×ÿ èQÕð"Ïÿ Ò¬^!'
/ãf8=ͨIîÅefë
cô¯F¢9=#µÄ7úì±¼Ñ8x¬ }öñ²ËVÁÉ·¹²( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢ÈÕ¼O£è,·gí,¡Å´<ól$þ\a&A±ñ ×¢¸ÿ øOþ
]sþû´ÿ ãôÂxÿ ô*ë÷ݧÿ ¹?ú¶§ø\·½Ô--§»Ó.Ú9¦TiÊ# Ë°£Ö£ÿ ñÿ èU×?ï»Oþ?\§Äk£ã¯\iáf+µuÒY×jJ¹ÆqqЩeèq»8$
+ õ;û=NÎ;˸.ídÎÉ HAÃ#ð«çúí¼=¡Ùi×ÖÒ%2llufÄà'$rI5¡ÿ ãÿ Ы®ßvü~;
++ÿ ñÿ èU×?ï»Oþ?J¾=ÃZÜ1gçw½ÎÔ±×
+¤À(¯¢³tK×RC§Ý¬¯<Ø]Z9bÎvïtÎ ÈädV QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE gkÚ¨ÐôíLÆ&kxYã~Ó4ù#æf %é\E´Öÿ éÉû\4òàävè £ ]Äùÿ î!aÿ ¥ÖE QE QE QE QE QÔ丱ûZÁ$kë f"iaùÛÐàí`*פÁ<7Vñ\[ËÐJã6®¤dGÎkÿ É<ð×ýôRÐAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/ñþE?ûXéd5Zÿ äSÿ ¸
þCY QE Q\Ï-´MZù¬å3é÷À¶¡éö3 ëßaäqåÉ×aQâ=4ÂÒ¸VVä=¤«3 b+½
+Ç ò7÷N 5h¬âÍ=uY¬ÈðÏÐÃ$¢3 µNÿ w|¤änþãbüzÖ-üV1]$·B·¬`°hv#¿)Î2TueÈú(¢
+ßð'üÏ
+Ø*×ÿ E-`Vÿ ?äxkþÁV¿ú)h ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢(øÿ "ýÄ,?ô²È?ò)ÿ ÜBÃÿ K!¬ (¢¸ýSûþ+¿í²yßÙößeó1çîó'Ï~vãg͸çfçÁÑÜ[ÜÆnP4ÐßG¼À
+q#2·^LbIz¦H0ÅභKæÊAp¨-Æ$[ioÞIó¹gK0CÀR¸Õµ´
+[OÕoJÚMǼ>tW ö$`*È¥r\².å+VoµÉæÓõë6Ô¾Ùe.wå¼òDe©ò|±ÆDæ:ä±tPÃh Ú~ÛsyÂAoJ
·Ú|ÇJ¡äùvVgÈàî
+Ùà±§é §Þ´ñ˹
+½¢§«òàsæt =©xUi©½ÙHDÈÍCmÖylþg ¶0Ϲò®xÄZµþt«ûy¡c&ÁkJF'ÏËFÆH-@Í \\Ýhó]ËÒ¶áæÂIWPÄ+Uwe@;
9ʤV ¿àOù'ÿ °U¯þZÀÿ É<ð×ýôRÐAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/ñþE?ûXéd5Zÿ äSÿ ¸
þCY QE QE QE QE Vÿ ?äxkþÁV¿ú)k·ü ÿ $óÃ_ö
+µÿ ÑK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@×£-à«éÁlÚés¤ÎûEc tÆHëXµß×ê\Þ£ÖêçJÙ¥³Ìöù%¼`'c´(
+pUK>Çÿ ³Ãô0i_øøÑÿ gÿ è`Ò¿ð6?ñ
++þÏ
+ÿ ÐÁ¥àlãGü%ÿ ¡Jÿ ÀØÿ Æ6(¬øK<7ÿ Cÿ ±ÿ ðxoþ
++ÿ cÿ Ø¢±ÿ á,ðßýWþÇþ4«â¯ÈÁ!Ö¬'(.IöUE%@ $ ^ÔocÓ4Ë»ùÚ+h^gbª¤g¿ÚxkMFð®¥Ü4m=6ò4d,2=sz6µ}m¨ÝÁ5¾i/7´r\J7 ª!9bê¬6
RýÅ QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE ÿÙ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.htm
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.htm (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.htm 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>Slide 2</title>
+</head>
+<body text=#000000 bgcolor=#FFFFFF link=#000080 vlink=#800000 alink=#000080>
+<center>
+<a href="img0.htm"><img src="first1.gif" border=0 alt="First page"></a> <a href="img0.htm"><img src="prev1.gif" border=0 alt="Back"></a> <a href="img2.htm"><img src="next1.gif" border=0 alt="Continue"></a> <a href="img2.htm"><img src="last1.gif" border=0 alt="Last page"></a> <a href="standards.htm"><img src="index.gif" border=0 alt="Overview"></a> </center><br>
+<center><img src="img1.jpg"></center>
+</body>
+</html>
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.jpg
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.jpg (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img1.jpg 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,430 @@
+ÿØÿà JFIF ÿÛ C
+
+ $.' ",#(7),01444'9=82<.342ÿÛ C
+
+2!!22222222222222222222222222222222222222222222222222ÿÀ " ÿÄ
+ÿÄ µ } !1AQa"q2¡#B±ÁRÑð$3br
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ÿÄ µ w !1AQaq"2B¡±Á #3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ? ÷ú(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢9ÿ øNüÿ C^ÿ øªØ±¿³Ôìã¼°»îÖLì Ø$0àà?
+ù³á5þká[¤Õ>j^"Þ¹[»].Õb|
ØärqþÐ=ëÖüE®jð¾«øoðC G¶mRÃì¾]ͬUؤJʪËÝàO ô
++ð_µëõµø>?Ýi÷rDñÏu Ú-!ùÀ<¨êOÆüMáMRþIãðÄvv·«zcÝ´ñp|ÌFJÆrÀ¸xÀÉEy>µñ7ÄxÓÃ/4ËuÍ)/¡Ûã.$ ³+cj
Ê'Égñ;Ç×Öþ(·Iðÿ Úü4ò½õÛI(¤aÇçyrcr00@$íWëµ?Úlì,VúþïìÓC0wcÍËdÄzÖxóÅ'tM+Åú^g¦ë»Ñ$y$\±HyÀ²)!BåÃÀ"=ÏVÓu«{-BÒæ{GÙs3+´-0à©Êè}*åx?¼CoáMkâþ¹t»ã´Ô7Éc®&@8ÜÅFqÆrxMâö¯s¬èªÅá÷Óu«³Ãm¦ÞolØê[× c¾Ó ÉXpxÓ·W[ÛøFy\$qÇ3±8 Ù$1QøãA¼ñ?õMÂ÷ìWWqlI pA*Øçk Tõá¡ðGµÑtÚxgâÃû½"tøNPìÒ¸ø`À¡bÀ3ýÓµ P¦è¯7ñ¯< §xB{9 ¾ðõıÚßjwlgÇ+ da½¸+@õ ?ï.|iã(
+´xkÃv$ÂNfP&<¤à`òyzEáúwÅêðXêt~
+;Ë¿-4c¨ùWêÊ
>cªî8 w)ÛÂIÿ
+!¢ÿ ee}»û<ÿ gý«Ìòü¿.mþnÞwgÍÆÞ1³Þ=âñÿ |ZÕžá³áËxôË-Æ·{äýªP ò¢RS:ä§ PFMkã©ýàCÃú4ÂC,±Igtø}é"G±$ef± r(Ø(¯±ñçÄKjþËðäºÍ´I0»I&KhS
+ÌX»ä:(Û·äätê>xÞóǾS¿µÞê·¶q;
+¬I8Ééø eæ¦é÷¶÷º
¥´÷o²Ú9¦Ti a9cÔzÕçÖÞ[c¼HÁUIà 9Íxí
+õγà4³ Ô$¸-Lrla)ha²6Øç#cânuïGöT±C^·w¹HǶ(#g»ØI
+É´Nå$
+ÙÍ {%ý§gå
Üv²gdÐH$FÁ áøUð¿
+øâo|ð
¦cþµ«Ü\ZØÛI!EÝçÈ7£I\îê0Mv5è<x¾ñ
¡qnn¬î´éÅ:÷6°$RYýÌcH O<6¶òÜ\K0D
äF
+¨ dO Îj;û=NÎ;˸.ídÎÉ HAÃ#ð¯Ô¼yâÏxgÆWÚ.¥Ká;h®m#¥Ì©åÒ.xùC,
YW´ÜÕ|@ÿ à
ÚÞOQæXî&ò£\M&dv?.ÕfLËÙÈÁ Ý'[yn.%"BòI#TP2I' ç5ý§gå
Üv²gdÐH$FÁ áøWÿ Â}®h>4ðæ°Ú5Íä:Íä7ºÇk$^^Ò§,Y\3wê; nàüþÞ?ô¢J ô
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+¯o}ow=Ü0I¾KID3¤lr õù]O¾¹«Ïø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@7à¯|Mð6¥Ïá á®®å1U\
+ª£AÛÖ·<]áxÛÃ&©ÞiVÑ¿7Zû³ 5bܧ?)$ÞªG½" àüàKÁþ1ñÚOh</¨¸¸·´Þdq¨"§.8ÉÂF;à×àÏA×ôÔ49ÛPÌ«ý®àù±¶É£\ª|À>b3x¢<¯Iøs¯[xßÁºíܺjÁ¡èë§\Gîìì©*LÆ:cÎ2i5øYmÍÿ Îû×Ýïóñæ|¼^ºÇÔ( >%xnóÂ? |=¡ßÉVº©Þð1(w$ÑjíÓÀ~,Öüs¢j¾/Õ4«Í7BÜÖiÇ$òämAÀV%QW(. 5è¦ë6ëoªiöÐ+Xî¡YT6ÈÎ ÷5r<¯NøSrçâ
+¾¯qhm<KqçZ´,ìÐ$®ãʳ¡À$¤´ü;ð³ÄZf¥-ÌÞÃK:]Ûhñ½åâ¬THY?vÛAùÑ·ÉÜ~jö
+(ÆÆ¿Ðg¸Ý.Ñ@ %X:£r23Èë^gsà¯ìü¨jþHÊYáYZv
*¸(íÂãIØ2Ü}¢ ó¿ÚgðrãF¿º(,l4ù.dE¦2c
+HÁvT
Xf«ü'ðÕÝÃ'¼ûDúö¼^K0IÜ3å9þø
+Uö±<»g z¥¤éºÍºÛê}¥ô
+áÖ;¨VU
+23F}Í\ ¸øEâ}ÓÄÇÂCö³s{©é¥/î3¸-åªëÁâ0zx#ÄßtxjëJV6l`Ô9óì $äJÜq£®p=" ñÿ |%Õž±á±áËõ}Í-¾·eç}Róbb,X»`£ `.j5y¦ðPÓeO^½ÅÓah$V91Q)@p¤u<÷5êP¥x+R±øË®xÂYíd¶ñF®Þh`!a·ýÛt'¨üÞ
+Ô¼á[/TÒiå½{
kWfP¥pw*åoJï( Ç~
+Ô¼Qâ¯jSÚGzn.Vg`λâl&qêGQXéðh/üTñ]Æöw6Wú
+¤²\!óMn
+ÀH95êPz|<ðÖº¥¯<?q-Õ¥Ú+Kæ¤ yD±VÆÓA9ØÐ<¯OãÅñ/´Ùµ{skgk§Fâ(¿¹$üÒ¬ïç< = ñ¸þøËF²ñ'|;«hÖþÕWgF é,pFbX
+ÅI7ÁËËÏ~Ñf½±]Ñ%h'1à}îïå²° ©>^IFÆÒ0A9ö
+(Êô¯:úYxïÃsêZdöözF°ÅtPÍ´K;9 gÿ
+ÞxGÀn$]Zù»Þ%é]Æ ôaÚº( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++xVêâ+{èÓO+8ïâfv' $Æ+r
+(¢
+(¢
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ £þ¿ÿ Ðסÿ àÆþ*:
++ÿ ïÁÿ ô5èø1ÿ ®
+(¢
+(¢
+çü=ÿ !ÏØV?ý"µ®¹ÿ ÈsÅöÿ Hh ¢(çÿ È·¥ÿ פ_ú Îðÿ üz_ýzEÿ
+ѯ¸¥ü8ú#òÜGñeêÿ 0¢+C ¢( ¢$o$©ÌÌp¤Jl×Û&ùæ%9åØ(àzû~Òm!¤ÞÄQM2 c.¢Fç2qè2?1@QMy%
+#ª)!AcIÀRH:
+(¦É"CÉ#ªF³3©'ÒÜuSc&$ÕãpYNCÐé@¢Ò"2+º«9Ún8'Ôàø$!äÕ#@YÔéEÇf:(¦ ¢( ¢(¿óÒì+cÿ ¥1W¼Wÿ ÌCIÿ °þÅ^ñ_3ÿ z~¬ûnÿ tøä(¯$ú¢(çÿ È·¥ÿ פ_ú Îðÿ üz_ýzEÿ
+ѯ¸¥ü8ú#òÜGñeêÿ 0¢+C ¢( ¢ÜB!yÑùI»{îWi!²{c>¥q¤ÞÄQMYÙÕYípvèpAüEE4HF:+@9ÁÇ¡Áü:
+(¦´îªÎv ' Àõ8þE5äH4¨¤
9' }I ~4ê (¦ÈÑS"ÅsÈ88ô8?¡¤DdWuVsµ8ÜpN©À'ð4\vc¨¢b
+(¢
+(¢3¼Aÿ "Þ©ÿ ^ÿ 辯<Aÿ "Þ©ÿ ^ÿ 辯οCìxgøU=WäQEx§ÓQ@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQEóÇÿ ä[Òÿ ëÒ/ý VgxþE½/þ½"ÿ Ðh×ÜRþ}ùn#ø²õQE¡QEâùõOúôÿ @5â¸/ÎòêÞHÿ |@·içÌ9r;ý8=}
Z
+¥î÷±ÕÅ:-YmÅ[äsÒKöÒlõ
!±XJHfBÿ 6w½ÎAàÆYPµ ù²G
+üQùy <j ¶ è Ï'¿&º*){{ßú½ÿ à
+â-¹«[þ Ïë~|ºNíM!µ;«fßãôóT1cµ0 >þ¼
+dÞÞÞ©0ºXî#{Õnä2ÕdòÏ·lcÈ|ñÎ_Úw'~b©c#ò¸_çéëÛú±ÎÀ÷0k+½¸øÛm
+o4Ô¾°\tϦߪÞ\Kp^ù&
Ü6Ò¦ÝÁþyùsw
+ªZBÑÆX«I$w«¹cøe)aÛÒúkúdcï8êúë·Îk7e5FA;DË$JÛïZ&¾c$J0Ⱦ\©r6
+«
+À@ÐU.#mhL-ûÛ¯6a|ÕÉÈÌgN÷F;:)Ëܹ·òó¸GÂ1åÛÏɯ÷9ÙÙ%ÿ uï.³qʤ̲4cÌ01Á^0IÛÁ á±1&þéM¿U¼¸à½òM¹! m¤/M»
+üóòç(î*[T´
£±VIïWrÇðËRù=÷ÿ çäñ¿.ßð_o2j(¢ºÎ ¢( ¢(¿óÒì+cÿ ¥1W¼Wÿ ÌCIÿ °þÅ^ñ_3ÿ z~¬ûnÿ tøä(¯$ú¢(çÿ È·¥ÿ פ_ú Îðÿ üz_ýzEÿ
+ѯ¸¥ü8ú#òÜGñeêÿ 0¢+C ¢( ®~ä¡»¸¹
+ßÙéu¹ù¾ô´yãBw#ý[tÚÁú
++:çV5¥WÙ¶íý_qÇ\OyS%ýÐ"=Bp»Á Ã6#>èÜN;ðTvºK\ÚC²}µr²Êcò"ç![«bÎ4_ÅýZÆÓÅ)+r÷üÓémc®"ÔµäÕ¯1LÒÀÊU g¢÷kÛI5ÍÝ´1_âÒKSö[ù.2|©+á>Pr¸m$ëè©ú»º×ú¹k¬×.¶¶ûioøoÉC{xt
+BY.æy[Gïy Ò\ÀGʸÓ=I&H¦kIÌ×Âtbò±$La¸Þ~ë`&S .z×Gyj¶WÏFÅzÃüÔÔ,<®®ö·æÇ,\£kßå¢]òò9=ÛGlÒDÓoÔ\ȲyÑ`H¼\)ì^R¯ssuÿ yñÆâæ!
+µÓ«4XBû`
+CóÓFÎ:z),3_k·O_ó±±v\ú÷·ù[ÓCÔe
.õË«k¦óGYbdò?{ó(Î00¼ÿ häa&¹d\Íql'F/+DÆàçî¶e0ç Ítw©{eqi!añ´lW¨0qïÍMOØ>kßÏñlÇÖÖÖßÉ.ÁEWQÂQE QE gxþE½Sþ½%ÿ Ð
+}_<xþE½Sþ½%ÿ Ð
+}_;>ØðÏðªz¯È(¢ñO¦
+(¢
+çü=ÿ !ÏØV?ý"µ®¹ÿ ÈsÅöÿ Hh ¢(çÿ È·¥ÿ פ_ú õoøA<ÿ B¦ÿ èø?áðý
+þ¡ÿ âkÜsËM¼ÿ à-S¹æåíwþïüÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&«ûoþþ?ðÿ V?éïþKÿ ò+Õ¿áðý
+þ¡ÿ âhÿ Áÿ ô*hø.ÿ £ûoþþ?ðýXÿ §¿ù/üÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø?¶ÿ éßãÿ ?Õú{ÿ ÿ Á<¦õoøA<ÿ B¦ÿ èø?áðý
+þ¡ÿ âhþÛÿ §ü ÿ V?éïþKÿ ò+º×üá].âÃYѾÇnæèþÁÁ
GFÐ3*1f8XÌÇÜÿ Áÿ ô*hø.ÿ £ûoþþ?ðýXÿ §¿ù/üÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø?¶ÿ éßãÿ ?Õú{ÿ ÿ Á<¦õoøA<ÿ B¦ÿ èø?áðý
+þ¡ÿ âhþÛÿ §ü ÿ V?éïþKÿ ò+Õ¿áðý
+þ¡ÿ âhÿ Áÿ ô*hø.ÿ £ûoþþ?ðýXÿ §¿ù/üÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO'ÿ ÿ a[ý)½â°àð_
mn"¸·ðÖñ8xäÂ%d`r!r<æ·+ÌÆb¾³QNÖÒǹà>£IÓæ滾Öè¼ß`¢+ô( <?ÿ "Þÿ ^è´kÕ¿áðý
+þ¡ÿ âhÿ Áÿ ô*hø.ÿ ¯rÏ,Ty6óÿ |µNçµßû¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø¯í¿úwøÿ À#ýXÿ §¿ù/üÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø?¶ÿ éßãÿ ?Õú{ÿ ÿ Á<¦õoøA<ÿ B¦ÿ èø?áðý
+þ¡ÿ âhþÛÿ §ü ÿ V?éïþKÿ ò+Õ¿áðý
+þ¡ÿ âhÿ Áÿ ô*hø.ÿ £ûoþþ?ðýXÿ §¿ù/üÊh®ë@ð_
uKýdøkFûÃlcû[1pHÌÎÁá£ksþOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø?¶ÿ éßãÿ ?Õú{ÿ ÿ Á<¦õoøA<ÿ B¦ÿ èø?áðý
+þ¡ÿ âhþÛÿ §ü ÿ V?éïþKÿ ò+Õ¿áðý
+þ¡ÿ âhÿ Áÿ ô*hø.ÿ £ûoþþ?ðýXÿ §¿ù/üÊh¯Vÿ Áÿ ô*hø.ÿ £þOÿ Щ¡ÿ àºþ&í¿úwøÿ Àõcþÿ ä¿ðO)¢½[þOÿ Щ¡ÿ àºþ&øA<ÿ B¦ÿ èø?¶ÿ éßãÿ ?Õú{ÿ ÿ Á<cÄò-êõé/þkèzçÿ áðý
+þ¡ÿ âk ¯;úÔ¹mo3ÙË2ï¨ÂQææ¿¿VQEqQE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@÷zÍk§\¿%ÔO,r9>Y"i$ýæiÐßëúîwö?³j¶3}»Ù<»o´lûû0~m½ñw¬?xRoj{âÑí!MÜdívAKyr£¡$SÁ×òx¾÷T_°.õ{¯7|DH£mxñåÍÝ$±Ic
ÔÓ<_á_£ØA©é·O;ÏnlxæTfV>Xc¹T°õR
+gé~/Ót
+ꯩÇv<>K:β=Ä,KwÜXoy#d8
+&ð¼b³åðwdkMhÖðêr_[F·óF ƺRè©/Ü"Ù½w+Yzço4? ikiÁáùô]ReR§÷Ë
+?vÙº#HØ$ ô
+?Å:&¥-¼6ú¥\\ùÞ»ÞtFuÞXîS±0rôoè:êDlu;Gy®'·?=ÊбP;Ü8Çð²×.Þñ°ZùÓZëêfKù(eûkÝò 8Éu^Âê(´ð ¾!{Û±hð5évß\(D[É®£fB¬LÛpçP0/¸¥ w·öwÞØîà¸ò%h&òdåÈ¿yddEX®oÂúÎq{-ÂÚF¤Pų;¨XËüË¿ï`=§i;ºJ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ ÇÅ;jwºt·Ð[ÝZ]ÅfÑÏ*!IcY#3¸1¹(Øjþ(Ñô];V¼¹¾¿²¢Ýèd#(¥Igè ãq#ËÝx
+òãZø¨æÄÉâ
+=,ìdbwÅníùT¶Ãòç;FF@«¯ïá"X¾Ãßi÷°my
+»Ï£ Á?Oͽ* t^%Ðu$ì5½6é#xÑÚ¤p¬íµÁà³psÀ®oÄ~5Ó.%Òô/TY5ÝÑËKèTÁá<dÈ»¤,J¦ÜUØ)±²õj·÷gSÖæÓZÝZóíWò<ÛíÜ:Ù<´¸ r¤m5×Á:®¯â¡âøìí-R¸Yâ¹E+hÞÊXÕf£ìÒ^ 2¹¶Ðhþ(ðÞá+^ÊúÆm#L©û±².Õb\¡T*ä}åëBwG¸æXu[#µg¸t¸B"z»~U+óx#ǧ5¶Ó¼K
+ÍÔÝjúSXnå|ª$.Ö\D®frbO=níÇigà{èþââ.%óäÌ¿¹KMp·>U·ÚÊJX°I0¥J0yðÝ[Åqo,sA*HØ2ºAG9©+/ÃÚlÚN
+¥ÃFÒFØKÞìûwnÁç ³rƵ( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢
++Ïõ¯â-GK´Ðn#²#3K¨4EËD}Ñ`|àuíTÿ ágk_ô-XàÙÿ ùºa¯8©F-¦qTÌp´äá9¤ÑéWÿ ÂÎÖ¿èZ°ÿ Á³ÿ ò=𳵯ú¬?ðlÿ üUõOò2?µ°_óñEyü,íkþ
«ü?ÿ #Ñÿ ;Zÿ ¡jÃÿ Ïÿ Èô}Cü?µ°_óñEyü,íkþ
«ü?ÿ #Ñÿ ;Zÿ ¡jÃÿ Ïÿ Èô}Cü?µ°_óñEyü,íkþ
«ü?ÿ #Ñÿ ;Zÿ ¡jÃÿ Ïÿ Èô}Cü?µ°_óñQÏ7VòÛÜEÐJ
$E®¤`Æ+Íÿ ágk_ô-XàÙÿ ùøYÚ×ýVø6þG£êäaýÿ é<3®[äÞº¿óõ3r0w/$°(Ç+·v)4AÆ\I´+¨¯Ò¯
ãY<I£øOL±3Ù5¤ÖpjL±1Ü@·Â& ðr[¬ÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ èÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ èÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ èÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ èÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ èÿ
еaÿ gÿ äz>¡þFÚØ/ùøL¢¼Ïþvµÿ BÕþ
+ÿ 룽ñÛ|<³ñLzzÉ%Ô6-£O´;F Úxg]¼ã¥eSVJqµÍèã(VMÓvÜêh¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ùµú'ùö¶þ~#Ó(¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ù¨bö¶þ~#Ó(¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ù¨bö¶þ~#Ó(¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ù¨bö¶þ~#Ó(¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ù¨bö¶þ~#Ó(¯3ÿ
еaÿ gÿ äz?ágk_ô-XàÙÿ ù¨bö¶þ~#bëÄzGµð¶}æ+µ£ÁR±@È"ä<3Wi_=øcÍð÷uËáûÝNþîiáwÔEªHÄQä·$î8 e³ÜÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q^gÿ ;Zÿ ¡jÃÿ Ïÿ ÈôÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q^gÿ ;Zÿ ¡jÃÿ Ïÿ ÈôÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q^gÿ ;Zÿ ¡jÃÿ Ïÿ ÈôÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q^gÿ ;Zÿ ¡jÃÿ Ïÿ ÈôÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q^gÿ ;Zÿ ¡jÃÿ Ïÿ ÈôÂÎÖ¿èZ°ÿ Á³ÿ ò=PÄÿ #ílüüG¦Q\O
üu{¯xû&óG·³Ýi%ÊË
+é;5*A1þ°äô®Ú¹êS9rÍYªÂ´é»¦QEA QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@+âù¼Kÿ _qé,N®xþG¯ÿ ×Ü_úKS¯°À»CÐüã6ÿ }©êQEvxQE QEfMª<zF¦Ò9 ¥Ï+#¨Ç Ìc¡ÏFÓÔw.å6ÔM:+
+lÝk1ZCk7EÂÉ+¨xÝWy^z~òú6!ÒuËF)®ZÚAIª,C|Îê¬Ã£8< A-Ôöð½õÔ×êµmôý]¿3zÎþØÊÿ k´ùÞGÙ~MûöïÆwmû6wcuâ¨\xhngjÖðB-Ipíß1GÏÍÐ pz|¤ä¹%^Ý0µdìõ{Ïê>%5é³ZÞ¬¦¸aûY
+Î|¿3ÜãClëЬínÖbeqÁ9 pààm9 IíéÞתVåNßÒ5hªê"âöÉ *ö×V²\+àpcÛôsÔzUkÝlÃe}5½¬Ì°G1vPbi#
+ ÀeHÉ pyn¬½É£i[ó·èlQT§ÔVÞäFö×VõÜm±G'qÉe OǬÃ%]nga(?|á
+ãæ$ÈÜ §í"®%F£WKúfyð¬\REÃ)ñ¨$sRU§}LÚ³³
+(¢( ºKþH
ÿ ^ºGþ·®^ºKþH
ÿ ^ºGþ·¯6þ%/WúMÃÿ ÂÄz/ÊG/EW´|ÈQE QE QU/îÞ8¦âyQéIõ
+¡Ûäªâ´vª,î$¹$&pÛ6"$ #' ãÈ7R)ÙÆä¹þ¿ËG¯5h®nOÝ.¦N,Ù®o`
+媮F¡²\|¹azÁ5ªú¶8® )*bó nÁ$<&5àÿ ĹajG?ÃOë¿Býs¯È¶q\Zé×NÉØ&Ù#wQ¸|Ü`6XqØ·w¨Mg4Ñ´itÐ.Gø9px'aÓöÐÕªOµ¿ÏóìhÑYVÒê÷uÊǺ
+¾T¨á¿Ë¿FpMVÐuÙµOS
¡-íü¦·+Τ?PÆÁ毥ն¾á¼-EK¢IüùÔUkËųHÿ u$²Jû#<nvÁlH
':zàU5Õå7Ä,®l12¨٤ $(ËëÄäfH§fDhÎKmý#VÎþÙÇ Hn$y7FÛd$g¬@Âäᦶ¿K©ä8¦
e+ò9VÚÀðCqÈäM5R-Ù1:3Jí袳0¢( ¢(oÀòPáÿ °U×þ¶¯[¯$ðü8ìuÿ £m«Öëä³?÷©ü¿$~ÿ ¸Sùÿ éL(¢à=`¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢<WÄò=xþ¾âÿ ÒX*\ñü^%ÿ ¯¸¿ô
+§_aÿ v¡ùÆmþûSÔ(¢ì<ð¢( ¬y|=k5½Éu
¯¥22^´ ËbJzå r>èÆ+bB3ø¥:³§ð;úSÛ^A:\)XÍÎõ1ýá4L ùç¥Ak }HÃí;üÏ+æ1ðvGa<«y|#Þ¶¨©ö0íýZßY«ßòïÍvúÚ¦`Ö)V´ ×lJûgä
+÷JÆs»'$ $Ñ®&¹3Kz®\A¿÷8ËE1c
ä®OCÎv(¤¨SJÉ~cxªÝ½}ùÚý£¿÷Þ^ëIí~îqæmùºöÛÓ¾i±éN.æK
iй`±íùQü]ý=ëN§J\ÍjJ¯QG=5_~æe¶ö§yw
+ZÎ×ìÄ´|O^#>¿{¾0bF¸ÒòÉoU-.ØQ\4»ÜÙÁP\ Ï\ìQKØÂÖ°þ³R÷¿à½SûAûeùº[îÞ#Ëo¾HÙ0T#îL¨%qÎ_»bÑÞ(oí¹Æqn¡äºtfláÈÛmÆkV^Æ涡õª¼ª7Ñy.
k_±YGo¿~Üò É'
+;(Î ì ªÍV©$¬e'&ä÷aESQE WQ©Éпë×Hÿ ѶõË×Q©Éпë×Hÿ ѶõâæßÄ¥êÿ Cé¸øXEùHåè¢ö
+(¢
+(¢)^i°ßÜÂ÷IÐF uf%pØ<d çñÆM,õ´Bê(c·Hö¬aÄY f2zusøéÑYºPníjj«ÔQåOM4ðûýLKµf±c±cxY"qÆãüsíN¾Ð~Ù~nû·¤òÛï6Lû* \sänãjaM«[úE¬]dî~®¬ÅþÆ»|vKßÊãìùÀÕÍó6O1nãKK¹.^ycDT`Â;á÷`äcî§.Mú)ª0Úß×ôÉxÞÿ òÿ #m]C:ÜÌ®óγ1T*?Õ,N nèÈu㨺=í¾³¨jwÖéöß/ts[Û±vëï[TRt)·{yþæÊXª©ZúZÛ-´ÿ $R¼³äÇ"OKÞl¢,£ä(C
+ÃwÞnvô9¥s¡Ëtï,×qË#¤jË,¢r¦CL¯ï8È(¤kjr¥ nL1 ø#þò4èìâ$gmÀò÷?#«ØÃîÕÛ}8êOzÓ)2¸XÂÉ|¾WSH9Îjý*0[!ËVI¦÷¿E×p¢+S ¢( ¢(oÀòPáÿ °U×þ¶¯[¯$ðü8ìuÿ £m«Öëä³?÷©ü¿$~ÿ ¸Sùÿ éL(¢à=`¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢<Ä^ñøÃ[»´Ð.®ín§H¦{u"CÃȤÈÝ«?þÿ Ыÿ 6üz½ªï¥W§ÚËÈòkä¸ZõI§wæx¯ü#þ*ÿ ¡Vÿ ÿ m?øõðø«þ
[ÿ ü ´ÿ ãÕíTVÚØëî2ÿ Wð]Þx¯ü#þ*ÿ ¡Vÿ ÿ m?øõðø«þ
[ÿ ü ´ÿ ãÕíTQýî¾àÿ Wð]Þx¯ü#þ*ÿ ¡Vÿ ÿ m?øõðø«þ
[ÿ ü ´ÿ ãÕíTQýî¾àÿ Wð]Þx¯ü#þ*ÿ ¡Vÿ ÿ m?øõðø«þ
[ÿ ü ´ÿ ãÕíTQýî¾àÿ Wð]Þx¯ü#þ*ÿ ¡Vÿ ÿ m?øõðø«þ
[ÿ ü ´ÿ ãÕíTQýî¾àÿ Wð]Þxmîâ>ëÃ7ñÆÒÇ>}©ËÈë&îÌ£Û<ñV?áñWý
+·ÿ øiÿ ǫدìmõ=:æÂò?2Öê'dÜFä`CFA=+?Ãw×Zt·òy)´»} y æ#G&Ñ»öç*hþÖÄ÷_p«ø.Ïï<·þÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzºÝK@Õàî¢ÅdÒêÖÚrÉl² ;¢xYÀbÁr7|W{EsWÆU®âçÐìÂå´0±ißÞß__ó<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª+§û[Ý}Çú¿ìþóÅáñWý
+·ÿ øiÿ Ǩÿ Å_ô*ßÿ àM§ÿ ¯j¢ílOu÷ú¿ìþóÅáñWý
+·ÿ øiÿ Ǩÿ Å_ô*ßÿ àM§ÿ ¯j¢ílOu÷ú¿ìþóÅáñWý
+·ÿ øiÿ Ǩÿ Å_ô*ßÿ àM§ÿ ¯j¢ílOu÷ú¿ìþóÅáñWý
+·ÿ øiÿ Ǩÿ Å_ô*ßÿ àM§ÿ ¯j¢ílOu÷ú¿ìþóÅáñWý
+·ÿ øiÿ Ǫ9ôoZÛËqqá«È`É$v¨ dLØ s^Ý\ýÏüTY/ï4K}ézz-ÔÀ!ø£_ÌÛS,©Gö¶'ºûý_Ávyæ0h¾'¹·tð¦D¢Im#<«J
+bêOøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<Wþÿ Ыÿ 6üzøGüUÿ Bÿ þÚñêöª(þÖÄ÷_p«ø.Ïï<ËÁ»iã%¿ÔtkTÓç|ÓBÛär1èÖ½6+µiV©=Ùêa°ðÃÒT©ì¿áÂ(¬Â( ( ¹ÿ ÈsÅöÿ Hk ®Ãßòñgý
cÿ Ò+Z ±câÏ
+êwÙØxJ»º;!ö9° 8Prp?
lWøfÏ^ÖþèZ\özm®6jìW¯%Äj#B®T,£ ©Þv6æÛauÍ^Ç@ÔuûFKjsiöÖ«h"S|mÒFTd®£øUpq»ç åçã[×vÏc£ÿ njÌñ ~Ó}¦9 ı#ª"'c» #îÞOÍbÒ-vîú;«ÌXÔlY£G-j©ÁXWËÝVg;BD¢¼ìkºÕΣ§èöWúA5êFu;ý(Á,Ö÷NñìxÑK¡
:®ôµ·(:~ñ¶>¯wtú¼K£KóѪl" >îï¾o»´Ñ*9çÖÞ[c¼HÁUIà 9ÍqwÓ]ZÞIb<Uâ;«¨°¥Á!,@`²ËösÈw¦5P9væå¼Ô57_ñò,x6ÒöK1/nÌñ]
],rX,¸PëW?{-î©âôk]F}6;KHn{däÊò¨_Þ#*¨òXYpT)
+Ïø^÷^ñtúûÜkóéñ麬tiamÜbHñ2¤+6YWªî ³»@=Ãðíåöµ£h:Ô×ÄZbMqk_+K"ÆáJ
ÃsünPEPEP\þ½ÿ FÏÄ)òÃú.¡·sħú§Ãnc§=MtðCuo-½ÄQͨRHäPÊêF ðAb$¢°ü;<Ð$ºô²K}§"þöF.ÓÛ³:Ã+7w+êä
+¥IÜ ( ( ( ( ( ( ( ( ( *¥©C¦[¬,É#à·$òHDI$ f!A ±}pò¦¥É·QcI PE¬°Òä 8w8û¥UÊèXØÛéÖqÚÚÇå ,I$fcÌI$±$I$TôM6k;´ê
+º½Ê!¼ +¸¹@"%%rNY¥ QE QE QE QE QE QE QE QE QE QE Ëéwözf¡ãËû¸--cÕcß4òÑsgjXð2HuÏø{þC,ÿ °¬úEk@</&ÿ õ©A¨XØDk43¤¿q ÌnÆ é×¥Ic>ë$Öó\MrÛÛ¯$Í6UJ»eHÁ\)#5ÁÜYø/ø2ÖÊ[ë'JDCi$²-ز+¦?å®|Óä1 û¸Ô¹Ó5¿Ü$ÖVÒçXÏå]ÜG´ )µAö
ºà'Tl\øjÉl.n5ZîæHÐ8ÔnÚ$kEÖPWj,j¢¹%Nír¨DðÎëQ¾»Ô_Ëòõ |¥/~ÍP`Ë'U;²¶å;kÊõ9¼M¬ø;Ä18ñƾööÑÅÆÞ@/el×hѨڮUä;d naå
+嫸ÓcÕu{©C¥Þ%ÌRæɸ]'g*¡ã0òBË*1.7,|?a;iú¨Ô'ÔnQvîñ±¸)#@J(_,$Ì@@£'w%µËÆúãSéd5+$±¹¶Ä¦^0A>sséwó?ÙøÚßOÍ×-âOXÒÌÚI¼ µ¾{£ûU¿ä;
+u5ðn©Å}|ëæ5I$¹_,ÌÆhråÔ¹HB #ð<̾#ÖGÚ_}àS¦Ú,Ëd;1ÀPF,i¿tË-
+téuè_O<ÒHðq ß(ÄÇÊf!Jí,Hݾ¹ÿ ÙkZ¹¨_ëI+©RTK»12²ÕViUädß
í5Àñ£g¥É«A®Iª=Þ1Háe[lóS5a8(Àé4èÚdäØêØ_Áyç±13íÀqêëÆðÃ+¸o8 ;n4KÑ[SK|ù·b[2ï1ÊbÇïneTrXbå;«m;UÔü}yous¬Ã£ï¸` Hcl6(uÁQ¿Ï#aRJÈ2Apx½>ÏÅ~d uË+»¿*êæF´¹}ÛZZù{T: ýçÚ|Ú«"
ëzUôí?ý>x¬t<Úþú`±Ô'ï$à
+Ê"ûÜ ýxÔxn⸷9 Ç$l]HÈ #×ëÚ
+î¯q¬És.³$i®éâÒÞ+baÍ¡Ð!ùHB
kn'.Åõاû=úkè²KP·²MnBL$f,òÉÌopªíЬQ\ÏcòïR[P[n
+Ù&IAn¯öÙLå55Ëo}õ¿µ`Gv#±Ó$ûJ¡<|Â|¶ÞØ¡Øír¤ uWøj}z[ûÈæÄ_A¬[Ågæ³qk²ÜͽOÜ&,àRÓyliQø4ØÛ\»Öf¶k¬ö×IùSy&YWwÙò`È60é:¶eosqw¨ZA«¸YV!HIÂûÃÔUÊò?ézõþspÄ
+yk{+ÚÖTÿ ?óÆܧ˽GÀöûgöÕÿ Ûµ~ÕæÜyÞn~ÉåùÇìÛ7|»¼ªãïy¿>Ú ±âø}ÄÇö^ÿ µ{Ù¾<ïûçjKÀ,|£ïè+ÊôkAqá¸ÔµÞYYK(fföïHâ!ýê±?3 2ï-^Úç^µ×/¼7<z½¾£%¡²
Ê}®ü 0Þc¸Û º¢ë_íö~Gö¸<7Èó<Á·ÌßåìÏ÷·ü¸ë»µæò?ßD¹TÕQàØZB·SýªÜ\7A¶ÄÂÜeVó2ÆXçÜXku¤Öçÿ Yê9c³}íí täÿ Y±²{ÇýV(Ø*®¦ß:¥¦¡ipîÕa\ÚÓlú:âåþG¯%½ÛkwsNÉ&¶x;7F.3³ÂÃÀòÇ-/@°ÔíäÑ¿¶m<Gm§$ûs+ĦÓMÂ|½UóRN"ù·+gåP´TrO/
+K,hó>Èí´¶ÔíV8=«Çà±ñ²ø2ÆêòmdøW»Ì$ÎN²·¬{ÂYF¡@9BljÑøçP¾Ôôiµ5ïd[$
+(¥V1¸ã`ýç
+ë)/¸Ó(¯/xuøü=}®\:ÝÈö{lçÌ;dmæJó&_ÌÄ¢6ô)åWYâ{Ëßê¶úÄöÖâ.Z8$&'J³&BvCs
!ñòý^ËÄørÝ"¿×H´MRUktÝæ<FÕXnicÞkm!ù2)¯âû]~ËI×íôËÜk«¥MÎÈöæ43Ùû!cu´0>A D ªI<0¼),±£Ìû"V`¶ÒØ_SµXàvö©+×t9¦>²ëR#ÔÝînÖCæí6×8 fm¹]»w0¸ææ[^ØL©ª¡´»º¸ûE¤w+)EmÙUÈ®óo]º@¡TãÕ´Ùn¼z
£Î\ fRÅpF3æ)F?éÿ tãÌâµ×ì|o.<G=æÒøÎó#,QþxØHø"0±v«é+æÃìøÊKbÕn® %íI¤Ø¦" 6n2# éQák·Yc3¢+¼aåV$)#¨« {í>çóêÚj×N|@Ú=µÄ©dÖ²I$æc
+«Ãé½®ùA¿
+ s~µñN¯¢Ùë6·ª]ÝèË;ifDegãkL· '²1?+ȤÚ(¯/wÔí4}+C\Ö}mÐ Þw¶û$¬êYv]Êíó3Ý"4iÛÿ joµnhj§öVÿ ?ÉþÊóS>wü²ó<¯;>wï³âÙ@«iºRoÔuK4_uÄËÚT7:ú²â³ôØ&Õ/ÛX¿Dÿ f[Ê¥Q Êèy±.yXÈ\#4ø4ÝgSð5xº÷U;Aw4fyR[keÙÕA
+¡þUÑÌò+éz®§§ëf×åÆþ=ôѼÏ3³-Ðrο¼KBR*÷UY²èW7àYîî|,¯}-Ü·öõ®ÙQ¶êU¶|
ùF08Åt QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@V~§6±ýccuùk¼{}½1±>{õÆ0:çÁ/3Åhó>ùYTí´.[ÔíU=ªJçþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE
+Èàâ4y|¬ªvÚ-êvªÀÕ%sÿ lñý ´?üÍÿ È´}³ÆôÐÿ ðs7ÿ "ÐAEsÿ lñý ´?üÍÿ È´}³ÆôÐÿ ðs7ÿ "ÐAXúõÄcÔ´ø÷ßØK½0S4Mıdã9_A!|ıÂÕ¶xÃþZþfÿ äZ>Ùãúhø9ÿ hbÂúßSÓ¯ìäó-n¢I¡}¤nF ©ÁädÖ¬W¦]x«HÖn´ìmo.£jVj©eó7Ù$K&ó»ëÀ\
;w>Ùãúhø9ÿ h ¢¹ÿ ¶xÃþZþfÿ äZ>Ùãúhø9ÿ h ¢¹ÿ ¶xÃþZþfÿ äZ>Ùãúhø9ÿ h ¨ád)QÄ
ÙÊ¢
1ã¹bI=É&°þÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE
+MKIÓuu·Õ4ûKèìwP¬ªdgû¹\ÿ Û<aÿ @-ÿ 3ò-lñý ´?üÍÿ È´¹$Ìð¼±FïïA(ÛJå}ÖaØÞ²õë4.MºÛI-`-ç 1Ä`¹ÇÝ*®W/R×¼U¦[¬h4²Hâ8-âÖ%2O!@mÎ$ ³ oã6âãHÐîu«Ì»±¨«öc²5ÉÚ¹8É$³33 u66úuv¶±ùp¦HI%ä³I,I$I$Ñ}ag©ÙÉgiݬßñ°ASÁÁ þöÏÐCÿ ÁÌßüGÛ<aÿ @-ÿ 3ò- nA6¶ñ[ÛÅ0D#5
+¨ ` Æ*JçþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ hûg?è¡ÿ àæoþE çþÙãúhø9ÿ kbÅï$³¯à£ñÁ11U'ôç X¢( ¢( ¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¨ç[yn.%"BòI#TP2I' ç4¯é³jZ[6=BÝÅÅfNT1!|rQÜw«V¥¯¥ÛßÀ²"L1Ê x£#N×VXv Õ®èúßýªØßù8ó>ÉpìÎq¤ã8=}
+eÛOây,¡7³Ô®$ùUû-àd1m0ÁÉ,eP :J(¨ÄðµÃÛ¬±ÑÞ0Ãr«ÔU=öJ ( ( ( ( §©jÚnn·¦¡ic8EêeK`ÄàcRXßÙêvqÞX]Áwk&vMDlppA
X¨ç[yn.%"BòI#TP2I' ç4A<7Vñ\[ËÐJã6®¤dGÎkçþ*ME¬÷%¾ô½=ê`@üQ¯Ïæm©T 4Ø&Õ/ÛX¿Dÿ f[Ê¥Q Êèy±.yXÈ\#4îTpÏ
+ÊXå@ì
ÊÅXqÜ0 ÄRPEPEPEPEPEPEPEPEPEPEPEPEP\ÿ ¿ä9âÏû
+Çÿ ¤VµÐW?áïùx³þ±ÿ é tQE QE QE QE QE QE QE QE QE ãH&ºð/míâiåÓ.R8ãRÌìb` Iã¹E yüSj׫øâïÊÍÆaö8"L PfÙU¤fd*J¶ÍÜ®èåäåÒµIµßìؼAeiqqäk{muvþÙíZÛ;¥½]n.æ51¨=² ò{ÛêÞñ½¢¶«¶6ú}´0>Ëx®)%UÎRÌFuÚw1¯um©ß]h«â´µ6¢ÄÜÅ1óåW¸>^ö"Tùá®Ä»º0× ]ÄÅ_ÇUÛksÙc¸÷2o±Éfê+ ( ( ( ( OÇ 6|?<RêP$yn4ëCs,*m§\ìòäà³*TýîÝk.}½ãÄw:A»p²Z]ÎíæÆ«m)¾0ÛvnòݸÚþ V~³©ÿ eiÏ4pý¦íó¥ ms6 XÁÁÆpIlaT3* <NÂ?Ãáï°éz½Í¶Øe¶º2ÇØØ7H\ݤæ¤Â¡k´GºðíàÒmß\ÃöyïfYåGqwæ²¼½ÜÒ«2Ån$¬ùî43û6)ÞY¼û˹~Ñu8]I6ª|«µB¢('
+2Y²ÇB<¿Á6Úí®µ ¹]q]Þà¾"¬M4Î$,ÀÙr*¨sWò@SêQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQ\½µ³øª[Ë»»ëè´è®å¶¶µ´¹kbL,cyã!ËP }
6»²E¹¼Ñ|"Ñ¿´ï§ó$³K©L~]ºl
+æÍ-´º¨m¥Ûrd<ÐQ\xºú]R
+ËF]P¤âæ9o<¸/ òá de¸FVU'«ÙbãÅBZv¾dò¥Õá¸+*ùLVVH¶È¬YXì}ªß&ðäü}¦ÆÞÖµdºÔï-4ÉÞµÔgUG
+N{sÀ<
+Ð0iþ°¸»WÔ§<Qæ¾åFp¢yÎBg¨ä
+Ê+ÅidÁ®ØGoxèÖ++p·9"
+¬É×ó%~`÷wf~·¯jPÁma¨[ǧêÞÙI ³»iX~Ûo£yD 1C)\ Áo(iEcøúâÞ++)<«½Jímb¨"!µ¤¹ÈÜ#M¹7íÈÛËÕl¦ð¾q®ÚêºßcO´ßEupfK¨æ
n#}aUËMÅC
+ ÖQ\?¼Eª'¼;w¬Xí±¹´´í¯wæÎòȨò&ÞÜ;7Î¥~m4zcá_
+Åao%楦Gqw·d~íR=ï,Á $d!,Î>P7 ë(®lx¢iÜi¶¶¾¼®é5·"ËXÙØÊå6Í\)cæ®Upû)ÿ oxoizzi°AZ\ا¸eùÒHxÛÊ>b
Á]ÛØ0ØQ\¾âÍr-:þ=2Ò5<ýæÖìÍ$+0óÓËÜ*Øvüç# °âãN¶ò×ìRD5¿$òY7##®(ÅQ@Q@Q@õ]6_K¸°¤D0$ñ7Ut$®¬)ì@=ª¾©MosâÆöW
+kt±°Ç'ãhäÛÛ¿i$©JçõoøëkßvÎH¾É©9ék¹â8Tfu8 bbìBÇÀAEPEPEPEPsÏ
+¼·Ç!y$ª($À sÇÒ Q½þÞ¾HeÙ,Vî¥L6ìàî`yß'ÀW -¿ñQêÍm×H°9Désu
¶ÙbdBvçs¤.Dn
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+çü=ÿ !ÏØV?ý"µ®¹ÿ ÈsÅöÿ Hh }?XÒo.¦ÑÍÔ¦g²»àHÀndUÀRWqO/%ÝÛ8¨äÒµ¡qm m.5hRhþÉ#íÖ)LdƲ/1!ÞÊwÿ *Qzÿ aÓ´eí-¯õ¥Ä±ô˼Q³s!@
I^¡¹ìyâO[ðí´:ö«ö¿.B³Ål$o-")T~t¸pwt!H+HÆá»Ëo&»s$uÄW&î8ØI$ª2ª[`±Á-ÈUjåÜü>¶{Û¨Dðüð^\KpúÕ²Iw ˺hÊÈA$+3 ¨(ûóþÙo|G
+î »ÑÒƶ·ÍMpìa ÃE¸í'¨T$eõ4¿Þj·VðC¡Ï,QËz¹Hå%hÑÕK®av;¼¶Ù´
,v
+Oé³k>Õô»vg½²Þ6¡
+p ÆO¡©53û_L6¢o&E+¤+¸,H²&åÈÊîEÈ2Éè0Ö¶XÒã+q©ÝZ¨g,åâDËUÊç(\m)æ;פ¸ÖnÄ?ÙvÚ¡îO8#F»¢R0ø19l²á@Û¼´wáÝKÄ%î¬m,.íP-vµÂC>ù,eûxÀÿ 1,6G¨x{X×®-oõ±´º´÷2ÅÕ¼ò³9Ib-Ô*
`åïñö¥%×íí´;G#Ϧ5Aä¬^k± ØûJ «¼d·Ì0Io/NËF®µ/"kUô¢}h§6v±Y1là WyÀQ¬iÚhÍö{¨%KiÂî1ȧ#T£ Adv\æ²æÓuíe°Úl:zºùÿ e/#ß*°;J°m¸d>nåv]Ãïv:ûV÷GNÛ$±Y\YÇçäIä;1¶þí·¼ áG ¹â©·Äèoõë9´Ãø~Þ;NXï·F¨ÈÒ(ß`RUï
+\ÆáÝy<?¢øV:h³ÓRÑêÒW2LÐtA.nEËîmÁNüúgaÖüàËöÓ´ÝJ{-(ÒÏSP`u(Û£Û[Ërè|DÕL´ÒÍÆi£Éq+jV÷[Ì+yfÚ¨ÈÀåo¯Ì2]H5ûÅþÕ·Ô,lï¬-ðâøµ±üÀ¥¥hÔ§0¾ï0ry >ËÂ7©iVT7ñùÁ´øP[ÚÊÜéíËäF|ÆVÝT2î.
+gNÖ&Ò{I ع8"¡cå°B\§>ð˱Ìc3í¼usyil ÐämB]Lé¯nò<*öv¸cGÙ´.ròÅCáwÉáÿ ojo§&åÝA¨\Y\(pE42ʤ¨Ü¢Yc
+P iÞÖ^±¿½Kf¶ÿ ½BÎáÖMW×ÏF9!ÆYöÚ¼15ÔX}³û:ÛûGÈûwhû>|¿3vÌó·9ÆyÅqþ$ñýÇ|A|tO:ÃD!oµ
i^H¢d»OñL¡²F»ÎT\Ó|cs{âvѦЮàØæ)¥Pò\Æ&Pî©åå² 6Ь¸uWÜüK×Qm:O
+ß5ðß1¶%O!Rv¬d2@ýCâsKï_[ßêPÁ£G%½ì&âKÍd³¤>PUÇçPäãjü˼å YEyÿ |s|±Õí`}FÒ/ô«Yd÷¦ßÎýèòR8آذܸR§p¯ øÓ]þëO½³mJK··´íAÄ÷ÙÜÂ˵-sݶ3,æ="áô¿Üj2Þ3èM¥ªEÔÿ k|öhãýÒí˨LÛ>M¬2Ä¢Øê#ÅWºöÙIJìyîÖ(¢Xá´s#,ý¤övÝè§ä ì*9àêÞ[{£ P¤È¡ÔAà8ÅyÜß/âÖh4ï´iºc6éæ[ bFH\»ðQ;;±©øÓ]¼Ó®Î¢ýË»³³iïîRF×"Ü#ø|ü6áµH >d '§;yôkÉdóKq V,óÂFaË_ P8¹^O/^ÊxµkçjV±%¼î²·Ù¯mY%NÒc-°[Lá£Ô`ÎÂÏÆy⣢ú5M±Ï3FÌ Â&Úìªb
+r$-¼©@EQ@Q@cê××y¦É²îâePÆÎ7ïp~]Ì˱w%¶ºÆëV5Oû+Ny£í7oí-mk°JÆ3Kc
+¡áTi:gölS¼³y÷rý¢êp»mTùW'j
DP2Nd³e}3N¶°³Ëµµ!
7µ £'Z±E QE QE QE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@ÿ cþιþÑò>Ãå?Ú>Ñ/ËÁÝ¿<mÆs1\¥xGZ3XIm©];¢¹[ûafDì\Þ±ïÁùçås_ðÆ¥ªi:Í´^"¾¶Ú\C¤én S$lª X|ͪX<ssOZ:®¾, ]¶mqæÞY]ÍlÍx¦7UEHѸWeùØ¥CÞÑ¥¿uwûtPÇ9áäv13²Iæ12y¿»+±6ãh¢çDðî¶wsÛùK±B¾FHò|ÖódÜMÅ]Ùò -\\ÔîïäÖHìöâÒ$2b^ÜÊöêL[ÖÚE<; m
³Ò&{ôí28§i¡Ô-gòç6xâKÄP*
+±¸jíÚ¥jCá
+ÞôÝÇi'×
+rÁ®%diÌ([i
+åT#32I&ÅΦ_ë1ÜOm#]Û$o»÷ÌcÝ$
3(mÅ Ü6ùצҢÒ/õMtí2"!óæ¶D×%eTIIg.Ùs&g(ß>@,H£@ðæ£qlòé?ÚS˾[1r·ú1s¨¦*&Pn-å& eèÞÐí/í¯a´Ï´rÖ»î%u¶Ê2YÆ
Xð¼|«-¼-£YÏc4{$°(mçbDÆÎyG9Îîr@Æ´íKFÒ ÆIníä+{æ,mYÚPs2¸_àåÛçÃÚû]ßZ[A%«²ú«wpC·k¨q*0WðHIáÕ}|IiÆLÇn/Ùʶxeex ä)©!ð¾¥
+ÚHãS·×¯-IJIq wf,H0
+*ÅÉà¹ná$¼´ðÏöc>hÖ¦å?st¿h;Ö5c2d*ÊxÞX0g
+Ï>Ô5û{DÓí£3¢J!»DϵùnPJD%̽c)ÐÐI«hv¹jVþ|pKç"e¶²À¹J»)S! ÏÃÚe½Ô v]Á½K¦0FÆiYO¾\ãæn>c?é7°ø¶ûUMÆ+¨Î.'BîYLaZ3¹¶®ðÂ]ÞY!!>^sÅËáO[³é|J5ÛÙnuî#fº³S- ¡fçÊeò²Ì(Ó-</¤ÙOñC;M¾zÉ5ܲ±cǽ±ÜÛ$eÉÉÚtDÛ^Ïúv
«jzòÅ$ª¡i8üÉ'/ÞvgY
À8EÉãõ^ßørÞÈØÏ?¢jÁÍÌd¤Ò¼MoÙÊá@1ÆQp~Tj5ÿ ÞýYDÒ ÎâeÇû#鬢!ÈÄfí·lào;ñüTÔ\xFÔoµRµ®©(y#Þñ©Aqp¬JRÃäg%py:JÓÄ|-¤ûr"È\ù-Ì
+ýYj,>pRB'uáÙ5m~eÓ'0^DË0û\y¹&D)å6?yîA at JÄDÏø|'«E,^hÿ mÓbÙeÓÄÆâ$kí±23·'lår"RËáh°ÿ 'ÿôÿ gýtê¿çÞÿ úaþ«ýÐDÓ¥ûNû|ý¦î+Ù~vù¦ËØÝxÇ·rsæöÕ Ñõ»ìͺ¬ÚÜsé«öß)¬@I"äb ñ7ÉT
+7¨LõCáÛ[}&k9á7·rKb!ó!bTùQ®ðGîÜËá½Ø
+h:gÙ¾Çk<b×a}²b®¶òÁ@qçËýÞv|´/´òTµ&»ÎT¼]tØ>bÉ\ì+1à\ÿ <9¨ßIâqö««ëIÖÊûí+Z
·]Ç3}ýû·Uy<{oâ]B{o2'Akö©#kFög%ZâMÓvÆÜd$É@:I´¯
+èBÕí¤HïoVëbyÓ<÷1 ?ËgŶãÝÊîf9ÔDÓ Ö%Õ£·Û}.ýòïcë·Ç"Oá÷9ò}cÀ¥Ï
¤±ÃÝ»[®E=´rÙIÐ#e1p©) ÇÌó8`»çõkË]V]þ&rÿ h´º¦øÛ )Ö}û¼Ã´É Úà"ù<2Ø7´ör¶³ÄÖÖYÀÐÞMG{¶m*àÝwýí®ë1âxsHÞKx¬c . ¹1ÆJ¨(!´`|½99Ç°¶Ã1{+[YÏR·ÊX>fO=§\Äöui[%ãÓ×ôNËIña"Ú[húó}³ÌÇ)ºgTß¡nP28$`Óþr³ÄÃÚ+É¢2®j ²ª®«Èª w
+àÛ'És$B}*VgT¸³dQ«ãÌmËeÚ«¸"ÿ ¦£ÿ Ûáÿ gÙ>Ïýöåÿ üý¿ÌÎï»òùÿ ññßeexE´Ò/×ÃñÏ%¬Z¼Û¿Û-ºÅ</ÈiÁÜU7y%c«®X_[êzuµýeÔI4/´ÈÀ8<:Õò~¿±¹Ñµ-g$´£C=©Êû2£&èÃHûæß0PÂ#¼HO=
åðö±5¤ö3Áý§/îâ2¤®FbS¡æ$H¾s3¨ª`¸ªpj¶7:4ZÂ\Æ4ù-ÅÒÜIò(®íçv6¼ów®Mü-usñ
+ëQ½{)²çÈ6ÆÜFÐ8(e|ɹü¼¹ãiäü áK¹î´øot8à³Ó^÷):+ ¡ ÜîAr9E%Üe7À=#HmF÷ûzú)!d°Y[º0Û³¹ç|\nC P\¶åPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ÿ ¿ä9âÏû
+Çÿ ¤VµÐW?áïùx³þ±ÿ é þ+ßí0ÚiÚÕä;ÂÇýr±\äù¦=¥F Êî,È©çï<i¬ý*æÚÎÅl§Óî¤ÇBgxbÚ6Âï¸3íTÚ
YÔ)î/¬mõ9-n£ó!|
+²°ÁVA ¬¹ü!¡Ü¥Ii'úH°¸Xy¬ìÄ0,åÕ_{e¨pCÐ?Äi®-nîáФ6ú}ÛoIÌf5IgTDdÏv(&áÆ2 1ë¾7Õ-gÓ®,¬ K 5Yì\ãÏ1$èѲ¬nêÍ,`Æ#_ha`§¤ÂúºZHcÔŵØ{_ÌÄL1aÌìÄ$Ôw ðíý໹Ó÷̲´ñ7 HÀxlFıbS¸W?2 vÿ ¦¼ìÚ
+ÈóNbT[mUdß60rP
Ue¾â[¸4ÿ j:Õ¼&pÄÛÄQÊFÊÁcx,ÎÊ[2î<!¡Û%âGi'úbF³¸ùl̤±*áÙzá±rKÕimåµg½r÷QÊL¢vdTbûÉÜYTn'ïI z¯µbj:ζW·
+ox¯CYVl¬¤ UNõÆ60Sºøqc£.£u¢IåûL,.VSjÒÂnÐÁiH¯[5tx[F·çì~s4SC#\Êó´©.ÍâBä2"~láP(Àâ£>ÐÞÝ!ÒI»3<¼n 2Êå·JG,¤"U ×<eªè^1¼±6ÝZIoj¶QÆò3y¯öfe|ÇÊàrV©wâ;«÷
îôÛHmãC$H·ÜIÌÌÁ Q$Óq0`Õè÷w s4wfâ;xíu¾d
áÁßó¸ßÄ;HfHt?ìûËô ³kE[y
$m@ªËÑp¬:²¤` È8üK4>½×®ãïN·¹70ÄJ#Ín]$NHBñ¶ÒyÁâ«Ïâëçñ=ƧhÑÜÜFò¨[Ï*0#ÖBÎv1 ý«hÚåGbSCCðÔ:Fs¦\\I¨Ápìd@0e*A,ç?Ç#ÈØ°3Ûáöý©â¼F-y;NeÈbÎdó&åXVøw?ÿ µôk8á°Kêòå"òüão)¬#ÁL³+1Â`o¨ïþ"_Çec¨¦äCi¨O«4ìÙ½Æ#¬~L7Ì#ù/*Û먽ð?µ
+«u¤A$+åmÐå³pUTÝ ÛòÐþ
+ÐecÖyÔJ&o>òiÓ.YÎü£²ÙÜTåU@ ÏOßêM¬1ÙO¥ê7º°G¨HüèÑ"W
+Z<y
+NÆ}qý¹«i7ryoåÝA&Ð6ðªØÇ̯£÷<¼mƣå[Þâ;
»îWyåógwmî
+-àLd c:ÉNMFBïpÓH¥w¨CPçqýÒ«;9̬\måH'wãcMñ~§oq§Ïw¼6övæßG!8ÂË,¤©Pï©â]jËÇ<VvOol¶)%Ñy¬.]ȶî8ÝÇÎÅ7.ü-£_O4×{ä_6b%uóID°~hÙb4gäm 5é:¦¢ugûYaCw,,ª¥ØÃk
+î76×uÎÖ r÷¾<½ÐSÄZ¦©¥ÎÚFw
+ÉûÈÄÐ -íÈr$a$±gP
+¬øÀçźö¬ê0]éÖ$6ö~U¹yF®K4-,lI1yn~èÜÝ$Ð¥Ó®tçÓ 672Å4¶Ø>[4B5A· P!m)È99®
+ÐcómgÍå.¾Ù7Ú¦ýçoó7#®íÙØvgh9¶ñÞªÚ£ÝYÙZM¥ÜéVpOq"ÎLÞsqPJÌøåFà«ìòÛw4-n_5ÕåÄözh´8ÄóÓD9>T½·7MXh-*ʶ³Äé6òhH¬ì¡6¸Ù·ÌFÜaa ZÏë£Ü]I¢Ë¤SÛìû<´$ªO VØWº$J¥`}GÄZÓøÞöÆ+Aª=ìzmËi¿iû4Uò<ÌíÜCca¯g㻹!Ðmô©/nõ+)¥ºD;§æL¹ìß1UèĪdn¢ß@±DµÒdw]ò·Ï$¨âA+²ãs{â$ç95^ÏÂ~¶Ö,ñº´[®%ejJ¨¥¢P@Q»ÀÀ~âëï=òØèÑâÆâm>áóh[È×$}Ì À$f 2F¼i®êú]¥³YÁw¬ÍÌÆâðE m2Cf7(vm ÿ >ì,ü-£iú_ÚÙùs´²Nzå²/.Âvùs.ün
+v·§kà?XÙ-¥¥µÝº#îY!Ô.Qò"mß³lqÛò/(À xù¬^K;]I´]ðɧÿ ¤*ܸ[vXR<y`F÷ ÌBîØÕÞxo[}wNy>Ë<R¥s:$Ã÷ ©Vn_âám3Á·7ö0Cmw£
+´Î; U`U'oÏF ÎÒEGiãïéZ&úDWs¾¶÷?Ù¿hwg¾¸Ö%WË8.vgáT và- uµõÃÞA¤i²l»æ¸T1³
+ûÜs2ì@ÝÉm®±ºÖ
¾§[XYÇåÚÚÄÂÚ QÉÀWÒtÏìاyfóï.åûEÔáv $Ú©ò®NÕ
+ d(ÉfË
+ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ +ð÷ü<Yÿ aXÿ ôÖº
+çü=ÿ !ÏØV?ý"µ ( ( ( ( ( ( ( ( ¹¯ëZm¥,Ú,÷·¿ggº
¥U_&Y2]Ns{ékø
ÓÃö?úIq@ðxÃþô?üÍÿ ÉÂEãùÿ Ðÿ ðW7ÿ $T4PßðxÃþô?üÍÿ ÉÂEãùÿ Ðÿ ðW7ÿ $T4PßðxÃþô?üÍÿ ÉÂEãùÿ Ðÿ ðW7ÿ $T4PßðxÃþô?üÍÿ ÉÂEãùÿ Ðÿ ðW7ÿ $T4P§ÖüUuo-½ÅÏæT)$ri2²º7 1\]
¥Õ¬ÒG¡Þ-M
+¬7tÒÇ4²ÈFÓqæb>}Ø
+½Á'²¢&ÿ Æóÿ ¡ÿ à®oþH£þ/Ïþÿ ¹¿ù"¡¢&ÿ Æóÿ ¡ÿ à®oþH£þ/Ïþÿ ¹¿ù"¡¢&ÿ Æóÿ ¡ÿ à®oþH£þ/Ïþÿ ¹¿ù"¡¢&ÿ Æóÿ ¡ÿ à®oþH£þ/Ïþÿ ¹¿ù"¡¢&ÿ Æóÿ ¡ÿ à®oþH®ËÃZÚÏ
tRácYïl¡¸c(g@Äqêk®³ÀòO<5ÿ `«_ý´ÐQE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@qºxoþ§ÿ I.+³®3âO
+ÿ ØTÿ é%Å cQE QE V6I§ÜXEÍó±ÁÛA§Gã<DWu#f²dðîw{uu¨ÚZß¼²Ú W0 E]¶xܸÇ.xî@)ê¾&{G-:êæ[k»{yjcGÀ,ëVLt8ÝA$zíåÖgcmÉ,--ËÄ6o, _39å~~z·ÃwiZiy·ROmqö¢-
aa»-¸ÃÈûÞÙ7,´O±ßCsöþ_Úþ]Ï2Ë×?÷ùÏ(â8"$\Y^@ΡTP× º Ú7eNé#aÆqÃ"×nfñ¦t»¨# ¤¦
+2ñ0üÝË(ÎC
ÎOys¬Éuj³G³-$k¤¦mÿ ¼}ñFK|¹N`W^-.ûûRÒþçPY"häE¶Ø¥_Ë 'ÌJàÆÌ[9n Kw«á¶KK«HÖY
+§ÉF$ [;_~^ÑÄm×6S¼PMp'8bi3n`XíBHMÇ*
+t»æ¼û\PÏ4ÁtÂÛvB!£°2?ÞÞ>ï9w¾ö9"x%Vx×Ìh¼ÂK~íÿ yØlìC0 at 5§×mm§ºYcAh¤Ïr±î6 æ8ù³°Î6òwUË;¦»»ÚÏm"¶ÖuëÕIV#$vêÏ¢\M©Ç}-ò¤ËÏ6uI2T©9$¸F
+óàî b¬hÚ_öMþ#¾Bû Ê> Äi´q2rÌǾ(F( ( ºÏÉ<ð×ýôR×']g?äxkþÁV¿ú)h ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+ã>!tðßý
Oþ\Wg\×ô]KY¶ÒÎ-{+ß´2]LÑ+/,x¨Ç9 sTßðøÃþ|4?üMÿ ÈôÂ;ãùðÐÿ ði7ÿ #Ð4TßðøÃþ|4?üMÿ ÈôÂ;ãùðÐÿ ði7ÿ #Ð4TßðøÃþ|4?üMÿ ÈôÂ;ãùðÐÿ ði7ÿ #Ð4TßðøÃþ|4?üMÿ ÈôÂ;ãùðÐÿ ði7ÿ #Ð4TßðøÃþ|4?üMÿ ÈõNËOñUõÖ£o£°¸òÔåÁcråÑúmG8ä© þßÏÿ I¿ùøG|aÿ >þ
+&ÿ äz þßÏÿ I¿ùøG|aÿ >þ
+&ÿ äz þßÏÿ I¿ùøG|aÿ >þ
+&ÿ äz þßÏÿ I¿ùøG|aÿ >þ
+&ÿ äz ºÏÉ<ð×ýôR×3ÿ ï?çÃCÿ Á¤ßü]´Ù´o
+é]ÃFÓÙYCo#FIRÈI ã#ÐP¥Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQE QE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQE QE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQE QE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQE QE QE QE QE QE QE QE QE QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´ÐQEgêpëù_Ù7Ö6¸Ïö»7¸ÝÓÛ*c¿\ç#¦9 Т¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¢¹ÿ ±øÃþºþ ¦ÿ äª>Çãúèø&ÿ ¨ ¯#ÐäÐlµ-^þãYðť京yvÚ¬*²ÎK±$(Ý(ü£#ï>Çãúèø&ÿ ¨û?è;¡ÿ àoþJ ;ñõËOØý¦ú;
+f=2M¶EBf¶V¹à
YänXGö~Ï6§
®5mQôä\ò[TþÓ¹¿¼¶X§k·¸Þ&Ê»
+»{Yrv!°û?è;¡ÿ àoþJ¬? Úø©´{³£"ißIïµÍ¸ä\dØ2qËé>,Ô¼A
5KÝJ4Ô¦¸¸¸MÁ¥[,YÝy.?yL>Çfi3Ê
"½ÁZÞ§£L÷wß®8îât9j¶RTTY@,T°DÁR¸%K4cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉT}ÆôÐÿ ðM7ÿ %PAEsÿ cñýt?üMÿ ÉU±bÙÆ·óÁ=ÐÎù ÄÉƳÆ?úñÒ,QE QE QE QE W?áïùx³þ±ÿ étÏø{þC,ÿ °¬úEk@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþ
+ÿ Ïý
u/ý-º
+çüÿ ;û
+ê_ú[5 tQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE Ïø{þC,ÿ °¬úEk]sþÿ ç?ì+þZÐAErÿ a·ñ>½«ÇªGö
+6Xí#±G1$Í$÷dÏ
+ᶷ)$|0-ì´H£·:À¶µ¶*´9$y.cbQHÀ}ÂîôÒQ\]çµëMZËÃê4ÙuI®#Wº1:@aWî,ZÙ²`Ì»ÿ w¡ãO²jwt ðå
Öå¥Ìzù&òCH|±æfðà>iÉoäùÀ;+Yæñ7 ¼Ò%ØßÛÃsÆ61¶×1\Ë.Szä¦íËró.¥ Eð̹në7"{ËI1Nï
+¹X÷ (èW7wâYïæÑíãÔí,tƺo 72(r (¬X`K
+\þ±ë×
+ñŦ¯¦Ý$ZeËý¶ÊÙíÞÊhÕIãiÖR¬Ä}ÓON@ D¢¸½WÅ3iW±è·Þ"ðþ¨%ºÝMy})UÝÕ(À6Ìdãwü
¿õ-~m-é±%õ½ëËq6ëF·(a_5°ILÆ
+0iEqpx^ûZ¥ÀÓEjcKâ2vûWÙLÁËb!¸îòöÉÂã~[+¡
+ë¾*G»2>ÊÊ;ÖFUºyEPûHÊ*à (ÛüÞGÊ2ÒQ^gã«5ð´Z"hvñÇo¨ëvÙÞkGn²ÒhÝ@"¹u`7w êkºý³Òµ¡c5ÍݥżÖðÉ ¶ÈÁÈÄ2ce!nC(ówW«øÖmnöÂ-sÃúkéΩ,´ÁéL!Þ<´Úê<¯ÉoäùäÑ<Mªx£Gĺ,"MÞ]ñâîp¬Ud6Ô!Ú2é¼ì ì(¯;Zñ¬kÎú
£X`[yÒØM*ièm"HûeÀ¾à
+!°Jê4ëjïK/¿MO´Ba¼"»fòÙäEåNÖT ²û¹EPEPEPEP\ÿ äsÿ a]Kÿ Kf®¹ÿ ÿ ÈçþºþÍ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿ ç?ì+þZ×A\ÿ ¿ä9âÏû
+Çÿ ¤V´cPÑ®$ÔN©¥êb¿h<ÈDÐÌX¨2òù±Óù· W^\Ä·7¯«Å(Þâ8JÁ*º °?)Y6X³o8eÛËO¯.¨#MÓ_OÞ Îú¬»xÜ|± àoç<Wñ
+¿~Ã¥ê67VÚÂÇ»{v3á·!T«6Aä ôÈü/4µ±úY^+soÃ<i!v*¸w$$3¡l\è·Ésq¤jqØ¥ó¼W¶ó¸EO2"X}£æ¿"¿{þ±u%µ»ww¥Áo{<w¶VÐOq~%£(
ò&>©Æñyâ{PÒukØʺV£tÒD!¼G¹·yh¦G2D{HGL]àÖ/t{{Ýt×yÖ8ü³¾iyãehßsçs+*·Í»$|ÀAǼ²ÔÖÄZ}´±Ü}LÒfYDuhò³(p
Pr£'nàyôñÿ Ä+6¥ciz¬m¹ÞÌ,á"w@¯_|(é _-kcûfõþhÉw:]}Áy FÛÅÙ<¸vËÁ2^ Iá_ ®à©t¼Ýéóߣ¼ÞUÓ<¶
Ô*FÜÅ5aÁòÁÇ4MàéµkÛzöÒiîtÉ´¿3O²6Ì!Û¼
*
+ô¹ø;¸ÇѵsÄ3hÖZÑÞÞüÞKhLïäÍÂêÌAxäWݳk,»®?¼O}â{ÏßjZn¹½k.;|- û-È}ä!Îä!TÞ>¬ WP·Õ,cÕÞ!ou)°vhÕyÛ{`ÁÜÙåÙbßAû>§ßÙçkKKv3ï+M$N\· `Ä~PØB^ñ3^½Eñe²êUÔq}ÓHÛú]«ÂlûJù³ÌæF
+<AÚù|M«ÿ ÂUzº}ÌzÙ¶ðååälB°½ëPª \GX7;pÚÂ1ÿ ?ì߶ÌWûKÌò¿é÷í[1øsïÕsUÒúâÞúÒòK-BÕ!QdRT´nÕG;J·ËËÏĺ¹·´[ÏÚ%«=ÁRµQv·2 Ê°5±Wo(*¶årißj׺'<P,üCþýª)R2ò²@Q#?Xr/6È
$f ë5Ýë µrC©+ÄaÞÙ#ÙRx¦am¸åäÈÒ`*süCa0M}[R´¼Ö¤½´ÊhL¹[Ëyg)wg F¬íP`/Ì[?ãP á9RÎ0÷h at 1
Æçh%Ô6 Ïqóm"¿<EâMYNUæî+(ïáó`¸ÚUû*)ÝËXHÀËIU ¸¹ÑoþæãHÔã±Kçx¯mç1pdD°ûGÌ~E;~öúðøbæɧêÒ[è²;I,]î·;p%÷ ÌI$p]öºü»)ésA7ÄíRxµ>;Ê{xâ(ñùèBîeäßälËé)ׯõ«=oË[˵ 4ân<U4hÌp_Ëiqu`´Ú\øwR]ZæûKÖ#µÜÆ[f4¶DÝ à mØjM/÷]ç}W×Ú_]Kmh#c*ÆY¶ïHðIf;пÚÖµ¬ÛÝˬOi#ìÌP±fµy?îÐ!L(òy'{ËYsø³Q³éÇXÞîµ7¸Iw[ªÞDÏ
+Lkä¹"FR¡OÁÕN@="ó;OxãWÐàû]¢Á"GóLpuÏ$r4j±1,HC
+"Èʶ,Õ®5ohó]ê_jºmêK« /ØnKS%¾å |å¶dOãc¹péW¯õ"76¶á/þÇìÊ>ͧ%ÜÒÏsÈ.ü)Mêv|Ûù5ÚM¨êqü<ä×vó¢Îv¤q½@Á$.ª+y
+öç ë(¯ÐukgÇzD÷³A-ÜRÁÃVòß (;ãòäC+]'µ}}<E{§h×ñÉröRÆ»ãÈgIY]GÉæ_;y,"1îËòó{ïêhpkzÙíïnåÆÚ[m¯<)#ܽivVÝÉ'È¢2N<:γ£éIi¥k0JßÚº¯5ó¢ÿ ¤%×îíÈ.Òi<¥UùØÊ Z ö
+çüÿ ;û
+ê_ú[5q÷~!×mµÕÖgo*-fù!haØ¢ÊçËwÊß?;þQµÜð¥vÞ!ÖtãyÅ¢Þêy1ºHmX^>íU1ÜÅUÂ
+*ÀEy~§âýZÂóÄñŨâ8tûùmåâ3ÚÜB3ùkíWQ,¤2GoÆ¡¯k:W{â&Ôië~/M÷M#"Z*9XÁ36ÒéWÙøQ3êRYÆÙ0²3XÉ´êNI gÌ8ù¶M<_©4ú"KâO*øõéöÛìBX²Sn´x{¸0&=bñ½;ĺ¼6ÝìZi!×e³B7j1Çon°ìùJHò V'eÝÞ5S^É@Q@Q@Q@Q@ħuÛ©n§=¼7sÛ#ͪ:3yR´e'=iÿ ðxþ
ý#ÿ ò5 vtWÿ G¿è_Ò?ðq'ÿ #Qÿ G¿è_Ò?ðq'ÿ #PgEqðxþ
ý#ÿ ò5ðxþ
ý#ÿ ò5 vtWÿ G¿è_Ò?ðq'ÿ #Qÿ G¿è_Ò?ðq'ÿ #PgEqðxþ
ý#ÿ ò5ðxþ
ý#ÿ ò5 vtVOµuí/çµKY|éàxS*Wá®A)kPEPEPEPEP\ÿ ¿ä9âÏû
+Çÿ ¤VµÐW?áïùx³þ±ÿ é tQE QE QE QE ¸K3:#"HTnUb zJ©#¾ÑéRQ@Q@Q@Q@Q@Q@ï¬mõ+9-.ãómäÀ2Ä µ±ÕN0TðÀA±E Ts·6òÀæ@!F1ÈÈÀH*}Áv®[þ°ó\%·5à¸ÜÍZ
vÚ6 4Á±¹OP(ÿ ÞoúõÏûîÏÿ (©mmâ··8`GjQ@À TÉÂo7ý
+zçý÷gÿ ÉÂo7ý
+zçý÷gÿ ÉÒß_Ùér^_ÝÁik7Í<4\Xð2Hs~ Õ´ÝKG½K
+BÒéãÔïÖ Ê«ÝÌÈN{EV¿ñRêzuÍ
çõÉ-n¢xfO6ÐnF0ȸÈÈ'¥r
+ ÿ
áù¬5Ë{6czDcý~@´gÁ аQ\ü&óЧ®ßvüGü&óЧ®ßvü@mÉÂo7ý
+zçý÷gÿ ÉÂo7ý
+zçý÷gÿ ÉÖÑYñ~ ñÒÊîÎKK³Ë
+׸6ÄQHÛ"÷õz (¢ (¢ (¢ (¢ ð ø¦ïUµ²yn´ÙåÔn®¦¸²¶B&³ß$²ïov£ýb|ÇøºñvñÜKi|N©%«ÕÍÌm$qEF-eí`
+ÂtÏìO
+ǤùÞwØnîí¼Ý»wì¹wc'ÆqT¬|oaqBö1,
+$zÇ+¤SG'ï¤É.ÇÊ#hÉ$©à Iã?Éy'³ÔmÌ~võí¾ÙTÚAÁÜw6T]½×ÒÇWÇÉâc&xQCHÏç³
û°±ÁÛ½X°Ç~ÑiqÛ¶ùÖÚ¼¬ãír3÷¿Çj³ªxyµ»»
Ø`
º´ÂÂ6¾u$nÊÁR
+2(Ñ× 7°ZÇmw)8å<
u8q¬8S·i-´sYñx¶Üiv·oos:¯îå5E·Ôì¬ùÇÊçj#iëÆfÃ,úSçu°TQ,ñ¸%H$¬Ü/$È!$ðJ\z|Z,Riiw
íË4F¬ Çó-ù;ÇÝã
+?ÚÞ^ºÚÝÆs5¢O,`FóF_r/9<FÌp1ÙZµ¤þÓÎ++¹)îbU1Ã#*°V· !JÜÅQáùcÔAx-µýÍò3ÂYKJ'Âp¦^vöÏ®wqqk~ZÝL·7H]Q
+å°ªV5'Á@)[x¡´íNîÂåÖ[ï/&·@"·VMÌ~fé½W7WÄ6/¦+ìíVk¶1¸rAVa-WpÖ-ß"¼Òìtùî-§ì\ÜZ UWi·îd`yoî§/:vz
+Ì:
ÕôÚ}¦xLm-ªÂÌÇ3ä°rÄy*òI á½ÐºðкjWÁã0UÔ~ëcp©# äëkø[§føBTóùëyj6ÅÙÝ6ÄìOvÜny®Ö
+(¢
+(¢
+(¢
+(¢
+çü=ÿ !ÏØV?ý"µ®¹ÿ ÈsÅöÿ Hh ¢( ¢¹ÿ ^ÞXxiæ°º{[»´LȲ\G`8+¬z\ÿ ®ÿ Ðß«ÿ ß?þ1@Eyÿ ®ÿ Ðß«ÿ ß?þ1G®ÿ Ðß«ÿ ß?þ1@Eyÿ ®ÿ Ðß«ÿ ß?þ1G®ÿ Ðß«ÿ ß?þ1@Eyÿ ®ÿ Ðß«ÿ ß?þ1G®ÿ Ðß«ÿ ß?þ1@Eyÿ ®ÿ Ðß«ÿ ß?þ1G®ÿ Ðß«ÿ ß?þ1@Ey½ÕÖ½¦½ãÄú¶¡iÃ4»]$¸6l ýÖ=¯H ( ( ( ( 9Ðÿ ãÚÿ þºþÍO×o¥Òü=©ê*4¶¶ÎÁ*YP°Î1ÆE3Cÿ kÿ û
+êúW5M¬Xjèúwå}®ÚH<Í»¶oR¹ÆFq ;OE×søEÕb´´åàÓ"P¨2O3?ã äEYŶ°\y
+§ê>i9BBñ$@ä¬Ìª¶Þ2 WØû+XÔt½GOÔ5;îÒKpmì^6FuÛ»[ xã>¢¤Ô4·^]Ü-æÔF<¼{y^UcÈÜ¥88ßÅñEûát÷c6Ò$¾QUà pbḮuTXϼVw7S+ºAo°6Å*²ì«]3pqJßÃòÔ%ÒßépGo³pª¥Q·iä¶H=3Ä÷ºeô×v÷Ö׶Ñ^À³D%³<f)[C©Ü<´·cï|¼ UÄSÍ=òE¦]ÝùW+1Áfd%üÖPq´ßìü¬E¨¼Cis=ªZEssÄ1\¢å9I3ÃníÁ-´sYk&îí®ÚI¼Ó£d'{0ȹÈa6ó/4I¤EöÔ1iÄÆÜyÊFÐg*YB¤Cp&4ô^-^>{âeY!TfUÔx }ÓnQ
+ÉÑ´VÒ§¼îV¹`H
+±1ÔpÒ¶ïÀPÛWåj Áñóâoû
+¯þ[W[\?ãçÄßö_ý$¶®¶
+(¢
+(¢
+(¢
+(¢8ðv»k-г״ä·î{I´·v_6V©a:äg¥?þÐÁ¤àOþI®Î ã?áñ7ýGþ äÿ ä?áñ7ýGþ äÿ äìè 3þÐÁ¤àOþI£þÐÁ¤àOþI®Î ã?áñ7ýGþ äÿ ä?áñ7ýGþ äÿ äìè 3þÐÁ¤àOþI£þÐÁ¤àOþI®Î ÉðÖ.¢%÷Iu/<ï*DbRÒÊò)fÀñÔôj( ( ( ( ( ¹ÿ ÈsÅöÿ Hk ®Ãßòñgý
cÿ Ò+Z è(¢ æ|}ÿ "°ÿ °ÿ ¥×9⥷ðµ<<RÇa;¤ÅYXFÄGB
+t~>ÿ XØGOÿ ÒÈk2òÒû+;ó-î#h¥L¹X`Gµ rM&¡£Yjz¥£iok§O+CªÞý§Í@hÊâY
+¨ nW;®>[C[Ö"y.Öþ 7,Í1²
+'QÊ|ÞY?.ì/GyiýÅÊy÷´R¦Hܬ0FG#ڪˢXM¨ç
Ì»ÊFî¸Úí;A#jàü£ ãøî·¶÷RÏs¨7ìwØXn|°¾Z6áÀç;Wn Á ]Óµ]wZYf¶ÒÃÉò£ÖîyÞå$°eÆß7
+å¹welÚørÓcü¸¹O9ÖâH34#
+±PXÁ¶© ´<=¥ÌS¥¯åìÛr2BJ ØYB® RFÕÇÝ ÉÒõ;ë_5äÒ¥ÅíÄ6dVÆéYbXàFâÝÏóS±ÖíÅýÍ£yzuì¥Ú$ÚÖåYÁݳg-ܨÓÃúu¶4èâìD½Ä°+R¤±*ÊO#jàü«ipÿ ˯LrDí<)dÙ¼9rKäFæÎ8â9ø¼OªÉö«dO6X<{¯ìü¤ÍñìÇÌæ«c÷Ƴ§.µx/tÜD³¹&óybàªL *cå*]z\(ÚrjøEt®¥.Ú^Ó5ôí(ôÄ
÷|À`ðÀáÛ6[CÓZ{i~ÈmR4M¨r !X!årÓÊàÐ5Ïøö°ÿ °®ÿ ¥p×£Wëñíaÿ a]?ÿ Já¯F ( ( ( ( %<®ÚËt,õí9-æ»åm-Ýͤ*XN à¹ÀéOÿ _Äßô0iø'ÿ k³¢8ÏøEüMÿ Cÿ y?ù&øEüMÿ Cÿ y?ù&»:(ÿ _Äßô0iø'ÿ hÿ _Äßô0iø'ÿ k³¢8ÏøEüMÿ Cÿ y?ù&øEüMÿ Cÿ y?ù&»:(ÿ _Äßô0iø'ÿ hÿ _Äßô0iø'ÿ k³¢0¼3¡]hqjòúËÛ¿´»ÃnaUýÔq
+]ÏHÁÎ{ÖíPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ÿ ¿ä9âÏû
+Çÿ ¤VµÐW?áïùx³þ±ÿ é tQE RÕt«=oN{øÞKwdrW#R`C(<Õÿ
ë«ÿ àêóÿ ×ME s?ðè^º¿þ¯?øíðè^º¿þ¯?øítÔP3ÿ
ë«ÿ àêóÿ Ñÿ
ë«ÿ àêóÿ ×ME s?ðè^º¿þ¯?øíðè^º¿þ¯?øítÔP3ÿ
ë«ÿ àêóÿ Ñÿ
ë«ÿ àêóÿ ×ME sQøAx&)¨ÈÐÊ"ͪÝH»Ñ)*ÒpÀAé]-PEPExç
¼-áëh³Ï érË%ò=lÌÆ5$G$»}¡x/KgÔ4Ò&mKxcRØ' s* õj+Ëáð·
. x4X¤Pé"YÄÊÊFAA'ü"ÿ ¡wHÿ À(ÿ ø ôÊ+Ìÿ áðÏýºGþGÿ ÄÑÿ è]Ò?ð
+?þ&=2òóáo
+,éÐtQ+«:ÆlâÜʲçê=jOøD<3ÿ Bîÿ Qÿ ñ4éWÿ Â!áútüÿ £þÿ л¤àüM zeÏøþIç¿ìkÿ ¢º
+ (¢ (¢ (¢ óÄ^0ÕtK
+Gíú_k¶/û.fÙ½Cc?hÆzâ®ÿ iøÃþzþ
+¦ÿ äÌðüZýÿ ôZÔÞ#»ÃÂú½å³ùwöSKନH8<Gz »ý§ãú èø*ÿ hþÓñýô?üMÿ É5©êsØkvè©4ÖãN»¹{xc
+$C´(ê[ÀòOÒ©Oâä¶Ñ-¯¥roßÚ*m
fÝçíÈ\#/)ãÇÍ@ö?è'¡ÿ àªoþI£ûOÆôÐÿ ðU7ÿ $Öâ×o[$h,×Ip0|É¢!02à´9SÀ*I;H
+×WU»V¸·µ°Immf[{LûdÈB¸e"KÃ`
+ÀÚ~0ÿ ÿ ©¿ù&í?ÐOCÿ ÁTßü\ã)"²ÐWP6[ÛkMÅîÑ.&yñÀ)¹¹9R6¾7hIâC©d
laÍÀß°4ëÅæ@ãpòÕã
¿Ú~0ÿ ÿ ©¿ù&í?ÐOCÿ ÁTßüQé×M}§ÁrÑ¢v#Hvea÷AàF at 9Õ lxOT¼Ö<>wþAº7092ÞTòFRÌFBµ·\ÏäV?öÔ?ô²jé¨ ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ®Ãßòñgý
cÿ Ò+Zè+ð÷ü<Yÿ aXÿ ôÖ:
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢<ÏÂò%h?ö·ÿ ÑkUu¸´ÏÝ^_]ÛYE%pÙ]^å$»ä2/$`ä¹Rá8ÎÂV
¼Sáëh°O¯iqKñ½äjÊÂ5O×ÿ ¿Ã?ô1iøÿ @Z5ÕƨèÅæ{xöêRK
+¤ml¼wQª³ÆIJIb ÎKXÈ5;k§M¥s$þLëíLÿ f\[¤ Únr(Úã°ÿ ¿Ã?ô1iøÿ Gü%þÿ ¡Hÿ ÀØÿ øª äZ´½ñ\ÿ kÖ®íôfãL"¹q¹«¡$ÃnͨÝÙ5ÕÃŨlQÿ rEg`0cD¿7v±mÈOøRMRßP>$ÒüØ!ú-¥]yë×SV¿á/ðÏýZGþÇÿ ÅP1}we强v¡wwf¶Wj³¦` ËhòIyb~(²ßT]í$Õ-£¶ývcU¢c7|Å_4I=YYÇÕÂ_áú´ü
+ÿ £þÿ ÿ ÐŤàlüU di·ò¿m[«é$aÌc0"k}¡6îHÂ>ì+þÿ ÿ ÐŤàlüUðøgþ-#ÿ cÿ ⨬ð'üÏ
+Ø*×ÿ E-tÏøþIç¿ìkÿ ¢º
+ (¢ (¢ (¢ ó?È ÿ Ø:ßÿ EiÞZAeqgre½Äm©7+Èàö~øvÞà5H¢B$i¬^*ª ð §ÿ ¡zêÿ ø:¼ÿ ã´ÎA¡ç¼Ô¯¯¥0¼ $¬´Hä
+bTÁ%SHÚ0G9gü#ýþ?®þÛöµ}»÷~oåù[¶ìòÿ ÕüÙs÷¾jé¿áнuü^ñÚ?áнuü^ñÚ çí´TµâhïnÍÍŲ@ó»+0ÚÒ0qÀlÊÇÚ0 P(m?´ä¼öîE{hDsHªªÝã@@`¤/ å³Ð¡zêÿ ø:¼ÿ ã´Â¡zêÿ ø:¼ÿ ã´ÇÅàë[{H-ïE1©%ERJ¹|¸Î
+J©»&s\ëá++,%¶ÜÊí°ã$D;_ráv=ü :®¯ÿ «Ïþ;Gü :®¯ÿ «Ïþ;@}ZuÛDÎÀ3»;¹Ýس±ÆK18 Uª»ÿ
ë«ÿ àêóÿ Ñÿ
ë«ÿ àêóÿ Ðàùýuý,ºj¥¥iVz&¼vèÎà<¯#v.ijÄby=êí QE QE QE QE QE QE QE QE Ïø{þC,ÿ °¬úEk]sþÿ ç?ì+þZÐAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEsº¿SKÖ[KGÔ¯çKxîLU]T2D9ÌmÐÕSþy¿èS×?ï»?þH ¶ä¿á7þ
=sþû³ÿ ä?á7þ
=sþû³ÿ ä ëh®Kþy¿èS×?ï»?þH£þy¿èS×?ï»?þH ¶ä¿á7þ
=sþû³ÿ ä?á7þ
=sþû³ÿ ä ëh®Kþy¿èS×?ï»?þH£þy¿èS×?ï»?þH ¶çt¦©¬®&©XNöò\#]
+²£"°\s¨ë¢ ( ( ( ( ( ( ( ( ( ( ( ¹ÿ ÈsÅöÿ Hk ®Ãßòñgý
cÿ Ò+Z è(¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ áµ?ù(zý¬¿ômÕMPêòPõûYèÛª2u=NúßT³Óôû+kn!rn.ZU£^Èù$È=:Púì6 z¶Ë{¢»åKa$ñ ;ÈlRù(ù[´f©áû]c[±¹¿´´»´·¶3ÄbOÚ"¬pzóîj¯á멾Ûo§Gi¦¡§& f1ýÌUH~%?.P
+x Ö[°P/3w*¹±µ@6+®NåÀùKínÃMaºÕ¶ïr»¬I7ÈÊx?3>VçËú]Bé#6ßb»¿·¿f´^WÈn |Û7ßilõõFÔ-#±óní!·K3·diráz3)àùtr7| EâKO² ®dv¹¸!'¸2´eö¢ÛòN0Flîi·ÚÁvÉ"F at Z6Êï
+
+¥|ûs»oÍsXÓh:¢XÇ2$ª.îæ{t¾Ð73HæÆ¥²ªÄÆÒXü£&
áíGI¸±O6Ù ¶
aHd7*ùj#òn;QüÀw ¢>Tn µ©æ}3ËÁ9F]Êsµ× nFÁë`à»XÚy¦}¡'xRÜíXmáÞ5ÆrêÕP"ªàÙ tÏù(zwý¯ômw5ÃiòPôïû^ÿ èÛZîh ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¬½+MÇQ×.%hÊ_ÞÄAIÈQoXn:îà Ô¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢8íoDפñTú¦<ÙAnËuxð²´o3dmÁJ;«ÿ fxÃþþ
+fÿ äjîh û3ÆôÐÿ ðk7ÿ #Qýãúhø5ÿ «¹¢8oìÏÐ3Cÿ Á¬ßüGög?è¡ÿ àÖoþF®æ ῳ<aÿ @Íÿ ³ò5Ù0ÿ fÿ Y¿ù»(þÌñý4?üÍÿ ÈÔfxÃþþ
+fÿ äjîh ;DÑ5èüU©ªA¦ÁSÛªÚÞ<ÌÍ#ÂÙ;¢@ 種Æ( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢(ÿÙ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.htm
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.htm (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.htm 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>Slide 3</title>
+</head>
+<body text=#000000 bgcolor=#FFFFFF link=#000080 vlink=#800000 alink=#000080>
+<center>
+<a href="img0.htm"><img src="first1.gif" border=0 alt="First page"></a> <a href="img1.htm"><img src="prev1.gif" border=0 alt="Back"></a> <img src="next0.gif" border=0 alt="Continue"> <img src="last0.gif" border=0 alt="Last page"> <a href="standards.htm"><img src="index.gif" border=0 alt="Overview"></a> </center><br>
+<center><img src="img2.jpg"></center>
+</body>
+</html>
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.jpg
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.jpg (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/img2.jpg 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,361 @@
+ÿØÿà JFIF ÿÛ C
+
+ $.' ",#(7),01444'9=82<.342ÿÛ C
+
+2!!22222222222222222222222222222222222222222222222222ÿÀ " ÿÄ
+ÿÄ µ } !1AQa"q2¡#B±ÁRÑð$3br
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ
+ÿÄ µ w !1AQaq"2B¡±Á #3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ? ÷ú(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢)êZ¶£[Æ©¨ZXÀÎdºbRØ' ±8ãØÕ}7ĺ³pÖú^·¦ßN¨]£µºIX.@É
+IÆH÷æ´wüÍ?þ±ÿ è©kñÝÇ|[ýgð¿Jó|C
+ØÎÒ¬^×É`nvÚùÌd9ápy\òô}åþ1øy§xÓþM
+´;{¨bY®¯õ»£äåãå,ÄÈ*[ï ú·ÆmR0xËO±]N-Wû.ò9θ&GåNÔ ÑEyþ!øßÂ~:Ö©¡i¶ºÇÙ¡µÌÊ-LêK$¾å#<>èÍGqñâm</s èm}ªÚ(RâAö\Çý`÷v>SÚ=ryáµ·ââXá$/$0UE$x sQØßÙêvqÞX]Áwk&vMDlppA
y^ã½WÄ^ø§xNÓZïA·¸O²©RoÆcnCC}+â9ð¿ÂÃ¥éºmæ±q<PyòH,UnwÙñó÷¸Ëà éEyÿ üWâ]{\Ô¬µaáËËxãÔ4;å7àd.ÏÈÝBÿ «n¹¸±ñÄzÕ¾¡©è2xFÖÎ*ÚÃW¼ò¯ePçæELÄõÁb2@=¢M[MTKP´MBdߣL¢W^yTÎHù[;J¹^G}©~>x>+í
+Ò
+B}Ë$4-«¸-q A(sÓ/<yâÍ{Åæàm/J=+uq¨Hÿ ¿"»[rȹ$©ÛÊ1P¢¼oZøÕsÿ
+¶ËÅ%¢]É©ýæÖë|« ØïÃfIPÇÌGQZg<YÅ
+7¾#Òô¨#Õ-ê´ÚKaeYü®ÃÊe;@AÇÔ(¯Õ¾,kW%×ôý_XÁ£9®½tbîU.Êêã)Ou$Ø_L𮣨êþÓµ
+ZÒ[éâ$vó¬Ñxde$a'±ÐÈõm6mRm.-BÑõS|¶2Qxå9æ^Hî=hÔµm7F·[SP´±"Éu2Ä¥°Nbp DZ¯<C¬ÞxsöÕ5¨eÙN¤Ä«jñÁªrø2) gæ
+pqGí
+¬Þj:Äze³îÓ4(]
%qu:» `N÷qä70'PÑôWëþ8קñãx3Áö:lÚ
½¸º¼ºÔdq
+GÜÚ ~he-÷ñ ôo+/¼G¨ë|vz·_ȼ³Fuy~êá¡å½[n2IÐ jZ¶£[Æ©¨ZXÀÎdºbRØ' ±8ãØÕÊù£âv¹ã]sá¨xMÒ¡°¿»æÚK<»jȬ[;Õ·§¤6 z?~'^iÞ4ÿ SCmÞêk«ýnèÃ9ùxùK12
+ûÄc@¢jZ¶£[Æ©¨ZXÀÎdºbRØ' ±8ãØÕÊùÓâ_[Æ¿,¯§¶Þò×][;µE&! ¡ä÷ ?EÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPñgÁZ<+k¥ésÚC<W©pÍtìªT#®Õc¸íë]åPøÇáæ£ãOøJô5Ðî.¦aº°ÖíLÐMG« # (_ºNy åë 5ýK᥷QÑPþÓ[ù^;5³GP 'ÎC¼T:ã W²Q@Åj^<ð®¥Ïiñ^¥Ã5Ó²©P¸Urã·¯µ+ïº"ÐiöMo,líæ"aqÞ/R:Ǽ¢<¿Høq¬XÂÈónlOü$þwض»þï3åãýjôÝÐþ5áøã;áÆáÝ;PÐÞK9e:
õ¿ix1-a x£>±E y¿>Þx{ŧµoì«këÈ
´v:4F;H£Âe`âPp8w|¼Þ¯ð»Æþ KÛ-bçÂ7îáKkM`SPXv"®v§Ý$õ+»#Û( 7/->&xW\²¹é&ºyIùïµ%E8´ýõÉÈïÅW¼ð4kǵM*õ̵վ¡þâ\dJ7nmÍ#`£v6°Æ=B ñ½kàÏü*Û/ èÖw§öë«ñ,Çc¦Bø!J.)=Mu¯µ+ïº"ÐiöMo,líæ"aqÞ/R:Ǽ¢<Å^ñ¾¹ªk%Â:¥â46sêEn¬¢mÄ,nT¹Á%¹PØ^àÿ
+Càÿ Øh0\IpÀÌàìÌ]A¹8äõÊ(Ìçøa6§ñ#Å:Ω%¤.µ¦% 3£moÃ!PA°98!N=9ýWà潨ü9KS´ºñ$úÞßß]Îî$TãDlÞB©\ø8¯l¢<ï_ð>½Æ~¾ÓaÔ.-Å宣§P>þå$òĨ_¹òA¯£|&X¼â=;\Ô#¼Õ¼Dþ}åäq²*K÷
+ )f軳 â½2 ð½gáwÄox+Lð桬øìú[ ·XÄʪ¬ »ìࢪüÁc3ÒxÇáæ£ãOøJô5Ðî.¦aº°ÖíLÐMG« # (_ºNy ú
ãzçÂMRøimáäÔtfÔ?´ÖþWÍlàQä(IóÇï¸ÀìQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@SÔµm7F·[SP´±"Éu2Ä¥°Nbp DZ«Ëø¥|GO»Î«k²)¢þÐÓ-þÓ${gÊ0ùRe_fíû~Sð@:+Èí¼U'Ò]JÇÅ
+owݵ»K&é'ìêU¾Êï9?ë
+\ºokzÖ¯s¤K®[Â"½Á%KdeÇÉVYTa|Ñ1 à6©pÀ¡YsxA¶Õ>·¦Å¨Tt)fÆÑ°ää`cáõõmìWA»ñ¶¾sÝ[O<æ|Eä"J>7'ËÈ;Ã5$Òõä»ñ¥þ}}ÓÊÆÆÓËCq/ØaT|È8q.S}ìwW¥õöµem¥\xÉwç{wwçÓþõc?è£<(c!òG7'[Tðý¢Þøß̲õï6;SÏ_$98&`%hÆa"0äù|Ð@=¢Iá
áIegÙ³ ]¶ÂúªÇ°'µI\_tÛ
+é_O©hÛ"y·Û»²;&Þiä3ew4~"¹ÔcÑü"·mªÁ4÷hVR«NËöIÚE&0`®O|¹Û@Åæ~ÅGÅMJïR[!q0´kiX6´ù&I@û¶ä2¸ì-zf¯÷W^#éôýJeºpÓLÑÝBXvq¹0ùrêxZáíÖXÌèïa¹U
+Hê*ÀûO¥O
+²XâBêÌÁTsܱ ä^fɯ´z7SëZŲeHgwª¤Ùf|ƶùhÛyÌlå¶MSþ«h²Gý¸·
+./ÆJG¼Ø±®ì«(EmÞHÚ@=Bò´Ä3YØÅk7 ¾tµ]nVFêÛsCæÀ¿j'Ê-¸Ü
+íË«-Mt}[K
õ_³ÇÙClâyÆÕÕ¦"lù¹yòÛ a ¸¢¼î|MkèÓΤ×sYjÉÚ¤iKë<ÒUI<ÎY·º©ÿ §ÂCþÿ _ü#?dýÇü|ý§ûOËþ¿çòü¼¬ÿ GÏÞç4éo³þÎþÑû\aò¼ÿ ´ùËòñ»~îqÎzb¤3· nÒÆ'tgHË
+̪@bReöÜ=kÅü3¦x¨|9Õlµ/í&ør⧵ª¼½¶ê¬ÎUËãl(9$KóÓÇI©É«ik>«´¹ûL0Í*+yþ_°²Ê[êNSÌÜQ\¬u&ðæ×ñêQÆ^3¬%£³Ü*ùÀkp;ÊÉðuqúJxþÖöî[ß<vîªÑ´¿3(Ô®ÒãýWU·vÄxÊ" ¹Ey]¼Ú徯~"î÷KMÎåÝbIÕ®üÂà¼`î|¶î\PÍmbïV-isª¿í]J9e¼-Z,ÐC¶aÚH",P¢á[·icº3¤eæU 1© ²{nµ%yÞ·e¬§´«væîïN[+´MÂx=ÏnT9IdT"Ã|§9Mø§áwñd5dÕc¸O/ ^b+FñË+5¿Î¢f0!eòvP¨TrO/
+K,hó>Èí´¶ÔíV8=«ÊæÅm§YEi}ªÇj²Ïä\}åä\CäþêIVT]ÆऻÅË|]HàÔ¦ñ÷1k/<:ÅÛݳ+Dʹ[b¹ùAòÙbã$~r´Újzî¢y_ÚÚ/íw üc8ÜFqÓÔUÈ'êÞ+yc P<rFÁÔà9Íaø>£áû9-`Mú0C+p»B.r0sV>£ý§ÿ Dû?µ~Ýý¡kö+Îû'Øq¿¸Ýÿ _ë>»·þYÐiðÌó$RÆïìU(ÛCa½ÖSØÞ¤®m7R·ÖõÍVÙµ%ë¶"°¡d´wØ$<ÀKn å»HbrôñÚîY5_.ÏʾÁÖêRY|ź¶ó%f3°Hü²¬±É"« ÂÉ@¡EyÞaâ«O¨Õu+¹T¹âd·1<[Ü,¬â5E¸gT]pª/$\ñkêÐxOºÓÒù%Ý¡[Òx¤ÎZ7±dèÍ&ð±üè(¸¢¼~äø³ÃúOµ;iõ[»§ÓËê_LäMvñÅ´L¬USÜ|Ã*XFÌÅ®³ÅI6§øZÂ;ÝfXEè·¹ÚR×W¤åÄíÜvüùOm vWÚÇâ§×4ïRÉ\Dkiei!ûT¹·ªìÞFMÀgäìhlÓÓ4}ll纺ñ·O§èâS-ÔëfìlR2ôÉäËTÂ×n²ÆgDWxÃ
+ʬHRGP V ÷Ú}(xmm常8`É$Q@É$ ײkí§
+Ôúä±lRæÂ%Ýê©"6Y1¾Z6Þs9d-Zÿ ¤ÛÜÉöâê
+¢H$·\ýd,Bíçm]ª6òX7P¢¼¯\Ä3]ÛEa7 Õ]U¿14ãp|¶p6ù örvØß¼æÕÍZß[µKËK)uÏ.ÓP#N
+eÎͼ.¨ÓßÌ(Kæ@¸a"¨ ¤Q\ßõUÂ7®s N¸ÎÑîFdµ¸â1Ó$¬R&
+¸9®^öÃaþuíitÅOKY&x£ÔäyHä1R³@ª'&0ЦQ\_æÕd¸h5!©´ÑôûiÍÜrkµ3ʳH~æ]I
+òòx¬=Ë_´±Òæ/®5Äv<Î.'LÍ<Å/C«#U%H"?¼¡ $z
Fg
nÝ¥NèÎTÄ¤Ê í¸z×Ï.¶og±µÈÌ1jm4°Á+ Y/"kr$ľXÌUÞ©µðÆëþo_jê*é÷öâWiÊcÍÂd^º0̹~;<
+ wÏ
+ÊXå@ì
ÊÅXqÜ0 ÄRWÃíý4Xµµs{ªº-Âíµ03\´%7~ë&s Ë~ðOú¬WI E©ÇàÝQ]¯µ7>oØãf±EòÆZidËïÃÈÁ9\ C@
çv®/<Wl&Ô§ºÞwÒåû-Ì2²4.Ï9]âe°ùH²UË-OOñ<kê¯f©³|óLÌزKúAÇ~a÷7mùh¸¨æd<±Ä
Õ;¨ç¹b ɼ¿EÓ¼KztË}f÷Y&½ê
+ÜZ¥×&P%dó<öA»,$#ÂÅ%Yâk}ýÔ.éVí®·\ù~oÈ
B!òÎ#LgjrêWØÇâWñµµÞ³Öâ¥%ŵIJIj´)AØ7!îF@ÏIck®Åá_\ÛÜ_IÍ. ,RéÆ"Û4ßg¯ò
9Rg ª¡@:ëû=2ÎKËû¸--cÆù§F ËIñ«æqioâíâÉ<@Ú-ìnö[Ådì÷~ia1³UÉù>fQ÷äRéõkðM
+_GbÒ¬wâxå
¡ÂÊãxÆ¥#HX#5 wQE QE QE «jÉ¥Eú4÷W2ù6öÐmß+íg eQGoÝÀÉ
+Çñ&q©iѵ٩ZÊ&´Îyowäqä£uìpÀNø¦êïq¤ë3Kì[¬&IwS#(bÈØbÁK }|k¦Ì$µxÚ9P¢å$åív¤±¸b202¥³YúÃøtH~Ýw
+üÚº¨¸a+[M"**0ÉBÒ)-ØRFÛà[
+öïíôLÅ5ÉVý±ã¸k2e?zò7îö}ò: Æâë?ýÃg}j·¶l´k¸yñÈL>`n/ÍY÷þ;HûN¡¨C³D[·³ídpÑdJÌEfùÄùÃpucÂ>ÿ {NÒÅÕä÷WvZzY¢´»ã!¢2T1VxÔüäí
+
_£ÁPÝÜ^Åq<a+ÌcX\0Ü×Vï¹OÈò(x!ÆòªP(ܹ«jÉ¥Eú4÷W2ù6öÐmß+íg eQGoÝÀÉ ^ïÅ^ð´Z¶±<6©¶MJúÚÎ8OÊ$DX¬!óª¿1}½%þ5+8¤¿»K»7C|?5dØÈ_d²»
+cæ8 F>¯ðÿ MÖl¯tù¯µ(ôûä_µZ¬ÊâiVÕ¤Þq¿cËn ¯sñ/J³&æÃR·ò.¶n;uwhÖTåuU-/*Wi¤¼ñç÷ ͼ÷Im§¶¯Ë
+çËònEbf6aæ 1JÖ¥Ï
í§æâ;»»k¹¯Eò\DP´Ü¥H1©0o¼HÁÆ3üEàµÕ´Ûx/nÚF²H.®H£ h¥i3±Ê¸©Ém¥Éj °|elÛ7Rû{º{&[u×s
@VÙ
+0òÈ* PsÇÄÝmõ¹íu+{-2ãìºÔ¬¸Q°íb\ïm»2p
Y´m©j_oGCozÒ#Ën²*"îB®Í0Ý v>a%
+EsðóEÃú¦p÷sÚj·«}{¾@YAå@Ú¢nm»F ϾøÚvuöwgoknK¶êÓäÞJÀ0Ë#m²ÊXd89Ù©ÿ Åööwö^«öï+ífû8ó>É¿hÛ»;sÇþ»?òΫÞ|;°Ôæ]CUÕn®.bò¥IcÉUÄ#
+*á.
eTIbÒx³]ë#^ÒÚn2æøÚ©µîÈE#ÌË»XmYyÜb÷ÆúVá]7Äùo©$MmLÆD2,
+üή4Û$V:ݲ< öáTxãx .ÊIs2.1òؤ1¹oádÃ:.öéã¸Ò"-ï UWWHE¸uùacwD¶+os ì¤÷¶×Ì^]í¾A¹²H?gL$·<ðÏøoâ]¶©§é©X]ÙO2"Ý\:"ZÄæÓí[·?!1J7
ÈÎƱâØtNÖ.-îàáY-¤·zªÚË9BXþ.FÜî\³ðâÎÅs=ͬ×pÉ<÷n©q$EÆ«÷¢BylIoºÛÆ£øÖÂK3æGk,ðJlæBc FàáÌÇvç/%ÿ ÛcO¾K«huµ$'Ýå²Ø]æ7\£¿0^+ðÄKfÁfÕ´©í÷KkO@C=Çy-¾IHP»©O0&r{µ³±Õ®5yn<¹.¢·³o1ÀOGòÀÿ ir:óò3×Aðngá¨ìm5+»Û9n-/¢¸i#b¢)¶Æq2s Fñ'þ YßYÃö±ùm,3¬r¤Äܨ,J±öºíùxÉeâí=\ZÙÏ
+¾k~¤H xjmòÎI!rX($hhÚU³Nþy3[[iæÉ·
+5 eWzç.w.æ8\SÓüm¦%Ò[jZm൷ĦÒ(Ú$?ë7î
+¸øX½Òm$HæÔ6]ódz gRDq$!u<1ªÙëz:a=ÏïâY¡7üìûAîÌÙ'ïXeHf¯iá;¨n-¯/£qÍÖÙBý±¯02¹¼FÂlS¼©0 ×XÐtí?IÐôûË;HíÖ[íAáäFB@àðÎG$ð(>OÚ\+o$¶ªÃsÜ[H¶ÛÄð¼°Ä RIÉÌy¨iÇÖPF¹Ó5( ¼½M: ÜDU®[E
°(ÂL±OÛY²»±ô¿Ìu{$Õîc¶K;pPj&àbÞUU
+xDhcRÄ;°nkróÀ¶²6öûìñ]µý²´a-nËóÐìÜͽݶ»2|ÄmÀ Hþ2¶óíítÝJòæáï(`2M´Â2ÌáTdä 1ÃS«âÉ`O
+\étú¥¦±)ÃC±XÆmäv0Çh<ñµ\1Psÿ áÝì¯íüG<6lZQÄ$KpH[äòJ¸S7(+±©ø;KÔô]7Go>
+?P¿ÞÉxLX´Ç#) ç!æ2ÇÄkÛM.ïJ·é.56°¸-È[É*ª4nc$-¸ª;á¶Ó_Ú=«_¾¦ßgBKDF(Å-9}ÏdV]±fÀØ®5©',ê^Ô ×Ú) (åy#
+H®6¹NçÞYü?Ólioµ(n..%âá&Uy|åL¹ò rSk)Π¹â[øvþÑ.whAler|ûxT6x3+Ûa«ê¾,ßÁºöi§NºeÆÂÑH#
+å_k.ÇG;\§æùkCWðݵeys$é%¦<± '~rñ[ úï#}MÔôß[¥ÔA<©tñH§cyKlá°AÎú }/â-a-Ö·cw§F±4ïòÔÀó7ò³38"ÅÉV·|µ©¥xËGÕ|={Ç7iaæ}¬îI|¾hÕ¾BÈÍ×x)ÞøcAµÐm¬5FG´âîáä»"3´ÑÜ
+ Ù4ÍòíÀ\ô¶C
ôk½3Pº»Ô£½GK.¤¤V]¤ UÞ0{¼I Ý×
+FúMKA(t¸gÛrmâÞIÄeüÉ%*¨ £O;ÇwãËqªKpú<Z=µ¦¡k¨¶/æ¨tó&ÐWäÎðx+ ü!el÷:ÅÞ½©-ê$r6¥<±³
+áJyJ<¹äR6mÇÍùb/l¡¸¶ÓSÔd³·ÞÔÆbo!c2ÈÝÉXç?9VÉËà9|yo£4o=Î4«mP]A ýÔ2·Ë!b>P±¡å°´ÿ
¤¡,°OÆ*EslÓÛbÀoe0ÇÊ8Ãȧ*2ÈCðÿ MØaKíJ;v²M6KuvIh!°+Ól7ÿ ¬Få¼!e¥¼k¯jV2²%¥¦ÉbcXÇ
+«!C6$;3( ñÎsâx´A{"« ÁÌ~nÃ*/æÜP(û¥·üµ¡¦êSMªjZeÚÆ·²FP$·>[ã'rÈg$Ä[
+
+¯¦xVÇFºôù®ííQ%÷EÒ%
]³ó±¢®ÒÅ~PÛw
+Õ&¤ÜE®_ê÷w9ç¤1à¢Àê%A, øÆ<öS¼"0 ÇÖ|búZµßô©·rQ^O9þ!¹ÊnþÎq·ÌAZþ,MNßL»Ó¯¬oçc[yü¦*Ò+Ùv³Ê8;²¼5sSÐ,u6õd
+ÅÄj¼S÷sû°c'Ûiák[æµÛë^ÞXÇöè<ëb¨ûSbÆ#û}ä'ç<!P
+ú¦»Ñu='CûMÔºwÙìÌqrKϺª²åB௴ýÐH¯¦|G³>²Õ5iìÞ}>+°Ì8îÑÄ{*¢Ic]ÒmR0ba°¾°»ð
g¨N¶¶>DPÝ@ñ´öÒ.Ü¥Kz0*6ðVÖU§vd,íd»kÂé!ùp]ZÞ6m<¤P8¾#è÷5ŵµõżVöæxQ;xwÊÌᶶÆ
ò±aÌaÆHÐÖ|Aq¥xMÓáÓç¾[»KDVÈ
ãx@ùvÈä#$($$ðöz¥¼÷Ó6§§¤3Ìĸùpß6(U bµ$ÓaY¶Õ¤óííæ·Em+#FÌOÎb\sÜõìÍÛ|HÑ.¥g]Gr¤´LZÙÚ1粫0²¤Ívpv¶$â&oâQ¡I$pnÜHY31
+¥mÒ3tgb¶Æ÷í$Ñ~iZ½¤sÙZÛÉkÏ$f)FfFù2ÂG
+íÁPj¦ålì%³Úòú6(â¸+(÷c3«LÁr[{ÈìT®òí¿p8 ·JÔm4ôÓﯯ.âXb´E9ÃeWý`9bÁÜT7?mñcÂ×Ë+ÙO=Ôiå0F$yUåD@ùµåAUfÎP8gÃ÷¯tÝBB{´´¹KlàHGln`pJ2Zö^Òôë´ûKè´ÛybÖÈMà)2NqÜè .XX)PH
+ñüBµò$ãEÕmcí
+!È;b·.â_VÊÆسnÆqb÷Æz]õÕ½ÚO'¨-yP
Á0Å&2_÷ûÞÜ
¶2\x+M¹µ¸·yîÂOo¨[±¹y(R>^¡ÐuÏZûÂ6wí¨o¼¾=FR÷G( 24QÄñTáJÄ¿0öÖPÄP}ÿ Ä-.ÇZ{ ð-´²^
+à"A,¬HWßdOÞ¤ºØÆÐ[O¥ÖªÃ¨Ë*EȤ·¤¬+$\HËm_KÀz^³©Çy©\_],^xÞI¾HÒxÚ97í`Ùåݪª¦Å¿àS·Ôîõëëø%Yâ)K*Ç4j
cE]£íì·$ WÔ<coia¥jG÷63]ÜC}ç!/n!áäRrÊð8Ü3hÒ¼}¢j±$©/ óK,MO£iQÙßÌY¾T|Q±sàí.óNÂçÏÕnî®ãy¸ÛÆ0FdÂö׺X²ÔnîïÏÚáç¹(]À+¡UC+¾yv$â~©MHï
Ū=½ØPê¯s\¼n]¸p¹<®õ×I øÏÄ?lû$s§ÙeòÍQÉü ÚÜsíxÜíá6yÛ/
»]¥ävÂP#Ap·@Ûß"w P*æ¡Ã¥\\\«»©æD̺;$(XÇ ÁK¹ÜÛî;¸À¥Q@Q@Q@Q@Q@Q@Íøó^µÕ´x4»Í65jÂêÉædaÒïf at F"·ÉÏj§wãË}û]þ×·-7K»)/¢áG]üåÙF\F´m,Ä°¢¸¸~'è3Û¤ÉÛ®ÉÞcIÖÝa4
Þ'dÀIò¬ÙÁ_¿;ñ-4é/4öÊÅ)Tó#cãfFùYOÊÇ® lQ\¾
ãK=^}2ËdæêóOóÌòDjC |ù{ÙÕp~ÿ ÍoÌ/òÕñu¼ìwÆÝnÒÎ;1Ë!¸[v îÊì;Â4ÐQ\¥ñMÓmLíc©O¾rB¬BÚJ#XXF@ÇÞ*¦½ÏÄýÒêêÖâ;¸§¶·v
Â,§dFm¾Q0o(ÈV*ù@ÚQ\~ãim¬Yì´kç»K»$6ó¢#µ½ÄÞZÊH»wmuUb[ÕW&¤ðOañn¤\y-ÝÝ\\@Gò?1*Ä
3ÔFýÔ ê'
nmåÌ$Bc#2Tûí^&ö>"Ó~½¥~#Ä1éöÃL&º(xêØýØ1º
+¯ûÅÂ
+ôøO4¸üùnmïl¡ê¼Ý´¶þaTY¾HdpÁJàmÎü¥\ÅÂßRR´»ÒßN·w1]vX|H<¦pAòäwÊxäd/Æ:8ÿ :v}Vóìú
ò<2ÌÓ¸(dlC8RìFh]«=4kLð÷ëô Ú®ÛìRFnÈüxü´*N|ÇÞc&½üRWÉt-Uµ)|Ãý¶Q6n}í y±ý×n_ʸ\û:þº¢Ç}þxPܬr4"G`«ç÷q;·nÜÊ
+zd·%ð¥«E©h.smxáeXéL;ªþì"b¯µ' oÅ/âímÞÚóÄvº
ÏDWol[Èû/)h`PâB¿+yÀ°Új¿tÞÞMfÞïNWpÐ]yhÈ»¿dC¶&v;
+J°\}cÅÚVokúo¤þÕD»´Kù-#O´Onte÷t|jmÌ(í¿ö[Ë)õÏí¿ôø]¥'ìÞTâÔ¤'ÌÏÙ>d>fw9ó
+G>©q}ã9éüO;Ý:ÃoÌcH¬O ¤æ1³gä2g¼½×Ø¡M*úæþî&XÂa".Ðå¤XþS")Ãã 2ôý}µï¶Q>2;ÅÔ%
Y®"¸ÉEï& Nä;¶BaK cëvÑÑ´
+Fa©ÂHIßeRÊ×UdÆÛb,ùùÙZyªÁbsÅ;¿´tÿ ¶jÿ cySyßÙhó>Ñü¬ý÷vùÿ ìgçmðYµÂiz¬*Çc²Ü´«Å$ºØ
+Â6ûÅY2Sº«Ü|EÓ-lã»Æú(.bûE²Q.áÊ0;H%ýäëdïU ±Û@eÿ Nà¹o·-5èâÕ'ÔLÇÄRåÃÄS÷AÁ½äû¬WYoÅï$îí¯M½è´bY7±IL|¼qÉóNð3ÔAâ«E£$7by-ÅÂ"Ù
#<ÆØF8ÞP o¶ÿ «Éã¿;Ão¥êVÅüï²-:ê%
,z¸P«XÆ:¨XnÖlo¬GÜÙ^AÒ-ÔZÜò
óÏÎVVÛÎVtûcþì ý¸ÜPJÃÖàeëU¾â2äÍ ÜcÓ¾%iº»ÜG§é:ÌÒÅ{%ÆÖë d]ÅTÈÊز6d0RÈBé³ í^'¶T(¹I&¹{]æÁ),n©lÐ?§iÚ§âmÚçÄøseÛ@$â$@,ö¬øOö»±
+@&3àoøJLz¦«öè&Õ|ËÛÄlÁ$EÝÄÒ±C·oóÚ!Nä. )¯@Ð<]gâ²lïVöÓíwO>1°9 1#iÌ mÀ¡eù«./°þÜÆîÆ;«(ç{¨R&º:¨PK|¡d¸UÌ
S÷
ËÐ?X¾¥/-$yfÃS.8»&áFÎNH²[ïg \Vö> _Åu¦Mâ}-Å÷Ød»íÌ[g²ÂÐï^Nï6à2¨\>T¨$4Kµ´ÛJ¾Ô|bh"ÄO,²ZHÎ72È|©dÜÂäþ8¶þËÔç[k»I-l®®c3Ä6ÿ ,à*IÉBÈýÆ+ó ?ýNËÄá`×$ëOXC2ZÕ¬ÆÑÑ!¸Û?;F<¼ÔiQ'»Ô£øí¥¦-ºb¼XâÈ0®%å3¿AñJÓ®5%·»/bêÝ¢ä|Ìî¢ýÓ1Iÿ ,÷äfDñI}sima}t²þêÖ !37"
+Ä`µ²øØv ÃúzÈúµåó]êZä±]!Q%ãT\aWËF`ǨÀÎÐ9=fͨÄök/Ã{¨8f\Ú'ú=ÒÙßû°v´c)òä/ÎVºM/Çz·ö]RÚÂù¥ûE½¦ Ödù¬ãFd;
+ü.Ó´);ÆÁ©§x¯MÔ<5q¯$6É#Ìí¶@ª,U¢.wFnr¿x 8¿ôïøHÐá+ÿ gì¸ÿ ´ÿ iïù×üþ_õèùûÜæ·-o.t¯ë¡q©
+*y§¹k$)·IMäy!J
Ä¡ä t}GNñÅ°å0À+,dÂÎ8Û°°,Bd9c¹ñtÝOM»ÊÙÁuf692·GI¶®ç*¹)p_^^iÍmww©!¶yVFó_íØH± ò¼¾e
+ÔùCx9Ã{«/kÄGâ5³í¦F³iÛ}ÁÛÈ([÷eAJw~èmE
+# â>q\[[_\[Åh/ng
£·|¨ìÎklh_!Æd
++^½¾¾ñ,2éSªéwbp¦=×ÉLÞcq-»hÚéØ Mbñº
+¬¯lmß)MÇ(ò×Î ù¤®.Ïâͼ9¯^Ýã·ò\$ÍæG)#·dlò9f³+
Øñ/l¼)oÞ¥g#äK¬Xä;«9 1v;Npå¯xÏÃßcû\s¿Ú¥òÊQÁüHÜÜñn¹Únóâ Òõ~Ùk#i
/üÛ ±ÄHnÖÝæ¹8Èò(}åôÛ ÀdÈ#kU0ÜÌÝånÙóUx<k¦ÏÈ°]ÉdÜ¢ÿ ËÔíx!°À2YIR¸e. ãï~#èútÜÞ[_[Ú%ܶ)s2"G-Ê;§¤°ë±â08gVgt}ZUÂs´ûd÷LÈ·4¨ÅåÝ·åx~RAÈe,¡@:+âÓí_cÔ`Ծ˧Üj}xæÙ;7áñ´#bÿ Æ:^¬\é÷|fÖÑîæfUcU,Çh>aPùÂìÝònßòÐAErzWÄ+Z¸³¶°·»¸ååB°ùr¬F3ýò#´x:6CÕ~þõ QE QE QE QE QE QE QE QEN÷MúëN¸¤apn"
+F¤
+ÇM²1ãô9z¯´½kNÕì/¼ù-u[¸®®>ÜÄ@( d).{òØ#tP>|#gq¸êWÚIisg3\ÊþXqU Ä(À£$%«SM°m>Ý£úîöWrï=Ó)f8 `(TP
+ u'$nQ@þá=1´±åôÐi"[[Í(dWX¼/ÝÈc*T1m»êÂ6n·Qý²ùaSq+( m1NdA·æo4ýæð9PSÐQ@¿ü ¶¦=×·Óyö²Líw %cµÜ8À g¡«lõ6ÕÐÁ©Äéso¡Q¢òL¿w%`(RJ|¡¶î« ¢0õoÛjÓ]Î×wvóÜ%¢ùÌfÚf6PÊÃ;ç àU?ø:ßÂQ]¬?ò×Ë%X$.Ôîf2JØQóÌß{QE s÷>Òï4èì.|ùmVîêé¾78I ¸¸|cayàæH|/lmõ(µ+»½Qõqis-ÑDfÄcÊT 2C7|Ç7( }ü,[ÉuÝUu(¼Áý¡ºönMTùQýÔ^S9Ë9jðøBÃÖZÇ9Ó,å¸8§&FBß{hYÜwp¼sÔQ@ûøQ%òeXÕ^ñ<ÅïÎUX¤Ù¾/BƧËÂ0+ÁeÅðþ«ë]Rúí㹸¿``cÜ<Ëæ&åÜ®!©\ùy$í-óÒ Ç½ÐMçئMVúÚþÒ&_B!2:6Òá£hþc1Âã dÓ4ãͲY#AeobÜ©MgþðI9À÷Î¥ÏØøFÎÁ´ýÒG§JÎ)%!EH ¨Y[æ9s
ÜÌ
+¯`¶û9·ÖuXZÊ#o§²<CìP Æ£ËÄB ýðü殢 ôðÕÁ5صÓÑE¥K¾(]b0\åóå»wmä¶ÝĵIâM2ãRÓ£k³RµMi/"òßî1È>ãÈ9FëØáÅÅè?áÒti!ûuÜ7ójrê¢â)m4Pª4ª|À#%H¤¶KaIn7l7Û¼w·Ñ2K×%Z3öÇá®TÉ8ýëÈß»Ù÷Èè¢ åü#áøG´í,]^Ouwe§¥+K¾82Ê#%CgOÎNÐ (UùjðþOéÖzõÜ÷VvPÁ,ÁÒE1HÍeË,1¸n`PåOiE sçÂ6nï$×ÓM'ÙË(fv·¸k
?w»¶@Â
ÀP
+ãÁZmÍÅ»Ïv{}BÝuÈ[ÉD²òõ0¾®z×IE s÷>KE¯×XÕaºMâÕÒe?eeU¤:±UùdÞ`LWÀ¶$Òoo´É4ncÊ#£¤[BrAl¯ÞÁ õP7cà#NÑ´Ý&Ñ®â³Ó®'ÝRr¬¾jÌ¥w '|C)É æä³M'QÓîäýu=ÿ nv
+÷£ùaBü«ò
û¹ëv( 4ð½³¼O¨ÝÝê¥eu¾(é!UÂ"UF$ biÙøÎÓL6ڬЮ×θbH&3goÏ!Dɼ Ve=EÇÍàµê×]jÏgs§Ãe0ûF^é|ÉÚeÚ¼ÕÁM¬0BÁØ>³µÕ¸yíu¬}¦ÙØ_Ý,-´¨7"®rǦF9(Á4WQÜk:¬Ë}|âQv¬¡:¬`
+ȱ¦T+ÚT³Ð×<7g¯ùixñÒy,o.ß6È8VØ+~V9Ø¢1õ?¦¯§Eew¨_ü£ÉWUû\L uBíù±÷+/;Jsuà[¶q{}[Ëu2Ú>^k
¹Éʹ*#/û 6àH=Eýÿ °}¾ûÞû_ûíû·oÎ6ýîvcf>]»>ZÇoØo·xïo¢d)®J´gíÃ\©(qû׿w³ïÐ(EÅÁðþâa©_]±MNãR¶)ÞvGdܹªà$ÆNIF$±è4Ý6ökÁuwqq5¼PK%Äly_wAZgàa@
+(J(Ä~¶ñ-¹k»»Gky[R BùêÃ
+±@6Sð³u#ê]ÜZº86M/î¼M:ãçRcv]¡üŶî;«r DzðúZj0jj×·E4F[S¼Hb'åUU\y( P£ï15©m
+¼Q<ÒNèZYrÞ;@=x zRQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xMÅÅýΩª»ëÈ#S¼EXõKUU¸TW µ{µx?üÄ5oû
+ßéLµêe4áR³SI«uõG
ĪRÃFTäÓæ[;taþÿ Asÿ _ürô¿úëø8ºÿ ãê+è>«CùÜúþ/þ~Ëÿ æ7ý/þ:çþ.¿øåéô×?ðquÿ Ç)ÔQõZȾä_Åÿ ÏÙàOüÆÿ ¥ÿ Ðg\ÿ ÁÅ×ÿ £ý/þ:çþ.¿øå:>«CùÜëø¿ùû/ü ÿ ßô¿úëø8ºÿ ã¥ÿ Ðg\ÿ ÁÅ×ÿ §QGÕh"û}ÿ ?eÿ ?óþÿ Asÿ _ürô¿úëø8ºÿ ãê(úä_r¯âÿ çì¿ð'þcÒÿ è3®àâëÿ Qþÿ Asÿ _ürEU¡üîAõü_üýþÿ Ìoú_ýuÏü]ñÊ?Òÿ è3®àâëÿ S¨£ê´?}È>¿ÿ ²ÿ Àùÿ Kÿ ιÿ ¯þ9Gú_ýuÏü]ñÊu}Vò/¹×ñóö_øÿ 1¿éô×?ðquÿ Ç(ÿ Kÿ ιÿ ¯þ9N¢ªÐþE÷ úþ/þ~Ëÿ æ7ý/þ:çþ.¿øåéô×?ðquÿ Ç)ÔQõZȾä_Åÿ ÏÙàOüÆÿ ¥ÿ Ðg\ÿ ÁÅ×ÿ £ý/þ:çþ.¿øå:>«CùÜëø¿ùû/ü ÿ ßô¿úëø8ºÿ ãKX¸Ô-tKûu½qeÚGFþ×¹8`¤Ì~³¼Aÿ "Þ©ÿ ^ÿ 袦jnÈÖ;êÅ:²Ýuæ}EWÇ£
Q@~4k_øâÞY!-2åã6*ÈÂ& 9s^Gþÿ Asÿ _ür½cÇòO<Kÿ `«¯ýÕå5ídô©Ôçç{n½Oâ<EZ>ËÙÉÆ÷ÙµØoú_ýuÏü]ñÊ?Òÿ è3®àâëÿ S¨¯kê´?}Èù¯âÿ çì¿ð'þcÒÿ è3®àâëÿ Qþÿ Asÿ _ürEU¡üîAõü_üýþÿ Ìoú_ýuÏü]ñÊ?Òÿ è3®àâëÿ S¨£ê´?}È>¿ÿ ²ÿ Àùÿ Kÿ ιÿ ¯þ9Gú_ýuÏü]ñÊu}Vò/¹×ñóö_øÿ 1¿éô×?ðquÿ Ç(ÿ Kÿ ιÿ ¯þ9N¢ªÐþE÷ úþ/þ~Ëÿ æ7ý/þ:çþ.¿øåéô×?ðquÿ Ç)ÔQõZȾä_Åÿ ÏÙàOüÆÿ ¥ÿ Ðg\ÿ ÁÅ×ÿ £ý/þ:çþ.¿øå:>«CùÜëø¿ùû/ü ÿ ßô¿úëø8ºÿ ã¥ÿ Ðg\ÿ ÁÅ×ÿ §QGÕh"û}ÿ ?eÿ ?óþÿ Asÿ _ürô¿úëø8ºÿ ãê(úä_r¯âÿ çì¿ð'þcÒÿ è3®àâëÿ Qþÿ Asÿ _ürEU¡üîAõü_üýþÿ Ìoú_ýuÏü]ñÊ?Òÿ è3®àâëÿ S¨£ê´?}È>¿ÿ ²ÿ Àùÿ Kÿ ιÿ ¯þ9Z>¸½Çjê²Ç5Ì©$sê3Ê¿f*îAåTôíT*çÿ äzð×ý}Ëÿ ¤³×.7F8y¸Á'nÈîË1âéÆU$Ó}ÙíTQE|©÷ÁEPEPEP^ÿ 1
+[þ·ßúS-{Åx?üÄ5oû
+ßéLµëdßÇ~ª>{?Ý#þ%ù1ÔQE}1ñ!EPEPT5ÉR7d-eee8*B}jý6HÒhÞ9^7YXd0=A3WHºrQèg^Ïq ZVûìö4[FzÉ=2jë#ÈIþaiVÆg .Îw¡>`ä0þ!Xt«8|̤oC}¢gå=To' ñ:àg ¦Èƨe`Ky«q çÌ·ÂðOð¯ Æ
Wvþ¾GT*ÐVRMÛÉyú÷ÿ >ËP½¼¿68"û$7£äȬûÆÎÝ6O¡ç+Ó¨¦-º¾ÛcÒ%qÛ%£-g
+p
+jCioo!61¤X^ EÎÐ@ãùÕEÒÐý¢y¶iðvG%Àa2KÑÊàËä¨ÿ ¯òÓæO´¤Ü¬¬ý|ïgè·*C«]Ést8òE½°øãÆá©ù¾ùlU(|G5´SÅn®.LKyaH÷Éì2$HpÊ?89ÅmE¢éм«eb%¿x°Êç$~é<bѬñ
+
++Öp^åp*:öø¿¯ëú¹ª
Mû¿ð×õý|¶Ð©<×ó]5Í»2Ë®ç»ÌS§òÉ
+I$pttû¯·i¶·6yð¤»3»8Ï~µ
+Þ¤¸µë$¬ITb6ù~ép¼g mÈnÞm¢·
vÅEÉ8P05¬#%7}¿«~§=IÂT×.ÿ Õþý>ç±%Q[áEPEPYÞ ÿ oTÿ ¯IôZ5âùõOúôÿ @5_áËÑáÿ UùCÑEðçêAEP?ã¿ù'%ÿ °U×þjòõoÿ É<ñ/ý®¿ôSW×½ËÏê|ÿ ˯û{ô
+(¢½ãå( (
+¾ÊÙ]n§1HÈpÁDnüÄì=pN0pFs^>ö¸-!ºó£Ü*^Ïæ#%ò÷+nf àõévõÎäðEsC2îFÇr äG äU#Ѭ".V-!ÞVfsnBX¯`@sÎܯëOóÔê¥Vci®ÚwÖýûhT´Ô¯Zkc9·h§¹×jFU£eòXä(ü¸ãpäãòë·«c¥K6í-å´r²¶Uw4.ç÷ØôztÓmc»7+y,+¬©¡NH9>§4/<9c4 at Coýñæ32ùBTv Âô±Q(VPvzÿ ÃÁûÍaSê'%§§¯õ±wO¹cu
+Á¥¶ÊgJ«åò¿§¦{àa®¯¨.qy
Ýl¢ë>ã r¨¤" íóÿ ²I5ÑÚÚCgHU°NægrìǦK1$ 9= «ëÃÓÍhÖ>]«Ûùmo#«G;2 !@ØPÝ
+îÝ;J±¨¢çÿ úû÷
+¢äù¶ÓþßÚþ"ÔÚêM~mÄPÜÅk - æaæ÷º|¸Éu¥tú»iÓù,Ñ wÉÜTBÀIÀÄÄOLñÒ¯½
´pEÃ$ù%PÄm\µ Ѭj0Í+|àìN]H
+bA
+8notÿ «ÿ ÕZ¶qü<»÷¿ßäeXkº
Õª]ɨIm*ÜÆTáB3ß#1%ö£v{#
¬Ã\¤XegHÏ#qùdWSÉêË.A8"Åím.fÄ»|Ä0¨vá4U:1R¤çÈÁ©nôxfYTûAÛ9,N#'2*¯E/më»$Y(VäÕëý_æî®Ú+-4éé¦þ·êöÛCN(®ÓÍ
+(¢
+(¢
+¹áÿ ù¼5ÿ _rÿ é,õN®xþG¯
+×Ü¿úK=qãÿ ݧèzOûí?SÚ¨¢øóôp¢( ¢( ¢( ¯ÿ ÿ a[ïý)½â¸YþXMyupî³ ¹¸á£ÛVË°¡'cÔîËñ0ÃUsvµ´ù^o© ©Ói4ﯣõîptWsÿ
+®Óþ=sÿ %øÅðªí?èc×?òWÿ W¯ý³C³ü?ÌùßõoüÑûßù5Üÿ «´ÿ ¡\ÿ É_þ1Gü*»OúõÏüÿ ãlÐìÿ óõoüÑûßù5Üÿ «´ÿ ¡\ÿ É_þ1Gü*»OúõÏüÿ ãlÐìÿ óõoüÑûßù5Üÿ «´ÿ ¡\ÿ É_þ1Gü*»OúõÏüÿ ãlÐìÿ óõoüÑûßù5Üÿ «´ÿ ¡\ÿ É_þ1Gü*»OúõÏüÿ ãlÐìÿ óõoüÑûßù5Üÿ «´ÿ ¡\ÿ É_þ1Tõ/
Sum/ÄúÎé-ÊÊ 2Ä
+qóáñÏÊÔlÐìÿ óõoüÑûßùÐØø3Kò=6ÿ ÄZå¬ÙÖclÄXÀæÜ »+Ê7?(Øÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¬ïÈ·ª×¤¿ú¯Jÿ
Wiÿ C¹ÿ ¿üb¢¸øI§Ý[Ko7uÆT(ëa#q
+LózI?Ãü˥ø¨MIÊ:>ïüB¢+ç³
+(¢9ÿ ÿ É<ñ/ý®¿ôSW×µjÚl:Î}¥Ü4í¼ò4d
+êTFp}
+qßðªí?èc×?òWÿ W§c)á¹¹ÓÖÛ|Ï9Ëjã¹=Kûß¼c¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿üb½/íáþgþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢»øUvô1ëù+ÿ Æ(ÿ
Wiÿ C¹ÿ ¿übíáþaþâÿ ?{ÿ #¢ºOáõ¥oo¯k:
ÆE½°kUÝnvo ìr762 ̪Ö,~ÿ ¡ÆoüGª£ëÙö.I!A0e°07`nÆv®vûfgø«x¿æÞÿ È㨮çþ]§ýzçþJÿ ñ?áUÚÐÇ®ä¯ÿ £ûfgø«x¿æÞÿ Èᨮçþ]§ýzçþJÿ ñ?áUÚÐÇ®ä¯ÿ £ûfgø«x¿æÞÿ Èᨮçþ]§ýzçþJÿ ñ?áUÚÐÇ®ä¯ÿ £ûfgø«x¿æÞÿ Èᨮçþ]§ýzçþJÿ ñ?áUÚÐÇ®ä¯ÿ £ûfgø«x¿æÞÿ Èᨮçþ]§ýzçþJÿ ñ?áUÚÐÇ®ä¯ÿ £ûfgø«x¿æÞÿ Èáªçÿ äzð×ý}Ëÿ ¤³×[ÿ
+®Óþ=sÿ %øÅ[Ò~ÙiZÕ©ý±ªÝIfìñÇ9fæ£$ìOGnõ'4£V¡îý?ÌêÁd8U£dû¿ò;*(¢¼ë( ( ( ( ( ( ( ( ( (
+÷Ö6ú·Qù¾ AYX`« AV?üN4úiÿ ¾o-Ðß_hÆÙ}«ÿ -\óÐQ@ôÝVÇW·iì.cÌrá¢p(êyGV àUÊËÔ´8oîò+«»õ@ui V+Ã+Àum»® ÍSÿ
ôÝx`²_àÔ"-öI ã.Äb'#>e
+îs( ( ( ( ( ( ( ( ( ( ( ±ïµk¼MÒ-¾Ñv¸Y®E æ|Á¶Â4ÉåwÕÕê¿Û.<Iû«=¶Ü¾ ®®Óû¶äʧÊBü¸1çx6,lmôë8ímcòáL$K31Éf$XI$I
+úfg¥y²BeÝÆ
+Õä®XgF g8
+£
+ ¡E QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QEÏÿ b^hß¼ðôÙqýw9Ø<~íö»Ã·
+¹ -¸\ÓuÛmBᬤI,µ4C#é÷LuLf#æRFr¤
+J§©ivµºÃv7WHÛee8$Èb:(åÏý£Yо[¨§Ö¬&î ku;âUUu'1üç*¢6 ±Ô¶Õ´ÛÛ{kMBÒx.¥¼L¬³0HBHÝ>.QE QE QE QE QE QE QEG<ðÚÛËqq,pÁI*¢I< 9 (¨ÌðÂ[´±ÝÒ2Ãs*ÔYA=·Z§©ëú_¤÷Sçȵ¶É$c<rTb¨¥s ±}}o§YÉuu'
+`±$UFK1$ I Mcÿ gÜx÷Í´övÓaºSÝ®lUÔò[
+_q`±Ø±Ònò=KW¹ûEÚå¡·LydòfÚv'Ú#Wd (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ +ñ¯ePÒõ=)í5sw#Iyc
+3YÎȯßcyq5ÜQ@µ»Û.;?ùOpRÊââI|«àyhn12¾ìüå ÂwðCuo-½ÄQͨRHäPÊêF ðAb°ÿ ³5çѦûFÿ dÊ«ò/÷-äÊìêHWܼ*)y ¦k6z¯/åÝÛà]YÈ@Ùp$PN32¬9RÊA: QE QE QE QE V ëÀ¾!··I§L¹HãK3± I'Våsÿ Ú2øäе+Në5[myýÈ7FÁûÎC(û-¸ÆÁø¶ËUOXGg©ë:¿ÙæòéE]<;Û°âÅ"y]ªÝQÎÕ:ZÔWºüòë2ë3¤+¨ïªHêûf]É#È!WHÞCè66úuv¶±ùp¦HI%ä³I,I$I$Õ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ ÏÔôk=WÊdòîíòmo# MlÇ(Äg åXpÁsþߪh_&©úðßYZî1Ð ¡BYØñóĸ$¶R5\ ặâÞXæT°eu# 8 sRVþk{nô¨ô»É<bÝd·¹ryy#I~OÌ»¤±×¼ËÈôýJÊ}:ýò$áIò¥+tbíj(¢6(¢ (¢ *½õýg%åýܱã|ÓÈ#EÉ e$øÕ}OY³Ò¼¨æ2îã"ÖÎ2×,1HÎ22NG,UA"½y5äzµ4]Em
+D6»Ç2IWÌ!~^Ss ¯ökÏ|׫ömúX¼Efº^ÆbOËwnâ @gº
+( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( óÛz}Õ´Wø{\h¥@èضR23T¿ðµ-?è\×?òWÿ Öë]ê þær¼v;:±û×ùíÁÂÔ´ÿ ¡s\ÿ É_þ?Gü-KOú5Ïüÿ ãô}V¿ò?¹ëøOùûü ÞÑ\ü-KOú5Ïüÿ ãôÂÔ´ÿ ¡s\ÿ É_þ?GÕkÿ #û} ÿ ?cÿ /ó;Ú+ÿ
©iÿ Bæ¹ÿ ¿ü~øZô.kù+ÿ Çèúäs¯á?çìð%þg{Uï¬,õ;9,ïí »µá1"6#*x8 ¸¯øZô.kù+ÿ Çèÿ
©iÿ Bæ¹ÿ ¿ü~ª×þG÷0úþþ~Çÿ _ænýTÐ9°óõ]4˲ï»B{¤ÒÈ®yÙ!ÈÜÄ>cM7T´ÕÚkGr$±<RFØ)ÁCÐ\wü-KOú5Ïüÿ ãõÉøçÆZÒäAð¾¥o¯2#Ôæ;g.Iá{NB³8bÜêµÿ ýÌ>¿ÿ ±ÿ ÀùÓYz«4a¦ÛGy©2 <©%1Gy#|A
+Ä+²üõ{«øÏQð|0Ö×vGO¸Ss{m<{Ú(Èò6(3ò¦8Ûp9Ç¢xcÇÐá±@Õgº5ÍÜVö±©:dhbÒ0sK:êµÿ ýÌ>¿ÿ ±ÿ Àù¦iaón.&ûN¡qqrWnìgj*äìrv®N2I,ÌÌÚÁÂÔ´ÿ ¡s\ÿ É_þ?Gü-KOú5Ïüÿ ãô}V¿ò?¹×ðóö?øÿ 3½¢¸/øZô.kù+ÿ Çèÿ
©iÿ Bæ¹ÿ ¿ü~ª×þG÷0úþþ~Çÿ _æw´Wÿ RÓþ
Ísÿ %øýðµ-?è\×?òWÿ ÑõZÿ Èþæ_ÂÏØÿ àKüÎöà¿ájZй®ä¯ÿ £þ¥§ýçþJÿ ñú>«_ùÜÃëøOùûü ÞÑ\ü-KOú5Ïüÿ ãôÂÔ´ÿ ¡s\ÿ É_þ?GÕkÿ #û} ÿ ?cÿ /ó;Ú+
â׶ï¡k0ÖI¹Ui"¶bq®ê³9ÓviùÒNªæ§$׸QEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÏÿ oKÿ ¯H¿ôZ5áÿ ùô¿úôÿ @£_qKøqôGå¸âËÕþaEVAER÷Q·ÓÚÔ\æu·B~vûcñZ%vTbäív[¢ª\j6ö·övRóîËÝ]ÄéÓóøTÓåÏõ«Â S"Ì¥rqÏP Í.xÞײ¶úýnu}
+ÝË6õµFyU,0»±\`óê(mBÉaf¼·Bþ\®dQ³¬sÁäp}ióÇk§&®f
/-]£T¹
@ pw zúJcßBÙ¨®ÌH
+»jìA²2s.âäíbÍÞZÄÁd¹
È"
ÿ x:óLmBÉf¼·Âd¨dqÌ3Àär}hæê
+{"ÍÔ%RѺºT9äõøTbòÔÜ5¸¹Î¤)xÜ Ç\ úNè\ßM¨ªªiñ@'úÕ!$(¦P¹+¸ç©RÐæ§7®ìÍØâ6Ëã
+}ÎåÀ÷´¹£Ün[¢J*[O:OÉ,ù.¢Äg¦Ü·©ÕÚØ% GtQEQ!EPæ!¤ÿ ØVÇÿ Jb¯x¯ÿ ÿ a[ý)½â¾g9þ:ôýYöÜ7þé/ñ?ÉQ^Iô!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÏÿ oKÿ ¯H¿ôZ5áÿ ùô¿úôÿ @£_qKøqôGå¸âËÕþaEVAYÚöYDñù ϱò42!÷êÀqÏ5£EL¢¤¬ËÜ%ÍÎZ÷DÔo?|Ë%ä
ái
+b cF vgrü3í©bÒîn5+[»n¤ :ûcBYBG6Ò1prN{dôVV
ïvt¼uG[.Þ×C·Ñn ЮíRÙRI4xÕ¨ÌÀK¸uÆrã=zÓ®4Ûén£¼ÚKAoåF±[´Eð2ïoïW¶àg§¢«BÉ&ôþ¿Pxê¶Ò×þ£irZ_Ís4,àP²JÈÒe¥G¨ I c<qlÐK$Ú¬»¦v×xÔGÐôÉ0¸ Èç æ·©¦42,
È ¨lrÆF}ä*½PP[_æGÖ¤ê:woÁ§úÔ¶ÒÝÜýdÓÌÁÈ»(lªx(L6ßmÂäÔ7z.¡4Ûn¤ ÝK/
+ÂL P¼o-ûÌÄäç[ECÂÅÞíG8ÚÉiëþeÕ4=
¤ÖVÍ
+!i6p6çV-¾ÿ Jda
ËÇx+,ϵ1Ír£º¦¡[;T»{´¶
n\my ì8à·R8«)Ivÿ 4ÿ O")×"ÕÚïÖÍywó1llnt»MÒŤk{&X (;ylO$)FÉÎrG^MV¶Òµ+(ì²Ëí%y@V1
+°ä¶c'®~Zêh¥õh÷Ò°Ö6wnË_^÷ïÜå´m´½6ú{uµ´³Ó{©>ñî s!-9<në[<Úèó.Ùb¶r(qVE¼"Cv&ѵvW¶01é*<קõù"kâ=ôµÝÿ ?ów
+(¢·9( ÿ ÌCIÿ °þÅ^ñ^ÿ 1
+'þ¶?úS{Å|Îsüuéú³í¸oýÒ_â
+(¢¼èB( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ´{}B×D°·D×X£G_ì
+GWÒÿ è
+®àëÿ ×¼Q^¬szñI$´õÿ 3Àág'')kæ¿Èðô¿úkø'ºÿ ãt¥ÿ Ð\ÿ Á=×ÿ ¯x¢öÍ~Ëñÿ 2Õ¼'óKï_äx?ú_ýµÏüÝñº?Òÿ è
+®àëÿ ×¼QGöÍ~Ëñÿ 0ÿ VðÍ/½àÿ éô×?ðOuÿ Æèÿ Kÿ 6¹ÿ {¯þ7^ñEÛ5û/ÇüÃý[Â4¾õþGÿ ¥ÿ Ð\ÿ Á=×ÿ £ý/þÚçþ î¿øÝ{Ål×ì¿óõo üÒû×ùþÿ @msÿ ÷_ünô¿úkø'ºÿ ãuïQý³_²üÌ?Õ¼'óKï_äx?ú_ýµÏüÝñº?Òÿ è
+®àëÿ ×¼QGöÍ~Ëñÿ 0ÿ VðÍ/½àÿ éô×?ðOuÿ Æèÿ Kÿ 6¹ÿ {¯þ7^ñEÛ5û/ÇüÃý[Â4¾õþGÿ ¥ÿ Ð\ÿ Á=×ÿ £ý/þÚçþ î¿øÝ{Ål×ì¿óõo üÒû×ùþÿ @msÿ ÷_ünô¿úkø'ºÿ ãuïQý³_²üÌ?Õ¼'óKï_äx?ú_ýµÏüÝñº?Òÿ è
+®àëÿ ×¼QGöÍ~Ëñÿ 0ÿ VðÍ/½àÿ éô×?ðOuÿ Æèÿ Kÿ 6¹ÿ {¯þ7^ñEÛ5û/ÇüÃý[Â4¾õþGÛÛßÜêR&¬5;7fK¸EU[Ùf@ {W»QEpâq3ÄÍNi^ÖÐõp8x:n6Únúÿ K°QEÎvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~%ԦѼ+«êëOee5Äk %K" àQ^_¥øïâU÷ƧxbãIDyåµÏÁ7+&1 at p¬zBx>ã¿ù'%ÿ °U×þjò~ñþé¶çƳÙh~jK¦Áa,NáÔOß6¨#æÁp@=sÁþ%Æ°× ·Ý.Ñ
È%X££r21ÀéV,üK ê÷WZÞs¢o¹¤u
pN\
Rr}¥yŽ¼-ð>-@YkqÝù¬ÍbÅ=ÌÆ3ò㯠.Ep¶íu/ÛáËä6Þ7a®¡6²oR»Ô¨bànÉ@GÃâ]åÁé² ·k¢Ét*ÅZNÜ-ÐEF,ðÜÚÅ4§ïfE½²ÅÁæxîë^?à_hÖµOÁg³W»Ñ5g¸ó\ï@Ò 6´}Åè;}kÖt=.Óövðö¯ ©]ê®'ºÙ=Bî<
Â/Ê8ÈÎ3@OÚëº=ö£>gªØÜ_A»Î¶áHö¹AÈÁ ô5Ïø?ÄzεâÙji¥-®wåY+Bä¾U6x!yÝÇyýÆ¥ø{öð
aªéNvBÜDw#s¬Ø,rN95YWYøÊÏ&âR×±«3[×_¼y%zàsÇëðxoûGû;þ
++íÞoöo¶ÇæyÛ³ns»<c®jƧ®èú'ýªØØyÙòþ×poÆ3Äg=E|Á*iºg4«Xlüâ»Ô<¨VÐ\A«\wÆð¥]r>P` N]¿-ìÅÍFê=ÂWÂÑbLñT2,¶&_)ÎQ[ onI ¡âKiàK½{ÃW:Uì³ìòÏtÙó*£fBê¼|ÃïF:ñZ~´á+
+g[º±³ó-!æa:ÝW;_qR»Üsɯx.f
+~{}=%$½BV'£ byÄ6¸¡éÈjcþÞøMÿ Oÿ ·ö$[~Ñ/íPÎüs·?gÎïxÝ@÷¦ÜégTP´OÎnÒeh®wàã'<`Õ4ñgäÖ(üA¥<xû2-ìdÍ(6üß0+ÇpGZñ
+/ìÛßáò?áþÄwÙñåý£Ê8ÙvçíÛòc§kÖt=.Óövðö¯ ©]ê®'ºÙ=Bî<
Â/Ê8ÈÎ3@QêZ¶£[Æ©¨ZXÀÎdºbRØ' ±8ãØѦêÚn³n×^¡i}¹FÖeC`¤àq^GñVÞÊ_º$Òkú_Ah|#Ä0ÈlYÍ
++8Ê$ ÆJ/< n|´:déz±I{¥<¦ÒèüF ¹'åÀÛ"ü£ gÄO´8¯¦·ûeÕÄ¢+{A0¿vbNHP:,£æ¹=[â¼o§ê3Ñti´»ÇXd].WYí¤ 6y*Çh~àûãÇñÒÍ>_ ø¶o´Úèzq$¹£eÉ
RbÚXô,¼Õþ=е¿ñèÚìµöµ,)^DPÊù(!
+»ke÷H Uø5ÅMÃñI¦ÿ LkùoYB·,¶lÄjrAà}:Ï[\øWUÕ|?¦ß½¼Ír SpWpÀ(û¹Ëµâ$ÓtâÏ4¿µ£XYhVÖ÷M!&"yʤð>O0/Þ cïqKûö÷ÅøE¼øE¿±%Ýö|yhò6g¹ûF6üéÆÚ öêú½áKV[¾ÌóË,<HÊ6²»ÀÃsÓ¥hiîù¿Ù:ÿ 3ì .ÌçÚN3×Ð×j?Ú?ðÊOØ¿ãßímöï»þ§í2ã¯?ë<¯»ÏáAÅÚcøwRð¾¨t{´¶ðù¹
+uyBo5L{ÕÕXHnìáhè?íÝûcû#ûVÇûOþ|¾ÐwÝÝ÷3»îóÓ§5ÉÙ|PÓn~&ê>Z@¨Wz¸bcJ¦Ï¹Ø`19Cǧx'þ'ü*ûøJþÃý¡ö¹>Óþ·í;òÛÕüþ_·§Éö«oLA¶ý§|@ZlHmâ{E¸TPn[°)ùjX±Èù$úЦ|Dñ%ç| ©kÁ%Õ¯±'RPîäF=èð_¬üSàk_Ë4mý», ï3ó«Æá¸çiRzÖ?Æßù$:ïý»ÿ éDuæTÐ|3ÿ nëÿ a6ñÃæCÉ%éÈ,2 ±ÚbFÚ ô
¿ï> j>#óm ÆÆXþŵ
+Ècs&<Ïì"ôÀÎk¸þÝÑÿ ¶?²?µl´ÿ çËí ç}Ýßs;¾ï=:s^/ð¾ÆãLÔ~+Øxr?.êÖVNMÀíu7"!àà
ûßqñCÃ?ÿ Ëü%k÷ûNÿ 7óòüøÛ ¨õ-[MÑÖãTÔ-,`g²]L±)lXqìkÐü{y¬|\Õü/±HµÓÒòÚæKɹa`wn*Tù§úðþ2óá`|9ÿ
ädÿ gÿ ¤ý£göí¿½ß³øwùÏÉmÕCÂcÿ
Ãã¯ø@ü¿ØÙßgÇöÜýÍß.ß78þtùq@ïý»£ÿ ldjØÿ iÿ ÏÚÎû»¾æw}Þztæ¹?x×RñG¼c¥ÞÁi-è·¶hQ:ïrùb Äc M|ñ¥oø@íÙu/é³¥îô¼sv5HfSs¶h léÑù¯cøAÿ %âwý
Gþ¸ `¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢(9àêÞ[{£ P¤È¡ÔAà8ÅGcag¦YÇgai¥¬yÙÑrI8QÀÉ$þ5b +.ÏÃZouoe¢i¶Ð]¦ËáµDYaÀa#ÔúÖ¥N'M¶ÒÎiQÚ$*±lî ÆNF9ɪòxkAKKDÓ_O
÷ÅhÖ¨bFçL`¹¹õJ(N6©©.hú)²+¶
L¨¼ð¯ó7 ÷>´Yé:nquqe§Ú[OvûîdF²N\9br}O\¢1ì|'á½2ò;ËéVQçdÐYG®AFA#ñ©5/
+h:ÍÂÜj&}: EêÕ%`¹' °'$ãÜÖ¥Nm'M¹ÒÆ>i.PZ<*Ñ\mÆ8À¢m'M¹ÒÆ>i.PZ<*Ñ\mÆ8À«P8t6ÛK:\}¤ZyFChªÄU³¸l99ç&«Éám..]M}>ߣZ¡U1~fäçÖµ( ýOBÑõ¿+û[J±¿òsåý®Ý%ÙgÆp:z
+±cag¦YÇgai¥¬yÙÑrI8QÀÉ$þ5b +/MðÖ£\5Æ¢i¶3²i-mR&+pJq=
jQ@÷¨^ËÝ*ÆæèDÐ ¦·Gq7¤3:ÇÖ¹ÿ x^óþÛÍÁv:öýñ\¤Ñ£òÞ6Geõs0>ØQ@ß|57<¦hWÜOld0Bîwg glgã8Åji¢y¿Ù:U3ìéügÚq×ÔÖ
ý
£ÿ lkÿ eXÿ iÿ ÏïÙÓÎû»~þ7}Þ:ôâG¾Ô`Ôo4«è6ù73[£ÉÓ¹v±$´(
+÷Özwö]ÚÉðÏ<áQ®¦«Ù:éöì¥W6êT)ñò p1W(
+vzN§Ü]\YiöÓݾû!
Q¦l eXSëQÿ ahÿ ÛÚÿ ÙV?Úóûötó¾îß¿ßw½8
+(¥¤éºÍºÛê}¥ô
+áÖ;¨VU
+23F}ÍGg¡hú}á¼²Ò¬m®KtG1¨SpÚ¨ Ú=+B ÏþÂÑÿ ¶?µÿ ²¬´ÿ ç÷ìéç}Ý¿¾ïzqRYé:nquqe§Ú[OvûîdF²N\9br}O\¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¯9ÑüEã
+WD°Ô~ß¡Åö»hçòÿ ²æmÔ63ög®(Ѩ®ûOÆôÐÿ ðU7ÿ $Ñý§ãú èø*ÿ h¹¢¸oí?ÐOCÿ ÁTßüGö?è'¡ÿ àªoþI æá¿´üaÿ A=ÿ SòMÚ~0ÿ ÿ ©¿ù&;+þÓñýô?üMÿ É4iøÃþzþ
+¦ÿ ä îh®ûOÆôÐÿ ðU7ÿ $Ö÷õKÍcÃéwä¡ss#(åO$`
,Äd 8Éë@tQE QE W-â}gX²ÖôÍ;IÆ´Û\O$vÏ7ú¶
@dLgÍ<z
+ÏþÓñýô?üMÿ É4ÜÑ\7ö?è'¡ÿ àªoþI£ûOÆôÐÿ ðU7ÿ $ÐsEpßÚ~0ÿ ÿ ©¿ù&í?ÐOCÿ ÁTßü@ÍÃiøÃþzþ
+¦ÿ ä?´üaÿ A=ÿ SòM w4W
+ý§ãú èø*ÿ hþÓñýô?üMÿ É4ÜÑ\=¦½âH|A£Ú_ÝiW·×/,d
×K !Î:Æ1Þ» (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ +Ìü!ÿ "Vÿ `ëýµéæ~ÿ +Aÿ °u¿þZ °Õu+×0ßj#Sjö ZVå¿z"¬@ûÎXÉùN&Ô/o
+d¹XâóbÈ°Kå;eQå£À# U/¹acnðBÎÊÓK9.A;¤¤n²Çت
+áÈQck[ë»Kä¸u¸ËfÄòy²&vîÛÛ#hç®@2.<ooÃ:ì+ËKIþÝp°BQ;üì°ãø;@6¬<U>® éz|7^T~eÆ.ÀyGû·dÃ!`#'hC©»CçXÛÚ[ZÛØK«H%»')órãÞC"È£æEw\¨f`»ãËÙØv½Ô/ô¹¦Ôonb_*MãjLêv¯LméÈPO$'5+"ÓPÍ-o&³{ya#¥%+"£ÿ ð>oaIÙ°Ò7-]ËtQöûÂÌÉÂçnæ,?8ÇJ/ÛÇo±¿¾{Xm:bTaFáÐe÷6Á$VµñzK{yi%´2\Am-ȶ±º[ÔFT4r $¹eA`Ha»Iÿ \f²ZÚHn¤dI"¿Fm¥FØe aQd¤ 6¾·µx¶ßß4PBÖÖñoUÀÀ²¨||±ÅüܶâOÛÍi4_ßHnYä
Ô¥eTeu
+
+
+À,ÄnÕß ÿ Ȭì#¨édÕJ®øþEcÿ aCÿ K& ( ( 3Åò:èö¾ÿ ѵǽõÍ×uK'Öu«QÜpA²DªÐÄß4 îvÎæè+°ñGüºý¯¿ôeUµ±ÒâöxÙË^L'1#HøöÄcñÍ f[øYµQ¬Ñl®næ²a12bó7nM¸UýÌ!û¼´çñC¦è×i¦<Í©ZGr!Ie/-¼{ Ò3T|½³§íàÔä\Ü´QÍ%Ì6¬WËY7opBï$ùpÌ@ÞpÁ+-«»æ[EHí£idQ¤±JÞ£qËNXáH Ä·oxtåÒÑõ(ZO>$¹ù6"ÄÇËr£s<xgvX Ïм]{u¢[Ïscæyak*¯-ÂÛ
Æ<âHàp¸Îã³j
+ZË=ê]]Áq<Ò<2%"FeTc9pG3PEáË]+÷e¼×Ñ\Æ´3LxÇ, Ú»P ÷áhÓëÑEc¬ßKýLiøÈo9R5g+Ðd1tÆ~òHä
+Wz®³ou¦Gq`4·l¬ë2ÎgÂuBº5ê å~cí¶h£Lºî"c» [îÎ9RX¹HyôoÛßD±êw÷ÚÄùîª
+´RDWª6Êüd í|gÅ¡ [å³XÆøO Y¨/.Ñ°)VgùNÔù¹è,ÜxH-´Ù>Ç {ÜÍÚ ±I÷]ßp1©Û¸ILSÅáâO4¾£-ÌѬm91# º<lE).pF{0/fÓÀÝ]¬'Ídí"V-(q|Ä
+W$)PH ÿ ÈÓáoûÉÿ ¤w5èçòÿ ÈÓáoûÉÿ ¤w5è QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE Wgð÷ìVövÞ)×#··b6Úª£ dÁÀï]ÉÂ7ý
+çýñgÿ ÈôÂ7ý
+çýñgÿ ÈõÖÑ@ü!ÐÙ®ßüGü!ÐÙ®ßü]mæÓèW5ħ^ñf¥o¦³'QSh±¯90k|DpBÜU?p²!Üÿ "oú5ÏûâÏÿ ë®ì7¾ùô¨ç¿Ó~èÒ£V·¾ÎÍ´m9Ûq°¨@Kþ¿èl×?ï?þG£þ¿èl×?ï?þG®ÆúßQ³êÖO2È©R$2²`AHA ±@ü!ÐÙ®ßü[z¤¦
+Ä÷
+²K)}»Ý¤¤bvª¼ç ¥E QE QE ak¾\½³¼õ
ŬrÄiåË!BÀÇXצ;Öü!ÐÙ®ßü]mÉÂ7ý
+çýñgÿ ÈôÂ7ý
+çýñgÿ ÈõÖÔsÏ
+¼·Ç!y$ª($À s å¿áþÍsþø³ÿ äzËÓ|5y«\5Í·µ¤";B×Mó§î0" ùÈÂ
i:±Üx÷·Æ{m!¸M=+]§÷®Oùr$ÎótÉÂ7ý
+çýñgÿ ÈôÂ7ý
+çýñgÿ ÈõÖÑ@ü!ÐÙ®ßüGü!ÐÙ®ßü]mËÙø-mµkB}{U½k)X¢[ÜcxòvD¤ü²7zê(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢1ï´<ÞI©iA§ê²`K9ÌK
&@Ê_
+§peÇiei4Ýio.Âê ,õ8дîk @-*r¼¯#zÇmpkÿ µ¼¾ð¤WÃU¶òaÔlÒK×ÿ F·Ûä¹Jää.°Ù<ô¬ÿ ÝwÃöUÖ§´±2Ú^i÷©0¼ð}®(Úé¤ ù2*M
+¾_ßÜ~óE°Q^/áßxÊfÑôÝcX6¼»)õ4HXA#ÅpZѪî¤8M®Uþñ`Ë°þ#ÔuBö<Kmc
+¶Rn¢½EÓm «R¦N"Ê {Éø7W¾Ô®5H®ïã¾H]%=«1}ÑLn»T\3Ǹn÷|½e QE Wøm+MðÞ«x`jL¶A§Göï5Ú%Xæc1ÞB¨ùòÙÝ2#ñotMjZë[û%ü]YËfÂ1¦²ÊÆÞ[»þæUvå1¨ß
+ {$óÃko-ÅıÃH^I$`ªI$ð æ±àmvâ+ëè¤OÄr©VÊÍ2A#?wojÅæãQñF«a{¬jZÄb
+GX·Óá·FyÜyfi
+âQ-DbUãÛµ\Øñ¿|ڶͮÇmy±vi%¶VŤBê¤Ä/t¡Ç>`_.6RëV?
¯®5Z\ÝIæÌÛÔÊ(WeWR0X ÁÀPà
+¶ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ (¢ x!º·Þâ(æT)$r(eu#x 1Xf¼ðßÍd¿iÑDZkUîa üѯhvî
H« ¢+Øß[ê6qÝZÉæBù *AVS¬ © V+ûGt¼TÒ_ÈÔN¼¬ º ¶E
+¡w®ÕûÊ
+4n·
+åÃi÷>]®¯Å¤ÛAÌN
â$8®V R*¥©C¦[¬,É#à·$òHDI$ f!A Këë}:ÎK«©<¸S ¥$ªª2Y H k>ÆÆâöò=WUË2m,Ë1
+1Ã!A(¤ï!c¦^My£M×QdÛA
+®àA ±Ì`ó_
TÜá¶( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ª÷×öze÷pZZÇóO $<ãV+ñ÷üÃþÂ:þC@Âwàÿ úô?üÃÿ ÅQÿ ßÿ èkÐÿ ðcÿ Yÿ öß²ù³nó<¯7ìòy;ó·o·ËÝ»åÆìîùzñ@7ü'~ÿ ¡¯Cÿ Á?üUgë>/ð=ÖïqâÍ)Û3Å5µôM4. üÑI-FÜÀ!,¢<ÛÂÿ mS[M]£k8,¤Kó¶Âó¼[,
AQ,FHÂ*å°zO>=±Ô4ïí?êºU¶³å$qÏ.§mµ¡ 5|ÄĨ.¬-·*¤}-§ÿ ßÿ èkÐÿ ðcÿ Gü'~ÿ ¡¯Cÿ Á?üUcZÝÁ{KnûÑd"pGÌQ>¤~5 iÿ Âwàÿ úô?üÃÿ ÅTxÓ·W[ÛøFy\$qÇ3±8 Ù$1Y®Çµý
tÿ ý+=( ( ( ( ( ( ( ¹h~"xvâçõIbC¤£Þ2²Ar®¦¼ÏÂò%h?ö·ÿ Ñk@7ü'Ú¦¯ÿ [Ïþ5Gü'Ú¦¯ÿ [Ïþ5YôZ^w¨N®ÑZÂó¸@U,qsDÑGª[éå_ÍgR Úçß2.>5ÿ á>н5üÞñª?á>н5üÞñªÅþØÓ?³?´ÿ ´m>Áÿ ?^zù_{oßÎ:ñׯøõ+^öÙÚeW,ªLÁJóÈ!u
+}
+ kÿ Â}¡zjÿ ø%¼ÿ ãTÂ}¡zjÿ ø%¼ÿ ãUúZz|¶É{*ïÙ¥Q#¯<
ÎHàþGÒ«XøL¿OÙwWöÉs¬²*ÌÈ˸ÉàJ è?á>н5üÞñª?á>н5üÞñªÈ:½Ú5í°k5r«À¿?(À'Õ<3EqsÁ"K$F¬¤dGPE hÂ}¡zjÿ ø%¼ÿ ãU½a}o©éÖ×öry·Q$оÒ7# Tàò2ë\¥iøþIç¿ìkÿ ¢:
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+(¢
+æ|}ÿ "°ÿ °ÿ ¥×M\×#O
+¹ çhïl¥1ÁJûRê&bA'
+ àv
+5ÄÅ6¥§i:jº¢^éíkktÚ·0ñ£¹»rFÆ7eÚÛz?íÈè®àóÿ Qý¹ýµÏü^ñª æF6 =Þ4ÖòkWrê41
+÷>PòðK&÷Â@'~:µM§¥Ö6zöon±ßÃ1BK*ËqÛ¦ßùf¾ZcæÚ©¯Jè?·!ÿ v¹ÿ KÏþ5Göä?ô×?ðIyÿ ƨÏü7bëpÿ fÝ®Îf±
+¥½¡3Ò&òÃÎÝà
ù±ÓjqÚ]kfëPÒîïmæ²û<%«"t
önä4?3äFÃí3Nk°Ö`ûTèÒ;è÷<$J9;Q@N;nã-Y·k,jWÐ+i-t«©T6Á+Áâ0nì¤þÌ+½5$íúºÓ¥½D-rå?ÑÐK)$HxPÿ 'mo"Õ4Ù.í.å¾ÉÔ÷Q8xÊC±Êϯqåìe]¤ôßÛÿ Ð;\ÿ Á%çÿ £ûrúkø$¼ÿ ãTáW´ûd_d4h)%æÝæ)%d|¥§_BÃr´õÏøö°ÿ °®ÿ ¥pÑý¹ýµÏü^ñª«}|u&Óí´ÝdÈu;'&M&ê5UKf(TÚ=B( ( ( ( ( ( ( ¼ÏÂò%h?ö·ÿ Ñk^^_¡[xKðö§Ïá-Q¥µ´)qfT² SÎ8È ºíº§µ=>EêÒX¹!C2ÆxɬK½zõå¹Ñ¦··]:æÑ ¼Ï3ðDÎUqðFáyÆÏ®ÿ С«ÿ ßû?þ?G®ÿ С«ÿ ßû?þ?@Ìú^³>ms²î;5sŨ½</Ç_-O-Wø*oèV¡y¨Mc4²µòÚGçwiî&26¨c¾<Î butn»ÿ B¯ÿ ìÿ øýW¿Ôõ]3N¹¿¼ð¦¯¬O4ÏçZ¨ 8äàÒ*%µÝ¾±¨DÚWÚíï¯bºYÙÐEXâ_¿x1\))óJóú½o¥émir¢±âµ6Â)uù\ÄÊ¥N̲@ÜGmæë¿ô(jÿ ÷þÏÿ Ñæë¿ô(jÿ ÷þÏÿ Ð96z×7ÊsdgçE¹d3¤ÁÜä²dåÞAØ ®Dæ
+&$»#³»UîrÀ¾ßÌ û~RűÆ)þn»ÿ B¯ÿ ìÿ øýn»ÿ B¯ÿ ìÿ øý ]?É<ð×ýôR×?æë¿ô(jÿ ÷þÏÿ ×Qá;3Áº
ä~]Õ®oɸ®±¨aÁÁ¥ lQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QEÏøËþ@vßöÓô¶¹©xoEÕîêÿ K´í$wMÄ$l|èA$¤y5OÆ_ò¶ÿ °®ÿ ¥°×A@ÿ ö©cÿ Nô[}N?¶Æ©!,ųݥ` mÚkkºwö¨G[*Q'Ê>ó¼/µ×#¨ä» ¢1ì|S£_ÞGeç}&Lvw=´ò ,±JÙpÌ>Vç¯}ag©ÙÉgiݬßñ°ASÁÁ þÿ ½·:V§ªémÐ{£,jÜHfD8ÆÔ @:
++ûGtînl¬uG,öÚÍÏV)Y°y,f^ Âä
+Çü&:]·Ë¬yú$þÓO*0{(±íW'ÈX ( ( ( ( ( ( ( ( ¹ôÿ \g?6¥Êcy[¥ØÁÆ8+Ü£$þóvB´JMZúáï Ò4Ù6]Ïó\LªÙÁýî˹v nä¶×XÝkBÂÆßLÓ¬,ãòímbHaMÄíE (ÉäàÖ,QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QEâsþÍ]OËöKX¸È|ÉR=Îû[j®üÀ¬ý'ÆÚuåòÝßi^d_0mã^#®U at V®ù72¯¡o¼§4©µ'ì÷1ÛN·÷Ë$FU
+É(C) ÇQÖ²æðÞ±¨}¢mO\îÒ 4Ù,ìÞ²æÌÛLæ1Ê¡îÈá0õ/iþ Ñm¢+¸®N»kÖ³
+«£rPÃ8Ý2YøÛâY£:ͯnÄC!tb¦;pÓdD2ì0BA<~¹àì˸5§¸±¹ëv¥L¶½95!(Xäßò6ë6u
+6©Rð/ÛôÍ>Ôj>\ܺÌR7#I4»T4«X)il_4mOS¼²Yö4il±ÈËG7åKv+K£(ùQÔWoàkµÖÛS¼Ö£¹KÕ½wû
+$°°H¤Ñü ®ýÑásÎÝ¥ QE QE sÿ ð
èP|Úe§ö<Ã&Æ×,>éuL$»OA"²òF0H<ßuøjöÓNÓõMDÜÛÍ4/{¤O<¹áHmxÆ%bD Úªr[uz%SM]fÛTfÏ··Ý´¬1<g9qÏs×°&ÿ l4ø®¢Ö´ËëNÎÐÜÜXCåÞ:
PÍÌÛn\4¢0wëâø·á©ïHñ¥¼×4sÛÈÓ¬q´ÖS"Ç÷ÆÖ K¿Ø]ýµMíôpÝEuØç&p¤¡?;pÈáw)§â?oï/®$»¶¹»@$ТI2D
àÆ<²òÈ$íÜwP¥ »Ôã°N¾²¥6ÇÏòKÉ%¾cï228ݻ宸¹< wm¨Ã¥øíe÷íN£
+]D[ìæÜr»%$FTÒíËn$ÔþÛÖløÔü5;(ùm2å.cDîH.Vav¤mn'h è(¬½7ÄzFpÖ¶ÑÄBòYÊW®@ËÂà:F QÀô"µ( ¢( ¢( ¢(Ïô[Är]jNÖ÷zÈú°Ù,QK* ãe`R0Í +´Hy;j½ßÅW´³fm1yË:ÏpÖÑFèm¶ÓF
Ôcs"áºüwiV0ØO`¶Ñµ¤ï3Ë:¹ÙäÈlä3;qÓtâ¹=ÂÚ6§¬K}ϱH¤µ³k©^ä^$eÃKÜüQ§ÞthÂSÐüIzai¢Ó#¸×¯µ,'û\Û"(KÌPk.Øù7Iá¯ÿ ÂA»uÙ÷Ú[ßÁwî·[¶OݶåãÙ8±iá}&ÊxgÚheóÖI®å=ì]æÙ#.NNТ&Ûn§i>Ãoål´É~vlCï-y'¦öç©Ï$ñ@QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE sþ2ÿ ·ý
tßý-º
+ó:°ð¶ee|ÿ i»¶ºhV6B ¹Ihãpç®=ÂëíÚuµçÙç·óâI|Ù${;]{0ÎìhÅQ@Q@Q@Q@Q@Q@õ-'MÖmÖßTÓí/ W±ÝB²¨l3îk/þ±|Ú«}¦ãoæ}¢Øãî§&|¸ÇM°ø8ÈÂíè( í~)±ÿ .ÇT
>ô¶ ¤ÏM°Kòù É Gü&.§wý0àǪ©µË¼ .ÓÔÆ̼OAE W?ÿ vmóhþ~ å³Êì` ÂìG Æ0AU û?tî-¯luG
+àÚÍÏ%X°x
+!^ËdÀÏÿ ÂVÜêú>«¥Fy\B²Æ ûÌïH±*ðKHTc8}cãE¼þÓõ¿
+Z}¾âMV+6áW á`ÚÃpä ƹÿ «ÏøF£æ "j§¡®$P½#!^²rP¹ÿ ¥Çü"Z}ÍýöÚÜK=ø¹ Jó'ÀÂñµB®nÑÐPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX-Õ/4½Ý.Í´gº/<qT2äã#¥m×3ãïùýtÿ ý,3?´üaÿ A=ÿ SòMÚ~0ÿ ÿ ©¿ù&¦®[ĦY<C¥[}Rê&´ºvO¼6ìY^ @Ã?{¥ tÚ~0ÿ ÿ ©¿ù&í?ÐOCÿ ÁTßüXV÷wÖ÷Ú>ijöÑO
+ÄóFfxÖ9"0vÜHã ÿ ÃmâvmMJUÓ£û6«,)·®|µmÃc~éâ0oÄZ^·â«;[]ZóCk¸®ãS¥Kèz072YH ä1èpFÇö?è'¡ÿ àªoþI¬ý:úúó[Õ mÊÊe2¡Æ(¤ç°yõÎGÝÛób¾§¬]ø{OÕ$Ù-¯¦°5^9!Y.!ýÛÄH
+¹¾Ntù@:¯í?ÐOCÿ ÁTßüGö?è'¡ÿ àªoþI®bãÄ×ðkfo¼Ù&x ôG Ý7îÙiPRÄdì9ûoRmÏÃ4ËsåK<v
+íݹísæÉUÚðË&vð :í?ÐOCÿ ÁTßüTµxÃJÑ/õ·èrýÚIü¿ì¹~Å-ý ã8ë»g?Ú¬î3y±«æ<ÈÎF~VÀܾ#µfx¿þD{þÁ×ú-¨Ó(¢ (¢ (¢ (¢ +Ëît-Tñ'Ô4«¹Vþ$\[¤ìç ñ:õ
+óø¿äiñOýcÿ Ò;j þÓ|¥Î°j^´xâ(#b¹#8 q*Ðÿ CÃ?ô.éøÿ T¦SƺöuÝ¥¾4ëO3í6ïÞ\ãdLwõü;ák¢ëF
+&Îñ ÓL=6KBH¦Ô4?il,YÔ >s«þÿ л¤àüMG/
¼)AÑcRʽ@bG#©$êH¬8¢º¹ûýWQlׯ eÁ\CÚñã¢ü£¼8Ã
+©¶®©êO¦[É6£s4è·r;§|÷%dh )UUÚ8À$ä³ÕÂ!áútüÿ ¨Ï
¼(³¤AÑD®¬ë³s( :˨õ¬;ÉóYûRmë¹åM HÐJ¸ISnm~BQeNÌ~è5æ§uöm Ãuw´Ó Ù®$]Ú£È$,&¬Ç
+°ï$M tÿ ðxgþ
Ý#ÿ £ÿ âhÿ CÃ?ô.éøÿ \ür=ä¶vz¥ÛirkF.!ºg3Aö&vQ)$ºù¡ÆrJT¨Åí)á?¶¿o~`¼ÓæGh/Z"ÌÙÜ ÷çåfÝM ixQgH¢]YÖ3gæP@$t?QëRÂ!áútüÿ ®búîÊ+ËytíBîîÍl®ÕgLÁAÐ6.-åòÅüPe¾©$ºÚIª[GmúìÆ«+E$
+Æoù¾hz²³(ªÿ CÃ?ô.éøÿ Y)ð·ü!O¥Å,vºHq«+ØhÓoåÚ,·WÒI<( Ç4(aDÖûBmÜ 3.}¯âÿ ùµïû\è¶ L¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ¢( ®gÇßò+ûéÿ úY
+tÕKUÒ¬õ½9ì/ãy-ÝÈI^6Hd! ð{P3YúeªO÷iY`WHä·º
+ÅKÆËJ/_JÝÿ BõÕÿ ðuyÿ Çhÿ BõÕÿ ðuyÿ ÇhÛJ´µÞD<¶ñÉrM;ÊÁ]rIÉEëc«7tÚ³:Åo
+Û¬i<¯*H~ñ@ϸ|Íýãþ×Wÿ ÁÕçÿ £þ×Wÿ ÁÕçÿ Óí¢¸xÕÒIfóä+# ïåòFpFÐ:dÕ8ü3¤Är¶Î@dhÕç-®«-×r!Ú¸SµA WGÿ
ë«ÿ àêóÿ Ñÿ
ë«ÿ àêóÿ Ð97täkgq#1äò·óí¶X6ÌÁÈfËÿ áÓ¾Åö_*m¾gæý¢O;~6îówy¶ü¹Ý¿/N+ ÿ BõÕÿ ðuyÿ Çhÿ BõÕÿ ðuyÿ Çh>b·8 "5¢
UP0 ²|_ÿ "V½ÿ `ëýÕÓ¡zêÿ ø:¼ÿ ã´É¾øvâ 5IbJ<o¬^2²2ò ¦( ( ( ( ¼¾ç]Ñô¿x¢
+CU±´¯âqÅÂFÅ~Én3Gò¯P¢<Ïþÿ ÿ ÐŤàlüUðøgþ-#ÿ cÿ â«Ó( 3ÿ ¿Ã?ô1iøÿ Gü%þÿ ¡Hÿ ÀØÿ øªôÊ(Ìÿ á/ðÏýZGþÇÿ ÅQÿ èbÒ?ð6?þ*½2 ó?øKü3ÿ Cÿ ±ÿ ñTÂ_áú´ü
+ÿ ¯L¢<Ïþÿ ÿ ÐŤàlüUðøgþ-#ÿ cÿ â«Ó( 3ÿ ¿Ã?ô1iøÿ Y)ñO®<!A½¥Ë,¢F³3Ø <kØè ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ÿÙ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/index.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/index.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/index.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5 @@
+GIF89a ð ÿ ÿÿ!ù , $$$(((GGGLLLBYYPPP]]]^rreeebuuexxyyyo¥¥v©©xªª¨¨·· µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÍææÿÿÿüû ÿÿÿ ÿ =H8hð`ÂJ8 hܸ±'Z, *hÐP!=é!à "lØɳgd z*U
+ C'f y ÂÒ
+\pàiÔ
+ °puFK-8U0Ó£VÝVi§*bL*ãÙ« ù6AY¿t¯& FKd;ÁÕ
+0 ×2O=%/5à Ï<ÍÖÝ :5Õ @ òNÊW]¿ö ` q±&þ çÜÝ;+ pð[ÃmÄÅ9²FVÃò G<4ôê ü~|uëç/PÛxúܸyFè}á´RÕ=Ï-ûáÑÎùÇhJ9ÑcWIÕYY¡æSfn`X_ß)Æ@À×}Ô¡@o{ÃÙ
WAaurJYÐ[%Ö©Á\WPQQHå¶TS^V 9ù¸ÁOA}ÒH%ÒJ-½ÓG4IÄ$tÉTåùÖ CATe@ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last0.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last0.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last0.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,6 @@
+GIF89a ð ÿ ÿÿ!ù " , $$$(((LLLBYYPPP]]]eeebuuvvv~~~o¥¥v©©xªª
££¨¨¹¹¿¿¦¦¦¬¬¬µµµ¼¼¼´ÐлÔÔÇÇÇÌÌÌÃÙÙÉääÔééÿÿÿüû ÿÿÿ ÿ EH
+0XÐB
+ J8ðà 2jÜH`ÂA\ @8pÀAÁ :F)p XèÀ³§O`"Ø@s ø\ºÂD'
+` Ó«=1éA"T3`Û!ÃV3N 0À*Ù±N¨xTiÏW9\àpB E¬=à3ÂI¦DàËtë\GwÞMp¸pÅþ5Èv©áÏ?<ÀÌôéA
+<ͳeÅúT ! »ñlAAXÈÜ! Üæn`§kÀ,Î
+ ÄWÖþZÁð 8ÎÀØUãåiaµo¾`çPýºræëÛ;_¸ìTG ë-×dF÷Ý]ÇUzúõÔÁ-ØSµiÐe¬µ¦xegd§Ývb aË-ØoW9&ÐuvU{õõW`.¶õÖXÈUÐMü7dO ZyQUKfå$QId[¸½åT4ypS :P]Ñ$H!å[J+µôRL¤¥¦a´ÑH äi@Y7(Dj ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last1.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last1.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/last1.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,4 @@
+GIF89a ð ÿ ÿÿ!ù " , $$$(((666GGGLLLBYYPPP^^^Oeeeeebuuexxyyyo¥¥v©©xªª¤¤¨¨°°··¿¿ µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÍææÿÿÿüû ÿÿÿ ÿ EH
+ <pPÁÂ J8
2jÜBD- @ <xÈ ¡A x9°
+$|Øɳ'0t Ùc=&P @¡@A©U8
ZqÁT
+WÃ~Ð À) (Põ«oJhJ¡¢ Hw `uïÕ|T« 'L¾I_-[Ä]<dDy²Ü 8X#å0-+= à I%{®¼:i @fÝZuk Xx -íÕ¶oÈ ào©7z~ÛCq ÷d>: ÊÎöN®/õÏÄÊæ^»{ÒÜO¿þûóÎ××ÿlÛýΦÀ0]4ÏÐö} fM @aÿ±\0&cxEVU%ýZj±µS\J!¨Ttä`eUVf¡%TTOQ$ÕQ.îÄÔVDy@NbI Y\$IÒJ¸L*Ò$ÂÊmĤBrpAB8 @äd@ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next0.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next0.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next0.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,4 @@
+GIF89a ð ÿ ÿÿ!ù , $$$(((LLLBYYPPP]]]eeebuuvvvzzzo¥¥v©©xªª
££¨¨¹¹¿¿¦¦¦µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÃÙÙÊääÒèèÿÿÿüû ÿÿÿ ÿ AHÐ0XÐ@ÂJ8°C 2jÜH B=\ @4h¨ð@A :F)0 PØÀ³§O
+ @f8ðÉ©1N<À@
¦X{V8DªZÈJv®f
+ `ÀÕ²d+@P¥YÀÝà@ Ø ûàä^®@x@º3oÃe) `@²
3Ãà Oj&« B z .Üë xë85ë¬ 0!tê
+£j °`ÞªSHÐÚçðݳ}ó\ÞÜgnPK§ ºÏ×?û¦^6}C&[ Dƪ×gL90Áµ ¢R¼®íÕ×_±åÖ^¸ÍUÐM
O0ZqUòTH%Mm×SQuS :EÔP^ѤØH%)J,)ÀYLPè¢Emä# æâDIÛ»IpD. ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next1.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next1.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/next1.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,6 @@
+GIF89a ð ÿ ÿÿ!ù " , $$$(((666GGGLLLBYYPPP^^^Oeeeeebuuexxyyyo¥¥v©©xªª¤¤¨¨°°··¿¿ µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÍææÿÿÿüû ÿÿÿ ÿ EH
+ <pPÁÂ J8
2jÜBD- @ <xÈ ¡A x9°
+$|Øɳ'0t Ùc=&P @¡@A©U8
ZqÁT
+WÃ~Ð À) (PU)±;%4¥PÑ@ ¤Vû! Õ*s/ܲtAØÕyu at FÃa%H`À±0Ã= à bklµ 7ÞtR ,< Ðv5k×X<í!4kÍJ=èv wXÑ·
+gHÛwr« 4Lí|täØ>Wo-ÖôõÕq'um
+1A GqÁ«Å'E,PñÝ«%ùú<P-[«ðÁ\y
X|%Yh $U b¥ÕSIuTLmEWä$@ÅH"t@¤´R.Á$S4Pâo½#\@`ÁÅ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev0.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev0.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev0.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,4 @@
+GIF89a ð ÿ ÿÿ!ù , $$$(((LLLBYYPPP]]]eeebuuvvvzzzo¥¥v©©xªª
££¨¨¹¹¿¿¦¦¦µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÃÙÙÊääÒèèÿÿÿüû ÿÿÿ ÿ AHÐ0XÐ@ÂJ8°C 2jÜH B=\ @4h¨ð@A :F)0 PØÀ³§O
+ @f8ðÉ©1N<À@
¦X{V8DªZÈJv®f
+ `ÀÕ²d+@P¥pu ÀGlÀÝðà$Y®@x@º³laÃY) `@¼'!gà e),¬¬ ÆJ°fÖ $0 ð¶©èÒã`0[ÖÛ=sgÕ `Á ¾nìz5Vâ¼iGNÐX8Ö
+»%¨&KA^ëÊcOøzôë¦ <´÷öy¦ @dù}OÉÙ9S®tÐRx9¶W_éçÖ`YÉ@c1è¥@`d
<U!RIdS[ÂõTTFÝN¡5W4)6RIÞ¥´RKÅÁ5ZÑFD A5~
²-À@Tc@ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev1.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev1.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/prev1.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,5 @@
+GIF89a ð ÿ ÿÿ!ù " , $$$(((666GGGLLLBYYPPP^^^Oeeeeebuuexxyyyo¥¥v©©xªª¤¤¨¨°°··¿¿ µµµºººÂ«ÊʼÕÕÆÆÆÌÌÌÍææÿÿÿüû ÿÿÿ ÿ EH
+ <pPÁÂ J8
2jÜBD- @ <xÈ ¡A x9°
+$|Øɳ'0t Ùc=&P @¡@A©U8
ZqÁT
+WÃ~Ð À) (PUìV%4¥PÑ@ ¤n ¸Aj¸ý@dزtAØÕ)¶0½W%H`À¼= à 7B¾Ú B :Ö8:. ´UºµØ Äö z£í°r; À¶ïg(ûjmä·4Döyò¤^_øú7i ×bv¶)Ä0×yrÄ c¾Î±@Åw¿äëZ¶ÉTsä`
+Z%TT)VOQ$ÕQ2µQ^X eW DÒ'¥´RKÀ$Z4ÝGÁHÇiôb%rp8 @c@ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/standards.htm
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/standards.htm (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/architecture/tour/standards.htm 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,18 @@
+<html>
+<head>
+<title>Slide 1</title>
+</head>
+<body text=#000000 bgcolor=#FFFFFF link=#000080 vlink=#800000 alink=#000080>
+<center>
+<h2><a href="img0.htm">Click here to start</a></h2>
+</center>
+<center><table width=90%><TR>
+<td valign=top align=left width=50%>
+<h3><u>Table of contents</u></h3><p align=left><a href="img0.htm">Slide 1</a></p>
+<p align=left><a href="img1.htm">Slide 2</a></p>
+<p align=left><a href="img2.htm">Slide 3</a></p>
+</td>
+<td valign=top width=50%>
+</td></tr></table></center>
+</body>
+</html>
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/background/charter.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/background/org_chart.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/background/whos_who.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/doc_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/doc_utils.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/doc_utils.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,117 @@
+<?php
+
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999, 2000, 2001 (c) VA Linux Systems, Inc.
+// http://sourceforge.net
+//
+// $Id$
+//
+
+// colorized link to a file with CVS history
+// @param threshold age when quicklink is no longer highlighted (default is one week)
+// @param path path to file within CVS module
+//
+//
+//
+//
+//
+function util_cvs_query($path, $threshold = 604800, $module = "alexandria", $cvsroot = "/home/cvsroot", $viewcvs = "http://webdev.sourceforge.net/cgi-bin/viewcvs.cgi/") {
+
+ // cvs, the client, is too restrictive to use via PHP
+ // instead, read and munge the RCS files directly
+ //
+
+ // clean up slashes on inputs: path and cvsroot should only have
+ // leading slashes, module should have none
+ //
+ // TODO
+
+ // fail if path is unset or a directory
+ //
+ if (($path == '') || (substr($path, -1) == '/')) {
+
+ return 0;
+
+ } // if
+
+ // extract head line and first date line
+ //
+ $cvspath = escapeshellcmd($cvsroot . "/" . $module . "/" . $path . ",v");
+ $cvstemp = explode("/", $cvspath);
+ $cvsfile = $cvstemp[sizeof($cvstemp) - 1];
+
+ $datecmd = "grep -a ^date $cvspath | head -n1";
+ $datestring = exec($datecmd);
+
+ $versioncmd = "grep -a ^head $cvspath | head -n1";
+ $versionstring = exec($versioncmd);
+
+ // test for error
+ //
+ if (substr($datestring, 0, 4) != "date") {
+
+ return 0;
+
+ } else {
+
+ // pull out date and format
+ //
+ $result["date_full"] = substr($datestring, 5, 19);
+ $result["date_YYYY"] = substr($datestring, 5, 4);
+ $result["date_MM"] = substr($datestring, 10, 2);
+ $result["date_DD"] = substr($datestring, 13, 2);
+ $result["date_HH"] = substr($datestring, 16, 2);
+ $result["date_II"] = substr($datestring, 19, 2);
+ $result["date_SS"] = substr($datestring, 22, 2);
+
+ $result["date_UNIX"] = mktime($result["date_HH"],
+ $result["date_II"],
+ $result["date_SS"],
+ $result["date_MM"],
+ $result["date_DD"],
+ $result["date_YYYY"]);
+ $result["date_RFC"] = date("Y/m/d H:i:s", $result["date_UNIX"]) . " GMT";
+
+ // pull author name
+ //
+ eregi(".*author.(.*);.state.*", $datestring, $eregi_result);
+ $result["author"] = $eregi_result[1];
+
+ // pull head version number
+ //
+ eregi("head.(.*);", $versionstring, $eregi_result);
+ $result["version"] = $eregi_result[1];
+
+ // generate ViewCVS string
+ //
+ $result["viewcvs"] = $viewcvs . $module . "/" . $path;
+
+ // build quick-status HTML string
+ //
+ $result["status"] = "<font size=\"-2\"><a href=\"" . $result["viewcvs"] . "\">" . $cvsfile . "</a> " . $result["version"] . " " . $result["date_RFC"] . " " . $result["author"] . "</font>";
+ if (time() < ($result["date_UNIX"] + $threshold)) {
+ $result["status"] = "<b><font color=\"#000000\">" . $result["status"] . "</b></font>";
+ } // if
+
+ } // if ... else
+
+ return $result;
+
+} // util_cvs_query
+
+// utility function to call util_cvs_query
+//
+function util_cvs_status($path) {
+
+ $result = util_cvs_query($path);
+
+ if (is_array($result)) {
+ return $result["status"] . " ";
+ }
+ else {
+ return "<font size=\"-2\">revision history n/a</font> ";
+ } // if
+} // function util_cvs_status
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/docs/index.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/index.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/index.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,255 @@
+<?php include("doc_utils.php"); ?>
+
+<!-- ------------------------ HEADER ------------------------ -->
+<html>
+<head>
+ <title>SourceForge: Engine Team Documentation</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<table width="100%">
+ <tr>
+ <td>
+ <b><font size=+1>SourceForge: Engine Team Documentation</font></b><br>
+ <font size="-1">$Id$<br>
+ SourceForge Engine Team [<a href="mailto:alexandria-devel at sourceforge.net">email</a>]</font>
+ </td>
+ <td>
+ <a href="http://sourceforge.net"><img src="images/sflogo2-105a.png" width="108" height="53" border="0"></a>
+ </td>
+ </tr>
+</table>
+
+<!-- ------------------------ MENU ------------------------ -->
+<p><hr><p>
+
+<dd>
+ <a href="#0">0. Quick Links</a>
+</dd>
+
+<dd>
+ <a href="#1">1. Background</a>
+</dd>
+
+<dd>
+ <a href="#2">2. Project Management</a>
+</dd>
+
+<dd>
+ <a href="#3">3. Requirements, Design, Implementation</a>
+</dd>
+
+<dd>
+ <a href="#4">4. Projects</a>
+</dd>
+
+<p>
+ <b>Note:</b> revision histories in bold denote changes in the last week.
+</p>
+
+<!-- ------------------------ SECTION 0 ------------------------ -->
+<p><hr><p>
+
+<a NAME="0"></a><b>0. Quick Links</b>
+
+<p>
+ <b>List Archives:</b> | alexandria-devel | alexandria-cvs | <a href="https://lists.valinux.com/archives/sf-engine/">sf-engine</a> | <a href="https://lists.valinux.com/archives/sf-onsite/">sf-onsite</a>|<br>
+ <b>Sandboxes:</b> | <a href="http://webdev.tperdue.sourceforge.net">tperdue</a> | <a href="http://webdev.dbrogdon.sourceforge.net">dbrogdon</a> | <a href="http://webdev.pfalcon.sourceforge.net">pfalcon</a> | <a href="http://webdev.jbyers.sourceforge.net">jbyers</a> |<br>
+ <b>Reference:</b> | <a href="http://webdev.sourceforge.net/cgi-bin/viewcvs.cgi/">ViewCVS</a> | <a href="https://vaweb.valinux.com/Marketing/SourceForge/">product marketing</a> |<br>
+</p>
+
+</table>
+
+<!-- ------------------------ SECTION 1 ------------------------ newer than-->
+<p><hr><p>
+
+<a NAME="1"></a><b>1. Background</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Engine Team Charter, Vision</td>
+ <td><font size="-1">[<a href="background/charter.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/background/charter.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Engine Team Org Chart</td>
+ <td><font size="-1">[<a href="background/org_chart.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/background/org_chart.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Who's Who</td>
+ <td><font size="-1">[<a href="background/whos_who.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/background/whos_who.html"); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 2 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></a><b>2. Project Management</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>MRD, ERD, PRD: Requirements Discovery</td>
+ <td><font size="-1">[<a href="project_management/requirements.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/requirements.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Change Control and the Change Czar</td>
+ <td><font size="-1">[<a href="project_management/change_control.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/change_control.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Source Control</td>
+ <td><font size="-1">[<a href="project_management/source_control.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/source_control.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Source Control: Branching Diagram</td>
+ <td><font size="-1">[<a href="project_management/source_branching.sda">SDA</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/source_branching.sda"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Community Involvement</td>
+ <td><font size="-1">[<a href="project_management/community.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/community.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Technical and Document Review</td>
+ <td><font size="-1">[<a href="project_management/review.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/review.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Development Process</td>
+ <td><font size="-1">[<a href="project_management/development_process.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/development_process.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>PS Engineers on the Engine Team</td>
+ <td><font size="-1">[<a href="project_management/ps_engineers.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/project_management/ps_engineers.html"); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 3 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></a><b>3. Requirements, Design, Implementation</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Architecture Tour (slides)</td>
+ <td><font size="-1">[<a href="architecture/tour/standards.htm">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/architecture/tour/standards.htm"); ?></td>
+ </tr>
+
+ <tr>
+ <td>PHP Template Example: Logic and Presentation</td>
+ <td><font size="-1">[<a href="architecture/templating.php">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/architecture/templating.php"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Coding Standards</td>
+ <td><font size="-1">[<a href="architecture/coding_standards.html">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/architecture/coding_standards.html"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Site-Wide Structure and Use Cases</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 4 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></a><b>4. Projects</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Code Cleanup (March Madness and April Fool's)</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>XML Interface</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Site Searching</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Geocrawler II</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Reporting and Statistics Engine</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>UI Redesign</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Doc Manager II</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Content Manager</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+
+ <tr>
+ <td>Foundry II</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status("docs/"); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ FOOTER ------------------------ -->
+<p><hr><p>
+
+<p align="right">
+ <font size="-1">
+ Copyright © 1999, 2000, 2001 <a href="http://www.valinux.com/">VA Linux Systems, Inc.</a>
+ </font>
+</body>
+</html>
+<br>
+
+
+
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/change_control.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/community.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/development_process.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/ps_engineers.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/requirements.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/review.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_branching.sda
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_branching.sda (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_branching.sda 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,298 @@
+ÐÏࡱá ; þÿ G þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿ
+
+ ! " # $ % & ' ( ) * + þÿÿÿ- . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F þÿÿÿH I þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR o o t E n t r y ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ þÿÿÿþÿÿÿþÿÿÿ
+
+ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ
+ ÿÿÿÿ .½
ÑÐ )ä°± Drawing
+ StarDraw 5.0 <ñÿÿü Éc YH SfxDocumentInfo º11S º11S uKô Info 0 Info 1 Info 2 Info 3 º11äyPðø < TASK,0,1
+ 1,0,100,1, þÿ à
òùOh« +'³Ù0 ø h
+ t
+ ¤ ° ¼ È Ô à ì 1 @ jÄ @ @#C @ F;cÀ@ F;cÀ »» ÿÿ XOutdevItemPool 1 èèéêëìíîïðñòóôõö÷øùúûüý
+ è)èéêëìíîïðñùúûüýþ
+
+&'()*+,-./06789:;UVWXYZ[\] ècèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst ètèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef ¡ d î ì D 0 } ¹'è @ q X X º'é , @ ÿÿÿÿ X »'ê . @ ß 2 X X X ¼'ë @ ÿÿÿÿ X ½'ì @ µ ÿÿÿÿ Arrowÿÿÿÿ
+ Arrowÿÿÿÿ d È d X X XS ¾'í ª @ k ÿÿÿÿ Arrowÿÿÿÿ d È d Arrowÿÿÿÿ } ú ú ú } X X X_ ¿'î . @ ¥ , ¼ È X X X À'ï . @ ß , È ú X X X Á'ð @ X X Â'ñ @ . X òò
+ @ H óó
+ @ ^ ôô
+ @ t õõ
+ @ öö
+ @ ÷÷
+ @ ¶ øø
+ @ Ì ´'ú @ î X X µ'û @ n ÿÿÿÿ ¸¸ÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÌÌ ÿÿÿÿ ÿÿÿÿÿÿ Gray 10%ÿÿÿÿ ææææææX X X2 XD XV ¶'ü 6 @ À ÿÿÿÿ ÿÿÿÿÿÿ 2 2 d d X ·'ý ( @ ô ÿÿÿÿ X ¸'þ " @ " ÿÿÿÿ BMv v ( @ @ SD Ä @ x^íSI
+Ã0ô¯s½å\èzéü ÿ
+ª46Z
Bn8xÇ)1²Ì³.<è§B+ï ̨ޢÏ40:prf
+·í|q±ìüâÊ]~½+Háë~|ðWíF¼ðúúMñbÀö þâPÙ@úaüoÌCÄØ[½È¡z¼6~U{Ûß<ª½Õ?¥ ü{¿rü=+Îý÷ô|´¨ý¿.©MåÛxò³åG¦
+Ü«±X ÿÿ
+ @ <
+ @ R
+ @ h
+ @ ~
+ @
+ @ ª
+ @ À
+ @ Ö
+ @ ì
+ @
+
+ @
+
+
+
+ @ .
+
+ @ D
+
+ @ Z
+
+
+
+ @ p
+
+ @
+
+ @
+
+ @ ²
+
+ @ È
+
+ @ Þ
+
+ @ ô
+
+ @
+
+ @
+ @ 6 (
+ @ L (
+ @ b (
+ @ x (
+ @ (
+ @ ¤ (
+ @ º (
+ @ Ð (
+ @ æ (
+ @ ü (!
+ @ ("
+ @ ( (#
+ @ > $$
+ @ T %%
+ @ j &&
+ @ ''
+ @ ((
+ @ ¬ ))
+ @ Â ;(+ @ â X X ,, @
+ ÿÿÿÿ X -- " @ <
+ , È X X .. " @ j
+ , È X X //
+ @
+ 00
+ @
+ 11
+ @ ´
+ 22
+ @ Ê
+ 33
+ @ à
+ 44
+ @ ö
+ 55
+ @ 66
+ @ " II @ @ ô X JJ . @ r ¸g A% \) X X X KK @ X (L
+ @ ³ MM
+ @ É NN
+ @ ß OO
+ @ õ PP
+ @ QQ @ ' X RR
+ @ A SS
+ @ W TT
+ @ m UU
+ @ VV @ X WW
+ @ ¹ XX
+ @ Ï YY
+ @ å ZZ
+ @ û [[
+ @ \\
+ @ ' ]]
+ @ = ^^
+ @ S __
+ @ i ``
+ @ aa
+ @ bb
+ @ « cc
+ @ Á dd
+ @ × ee
+ @ í gg @ X hh
+ @ # ii
+ @ 9 jj
+ @ O kk
+ @ e ll
+ @ { mm
+ @ nn
+ @ § oo
+ @ ½ pp
+ @ Ó qq
+ @ é rr
+ @ ÿ ss
+ @ tt
+ @ + uu
+ @ A vv
+ @ W ww
+ @ m xx
+ @ yy
+ @ ùù b @ ë è¹' í¾' ïÀ' X X X X& X, X2 X8 j @ e ú´' ûµ' ûµ' ûµ' ú´' ûµ' X X X& X, X8 XD ** < @ ± X X X X X& 77 < @ ù X X X X X& HH x @ q £+' £+' ¦' ¦' §'
+ X X X X, X2 X8 XD XJ ff
+ º @ 7 QQ VV JJ KK QQ VV JJ KK JJ KK JJ II QQ VV QQ VV X X X& XD XV Xh Xt X zz @ y gg X 8 p ª Ö 6 p ª Ò ñ 3 I _ u µ A · å û ' = S i « Á × í / E [ q ³ É ß õ ! 7 M c y ¥ » Ñ ç ý ) ? U k © Õ
+ 1
+ G
+ ]
+ s
+
+
+ µ
+ Ë
+ á
+ = \ r ´ Ê ê , B b x ¤ º Ð æ ü
+ (
+ >
+ T
+ j
+
+
+ ¬
+ Ì
+ â
+ ø
+ $ : P f | ¨ ¾ Ô ê , B X Æ < Ì P
+ P ÷$ EditEngineItemPool ¤ Q ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ 6 f x 0 q7 g* > @ 0
+ " , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ " X , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ " È È , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ Z d " |ü°° , StarBats N ÿ - àü` ` , StarBats N ÿ K " ¨ý , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ K " ¨ýpp , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýÐ Ð , StarBats N ÿ - " ¨ý%% , StarBats N ÿ - " ¨ý0*0* , StarBats N ÿ -
+ r , StarBats ÿ - r èè , StarBats ÿ - r ÐÐ , StarBats ÿ - r ¸¸ , StarBats ÿ - r , StarBats ÿ - r , StarBats ÿ - r pp , StarBats ÿ - r XX , StarBats ÿ - r @@ , StarBats ÿ - r (#(# , StarBats ÿ - " ¨ýXX , StarBats i ÿ - " ¨ý°° , StarBats i ÿ - " ¨ý , StarBats i ÿ - " ¨ý` ` , StarBats i ÿ - " ¨ý¸¸ , StarBats i ÿ - " ¨ý , StarBats i ÿ - " ¨ýhh , StarBats i ÿ - " ¨ýÀÀ , StarBats i ÿ - " ¨ý , StarBats i ÿ - X X, XJ Xh XT Xr 6'
+ @ Ë0 @ í0 X X ! @ 1 d d üd x X <( @ >1 X
+( þ @ <2 StarBats ° !"- % StarBats !"- StarBats !r- StarBats X !"- X XG X X¹ @' @ ¨3 ) d d d d d Xd d È d d È °d d d ° þY|ü ` d d d ` þYàü d d d þY¨ý Àd d d À þY¨ý pd d d p þY¨ý d d d þY¨ý Ð d d d Ð þY¨ý
+ %d d d % þY¨ý 0*d d d 0* þY¨ý Xd d d X þY¨ý d d ¨ýd X X X! X4 XG X` Xy X X« XÄ XÝ Xö X X( XA A'¡ @ V4 d d d d d d ¤d Ò d d ôd d d d ,d d È d d d d X X X& X2 X> XJ XV Xb 1'¢ @ 4 d È X +'£ ( @ Ã4 X X X '¤
+ @ å4 !'¥ @ 5
+ X '¦ 6 @ E5
+ times dA helvetica X X '§ À @
+ å5 Nd
+ 4d
+ d
+ öd
+ {d
+ îd
+ §d
+ hd
+ Ûd
+
+ Ád
+ d
+ id
+
+
+íd
+ X X X" X, X6 X@ XJ XT X^ Xh Xr X| X ?(¨
+ @ /6 '© @ O6
+ X X 'ª @ r6
+ X '« @ 6
+ X '¬ @ µ6
+ X X ' @ Ø6
+ X '® @ ÷6
+ X %'¯
+ @ 7 S'°
+ @ '7 "'±
+ @ =7 '²
+ @ S7 ³³ @ m7 |X X n Å å ï > r ® ð ¼ Ò ú 8 ` ´ Ê à ö µ P z< g*
+ " ¨ýXX , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+( StarBats ° !"- !'¥ '¦ helvetica '§ íd
+ . 6 q ü 2 î + æJ Standard Standard ¾é # è¹' éº' ê»' ë¼' ì½' í¾' î¿' ïÀ' ðÁ' ñÂ' ú´' ûµ' ü¶' ý·' þ¸' +;( ,, -- .. g*
+( @' ¡A' ¢1' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Object with arrow Standard Object with arrow ¿é è¹' ê»' ë¼' ì½' î¿' ïÀ' ðÁ' Object with shadow Standard Object with shadow Àé +;( ,, -- .. Object without fill Standard Object without fill Áé ú´' Text Standard Text Âé è¹' ú´' Text body Standard Text body Ãé è¹' ú´' §' Text body justfied Standard Text body justfied Äé è¹' ú´' £+' First line indent Standard First line indent Åé è¹' ú´' g* @' Title Standard Title Æé è¹' ú´' §' Title1 Standard Title1 Çé è¹' ú´' ûµ' +;( ,, -- .. £+' §' Title2 Standard Title2 Èé ê»' ûµ' +;( ,, -- .. g* @' ¡A' £+' §' Heading Standard Heading Éé è¹' ú´' ¡A' §' Heading1 Standard Heading1 Êé è¹' ú´' ¡A' §' ©' Heading2 Standard Heading2 Ëé è¹' ú´' ¡A' §' ©' ¬' Dimension Line Standard Dimension Line Ìé è¹' ì½' í¾' î¿' ïÀ' ú´' §' Home~LT~Gliederung 1 Home~LT~Gliederung 1þ¯ÿÿ Ïé è¹' ú´' g* @' ¡A' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Gliederung 2 Home~LT~Gliederung 1 Home~LT~Gliederung 2þ¯ÿÿ Ðé @' ¡A' §' Home~LT~Gliederung 3 Home~LT~Gliederung 2 Home~LT~Gliederung 3þ¯ÿÿ Ñé @' ¡A' §' Home~LT~Gliederung 4 Home~LT~Gliederung 3 Home~LT~Gliederung 4þ¯ÿÿ Òé @' ¡A' §'
+ Home~LT~Gliederung 5 Home~LT~Gliederung 4 Home~LT~Gliederung 5þ¯ÿÿ Óé @' ¡A' §'
+ Home~LT~Gliederung 6 Home~LT~Gliederung 5 Home~LT~Gliederung 6þ¯ÿÿ Ôé @' ¡A' §'
+ Home~LT~Gliederung 7 Home~LT~Gliederung 6 Home~LT~Gliederung 7þ¯ÿÿ Õé @' ¡A' §'
+ Home~LT~Gliederung 8 Home~LT~Gliederung 7 Home~LT~Gliederung 8þ¯ÿÿ Öé @'
+ ¡A' §'
+ Home~LT~Gliederung 9 Home~LT~Gliederung 8 Home~LT~Gliederung 9þ¯ÿÿ ×é @' ¡A' §'
+
+ Home~LT~Titel
+ Home~LT~Titelþ¯ÿÿ Íé è¹' ú´' QQ g* £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Untertitel Home~LT~Untertitelþ¯ÿÿ Ýé è¹' ú´' QQ g* @' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Notizen Home~LT~Notizenþ¯ÿÿ Úé è¹' ú´' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Hintergrundobjekte Home~LT~Hintergrundobjekteþ¯ÿÿ Øé +;( ,, -- .. Home~LT~Hintergrund Home~LT~Hintergrundþ¯ÿÿ Ùé è¹' ú´' Title Title @ Íé Subtitle Subtitle @ Ýé Background objects Background objects @ Øé
+ Background
+ Background @ Ùé Notes Notes @ Úé Outline 1 Outline 1 @ Ïé Outline 2 Outline 1 Outline 2 @ Ðé Outline 3 Outline 2 Outline 3 @ Ñé Outline 4 Outline 3 Outline 4 @ Òé Outline 5 Outline 4 Outline 5 @ Óé Outline 6 Outline 5 Outline 6 @ Ôé Outline 7 Outline 6 Outline 7 @ Õé Outline 8 Outline 7 Outline 8 @ Öé Outline 9 Outline 8 Outline 9 @ ×é t Ð P ê D â P ä 8 > ¤
+ p Ö < ¢ n ô
+ f ° Ò ú 6 b ® á
+ G
+ z
+
+ à
+ DrMd / / JoeMn 0 º11yP º11S º11yP ÿÿ O ö DrLy LAYER_LAYOUT DrLy
+ LAYER_BCKGRND DrLy LAYER_BACKGRNDOBJ DrLy LAYER_CONTROLS DrLy ! LAYER_MEASURELINES DrMP À & JoeM Çl VT Ð Ð Ð Ð DrML DrOb < SVDr & ø Ð ( A& DrOb < SVDr & 3D Ð Í[ A& DrOb < SVDr & ø . ( L DrOb < SVDr & 3D . Í[ L DrXX gg f Home~LT~Gliederung ÿ DrMP 8 ¶ JoeM VT Çl { y DrML DrOb SVDr & { y ½Q 0j ' Home~LT~Hintergrundþ¯ { y ½Q 0j DrXX gg N Home~LT~Gliederung ÿ DrMP ý JoeM VT Çl Ð Ð Ð Ð DrML DrOb Þ SVDr & º ç
+ 8 '0 !
+ Home~LT~Titelþ¯ º ç
+ 8 '0 d xV4B1 O õ Click to move the slide
+ Home~LT~Titelþ¯ <(
+( @' DrOb é SVDr & Ü Ç3 G "] # Home~LT~Notizenþ¯ Ü Ç3 G "] m xV4B1 X õ Click to edit the notes format Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrPg ä b JoeM Çl VT Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrXX Handoutsgg F Home~LT~Gliederung ÿ DrPg % % JoeM VT Çl { y DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb  SVDr & y Standard l y M xV4B1 8 õ CVS Standard <(
+( @' ¦ DrOb Ê SVDr & { c q Standard t { c q U xV4B1 @ õ Tag20001214 Standard <(
+( @' ¦ DrOb e SVDr & | 9 Ë D Standard r ÿÿÿÿ S xV4B1 > õ enhance Standard
+( @' §
+ ¦ ¡ P ö c DrCn $ DrCn $ ; xi (# ÿÿ DrOb Ê SVDr & { C q ä# Standard t { C q ä# U xV4B1 @ õ Tag20010110 Standard <(
+( @' ¦ DrOb Å SVDr & { ;. q Ü4 Standard o { ;. q Ü4 P xV4B1 ; õ Tag... Standard <(
+( @' ¦ DrOb e SVDr & O # $ Standard r ÿÿÿÿ S xV4B1 > õ enhance Standard
+( @' ¦ §
+ ¡ ö ö C DrCn $ DrCn $ ; xi (# ÿÿ DrOb Q SVDr & ¹
+ # 4 / Standard ^ ÿÿÿÿ ? xV4B1 * õ ... Standard
+( @' ¡ ö ä# ö ;. DrCn $ DrCn $ ; xi (# ÿÿ DrOb É SVDr & ´$ 1 ª= Ò Standard s ´$ 1 ª= Ò T xV4B1 ? õ
+ Ps20001214 Standard <(
+( @' ¦
+ DrOb m SVDr & o 9 2 Standard z W) L ÿÿÿÿ [ xV4B1 F õ PS Branch Standard <(
+( @' §
+ ¦ ¡ P /1 1 DrCn $ DrCn $ ; xi (# ÿÿ DrOb É SVDr & ©$ ÷$ = + Standard s ©$ ÷$ = + T xV4B1 ? õ
+ Ps20001214 Standard <(
+( @' ¦
+ DrOb m SVDr & å* ñ n7 Ø% Standard z ÿÿÿÿ [ xV4B1 F õ
+ Enhance & tag Standard <(
+( @' ¦' §'
+ ¡ /1 Ò $1 ÷$ DrCn $ DrCn $ ; xi (# ÿÿ DrOb ^ SVDr & ² % () Standard k ÿÿÿÿ L xV4B1 7 õ Diff Standard
+( @' ¦' §'
+ ¡ q ©$ G( DrCn $ DrCn $ ; PF ÿÿ DrOb ^ SVDr & % t! Standard k ÿÿÿÿ L xV4B1 7 õ Diff Standard
+( @' ¦' §'
+ ¡ ´$ q DrCn $ DrCn $ ; PF ÿÿ DrOb ^ SVDr & f' % l2 Standard k ÿÿÿÿ L xV4B1 7 õ Diff Standard
+( @' ¦' §'
+ ¡ ©$ G( q 1 DrCn $ DrCn $ ; PF ÿÿ DrOb Á SVDr & %D « ½Q L Standard k %D « ½Q L L xV4B1 7 õ GS Standard <(
+( @' ¦ DrOb à SVDr & %D ] ½Q þ Standard m %D ] ½Q þ N xV4B1 9 õ CSCO Standard <(
+( @' ¦ DrOb à SVDr & %D Ç ½Q h' Standard m %D Ç ½Q h' N xV4B1 9 õ INTC Standard <(
+( @' ¦ DrOb  SVDr & %D {( ½Q / Standard l %D {( ½Q / M xV4B1 8 õ HWP Standard <(
+( @' ¦ DrOb ` SVDr & É< E Ü Standard m ÿÿÿÿ N xV4B1 9 õ Branch Standard
+( @' ¦' §'
+ ¡ ª= %D û DrCn $ DrCn $ ; PF ÿÿ DrOb ` SVDr & É< E Standard m ÿÿÿÿ N xV4B1 9 õ Branch Standard
+( @' ¦' §'
+ ¡ ª= %D DrCn $ DrCn $ ; PF ÿÿ DrOb f SVDr & É< E ø$ Standard s â á ÿÿÿÿ T xV4B1 ? õ Branch Standard <(
+( @' ¦' §'
+ ¡ ª= %D $ DrCn $ DrCn $ ; PF ÿÿ DrOb f SVDr & É< E ¬, Standard s à  ÿÿÿÿ T xV4B1 ? õ Branch Standard <(
+( @' ¦' §'
+ ¡ ª= %D Ë+ DrCn $ DrCn $ ; PF ÿÿ DrOb  SVDr & { Â@ q cG Standard l { Â@ q cG M xV4B1 8 õ ... Standard <(
+( @' ¦ DrOb SVDr & û3 × £A Standard ÿÿÿÿ ¡ ö Ü4 ö Â@ DrCn $ DrCn $ ; xi (# ÿÿ DrOb Ä SVDr & ©$ Õ9 = v@ Standard n ©$ Õ9 = v@ O xV4B1 : õ PS... Standard <(
+( @' ¦ DrOb m SVDr & à* ·* i7 ¶: Standard z Þ ÿÿÿÿ [ xV4B1 F õ
+ Enhance & tag Standard <(
+( @' ¦' §'
+ ¡ $1 + $1 Õ9 DrCn $ DrCn $ ; xi (# ÿÿ DrOb d SVDr & ª0 % > Standard q á á ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ q 1 ©$ %= DrCn $ DrCn $ ; PF ÿÿ DrOb d SVDr & ¾< E () Standard q á á ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ %D û = G( DrCn $ DrCn $ ; PF ÿÿ DrOb d SVDr & ¾< Ì E () Standard q   ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ %D = G( DrCn $ DrCn $ ; PF ÿÿ DrOb d SVDr & ¾< 6# E > Standard q £ £ ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ %D $ = %= DrCn $ DrCn $ ; PF ÿÿ DrOb d SVDr & ¾< ê* E > Standard q £ £ ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ %D Ë+ = %= DrCn $ DrCn $ ; PF ÿÿ DrOb d SVDr & D< % óD Standard q á á ÿÿÿÿ R xV4B1 = õ Diff Standard <(
+( @' ¦' §'
+ ¡ ©$ %= q D DrCn $ DrCn $ ; PF ÿÿ DrXX gg F Home~LT~Gliederung ÿ DrPg { JoeM VT Çl Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & º ç
+ 8 '0 DrOb Ý SVDr & Ü Ç3 G #] # Home~LT~Notizenþ¯ Ü Ç3 G #] a xV4B1 L õ Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrXX V þÿÿGeneric Printer SGENPRT PostScript D VT $m áí ² VT $m d ,,lpr -P zonker default_queue SGENPRT DrVw P SVDr
+ SVDr : SVDr ö ö þ þ ö ö SVDrA Layout : SVDr è è þ þ SVDr Ü # SVDr SVDr# SVDr0 SVDr1 SVDr3 SVDr4 SVDr@ SVDr SVDrD SVDrP SVDrQ Ö ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrHL DrHl { DrHL DrHL <ñÿÿü Éc YH
+ R o o t E n t r y ÿÿÿÿÿÿÿÿ .½
ÑÐ )ä°± À C o m p O b j ÿÿÿÿ = O l e
+ ÿÿÿÿÿÿÿÿÿÿÿÿ p e r s i s t e l e m e n t s " ÿÿÿÿ S f x D o c u m e n t I n f o ÿÿÿÿÿÿÿÿ u S f x W i n d o w s ÿÿÿÿ ÿÿÿÿ S f x S t y l e S h e e t s ÿÿÿÿÿÿÿÿÿÿÿÿ K S u m m a r y I n f o r m a t i o n ( ÿÿÿÿÿÿÿÿ ( S t a r D r a w D o c u m e n t 3 $ ÿÿÿÿÿÿÿÿÿÿÿÿ , f5 ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/docs/project_management/source_control.html
===================================================================
Added: trunk/gforge_base/evolvisforge/gforge/docs/templates/generic_document.html
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/templates/generic_document.html (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/templates/generic_document.html 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,56 @@
+<!-- ------------------------ HEADER ------------------------ -->
+<html>
+<head>
+ <title>SourceForge: HTML Documentation Template</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<table width="100%">
+ <tr>
+ <td>
+ <b><font size=+1>SourceForge: HTML Documentation Template</font></b><br>
+ <font size="-1">$Id: generic_document.html,v 1.1 2001/03/14 01:46:18 jbyers Exp $<br>
+ SourceForge Engine Team [<a href="mailto:alexandria-devel at sourceforge.net">email</a>]</font>
+ </td>
+ <td>
+ <a href="http://sourceforge.net"><img src="/images/sflogo2-105a.png" width="108" height="53" border="0"></a>
+ </td>
+ </tr>
+</table>
+
+<!-- ------------------------ MENU ------------------------ -->
+<p><hr><p>
+
+<dd>
+ <a href="#0">0. section zero</a>
+</dd>
+
+<dd>
+ <a href="#1">1. section one</a>
+</dd>
+
+<!-- ------------------------ SECTION 0 ------------------------ -->
+<p><hr><p>
+
+<a NAME="0"></a><b>0. section zero</b>
+
+<p>
+Content foo.
+
+<!-- ------------------------ SECTION 1 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></a><b>1. section one</b>
+
+<p>
+Content bar.
+
+<!-- ------------------------ FOOTER ------------------------ -->
+<p><hr><p>
+
+<p align="right">
+ <font size="-1">
+ Copyright © 1999, 2000, 2001 <a href="http://www.valinux.com/">VA Linux Systems, Inc.</a>
+ </font>
+</body>
+</html>
Added: trunk/gforge_base/evolvisforge/gforge/docs/templates/project_index.html
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/docs/templates/project_index.html (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/docs/templates/project_index.html 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,181 @@
+<!-- ------------------------ HEADER ------------------------ -->
+<html>
+<head>
+ <title>SourceForge: [TODO] Project Documents</title>
+</head>
+<body bgcolor="#FFFFFF">
+
+<table width="100%">
+ <tr>
+ <td>
+ <b><font size=+1>SourceForge: [TODO] Project Documents</font></b><br>
+ <font size="-1">$Id: project_index.html,v 1.1 2001/03/14 01:46:18 jbyers Exp $<br>
+ SourceForge Engine Team [<a href="mailto:alexandria-devel at sourceforge.net">email</a>]</font>
+ </td>
+ <td>
+ <a href="http://sourceforge.net"><img src="/images/sflogo2-105a.png" width="108" height="53" border="0"></a>
+ </td>
+ </tr>
+</table>
+
+<!-- ------------------------ MENU ------------------------ -->
+<p><hr><p>
+
+<dd>
+ <a href="#0">0. Requirements</a>
+</dd>
+
+<dd>
+ <a href="#1">1. Project Management</a>
+</dd>
+
+<dd>
+ <a href="#2">2. Design</a>
+</dd>
+
+<dd>
+ <a href="#3">3. Implementation</a>
+</dd>
+
+<!-- ------------------------ SECTION 0 ------------------------ -->
+<p><hr><p>
+
+<a NAME="0"></a><b>0. Requirements</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Project Charter, Vision</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Use Case Requirements</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Non-Functional Requirements</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Interface Requirements / Mockup</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <tr>
+ <td>Acceptance Plan</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Enhancement Proposals</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 1 ------------------------ -->
+<p><hr><p>
+
+<a NAME="1"></a><b>1. Project Management</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Development Process</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Resources</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Schedule and Milestones</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Risk Management (Top 10 Risks)</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Text Archive (Emails, Meeting Minutes, IRC Logs)</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 2 ------------------------ -->
+<p><hr><p>
+
+<a NAME="2"></a><b>2. Design</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Project Architecture</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Project Interfaces and Interactions</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Object Model (UML)</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ SECTION 3 ------------------------ -->
+<p><hr><p>
+
+<a NAME="3"></a><b>3. Implementation</b>
+
+<ul>
+<table border="1" cellpadding="2" cellspacing="2">
+ <tr>
+ <td>Development Notes</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+
+ <tr>
+ <td>Deployment and Installation Notes</td>
+ <td><font size="-1">[<a href="">HTML</a>]<font></td>
+ <td><?php echo util_cvs_status(""); ?></td>
+ </tr>
+</table>
+</ul>
+
+<!-- ------------------------ FOOTER ------------------------ -->
+<p><hr><p>
+
+<p align="right">
+ <font size="-1">
+ Copyright © 1999, 2000, 2001 <a href="http://www.valinux.com/">VA Linux Systems, Inc.</a>
+ </font>
+</body>
+</html>
Added: trunk/gforge_base/evolvisforge/gforge/pager.php3
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/pager.php3 (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/pager.php3 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,17 @@
+<?php
+
+require ('squal_pre.php');
+
+if (!$conn) {
+ echo "false\n";
+} else {
+ $result=db_query("SELECT count(*) FROM users");
+
+ if (!$result || db_numrows($result) < 1) {
+ echo "false\n";
+ } else {
+ echo "true\n";
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/utils/download/README
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/utils/download/README (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/utils/download/README 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,10 @@
+#
+#
+# download_filemaint.pl
+#
+# -runs once a minute to clear out files that
+# admins have requested to be deleted
+# -depends on a file called .delete_files in the incoming directory
+# .delete_file must be owned by nobody:nobody so the web servers
+# can write to it
+#
Added: trunk/gforge_base/evolvisforge/gforge/utils/groupCreator
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/utils/groupCreator (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/utils/groupCreator 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,120 @@
+#!/usr/bin/perl -w
+#
+# $Id$
+#
+# groupCreator - perl script to create /home/groups/* and /cvsroot/* from
+# ldap properly. It's made independant of the other scripts
+# for a reason.
+#
+use strict;
+use Net::LDAP;
+use Getopt::Std;
+
+# initialize our variables
+umask(002);
+my ($basedn, $binddn, $bindpw, $ldap, $filter, $uid, $gid, $type, $cvsdir);
+my ($entry, $attr, $mesg, @groupArray, $counter, $ticker, $group, %opts);
+
+ at groupArray = ();
+$counter = 0;
+$ticker = 0;
+
+# unbuffer our output
+$| = 1;
+
+# configuration
+$basedn = 'dc=sourceforge,dc=net';
+$binddn = 'cn=Manager, dc=sourceforge, dc=net';
+$bindpw = '';
+$filter = '(&(objectClass=posixGroup)(memberUid=*))';
+
+# proccess the command line args
+getopt('t', \%opts);
+if (!$opts{'t'} || $opts{'t'} ne 'shell' && $opts{'t'} ne 'cvs') {
+ print <<EOF;
+usage: groupCreator [-t type]
+creates project directories and repositories based on information from LDAP
+
+ -t type (shell or cvs) will create either cvsroots
+ or /home/groups directories
+
+EOF
+ exit;
+}
+
+$ldap = Net::LDAP->new('sf-ldap1') or die $@;
+
+$ldap->bind(
+ dn => $binddn,
+ password => $bindpw
+);
+
+print "Performing search query $filter: ";
+$mesg = $ldap->search(
+ base => $basedn,
+ filter => $filter,
+ scope => 'sub',
+ attrs => 'cn'
+) or die $@;
+print "done.\n";
+
+
+# build an array of group names
+foreach $entry ($mesg->entries) {
+ $counter++;
+ push @groupArray, $entry->get('cn');
+}
+
+print "Preparing to process $counter groups: ";
+ at groupArray = sort @groupArray;
+print "done.\n";
+
+print "Processing: ";
+foreach $group (@groupArray) {
+ $ticker++;
+
+ # print a . for every 1000 groups we process
+ if ($ticker == 1000) {
+ print ".";
+ $ticker=0;
+ }
+
+ # get numeric uid for the user and group
+ $uid = getpwnam('nobody');
+ $gid = getgrnam($group);
+
+ # uh oh! nobody or the group doesn't seem to exist on this machine??
+ if (!$uid || !$gid) { die "\nhouston, we have a problem: $group\n"; }
+
+ # process this batch like we're on a shell server (create /home/groups/*, /home/groups/*/htdocs, /home/groups/*/cgi-bin)
+ if ($opts{'t'} eq 'shell') {
+ if (! -e "/home/groups/$group" && $group eq 'alexandria') {
+ mkdir "/home/precision/groups/$group", 0775 or die "Can't create top-level directory for $group: $!\n";
+ mkdir "/home/precision/groups/$group/htdocs", 0775 or die "Can't create htdocs directory for $group: $!\n";
+ mkdir "/home/precision/groups/$group/cgi-bin", 0775 or die "Can't create cgi-bin directory for $group: $!\n";
+ chown $uid, $gid, ("/home/precision/groups/$group", "/home/precision/groups/$group/htdocs", "/home/precision/groups/$group/cgi-bin");
+ }
+
+ # proccess the batch like a cvs server (create /cvsroot/* and init the repository)
+ } elsif ($opts{'t'} eq 'cvs') {
+ $cvsdir = "/home/precision/groups/cvsroot/$group";
+ if (! -e $cvsdir && $group eq 'alexandria') {
+ mkdir $cvsdir, 0775 or die "Can't create $cvsdir: $!\n";
+ system("/usr/bin/cvs -d$cvsdir init");
+ system("echo \"\" > $cvsdir/CVSROOT/writers");
+ system("echo \"anonymous\" > $cvsdir/CVSROOT/readers");
+ system("echo \"anonymous:\\\$1\\\$0H\\\$2/LSjjwDfsSA0gaDYY5Df/:anoncvs_$group\" > $cvsdir/CVSROOT/passwd");
+
+ # setup loginfo to make group ownership every commit
+ system("echo \"ALL chgrp -R $group $cvsdir\" > $cvsdir/CVSROOT/loginfo");
+ system("echo \"\" > $cvsdir/CVSROOT/val-tags");
+ chmod 0644, "$cvsdir/CVSROOT/val-tags";
+
+ # set group ownership, anonymous group user
+ system("chown -R $uid:$gid $cvsdir");
+ system("chmod g+rw $cvsdir/CVSROOT/*");
+ }
+ }
+
+}
+print " done.\n"
Property changes on: trunk/gforge_base/evolvisforge/gforge/utils/groupCreator
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/utils/ldap-check-replica
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/utils/ldap-check-replica (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/utils/ldap-check-replica 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+#
+# Check proper installation of LDAP replication
+# by pfalcon at sourceforge.net 2001-01-16
+# $Id: ldap-check-replica,v 1.1 2001/01/24 22:17:31 pfalcon Exp $
+#
+
+require("include.pl"); # Include all the predefined functions
+&parse_local_inc;
+
+$ldap1="sf-ldap1";
+$ldap2="sf-ldap2";
+
+print "Making change to the master server.\n";
+$time=time();
+$cmd = "
+echo '
+dn: cn=Replicator,dc=sourceforge,dc=net
+changetype: modify
+replace: description
+description: modified at $time
+' |
+${ldap_prefix}ldapmodify -h $ldap1 -p $ldap1 -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd
+";
+system($cmd);
+
+print "Allowing for propogation delay...\n\n";
+sleep(10);
+
+print "Querying master server:\n";
+$cmd = "${ldap_prefix}ldapsearch -h $ldap1 -p $sys_ldap_port -LLL -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd -b '$sys_ldap_base_dn' '(cn=Replicator)' description";
+system($cmd);
+print "Querying slave server 1:\n";
+$cmd = "${ldap_prefix}ldapsearch -h $ldap2 -p $sys_ldap_port -LLL -D '$sys_ldap_bind_dn' -w $sys_ldap_passwd -b '$sys_ldap_base_dn' '(cn=Replicator)' description";
+system($cmd);
+
+print "If two requests above differ, LDAP replication is NOT functioning\n";
Property changes on: trunk/gforge_base/evolvisforge/gforge/utils/ldap-check-replica
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/gforge_base/evolvisforge/gforge/www/account/unsubscribe.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/account/unsubscribe.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/account/unsubscribe.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,62 @@
+<?php
+/**
+ *
+ * Disable optional site mailings for account
+ *
+ * This page is accessed via URL present in site mailings
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('pre.php');
+require_once('common/include/account.php');
+
+if (!$confirm_hash) {
+ $confirm_hash = $ch;
+}
+
+$confirm_hash = html_clean_hash_string($confirm_hash);
+
+$res_user = db_query("SELECT * FROM users WHERE confirm_hash='$confirm_hash'");
+if (db_numrows($res_user) > 1) {
+ exit_error("Error","This confirm hash exists more than once.");
+}
+if (db_numrows($res_user) < 1) {
+ exit_error("Error","Invalid confirmation hash.");
+}
+
+$row_user = db_fetch_array($res_user);
+$user =& user_get_object($row_user['user_id'], $res_user);
+exit_assert_object($user, 'User');
+
+$user->unsubscribeFromMailings($all);
+
+site_header(array('title'=>"Unsubscription Complete"));
+
+if ($all) {
+ $what = $Language->getText('account_unsubscribe', 'all_mailings');
+} else {
+ $what = $Language->getText('account_unsubscribe', 'site_mailings');
+}
+?>
+
+<h2>Unsubscription Complete</h2>
+<p>
+You have been unsubscribed from <?php print $what; ?>. In case you
+will want to re-activate your subscriptions in the future, login
+and visit your Account Maintenance page.
+</p>
+
+<p>
+<A href="/"><?php echo $Language->getText('general', 'return'); ?></A>
+</p>
+
+<?php
+site_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/admin_table.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/admin_table.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/admin_table.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,276 @@
+<?php
+/**
+ *
+ * Module to render generic HTML tables for Site Admin
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+/**
+ * admin_table_add() - present a form for adding a record to the specified table
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ */
+function admin_table_add($table, $unit, $primary_key) {
+ global $PHP_SELF;
+
+ // This query may return no rows, but the field names are needed.
+ $result = db_query('SELECT * FROM '.$table.' WHERE '.$primary_key.'=0');
+
+ if ($result) {
+ $cols = db_numfields($result);
+
+ echo 'Create a new '.$unit.' below:
+ <FORM NAME="add" ACTION="'.$PHP_SELF.'?function=postadd" METHOD="POST">
+ <TABLE>';
+
+ for ($i = 0; $i < $cols; $i++) {
+ $fieldname = db_fieldname($result, $i);
+
+ echo '<TR><TD><B>'.$fieldname.'</B></TD>';
+ echo '<TD><INPUT TYPE="text" NAME="'.$fieldname.'" VALUE=""></TD></TR>';
+ }
+ echo '</TABLE><INPUT TYPE="submit" VALUE="Submit New '.ucwords($unit).'"></FORM>
+ <FORM NAME="cancel" ACTION="'.$PHP_SELF.'" method="POST">
+ <INPUT TYPE="submit" VALUE="Cancel">
+ </FORM>';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_postadd() - update the database based on a submitted change
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ */
+function admin_table_postadd($table, $unit, $primary_key) {
+ global $HTTP_POST_VARS;
+
+ $sql = "INSERT INTO $table ("
+ . join(',', array_keys($HTTP_POST_VARS))
+ . ") VALUES ('"
+ . htmlspecialchars(join("','", array_values($HTTP_POST_VARS)))
+ . "')";
+
+ if (db_query($sql)) {
+ echo ucfirst($unit).' successfully added.';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_confirmdelete() - present a form to confirm requested record deletion
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ * @param $id - the id of the record to act on
+ */
+function admin_table_confirmdelete($table, $unit, $primary_key, $id) {
+ global $PHP_SELF;
+
+ $result = db_query("SELECT * FROM $table WHERE $primary_key=$id");
+
+ if ($result) {
+ $cols = db_numfields($result);
+
+ echo 'Are you sure you want to delete this '.$unit.'?
+ <UL>';
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<LI><B>'.db_fieldname($result,$i).'</B> '.db_result($result,0,$i).'</LI>';
+ }
+ echo '</UL>
+ <FORM NAME="delete" ACTION="'.$PHP_SELF.'?function=delete&id='.$id.'" method="POST">
+ <INPUT TYPE="submit" VALUE="Delete">
+ </FORM>
+ <FORM NAME="cancel" ACTION="'.$PHP_SELF.'" method="POST">
+ <INPUT TYPE="submit" VALUE="Cancel">
+ </FORM>';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_delete() - delete a record from the database after confirmation
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ * @param $id - the id of the record to act on
+ */
+function admin_table_delete($table, $unit, $primary_key, $id) {
+ if (db_query("DELETE FROM $table WHERE $primary_key=$id")) {
+ echo ucfirst($unit).' successfully deleted.';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_edit() - present a form for editing a record in the specified table
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ * @param $id - the id of the record to act on
+ */
+function admin_table_edit($table, $unit, $primary_key, $id) {
+ global $PHP_SELF;
+
+ $result = db_query("SELECT * FROM $table WHERE $primary_key=$id");
+
+ if ($result) {
+ $cols = db_numfields($result);
+
+ echo 'Modify the '.$unit.' below:
+ <FORM NAME="edit" ACTION="'.$PHP_SELF.'?function=postedit&id='.$id.'" METHOD="POST">
+ <TABLE>';
+
+ for ($i = 0; $i < $cols; $i++) {
+ $fieldname = db_fieldname($result, $i);
+ $value = db_result($result, 0, $i);
+
+ echo '<TR><TD><B>'.$fieldname.'</B></TD>';
+
+ if ($fieldname == $primary_key) {
+ echo "<TD>$value</TD></TR>";
+ } else {
+ echo '<TD><INPUT TYPE="text" NAME="'.$fieldname.'" VALUE="'.$value.'"></TD></TR>';
+ }
+ }
+ echo '</TABLE><INPUT TYPE="submit" VALUE="Submit Changes"></FORM>
+ <FORM NAME="cancel" ACTION="'.$PHP_SELF.'" method="POST">
+ <INPUT TYPE="submit" VALUE="Cancel">
+ </FORM>';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_postedit() - update the database to reflect submitted modifications to a record
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ * @param $id - the id of the record to act on
+ */
+function admin_table_postedit($table, $unit, $primary_key, $id) {
+ global $HTTP_POST_VARS;
+
+ $sql = 'UPDATE '.$table.' SET ';
+ while (list($var, $val) = each($HTTP_POST_VARS)) {
+ if ($var != $primary_key) {
+ $sql .= "$var='". htmlspecialchars($val) ."', ";
+ }
+ }
+ $sql = ereg_replace(', $', ' ', $sql);
+ $sql .= "WHERE $primary_key=$id";
+
+ if (db_query($sql)) {
+ echo ucfirst($unit) . ' successfully modified.';
+ } else {
+ echo db_error();
+ }
+}
+
+/**
+ * admin_table_show() - display the specified table, sorted by the primary key, with links to add, edit, and delete
+ *
+ * @param $table - the table to act on
+ * @param $unit - the name of the "units" described by the table's records
+ * @param $primary_key - the primary key of the table
+ */
+function admin_table_show($table, $unit, $primary_key) {
+ global $HTML, $PHP_SELF;
+
+ $result = db_query("SELECT * FROM $table ORDER BY $primary_key");
+
+ if ($result) {
+ $rows = db_numrows($result);
+ $cols = db_numfields($result);
+
+ echo '<TABLE BORDER="0" WIDTH="100%">
+ <TR BGCOLOR="'.$HTML->COLOR_HTMLBOX_TITLE.'">
+ <TD COLSPAN="'.($cols+1).'"><B><FONT COLOR="'. $HTML->FONTCOLOR_HTMLBOX_TITLE .'">'. ucwords($unit) .'s</FONT></B>
+ <A HREF="'.$PHP_SELF.'?function=add">[add new]</A></TD></TR>';
+
+ echo '
+ <TR><TD WIDTH="5%"></TD>';
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<TD><B>'.db_fieldname($result,$i).'</B></TD>';
+ }
+ echo '</TR>';
+
+ for ($j = 0; $j < $rows; $j++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($j) .'">';
+
+ $id = db_result($result,$j,0);
+ echo '<TD><A HREF="'.$PHP_SELF.'?function=edit&id='.$id.'">[edit]</A>';
+ echo '<A HREF="'.$PHP_SELF.'?function=confirmdelete&id='.$id.'">[delete]</A> </TD>';
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<TD>'. db_result($result, $j, $i) .'</TD>';
+ }
+ echo '</TR>';
+ }
+ echo '</TABLE>';
+ } else {
+ echo db_error();
+ }
+}
+
+
+require_once('pre.php');
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+$HTML->header(array('title'=>'Edit the '. ucwords($unit) .'s Table'));
+
+echo '<H3>Edit '. ucwords($unit) .'s</H3>
+<P><A HREF="/admin/">Site Admin Home</A>
+<P>';
+
+switch ($function) {
+ case 'add' : {
+ admin_table_add($table, $unit, $primary_key);
+ break;
+ }
+ case 'postadd' : {
+ admin_table_postadd($table, $unit, $primary_key);
+ break;
+ }
+ case 'confirmdelete' : {
+ admin_table_confirmdelete($table, $unit, $primary_key, $id);
+ break;
+ }
+ case 'delete' : {
+ admin_table_delete($table, $unit, $primary_key, $id);
+ break;
+ }
+ case 'edit' : {
+ admin_table_edit($table, $unit, $primary_key, $id);
+ break;
+ }
+ case 'postedit' : {
+ admin_table_postedit($table, $unit, $primary_key, $id);
+ break;
+ }
+}
+
+echo admin_table_show($table, $unit, $primary_key);
+
+$HTML->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/database.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/database.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/database.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,150 @@
+<?php
+/**
+ *
+ * Site Admin page for maintaining groups'databases
+ *
+ * This page allows to:
+ * - browse aggregate numbers of databases of specific type (active,
+ * deleted, etc.)
+ * - list all databases of given type
+ * - edit some database (by going to group's DB Admin page)
+ * - register existing database in system
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('www/admin/admin_utils.php');
+
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+
+if ($submit) {
+
+ $group_id = seek_gid($groupname);
+
+ if ($group_id) {
+
+ $group =& group_get_object($group_id);
+ exit_assert_object($group, 'Group');
+
+ $user =& session_get_user();
+ exit_assert_object($user, 'User');
+
+ $res = db_query("
+ INSERT INTO prdb_dbs(group_id, dbname, dbusername, dbuserpass, requestdate, dbtype, created_by, state)
+ VALUES ($group_id,'$dbname','$dbname','xxx',".time().",1,".$user->getID().",1)
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= 'Error adding databse: '.db_error();
+ } else {
+ $feedback .= "Group <i>".$group->getUnixName()."</i> added already active database";
+ }
+
+ } else {
+
+ $feedback .= "<b>Unable to insert already active database..</b>";
+
+ }
+
+}
+
+
+site_admin_header(array('title'=>"Site Admin: Groups' DB Maintanance"));
+
+$res_db = db_query("
+ SELECT stateid,statename,COUNT(*)
+ FROM prdb_dbs,prdb_states
+ WHERE stateid=state
+ GROUP BY statename,stateid
+");
+
+echo '<h3>Statistics for Project Databases</h3>';
+
+if (db_numrows($res_db) > 0) {
+
+ echo '<table width="50%"><tr><td>';
+ $title=array();
+ $title[]='Type';
+ $title[]='Count';
+ echo html_build_list_table_top($title);
+
+ while ($row_db = db_fetch_array($res_db)) {
+
+ print '<tr><td align="center"><a href="'.$PHP_SELF.'?displaydb=1&dbstate='.$row_db['stateid'].'">'.$row_db['statename'].'</a></td><td align="center">'.$row_db['count'].'</td></tr>';
+
+ }
+
+ echo '</table>';
+ echo '</td></tr></table>';
+
+} else {
+ echo '<p>No databases defined</p>';
+}
+
+
+if ($displaydb) {
+
+ $res_db = db_query("
+ SELECT statename
+ FROM prdb_states
+ WHERE stateid=".$dbstate."
+ ");
+
+ $row_db = db_fetch_array($res_db);
+
+ print '<hr><h3>Displaying Databases of Type: '.$row_db['statename'].' </h3>';
+
+ $res_db = db_query("
+ SELECT *
+ FROM prdb_dbs
+ WHERE state=".$dbstate."
+ ORDER BY dbname
+ ");
+
+ while ($row_db = db_fetch_array($res_db)) {
+
+ print '<li><a href="/project/admin/database.php?group_id='.$row_db['group_id'].'">'.$row_db['dbname']."</a>";
+
+ }
+
+
+}
+
+
+
+?>
+<hr>
+
+<h3>Add an already active database</h3>
+
+<form name="madd" method="post" action="<?php echo $PHP_SELF; ?>">
+
+<table>
+
+<tr>
+<td>Group Unix Name</td>
+<td><input type="text" name="groupname"></td>
+</tr>
+
+<tr>
+<td>Database Name</td>
+<td><input type="text" name="dbname"></td>
+</tr>
+
+</table>
+<input type="submit" name="submit" value="Add">
+</form>
+
+<?php
+
+site_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_filetype.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_filetype.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_filetype.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * Site Admin page to edit File Release System file types
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+$unit = 'file type';
+$table = 'frs_filetype';
+$primary_key = 'type_id';
+
+include_once('admin_table.php');
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_processor.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_processor.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/edit_frs_processor.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * Site Admin page to edit File Release System processor types
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+$unit = 'processor';
+$table = 'frs_processor';
+$primary_key = 'processor_id';
+
+include_once('admin_table.php');
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/edit_supported_languages.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/edit_supported_languages.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/edit_supported_languages.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * Site Admin page to edit supported language treanslations
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+$unit = 'supported language';
+$table = 'supported_languages';
+$primary_key = 'language_id';
+
+include_once('admin_table.php');
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/intelapprove.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/intelapprove.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/intelapprove.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,99 @@
+<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id: intelapprove.php,v 1.9 2001/04/24 14:34:37 pfalcon Exp $
+
+require_once('pre.php');
+
+session_require(array('group'=>'5914','admin_flags'=>'A'));
+
+// group public choice
+if ($submit) {
+ /*
+ update the project flag to active
+ */
+ $accept_count=count($accept);
+ $delete_count=count($delete);
+
+ $approve_message='Congratulations! Your proposal has been accepted and you now have
+access to the Itanium(tm) processor prototype compile farm. This is a
+great opportunity for members of the Open Source community and
+SourceForge is excited to be able to provide this access. Please be
+understanding if there are any issues with accessing the Itanium
+processor prototype compile farm during the start-up phase. We will be
+continually improving access to the machines.
+
+Remember that your access to the compile farm is subject to the terms
+and conditions set forth by Intel and VA Linux as documented in the
+click through license.
+
+Please wait at least 6 hours for your account to be activated
+before trying to login.
+
+If you have questions, READ THE DOCS at http://sourceforge.net/compilefarm/
+
+For find more resources on porting to IA-64 and for mailing lists, see
+http://sourceforge.net/project/?group_id=1196';
+
+ $delete_message='I am sorry to inform you that your proposal to access the Itanium(tm)
+processor prototype compile farm has been rejected because you did not
+meet our criteria.';
+
+
+ for ($i=0; $i<$accept_count; $i++){
+ $result=db_query("UPDATE intel_agreement SET is_approved='1' WHERE user_id='$accept[$i]'");
+ if (!$result) {
+ echo db_error();
+ }
+ $sql="SELECT email FROM users WHERE user_id='$accept[$i]'";
+ $result=db_query($sql);
+ mail (db_result($result,0,'email'),'You Have Been Approved',$approve_message,'From: esindelar at users.sourceforge.net');
+ }
+
+ for ($i=0; $i<$delete_count; $i++){
+ $result=db_query("DELETE FROM intel_agreement WHERE user_id='$delete[$i]'");
+ if (!$result) {
+ echo db_error();
+ }
+ $sql="SELECT email FROM users WHERE user_id='$delete[$i]'";
+ $result=db_query($sql);
+ mail (db_result($result,0,'email'),'You Could Not Be Approved',$delete_message,'From: esindelar at users.sourceforge.net');
+ }
+
+
+}
+
+
+// get current information
+$result = db_query("SELECT users.user_name,users.email,users.user_id,intel_agreement.message ".
+ "FROM users,intel_agreement ".
+ "WHERE users.user_id=intel_agreement.user_id AND is_approved='0'");
+
+if (db_numrows($result) < 1) {
+ exit_error("None Found","No Pending Requests to Approve");
+}
+
+$HTML->header(array('title'=>'Approving Pending Requests'));
+
+echo '<TABLE BORDER="1">';
+
+echo '<TR><TD>user_name</TD><TD>Email</TD><TD>Justification</TD><TD>Accept</TD><TD>Delete</TD></TR>
+
+ <FORM ACTION="'. $PHP_SELF .'" METHOD="POST">';
+
+$rows=db_numrows($result);
+
+for ($i=0; $i<$rows; $i++) {
+ echo '<TR><TD><A HREF="/developer/?form_dev='. db_result($result,$i,'user_id') .'">'. db_result($result,$i,'user_name') .'</A></TD><TD>'. db_result($result,$i,'email') .'</TD><TD>'. nl2br(db_result($result,$i,'message')) .'</TD>
+ <TD VALIGN="TOP"><INPUT TYPE="CHECKBOX" NAME="accept[]" VALUE="'. db_result($result,$i,'user_id') .'"></TD>
+ <TD VALIGN="TOP"><INPUT TYPE="CHECKBOX" NAME="delete[]" VALUE="'. db_result($result,$i,'user_id') .'"></TD></TR>';
+}
+
+echo '<TR><TD COLSPAN="5"><INPUT TYPE="SUBMIT" NAME="submit" VALUE="Process"></TD></TR></FORM></TABLE>';
+
+$HTML->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/massmail-old.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/massmail-old.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/massmail-old.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,87 @@
+<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id$
+
+require_once('pre.php');
+
+session_require(array('group'=>'1','admin_flags'=>'A'));
+$HTML->header(array('title'=>"Administrative Mass Mail Engine"));
+
+// get numbers of users for each mailing
+$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A' AND mail_va=1");
+$row_count = db_fetch_array($res_count);
+$count_comm = $row_count[count];
+$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A' AND mail_siteupdates=1");
+$row_count = db_fetch_array($res_count);
+$count_sf = $row_count[count];
+$res_count = db_query("SELECT count(*) AS count FROM users WHERE status='A'");
+$row_count = db_fetch_array($res_count);
+$count_all = $row_count[count];
+$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE "
+ ."users.user_id=user_group.user_id AND users.status='A' AND user_group.admin_flags='A'");
+$row_count = db_fetch_array($res_count);
+$count_admin = $row_count[count];
+$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE "
+ ."users.user_id=user_group.user_id AND users.status='A'");
+$row_count = db_fetch_array($res_count);
+$count_devel = $row_count[count];
+$res_count = db_query("SELECT count(*) AS count FROM users,user_group WHERE "
+ ."users.user_id=user_group.user_id AND users.status='A' AND user_group.group_id=1");
+$row_count = db_fetch_array($res_count);
+$count_sfadmin = $row_count[count];
+
+print '<P><B>Mail Engine for SourceForge Subscribers (MESS)</B>
+
+<P>Be <FONT color=#FF0000><B>VERY</B></FONT> careful with this form,
+because sutmitting it WILL send email to lots of users.
+
+<FORM action="massmail_execute.php">
+<INPUT type="radio" name="destination" value="comm">
+Send only to users subscribed to "Additional Community Mailings" ('
+.$count_comm
+.')<BR><INPUT type="radio" name="destination" value="sf">
+Send only to users that agreed to receive "Site Updates" ('
+.$count_sf
+.')<BR><INPUT type="radio" name="destination" value="devel">
+Send only to project developers ('
+.$count_devel
+.')<BR><INPUT type="radio" name="destination" value="admin">
+Send only to project administrators ('
+.$count_admin
+.')<BR><INPUT type="radio" name="destination" value="sfadmin">
+Send only to SourceForge administrators (test) ('
+.$count_sfadmin
+.')<BR><INPUT type="radio" name="destination" value="all">
+Send to all users, regardless of their preferences ('
+.$count_all
+.')
+<P><B>Start With User ID:</B> (for use when the process quits)
+<BR><INPUT type="text" name="first_user" value="0">
+<P>
+Subject:
+<BR><INPUT type="text" name="mail_subject" value="SourceForge: ">
+
+<P>Text of Message:
+<PRE>
+<BR><TEXTAREA name="mail_message" cols="70" rows="40" wrap="physical">
+
+---------------------
+This email was sent from '. $GLOBALS['sys_default_domain'] .'. To change your email receipt
+preferences, please visit the site and edit your account via the
+"Account Maintenance" link.
+
+Please direct any questions to admin@'. $GLOBALS['sys_default_domain'].' .
+</TEXTAREA>
+</PRE>
+<P><INPUT type="submit" name="Submit" value="Submit">
+
+</FORM>
+';
+
+$HTML->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/resetapc.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/resetapc.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/resetapc.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,16 @@
+<?php
+
+require_once('pre.php');
+require_once('www/admin/admin_utils.php');
+
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+site_admin_header(array('title'=>"Site Admin"));
+
+echo '<P>'.$sys_name.'<P>';
+
+apc_reset_cache();
+
+site_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/unsubscribe.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/unsubscribe.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/unsubscribe.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,134 @@
+<?php
+/**
+ *
+ * Site Mailings Subscription Maintanance page
+ *
+ * This page is used to maintain site mailings (currently, just
+ * unsubscribe specific user).
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('www/admin/admin_utils.php');
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+if ($submit && $user_name) {
+
+ if (!$type) {
+
+ /*
+ Show form for unsubscription type selection
+ */
+
+ site_admin_header(array('title'=>'Site Mailings Subscription Maintanance'));
+ ?>
+
+ <h4>Unsubscribe user: <?php echo $user_name; ?></h4>
+ <p>
+ You can unsubscribe user either from admin-initiated
+ sitewide mailings or from all site mailings
+ (admin-initiated and automated mailings, like forum
+ and file release notifications).
+ </p>
+ <form action="<?php echo $PHP_SELF; ?>" method="POST">
+ <input type="hidden" name="user_name" value="<?php echo $user_name?>">
+ Unsubscription type: <?php echo html_build_select_box_from_arrays(
+ array('MAIL','ALL'),
+ array('Admin-initiated mailings','All site mailings'),
+ 'type',false,false
+ ); ?>
+ <input type="submit" name="submit" value="Unsubscribe">
+ </form>
+
+ <?php
+ site_admin_footer(array());
+ exit();
+ } else {
+
+ /*
+ Perform unsubscription
+ */
+
+ $u =& user_get_object_by_name($user_name);
+ exit_assert_object($u, 'User');
+ if (!$u->unsubscribeFromMailings($type=='ALL' ? 1 : 0)) {
+ exit_error(
+ 'Error',
+ 'Could not unsubscribe user: '.$u->getErrorMessage()
+ );
+ }
+
+ $feedback .= 'User unsubscribed<br>';
+ }
+}
+
+site_admin_header(array('title'=>"Site Mailings Subscription Maintanance"));
+
+?>
+
+<h4>
+Site Mailings Subscription Maintanance
+</h4>
+
+<p>
+Use field below to find users which match given pattern with
+the SourceForge username, real name, or email address
+(substring match is preformed, use '%' in the middle of pattern
+to specify 0 or more arbitrary characters). Click on the username
+to unsubscribe user from site mailings (new form will appear).
+</p>
+
+<form action="<?php echo $PHP_SELF; ?>" method="POST">
+Pattern: <input type="text" name="pattern" value="<?php echo $pattern; ?>">
+<input type="submit" name="submit" value="Show users matching pattern">
+</form>
+
+<?php
+
+if ($pattern) {
+ $res = db_query("
+ SELECT *
+ FROM users
+ WHERE user_name LIKE '%$pattern%'
+ OR realname ILIKE '%$pattern%'
+ OR email ILIKE '%$pattern%'
+ ");
+
+ $title=array();
+ $title[]=' ';
+ $title[]='user_id';
+ $title[]='Username';
+ $title[]='Real Name';
+ $title[]='Email';
+ $title[]='Site Mail.';
+ $title[]='Comm. Mail.';
+
+ echo html_build_list_table_top($title);
+
+ while ($row = db_fetch_array($res)) {
+ echo '
+ <tr bgcolor="'.html_get_alt_row_color($i++).'">
+ <td> </td>
+ <td>'.$row['user_id'].'</td>
+ <td><a href="unsubscribe.php?submit=1&user_name='.$row['user_name'].'">'.$row['user_name'].'</a></td>
+ <td>'.$row['realname'].'</td>
+ <td> '.$row['email'].'</td>
+ <td>'.$row['mail_siteupdates'].'</td>
+ <td> '.$row['mail_va'].'</td>
+ </tr>
+ ';
+ }
+
+ echo '</table>';
+}
+
+site_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/admin/vhost.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/admin/vhost.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/admin/vhost.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,173 @@
+<?php
+/**
+ *
+ * Site Admin page for maintaining groups' Virtual Hosts
+ *
+ * This page allows to:
+ * - add a VHOST entry for group
+ * - query properties of VHOST entry
+ * - edit some database (by going to group's DB Admin page)
+ * - register existing database in system
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('common/include/account.php');
+require_once('www/admin/admin_utils.php');
+
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+if ($add) {
+
+ $group_id = seek_gid($groupname);
+
+ if ($group_id) {
+
+ $group = &group_get_object($group_id);
+ exit_assert_object($group, 'Group');
+
+ if (valid_hostname($vhost_name)) {
+
+ $homedir = account_group_homedir($group->getUnixName());
+ $docdir = $homedir.'/htdocs/';
+ $cgidir = $homedir.'/cgi-bin/';
+
+
+ $res = db_query("
+ INSERT INTO prweb_vhost(vhost_name, docdir, cgidir, group_id)
+ VALUES ('$vhost_name','$docdir','$cgidir',$group_id)
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= 'Error adding VHOST: '.db_error();
+ } else {
+ $feedback .= "Virtual Host <b>".$vhost_name."</b> scheduled for creation on group <i>".$group->getUnixName()."</i>";
+ }
+ } else {
+
+ $feedback .= "<b>The provided group name does not exist.</b>";
+
+ }
+
+ }
+}
+
+if ($tweakcommit) {
+
+ $res = db_query("
+ UPDATE prweb_vhost
+ SET docdir='$docdir',
+ cgidir='$cgidir'
+ WHERE vhostid=$vhostid
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= 'Error updating VHOST entry: '.db_error();
+ } else {
+ $feedback .= "Virtual Host entry updated.";
+ }
+
+}
+
+
+site_admin_header(array('title'=>"Site Admin"));
+?>
+
+<h3>Virtual Host Administration</h3>
+
+<form name="madd" method="post" action="<?php echo $PHP_SELF; ?>">
+
+<b>Add Virtual Host</b>
+
+<table border="0">
+
+<tr>
+<td>Group Unix Name</td>
+<td><input type="text" name="groupname"></td>
+</tr>
+
+<tr>
+<td>Virtual Host Name</td>
+<td><input type="text" name="vhost_name"></td>
+</tr>
+</table>
+
+<input type="submit" name="add" value="Add Virtual Host">
+</form>
+
+<p>
+
+
+<hr>
+<b>Tweak Directories</b>
+<br>
+
+<form name="tweak" method="post" action="<?php echo $PHP_SELF; ?>">
+<table border="0">
+<tr>
+ <td>Virtual Host: </td><td><input type="text" name="vhost_name"></td><td><input type="submit" value="Get Info"></td>
+</tr>
+</table>
+
+<input type="hidden" name="tweak" value="1">
+
+</form>
+
+<?php
+
+if ($tweak) {
+
+
+ $res_vh = db_query("
+ SELECT vhostid,vhost_name,docdir,cgidir,unix_group_name
+ FROM prweb_vhost,groups
+ WHERE vhost_name='$vhost_name'
+ AND prweb_vhost.group_id=groups.group_id
+ ");
+
+ if (db_numrows($res_vh) > 0) {
+
+ $row_vh = db_fetch_array($res_vh);
+
+ print '<p><b>Update Record:</b><hr>';
+
+ $title=array();
+ $title[]='VHOST ID';
+ $title[]='VHOST Name';
+ $title[]='Group';
+ $title[]='Htdocs Dir';
+ $title[]='CGI Dir';
+ $title[]='Operations';
+ echo html_build_list_table_top($title);
+
+ print '
+ <form name="update" method="post" action="'.$PHP_SELF.'">
+
+ '.html_build_list_table_top($title).'
+ <tr><td>'.$row_vh['vhostid'].'</td>
+ <td>'.$row_vh['vhost_name'].'</td>
+ <td><a href="/projects/'.$row_vh['unix_group_name'].'">'.$row_vh['unix_group_name'].'</a></td>
+ <td><input maxlength="255" type="text" name="docdir" value="'.$row_vh['docdir'].'"></td>
+ <td><input type="text" name="cgidir" value="'.$row_vh['cgidir'].'"></td><td><input maxlength="255" type="submit" value="Update"></tr>
+ </table>
+
+ <input type="hidden" name="tweakcommit" value="1">
+ <input type="hidden" name="vhostid" value="'.$row_vh['vhostid'].'">
+ </form>
+ ';
+ } else {
+ echo "No such VHOST: '$vhost_name'";
+ }
+
+}
+
+site_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_featuredprojects.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_featuredprojects.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_featuredprojects.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,55 @@
+<?php
+/**
+ * rss_foundry_featuredprojects.php - Stats export page for Foundry featured projects.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @date 2001-06-06
+ * @version $Id: rss_foundry_featuredprojects.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $
+ *
+ */
+require_once('pre.php');
+require_once('rss_utils.inc');
+
+header("Content-Type: text/plain");
+print '<?xml version="1.0" encoding="utf-8"?>';
+?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
+ <channel rdf:about="http://www.xml.com/xml/news.rss">
+ <title>Featured Projects</title>
+ <description>SourceForge.net Site Statistics</description>
+<?php
+ $sql="SELECT
+ groups.group_name,
+ groups.unix_group_name,
+ groups.group_id,
+ foundry_preferred_projects.rank
+ FROM
+ groups,
+ foundry_preferred_projects
+ WHERE
+ foundry_preferred_projects.group_id=groups.group_id
+ AND
+ foundry_preferred_projects.foundry_id='$foundry_id'
+ ORDER BY
+ rank ASC";
+ $res_grp=db_query($sql);
+ $rows=db_numrows($res_grp);
+
+ if (!$res_grp || $rows < 1) {
+ echo " No Projects\n";
+ } else {
+ for ($i=0; $i<$rows; $i++) {
+ echo " <item>\n";
+ echo " <title>Project</title>\n";
+ echo ' <description>' . db_result($res_grp,$i,'group_name') . "</description>\n";
+ echo ' <link>http://' . $GLOBALS[sys_default_domain] . '/projects/' . db_result($res_grp,$i,'unix_group_name') . "</link>\n";
+ echo " </item>\n";
+ }
+ }
+?>
+ </channel>
+</rdf:RDF>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_mostactive.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_mostactive.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_mostactive.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,48 @@
+<?php
+/**
+ * rss_foundry_mostactive.php - Stats export page for Foundry most active projects.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @date 2001-06-06
+ * @version $Id: rss_foundry_mostactive.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $
+ *
+ */
+require_once('pre.php');
+require_once('rss_utils.inc');
+
+header("Content-Type: text/plain");
+print '<?xml version="1.0" encoding="utf-8"?>';
+?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
+ <channel rdf:about="http://www.xml.com/xml/news.rss">
+ <title>Most Active Projects</title>
+ <description>SourceForge.net Site Statistics</description>
+<?php
+ $sql="SELECT
+ *
+ FROM
+ foundry_project_rankings_agg
+ WHERE
+ foundry_id='$foundry_id'
+ ORDER BY
+ foundry_id ASC,
+ ranking ASC";
+ $result=db_query($sql, 20, 0, SYS_DB_STATS);
+ if (!$result || db_numrows($result) < 1) {
+ echo " <error/>\n";
+ } else {
+ while ($row=db_fetch_array($result)) {
+ echo " <item>\n";
+ echo ' <title>' . $row['group_name'] . "</title>\n";
+ echo ' <description>' . $row['percentile'] . "%</description>\n";
+ echo ' <link>http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row['unix_group_name'] . "</link>\n";
+ echo " </item>\n";
+ }
+ }
+?>
+ </channel>
+</rdf:RDF>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_topdownloads.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_topdownloads.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/rss_foundry_topdownloads.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,49 @@
+<?php
+/**
+ * rss_foundry_topdownloads.php - Stats export page for Foundry top downloads.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @date 2001-06-06
+ * @version $Id: rss_foundry_topdownloads.php,v 1.2 2001/06/14 21:54:23 dbrogdon Exp $
+ *
+ */
+require_once('pre.php');
+require_once('rss_utils.inc');
+
+header("Content-Type: text/plain");
+print '<?xml version="1.0" encoding="utf-8"?>';
+?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
+ <channel rdf:about="http://www.xml.com/xml/news.rss">
+ <title>Top Downloads</title>
+ <description>SourceForge.net Site Statistics</description>
+<?php
+ $res_topdown = db_query("SELECT
+ *
+ FROM
+ foundry_project_downloads_agg
+ WHERE
+ foundry_id='$foundry_id'
+ ORDER BY
+ foundry_id DESC,
+ downloads DESC", 10, 0, SYS_DB_STATS);
+ if (!$res_topdown || db_numrows($res_topdown) < 1) {
+ echo " <item>\n";
+ echo " <title>No Projects</title>\n";
+ echo " </item>\n";
+ } else {
+ while ($row_topdown = db_fetch_array($res_topdown)) {
+ echo " <item>\n";
+ echo ' <title>' . $row_topdown['group_name'] . "</title>\n";
+ echo ' <description>' . $row_topdown['downloads'] . "</description>\n";
+ echo ' <link>http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row_topdown['group_name'] . "</link>\n";
+ echo " </item>\n";
+ }
+ }
+?>
+ </channel>
+</rdf:RDF>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdn_search.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdn_search.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdn_search.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,85 @@
+<?php
+/**
+ * rss_osdn_search.php - Global OSDN search export
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @date 2001-06-15
+ * @version $Id: rss_osdn_search.php,v 1.2 2001/06/21 21:38:00 jbyers Exp $
+ *
+ */
+require_once('pre.php');
+require_once('rss_utils.inc');
+
+header("Content-Type: text/plain");
+print '<?xml version="1.0" encoding="utf-8"?>';
+?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
+ <channel rdf:about="http://www.xml.com/xml/news.rss">
+ <title>OSDN Universal Search</title>
+ <description>SourceForge export for OSDN Universal search</description>
+<?php
+ $result=search_projects();
+ if (!$result || db_numrows($result) < 1) {
+ echo " <item>\n";
+ echo " <title>No Data</title>\n";
+ echo " </item>\n";
+ } else {
+ while ($row=db_fetch_array($result)) {
+ $weight = 10;
+ if (stristr($row['group_name'], $query_text)) {
+ $weight += 10;
+ }
+
+ if (stristr($row['short_description'], $query_text)) {
+ $weight += 10;
+ }
+
+ echo " <item>\n";
+ echo ' <title>' . $row['group_name'] . "</title>\n";
+ echo ' <description>' . $row['short_description'] . "</description>\n";
+ echo ' <link>http://' . $GLOBALS[sys_default_domain] . '/projects/' . $row['unix_group_name'] . "</link>\n";
+ echo " <osdn:weight>$weight</osdn:weight>\n";
+ echo " </item>\n";
+ }
+ }
+?>
+ </channel>
+</rdf:RDF>
+
+<?php
+ function search_projects() {
+ global $query_text, $offset;
+
+ // If multiple words in the query text, separate them and put ILIKE (pgsql's
+ // case-insensitive LIKE) in between
+ // XXX:SQL: this assumes db understands backslash-quoting
+
+ $array=explode(" ",quotemeta($query_text));
+ // we need to use double-backslashes in SQL
+ $array_re=explode(" ",addslashes(quotemeta($query_text)));
+
+ $query_text1="group_name ILIKE '%" . implode($array,"%' $crit group_name ILIKE '%") ."%'";
+ $query_text2="short_description ILIKE '%" . implode($array,"%' $crit short_description ILIKE '%") ."%'";
+ $query_text3="unix_group_name ILIKE '%" . implode($array,"%' $crit unix_group_name ILIKE '%") . "%'";
+
+ $sql = "SELECT
+ group_name,
+ unix_group_name,
+ type,
+ group_id,
+ short_description
+ FROM
+ groups
+ WHERE
+ status='A'
+ AND
+ is_public='1'
+ AND
+ (($query_text1) OR ($query_text2) OR ($query_text3))";
+ return db_query($sql, 15, $offset);
+ }
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdnnews.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdnnews.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/rss_osdnnews.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,219 @@
+<?php
+/**
+ * rss_osdnnews.php - Stats export page for the OSDN newsletter
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @date 2001-05-22
+ * @version $Id: rss_osdnnews.php,v 1.2 2001/07/10 00:03:08 pfalcon Exp $
+ *
+ */
+require_once('pre.php');
+require_once('rss_utils.inc');
+
+if (!$days) {
+ $days = '7';
+}
+
+//
+// Get the dates
+//
+$udate = date('U') - ($days * 86400);
+$currudate = date('U');
+
+$tmp1 = getdate($udate);
+$month = pad_number($tmp1['mon']);
+$day = pad_number($tmp1['mday']);
+$year = $tmp1['year'];
+
+$tmp2 = getdate($currudate);
+$curr_month = pad_number($tmp2['mon']);
+$curr_day = pad_number($tmp2['mday']);
+$curr_year = $tmp2['year'];
+
+$month_day = $year . $month;
+$curr_month_day = $curr_year . $curr_month;
+
+header("Content-Type: text/plain");
+print '<?xml version="1.0" encoding="utf-8"?>';
+?>
+
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
+ <channel rdf:about="http://www.xml.com/xml/news.rss">
+ <title>SourceForge Stats</title>
+ <description>SourceForge.net Site Statistics</description>
+ <item>
+ <title>Pageviews</title>
+ <description><?php echo get_pageviews(); ?></description>
+ </item>
+ <item>
+ <title>Downloads</title>
+ <description><?php echo get_downloads(); ?></description>
+ </item>
+ <item>
+ <title>Registered Users</title>
+ <description><?php echo get_registered_users(); ?></description>
+ </item>
+ <item>
+ <title>Registered Projects</title>
+ <description><?php echo get_registered_projects(); ?></description>
+ </item>
+ </channel>
+</rdf:RDF>
+
+<?php
+/**
+ * get_downloads() - Get downloaded files
+ *
+ * This function retrieves a count of downlaoded files as well as the
+ * total number of Kbytes made up of those files.
+ *
+ * @returns String A string of data containing file and filesize counts or 'ERROR' on error.
+ *
+ */
+function get_downloads() {
+ global $month_day, $day;
+
+ $sql = "SELECT
+ sum(s.downloads) AS downloads,
+ sum(f.file_size) AS filesize
+ FROM
+ frs_dlstats_file_agg s,
+ frs_file f
+ WHERE
+ s.file_id=f.file_id
+ AND (
+ s.month = '$month_day'
+ AND
+ s.day >= '$day'
+ OR
+ s.month > '$month_day'
+ )";
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $http_stats = db_fetch_array($res);
+
+ //
+ // Determine the total number of files and file sizes
+ //
+ $total_files = number_format($ftp_stats[0] + $http_stats[0]);
+ $total_size = number_format(($ftp_stats[1] + $http_stats[1]) / 1000);
+
+ return "$total_files downloads accounting for " . $total_size . "Kb" . " of data.";
+}
+
+/**
+ * get_registered_users() - Get a count of regiestered users
+ *
+ * This function retrieves both a count of current users and new users
+ * since '$days' ago.
+ *
+ * @returns String A string of data containing the current and new users or 'ERROR' on error.
+ *
+ */
+function get_registered_users() {
+ global $udate, $days;
+
+ //
+ // Get the current users
+ //
+ $sql = "SELECT count(*) AS count FROM users WHERE status='A'";
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $curr_users = number_format(db_result($res, 0, 0));
+
+ //
+ // Get the users from '$days' offset
+ //
+ $sql = "SELECT count(*) AS count FROM users WHERE status='A' AND add_date >= '$udate'";
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $new_users = number_format(db_result($res, 0, 0));
+
+ return "$curr_users up $new_users from $days days ago.";
+}
+
+/**
+ * get_registered_projects() - Get a count of registered projects
+ *
+ * This function retrieves both a count of current registered projects and
+ * new projects registered since '$days' ago.
+ *
+ * @returns String A string of data containing the current and new projects or 'ERROR' on error.
+ *
+ */
+function get_registered_projects() {
+ global $udate, $days;
+
+ //
+ // Get the current projects
+ //
+ $sql = "SELECT count(*) AS count FROM groups WHERE status='A'";
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $curr_projx = number_format(db_result($res, 0, 0));
+
+ //
+ // Get the projects from '$days' offset
+ //
+ $sql = "SELECT count(*) AS count FROM groups WHERE status='A' AND register_time >= '$udate'";
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $new_projx = number_format(db_result($res, 0, 0));
+
+ if (!$new_projx) {
+ return 'ERROR';
+ }
+
+ return "$curr_projx up $new_projx from $days days ago.";
+}
+
+/**
+ * get_pageviews() - Get the latest pageview count
+ *
+ * This function retreives the latest site-wide pageview count.
+ *
+ * @returns Int A count of total pageviews or 'ERROR' on error.
+ *
+ */
+function get_pageviews() {
+ $sql = 'SELECT sum(a.site_views) FROM stats_project_all a, groups g WHERE a.group_id=g.group_id';
+ $res = db_query($sql, 1, 0, SYS_DB_STATS);
+ if (!$res) {
+ return 'ERROR';
+ }
+ $pageviews = number_format(db_result($res, 0, 0));
+
+ return $pageviews;
+}
+
+/**
+ * pad_number() - Zero-pad a number
+ *
+ * This function will zero-pad a single digit number
+ *
+ * @param $num Int A number that may need padding.
+ * @returns Int The padded number if $num was a single digit number or 'ERROR' on error.
+ *
+ */
+function pad_number($num) {
+ if (strlen($num) < 2) {
+ return ('0' . $num);
+ } else {
+ return $num;
+ }
+}
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,170 @@
+<?php
+/**
+ * sf_tracker_export.php
+ *
+ * SourceForge Exports: Export tracker contents in XML
+ *
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @author Darrell Brogdon <dbrogdon at valinux.com>
+ * @version $Id$
+ *
+ */
+
+set_time_limit(0);
+
+require_once('pre.php');
+require_once('common/tracker/Artifact.class');
+require_once('common/tracker/Artifacts.class');
+require_once('common/tracker/ArtifactFile.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('common/tracker/ArtifactGroup.class');
+require_once('common/tracker/ArtifactCategory.class');
+require_once('common/tracker/ArtifactCanned.class');
+require_once('common/tracker/ArtifactResolution.class');
+
+header("Content-Type: text/plain");
+?>
+<tracker version="1.0" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://<?php echo $sys_default_domain; ?>/export/sf_tracker_export.xsd">
+<?php
+if ($group_id && $atid) {
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ echo(" <error>Could not get the Group object</error>\n");
+ $errors = true;
+ }
+
+ //
+ // Create the ArtifactType object
+ //
+ $ath = new ArtifactType($group,$atid);
+ if (!$ath || !is_object($ath)) {
+ echo(" <error>ArtifactType could not be created</error>\n");
+ $errors = true;
+ }
+ if ($ath->isError()) {
+ echo(' <error>' . $ath->getErrorMessage() . "</error>\n");
+ $errors = true;
+ }
+
+ //
+ // Create the Artifacts object
+ //
+ $artifacts = new Artifacts($ath);
+ if (!$artifacts || !is_object($ath)) {
+ echo(" <error>Artifacts could not be created</error>\n");
+ $errors = true;
+ }
+ if ($artifacts->isError()) {
+ echo(' <error>' . $artifacts->getErrorMessage() . "</error>\n");
+ $errors = true;
+ }
+
+ //
+ // Loop through each artifact object and show the results
+ //
+ if (!$alist =& $artifacts->getArtifacts($offset)) {
+ echo(' <error>' . $artifacts->getErrorMessage() . "</error>\n");
+ $errors = true;
+ }
+
+ if ($errors) {
+ echo ('</tracker>');
+ exit;
+ }
+
+ for ($i=0; $i<count($alist); $i++) {
+?>
+ <artifact id="<?php echo $alist[$i]->getID(); ?>">
+ <submitted_by><?php echo $alist[$i]->getSubmittedUnixName(); ?></submitted_by>
+ <submitted_date><?php echo date( $sys_datefmt, $alist[$i]->getOpenDate() ); ?></submitted_date>
+ <artifact_type id="<?php echo $ath->getID(); ?>"><?php echo $ath->getID(); ?></artifact_type>
+ <category id="<?php echo $alist[$i]->getCategoryID(); ?>"><?php echo $alist[$i]->getCategoryName(); ?></category>
+ <artifact_group id="<?php echo $alist[$i]->getArtifactGroupID(); ?>"><?php echo $alist[$i]->getArtifactGroupID; ?></artifact_group>
+ <assigned_to><?php echo $alist[$i]->getAssignedRealName(); ?></assigned_to>
+ <priority id="<?php echo $alist[$i]->getPriority(); ?>"><?php echo $alist[$i]->getPriority(); ?></priority>
+ <status><?php echo $alist[$i]->getStatusName(); ?></status>
+ <resolution><?php echo $alist[$i]->getResolutionName(); ?></resolution>
+ <summary><?php echo $alist[$i]->getSummary(); ?></summary>
+ <detail><?php echo $alist[$i]->getDetails(); ?></detail>
+<?php
+ $result = $alist[$i]->getMessages();
+ $rows = db_numrows($result);
+ if ($rows > 0) {
+?>
+ <follow_ups>
+<?php
+ for ($x=0; $x<$rows; $x++) {
+?>
+ <item>
+ <date><?php echo db_result($result, $x, 'adddate'); ?></date>
+ <sender><?php echo db_result($result, $x, 'user_name'); ?></sender>
+ <text><?php echo db_result($result, $x, 'body'); ?></text>
+ </item>
+<?php
+ }
+?>
+ </follow_ups>
+<?php
+ }
+
+ $file_list =& $alist[$i]->getFiles();
+ $count=count($file_list);
+ if ($count > 0) {
+?>
+ <existingfiles>
+<?php
+ for ($x=0; $x<$count; $x++) {
+?>
+ <file>
+ <id><?php echo $file_list[$x]->getID(); ?></id>
+ <name><?php echo $file_list[$x]->getName(); ?></name>
+ <description><?php echo $file_list[$x]->getDescription(); ?></description>
+ <filesize><?php echo $file_list[$x]->getSize(); ?></filesize>
+ <filetype><?php echo $file_list[$x]->getType(); ?></filetype>
+ <adddate><?php echo $file_list[$x]->getDate(); ?></adddate>
+ <submitted_by><?php echo $file_list[$x]->getSubmittedBy(); ?></submitted_by>
+ </file>
+<?php
+ }
+?>
+ </existingfiles>
+<?php
+ }
+
+ $result = $alist[$i]->getHistory();
+ $rows = db_numrows($result);
+
+ if ($rows > 0) {
+?>
+ <change_log>
+<?php
+ for ($x=0; $x<$rows; $x++) {
+?>
+ <item>
+ <field><?php echo db_result($result, $x, 'field_name'); ?></field>
+ <old_value><?php echo db_result($result, $x, 'old_value'); ?></old_value>
+ <date><?php echo db_result($result, $x, 'entrydate'); ?></date>
+ <by><?php echo db_result($result, $x, 'user_name'); ?></by>
+ </item>
+<?php
+ }
+?>
+ </change_log>
+<?php
+ }
+?>
+ </artifact>
+<?php
+ }
+} else {
+ print(" <error>Group ID Not Set</error>\n");
+}
+?>
+</tracker>
Added: trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.xsd
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.xsd (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/export/sf_tracker_export.xsd 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
+ <xsd:element name="adddate" type="xsd:string"/>
+ <xsd:element name="artifact">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="submitted_by"/>
+ <xsd:element ref="submitted_date"/>
+ <xsd:element ref="artifact_type"/>
+ <xsd:element ref="category"/>
+ <xsd:element ref="artifact_group"/>
+ <xsd:element ref="assigned_to"/>
+ <xsd:element ref="priority"/>
+ <xsd:element ref="status"/>
+ <xsd:element ref="resolution"/>
+ <xsd:element ref="summary"/>
+ <xsd:element ref="detail" minOccurs="0"/>
+ <xsd:element ref="followups"/>
+ <xsd:element ref="existingfiles"/>
+ <xsd:element ref="changelog"/>
+ </xsd:sequence>
+ <xsd:attribute name="id" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="artifact_group">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="artifact_type">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assigned_to">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="by">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="category">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="changelog">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="field" minOccurs="0"/>
+ <xsd:element ref="old_value" minOccurs="0"/>
+ <xsd:element ref="date" minOccurs="0"/>
+ <xsd:element ref="by" minOccurs="0"/>
+ <xsd:element ref="item" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="date" type="xsd:string"/>
+ <xsd:element name="description" type="xsd:string"/>
+ <xsd:element name="detail" type="xsd:string"/>
+ <xsd:element name="existingfiles">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="file" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="field" type="xsd:string"/>
+ <xsd:element name="file">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="id"/>
+ <xsd:element ref="name"/>
+ <xsd:element ref="description"/>
+ <xsd:element ref="location"/>
+ <xsd:element ref="filesize"/>
+ <xsd:element ref="filetype"/>
+ <xsd:element ref="adddate"/>
+ <xsd:element ref="submitted_by"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="filesize" type="xsd:byte"/>
+ <xsd:element name="filetype">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="followups">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="item" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="id">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="item">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="field" minOccurs="0"/>
+ <xsd:element ref="old_value" minOccurs="0"/>
+ <xsd:element ref="date"/>
+ <xsd:element ref="sender" minOccurs="0"/>
+ <xsd:element ref="submitted_by" minOccurs="0"/>
+ <xsd:element ref="text" minOccurs="0"/>
+ <xsd:element ref="by" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="location" type="xsd:string"/>
+ <xsd:element name="name">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="old_value" type="xsd:string"/>
+ <xsd:element name="priority">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resolution">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="sender" type="xsd:string"/>
+ <xsd:element name="status">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:restriction base="xsd:string">
+ <xsd:attribute name="id">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:restriction>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="submitted_by">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="submitted_date" type="xsd:string"/>
+ <xsd:element name="summary" type="xsd:string"/>
+ <xsd:element name="text" type="xsd:string"/>
+ <xsd:element name="tracker">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="artifact" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="version" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:number"/>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
Added: trunk/gforge_base/evolvisforge/gforge/www/help/tracker.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/help/tracker.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/help/tracker.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,93 @@
+<?php
+/**
+ *
+ * SourceForge Help Facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+
+help_header('Tracker Help - ' . ucwords(str_replace('_',' ',$helpname)));
+?>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+ <td>
+<?php
+ switch( $helpname ) {
+ case 'assignee':
+ print('This drop-down box represents the project administrator to which a tracker item is assigned.');
+ break;
+ case 'status':
+ print('This drop-down box represents the current status of a tracker item.<br><br>
+ You can set the status to \'Pending\' if you are waiting for a response from the tracker item author. When
+ the author responds the status is automatically reset to that of \'Open\'. Otherwise, if the author doesn\'t
+ respond with an admin-defined amount of time (default is 14 days) then the item is given a status of \'Deleted\'.');
+ break;
+ case 'category':
+ print('This drop-down box represents the Category of the tracker items which is a particular section of a project.<br><br>
+ Select \'Any\' for a broader result set.');
+ break;
+ case 'group':
+ print('This drop-down box represents the Group of the tracker items which is a list of project admin-defined options.<br><br>
+ If you are a project admin you can click the \'(admin)\' link to define your own groups.');
+ break;
+ case 'sort_by':
+ print('The Sort By option allows you to determine how the browse results are sorted.<br><br> You can sort by
+ ID, Priority, Summary, Open Date, Close Date, Submitter, or Assignee. You can also have the
+ results sorted in Ascending or Descending order.');
+ break;
+ case 'data_type':
+ print('The Data Type option determines the type of tracker item this is. Since the tracker rolls into one the
+ bug, patch, support, etc... managers you need to be able to determine which one of these an item should belong.
+ <br><br>This has the added benefit of enabling an admin to turn a support request into a bug.');
+ break;
+ case 'priority':
+ print('The priority option allows a user to define a tracker item priority (ranging from 1-Lowest to 9-Highest).<br><br>
+ This is especially helpful for bugs and support requests where a user might find a critical problem with a project.');
+ break;
+ case 'resolution':
+ print('The resolution option represents a tracker items resolution if any.');
+ break;
+ case 'summary':
+ print('The summary text-box represents a short tracker item summary. Useful when browsing through several tracker items.');
+ break;
+ case 'canned_response':
+ print('The canned response drop-down represents a list of project admin-defined canned responses to common support or bug
+ submission.<br><br> If you are a project admin you can click the \'(admin)\' link to define your own canned responses');
+ break;
+ case 'comment':
+ print('The comment textarea allows you to attach a comment to a tracker item when a canned response isn\'t appropriate.');
+ break;
+ case 'attach_file':
+ print('When you wish to attach a file to a tracker item you must check this checkbox before submitting changes.');
+ break;
+ case 'monitor':
+ print('You can monitor or un-monitor this item by clicking the "Monitor" button. <br><br><b>Note!</b> this will send you additional email. If you add comments to this item, or submitted, or are assigned this item, you will also get emails for those reasons as well!');
+ break;
+ default:
+ print("UNKNOWN HELP REQUEST: $helpname");
+ break;
+ }
+?>
+ </td>
+</tr>
+<tr>
+ <td align="right">
+ <br><br>
+ <form>
+ <input type="button" value="Close Window" onClick="window.close()">
+ </form>
+ </td>
+</tr>
+</table>
+
+<?
+help_footer();
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/images/favicon.ico
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/favicon.ico (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/favicon.ico 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+ ¨ ( @ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôõôôõåãáåãáâÞÛâÞÛãàÝãàÝêêéêêéúýÿúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôõôôõåãáåãáâÞÛâÞÛãàÝãàÝêêéêêéúýÿúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ×ÏÝ×ϯ¯tOtO
T
TGGK K ^'^']]ƹªÆ¹ªòòôòòôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ×ÏÝ×ϯ¯tOtO
T
TGGK K ^'^']]ƹªÆ¹ªòòôòòôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾«¾«i5i5xYxYwwįįĨĨ¨~N¨~NOOz7 z7 }? }? rFrFçæåçæåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾«¾«i5i5xYxYwwįįĨĨ¨~N¨~NOOz7 z7 }? }? rFrFçæåçæåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿν¬Î½¬¨T¨Tæß×æßׯ±¯±àâåàâåÿÿÿÿÿÿÿÿÿÿÿÿëäÜëäܺtºtSS|9 |9 p?p?ðîìðîìÿÿÿÿÿÿÿÿÿÿÿÿν¬Î½¬¨T¨Tæß×æßׯ±¯±àâåàâåÿÿÿÿÿÿÿÿÿÿÿÿëäÜëäܺtºtSS|9 |9 p?p?ðîìðîìÿÿÿÿÿÿòíéòíésBsBøôïøôïÙÚÝÙÚÝ¡¡¢ ¢ ´³³´³³øøøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÛÎçÛÎc*c*y7 y7 ««ÿÿÿÿÿÿòíéòíésBsBøôïøôïÙÚÝÙÚÝ¡¡¢ ¢ ´³³´³³øøøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÛÎçÛÎc*c*y7 y7 ««ÿÿÿÿÿÿÒ¿ªÒ¿ªd*d*üüûüüûßÞßßÞßÉÈÈÉÈÈ´²±´²±ÏÍÍÏÍÍßÞÞßÞÞÿÿÿÿÿÿüüüüüüóóóóóóÿÿÿÿÿÿåÚÌåÚÌ
I
Is@s@ýýýýýýÒ¿ªÒ¿ªd*d*üüûüüûßÞßßÞßÉÈÈÉÈÈ´²±´²±ÏÍÍÏÍÍßÞÞßÞÞÿÿÿÿÿÿüüüüüüóóóóóóÿÿÿÿÿÿåÚÌåÚÌ
I
Is@s@ýýýýýýǮǮJJÝØÔÝØÔÿÿÿÿÿÿûüûûüûôôôôôôÿÿÿÿÿÿëêéëêéèçæèçæááàááà°¯®°¯®êêéêêéúýÿúýÿ¹p¹pZZúùøúùøǮǮJJÝØÔÝØÔÿÿÿÿÿÿûüûûüûôôôôôôÿÿÿÿÿÿëêéëêéèçæèçæááàááà°¯®°¯®êêéêêéúýÿúýÿ¹p¹pZZúùøúùøÞνÞνV V ¦y¦yëëêëëêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÛÚÙÛÚÙÈÇÆÈÇÆÄÃÂÄÃÂÍÌËÍÌËúüþúüþϸϸ¦|K¦|KþþþþþþÞνÞνV V ¦y¦yëëêëëêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÛÚÙÛÚÙÈÇÆÈÇÆÄÃÂÄÃÂÍÌËÍÌËúüþúüþϸϸ¦|K¦|Kþþþþþþûúùûúù¬p¬pkk¸±«¸±«ãáàãáàûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿûûûûûûàÞßàÞßÛÙÙÛÙÙííïííïÿÿÿÿÿÿ¨]¨]Ï·Ï·ÿÿÿÿÿÿûúùûúù¬p¬pkk¸±«¸±«ãáàãáàûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿûûûûûûàÞßàÞßÛÙÙÛÙÙííïííïÿÿÿÿÿÿ¨]¨]Ï·Ï·ÿÿÿÿÿÿÿÿÿÿÿÿéæâéæâ³¥³¥ËúËúààààààÖÖÖÖÖÖ×ÖÖ×ÖÖìîïìîïúûýúûýôõ÷ôõ÷ôöøôöøáßÞáßÞtt´k´kúøõúøõÿÿÿÿÿÿÿÿÿÿÿÿéæâéæâ³¥³¥ËúËúààààààÖÖÖÖÖÖ×ÖÖ×ÖÖìîïìîïúûýúûýôõ÷ôõ÷ôöøôöøáßÞáßÞtt´k´kúøõúøõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòñîòñîãâàãâàøùùøùùÖÔÑÖÔѨ¨¦{¦{·§·§ÒÀ®ÒÀ®b1b1¶k¶kþýýþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòñîòñîãâàãâàøùùøùùÖÔÑÖÔѨ¨¦{¦{·§·§ÒÀ®ÒÀ®b1b1¶k¶kþýýþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûûûûáßÝáßÝ¿´©¿´©{{¤a¤a²q²qÌ´Ì´åÙËåÙËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûûûûáßÝáßÝ¿´©¿´©{{¤a¤a²q²qÌ´Ì´åÙËåÙËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþüûûüûûýüûýüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþüûûüûûýüûýüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/c.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/c.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/c.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , ©Ëí!Æ³Æ ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/i.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/i.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/i.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , §»íJkfÔ?\aX¦èjy ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/l.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/l.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/l.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , §»íJkfÔ? âèæ¦ê ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/m.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/m.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/m.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , ©ËÝ £\ä'hZÈ\TG ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/n.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/n.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/n.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , ©ËÝ £\UÕËé⸠;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/p.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/p.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/p.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , ©ËÝ £\ð {MUÞªa¨x¦*S ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/t.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/t.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/t.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿ!ù , §»íJkfÔ? â8yh^X¡îú. ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/images/phorum/trans.gif
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/images/phorum/trans.gif (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/images/phorum/trans.gif 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1 @@
+GIF89a ÿÿÿÿÿÿ!ù , D ;
\ No newline at end of file
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Base.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Base.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Base.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,374 @@
+#/**
+# *
+# * Default message catalog (English)
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# *
+# */
+about_foundries about_blurb SourceForge Foundries serve as places for developers to congregate, share expertise and news, get and give advice, and generally help each other develop better software faster (this is Open Source, after all).<br> <br>If you're interested in volunteering to help support or start a foundry, or have suggestions, ideas, or gripes please <a href="/contact.php" >contact SourceForge</a>.
+about_foundries foundries_list Here is a list of all foundries on the system. Some are more complete than others. If you see a foundry you may want to contribute to, contact the existing foundry admins for that foundry.
+account title Account Preferences
+account_change_email message You have requested a change of email address on SourceForge.\nPlease visit the following URL to complete the email change:\n\n<https://$1/account/change_email-complete.php?ch=_$2>\n\n -- the SourceForge staff
+account_change_email section Account Preferences
+account_change_email subject SourceForge Verification
+account_change_email title Change Email Address
+account_change_pw confirmation <h2>SourceForge Password Change Confirmation</h2> <p> Congratulations. You have changed your password. </p>
+account_change_pw section Account Preferences
+account_change_pw title Change Password
+account_editsshkeys section Account Preferences
+account_editsshkeys title Edit CVS/SSH Shared Keys
+account_first about_blurb You are now a registered user on SourceForge, the online development environment for Open Source projects.<P>As a registered user, you can participate fully in the activities on the site. You may now post messages to the project message forums, post bugs for software in SourceForge, sign on as a project developer, or even start your own project.<P>You should take some time to read through the <A href="/docs/site/"><b>Site Documentation</b></A> so that you may take full advantage of SourceForge.<P>Enjoy the site, and please provide us with feedback on ways that we can improve SourceForge.<P>--the SourceForge staff
+account_first title Welcome to SourceForge!
+account_login deleted_account <p>Your SourceForge account has been removed by SourceForge staff. This may occur for two reasons, either 1) you requested that your account be removed; or 2) some action has been performed using your account which has been seen as objectionable (i.e. you have breached the terms of service for use of your account) and your account has been revoked for administrative reasons. Should you have questions or concerns regarding this matter, please log a<a href="/support/?group_id=1">support request</a>.</p><p>Thank you, <br><br>SourceForge Staff</p>
+account_login pending_account <P>Your account is currently pending your email confirmation. Visiting the link sent to you in this email will activate your account. <P>If you need this email resent, please click below and a confirmation email will be sent to the email address you provided in registration. <P><A href="pending-resend.php?form_user=$1">[Resend Confirmation Email]</A> <br><hr> <p>
+account_login title SourceForge Site Login
+account_lostpw message Someone (presumably you) on the SourceForge site requested a\npassword change through email verification. If this was not you,\nignore this message and nothing will happen.\n\nIf you requested this verification, visit the following URL\nto change your password:\n\n<https://$1/account/lostlogin.php?ch=_$2>\n\n -- the SourceForge staff\n
+account_lostpw subject SourceForge Verification
+account_lostpw title Lost Your Password?
+account_register title SourceForge New Account Registration
+account_unsubscribe all_mailings all SourceForge mailings and notifications
+account_unsubscribe site_mailings SourceForge site mailings
+account_verify title SourceForge Account Verification
+account_verify verify_blurb <p>In order to complete your registration, login now. Your account willthen be activated for normal logins.</p>
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code en
+conf language_id 1
+contact about_blurb <p>This is the contact page for <b>SourceForge.net</b> -- if you are having a problem with a project hosted by us please send your questions/info to the support/bug manager for that project. You can access those features by visiting that project's development home page at: sourceforge.net/projects/<project name> and clicking the approrpiate tool.</p><p>If you have a support request, bug report or wish to communicate directly with the SourceForge <A href="staff.php">staff</a>, please take care in using the appropriate means:</p><ul><li>To Request support for your project or account, visit the <a href="/support/?func=addsupport&group_id=1">SourceForge Support Manager</a></li><li>If you've found a bug in SourceForge, please use the <a href="/bugs/?func=addbug&group_id=1">SourceForge Bug Tracker</a></li><li>All press inquiries should be directed to <a href="mailto:eureka at valinux.com">Eureka Endo</a>, Press Relations Manager, VA Linux Systems.</li></ul>
+contact title Contact SourceForge
+cvs section Project: $1
+cvs title CVS
+docman section Project: $1
+docman title Document Manager
+docman_admin section $1
+docman_admin title Document Manager: Administration
+docman_admin_docedit section Document Manager
+docman_admin_docedit title Edit Document
+docman_admin_editdocs section Document Manager Administration
+docman_admin_editdocs title Edit Docs
+docman_admin_editgroups section Document Manager Administration
+docman_admin_editgroups title Edit Groups
+docman_admin_groupdelete section Document Manager Administration
+docman_admin_groupdelete title Delete Document Group
+docman_admin_groupedit section Document Manager Administration
+docman_admin_groupedit title Rename Document Group
+docman_display_doc section Project: $1
+docman_display_doc title Document Manager: Display Document
+docman_new section Project: $1
+docman_new title Document Manager: Submit New Documentation
+forum section Project: $1
+forum title Forums
+forum_admin section Project: $1
+forum_admin title Forums: Administration
+forum_admin_addforum section Forum Administration
+forum_admin_addforum title Add Forum
+forum_admin_changestatus section Forum Administration
+forum_admin_changestatus title Change Forum Status
+forum_admin_delete section Forum Administration
+forum_admin_delete title Delete Forum
+forum_forum section Project: $1
+forum_forum title Forums: View Forum
+forum_forum_thread section Forums
+forum_forum_thread title View Thread
+forum_message section Forums
+forum_message title View Message
+foundry section Foundry: $1
+foundry title Summary
+foundry_admin section Foundry: $1
+foundry_admin title Foundry Administration
+foundry_html_admin section Foundry Administration
+foundry_html_admin title Foundry HTML Admin
+foundry_news section Foundry Administration
+foundry_news title Foundry News Summary
+frs file_download Download
+frs file_monitor Monitor
+frs file_notes Notes
+frs file_package Package
+frs file_rel_date Date
+frs file_version Version
+frs latest_file_releases Latest File Releases
+general return [Return to SourceForge]
+general sitename SourceForge
+group developer_info Developer Info
+group developers Developers
+group long_bugs Bug Tracking
+group long_cvs CVS Repository
+group long_docman DocManager: Project Documentation
+group long_forum Public Forums
+group long_foundries SourceForge Development Foundries
+group long_ftp Anonymous FTP Space
+group long_homepage Project Home Page
+group long_mail Mailing Lists
+group long_news Latest News
+group long_patch Patch Manager
+group long_pm Task Manager
+group long_support Tech Support Manager
+group long_survey Surveys
+group project_admins Project Admins
+group public_area Public Areas
+group short_admin Admin
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Docs
+group short_files Files
+group short_forum Forums
+group short_homepage Home Page
+group short_mail Lists
+group short_main Main
+group short_memberlist Developers
+group short_news News
+group short_patch Patches
+group short_pm Tasks
+group short_summary Summary
+group short_support Support
+group short_survey Surveys
+group short_tracker Tracker
+home about_blurb SourceForge is a <B>free service to <A href="http://www.opensource.org">Open Source</A> developers</B> offering easy access to the best in CVS, mailing lists, bug tracking, message boards/forums, task management, site hosting, permanent file archival, full backups, and total web-based administration. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ more ]</font></A><A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A><BR> <P><B>Site Feedback and Participation</B><P>In order to get the most out of SourceForge, you'll need to <A href="/account/register.php">register as a site user</A>. This will allow you to participate fully in all we have to offer. You may of course browse the site without registering, but will not have access to participate fully. <P> <BR><B>Set Up Your Own Project</B><P><A href="/account/register.php">Register as a site user</A>, then <A HREF="/account/login.php">Login</A> and finally, <A HREF="/register/">Register Your Project.</A> Thanks... and enjoy the site.
+home breaking_down_barriers Breaking Down the Barriers to Open Source Development
+home highest_ranked_users Highest Ranked Users
+home most_active_this_week Most Active This Week
+home sfos SourceForge OnSite
+home sourceforge_statistics SourceForge Statistics
+home top_project_downloads Top Project Downloads
+mail provided_by <P>Mailing lists provided via a SourceForge version of <A href="http://www.list.org">GNU Mailman</A>. Thanks to the Mailman and <A href="http://www.python.org">Python</A> crews for excellent software.
+mail section Project: $1
+mail title Mailing Lists
+mail_admin section Mailing Lists
+mail_admin title Mailing List Admin
+mail_admin_add_list section Mailing List Admin
+mail_admin_add_list title Add List
+mail_admin_change_status section Mailing List Admin
+mail_admin_change_status title Admin / Update Lists
+menu about_foundries About Foundries
+menu about_sourceforge About SourceForge
+menu account_maintenance Account Maintenance
+menu bookmark_page Bookmark Page
+menu change_my_theme Change My Theme
+menu code_snippet_library Code Snippet Library
+menu compile_farm Compile Farm
+menu contact_us Contact SourceForge
+menu discussion_forums Discussion Forums
+menu documentation Site Docs
+menu foundry_admin Foundry Admin
+menu foundry_summary Foundry Summary
+menu login Login via SSL
+menu logout Logout
+menu my_personal_page My Personal Page
+menu new_project Register New Project
+menu new_releases New Releases
+menu new_user New User via SSL
+menu other_site_mirrors Other Site Mirrors
+menu project_admin Project Admin
+menu project_help_wanted Project Help Wanted
+menu project_summary Project Summary
+menu search Search
+menu site_status Site Status
+menu software_map Software Map
+menu top_projects Top Projects
+my about_blurb Your personal page contains lists of bugs and tasks that you are assigned, plus a list of groups that you are a member of.
+my no_bookmarks You currently do not have any bookmarks saved
+my no_monitored_filemodules <H3>You are not monitoring any files</H3><P>If you monitor files, you will be sent new release notices viaemail, with a link to the new file on our download server.<P>You can monitor files by visiting a project's "Summary Page" and clicking on the check box in the files section.<BR> 
+my no_monitored_forums <H3>You are not monitoring any forums</H3><P>If you monitor forums, you will be sent new posts in the form of an email, with a link to the new message.<P>You can monitor forums by clicking "Monitor Forum" in any given discussion forum.<BR>
+my no_open_tasks You have no open tasks assigned to you.
+my no_projects You're not a member of any active projects
+my no_tracker_items_assigned You have no open tracker items assigned to you.
+my no_tracker_items_submitted You have no open tracker items submitted by you.
+my title Personal Page For: $1
+my_bookmark_add section My Personal Page
+my_bookmark_add title Add Bookmark
+my_bookmark_delete section My Personal Page
+my_bookmark_delete title Delete Bookmark
+my_bookmark_edit section My Personal Page
+my_bookmark_edit title Edit Bookmark
+my_diary section My Personal Page
+my_diary title Diary And Notes
+new title New Releases
+news section Project: $1
+news title News
+news_admin section News
+news_admin title News Admin
+news_main title SourceForge News
+news_submit post_blurb You can post news about your project if you are an admin on your project. You may also post "help wanted" notes if your project needs help.<P>All posts <B>for your project</B> will appear instantly on your project summary page. Posts that are of special interest to the community will have to be approved by a member of the news team before they will appear on the SourceForge home page.
+news_submit section News
+news_submit title Submit News for $1
+partners about_blurb <P>SourceForge is proud to partner with the following organizations:<P><TABLE width=100%><TR valign="top"><TD><A href="http://www.cosource.com/">$1</A></TD><TD><B><A href="http://www.cosource.com/">Cosource.com</A></B><BR>Cosource.com is a collaborative, reverse-auction web site enabling international consumers and developers of Open Source products to work together to fund development of innovative software solutions.</TD></TR></TABLE>
+people about_blurb <P>The SourceForge Project Help Wanted board is for non-commercial, project volunteer openings. Commercial use is prohibited.<P>Project listings remain live for two weeks, or until closed by the poster, whichever comes first. (Project administrators may always re-post expired openings.)<P>Browse through the category menu to find projects looking for your help.<P>If you're a project admin, log in and submit help wanted requests through your project administration page.<P>To suggest new job categories, submit a request via the support manager.<P>
+people section Project Help Wanted
+people title Projects Needing Help
+people_admin section Project Help Wanted
+people_admin title Help Wanted Administration
+people_admin_people_cat section Help Wanted Administration
+people_admin_people_cat title Add Job Categories
+people_admin_people_skills section Help Wanted Administration
+people_admin_people_skills title Add Job Skills
+people_cat section Help Wanted
+people_cat title List Jobs By Category
+people_createjob section Project Help Wanted
+people_createjob title Create A New Job
+people_editjob section Project Help Wanted
+people_editjob title Edit Job
+people_editprofile section Project Help Wanted
+people_editprofile title Edit Your Profile
+people_helpwanted_latest section Project Help Wanted
+people_helpwanted_latest title Last Posts
+people_proj section Project Help Wanted
+people_proj title Project Help Wanted For $1
+people_viewjob section Project Help Wanted
+people_viewjob title $1 wanted for $2
+people_viewprofile section User Info
+people_viewprofile title View Developer Profile
+pm section Project: $1
+pm title Task Manager: Subprojects And Tasks
+pm_addtask section Task Manager
+pm_addtask title Add A Task
+pm_admin section $1
+pm_admin title Task Manager: Administration
+pm_admin_change_status section Task Manager Administration
+pm_admin_change_status title Update Information
+pm_admin_projects section Task Manager Administration
+pm_admin_projects title Add Subprojects
+pm_browse_custom section Task Manager
+pm_browse_custom title Browse Custom Tasks
+pm_browse_my section Project $1 Task Manager
+pm_browse_my title Browse My Tasks
+pm_browse_open section Task Manager
+pm_browse_open title Browse Open Tasks
+pm_detailtask section Task Manager
+pm_detailtask title Task Detail
+pm_modtask section Task Manager
+pm_modtask title Modify Task
+pm_reporting section Task Manager
+pm_reporting title Task Reporting System
+project_admin section Project: $1
+project_admin title Administration Summary
+project_admin_database section Project $1 - Administration
+project_admin_database title Database Information
+project_admin_editgroupinfo section Project $1 - Administration
+project_admin_editgroupinfo title Edit Public Info
+project_admin_editimages section Project $1 - Administration
+project_admin_editimages title Edit Multimedia Data
+project_admin_editpackages section Project $1 - Administration
+project_admin_editpackages title Edit Packages
+project_admin_editreleases section Project $1 - Administration
+project_admin_editreleases title Edit Releases
+project_admin_history section Project $1 - Administration
+project_admin_history title History
+project_admin_newrelease section Project $1 - Administration
+project_admin_newrelease title Create New Release
+project_admin_qrs section Project $1 - Administration
+project_admin_qrs title Quick Release System
+project_admin_userpermedit section Project $1 - Administration
+project_admin_userpermedit title Edit Developer Permissions
+project_admin_userperms section Project $1 - Administration
+project_admin_userperms title User Permissions List
+project_admin_vhost section Project $1 - Administration
+project_admin_vhost title Virtual Host Management
+project_memberlist joining <P>If you would like to contribute to this project by becoming a developer, contact one of the project admins, designated in bold text below.<br><br>
+project_showfiles section Project: $1
+project_showfiles title File List
+project_shownotes section Project: $1
+project_shownotes title Release Notes
+projects section Project: $1
+projects title Summary
+register title New Project Registration
+register_complete section New Project Registration
+register_complete title Registration Complete
+register_projectinfo section New Project Registration
+register_projectinfo title Project Information
+register_requirements section New Project Registration
+register_requirements title Services & Requirements
+register_tos section New Project Registration
+register_tos title Terms Of Service Agreement
+search title Search
+sendmessage about_blurb In an attempt to reduce spam, we are using this form to send email.<p>Fill it out accurately and completely or the receiver may not be able to respond.<P><FONT COLOR="RED"><B>IF YOU ARE WRITING FOR HELP:</B> Did you read the site documentation? Did you include your <B>user_id</B> and <B>user_name?</B> If you are writing about a project, include your <B>project id</B> (<B>group_id</B>) and <B>Project Name</B>.</FONT>
+sendmessage title Send $1 A Message
+snippet title Code Snippet Library
+snippet_add_snippet_to_package section Code Snippet Library
+snippet_add_snippet_to_package title Add Snippet To Package
+snippet_addversion section Code Snippet Library
+snippet_addversion title Post A New Version
+snippet_browse section Code Snippet Library
+snippet_browse title Browse Snippets
+snippet_delete section Code Snippet Library
+snippet_delete title Delete A Snippet
+snippet_detail section Code Snippet Library
+snippet_detail title View Snippet Detail
+snippet_package section Code Snippet Library
+snippet_package title Create Snippet Package
+snippet_submit section Code Snippet Library
+snippet_submit title Submit Snippet
+softwaremap title Trove
+staff about_blurb <P><h2>SourceForge Staff</h2><P><table border=0 cellspacing=2 cellpadding=2 bgcolor=""><tr valign=top><td><a href="/sendmessage.php?toaddress=pat_maillink_users.sourceforge.net">Patrick McGovern</a></td><td>(pat)</td><td>Patrick McGovern (pat) - Pat "Sounds Good" McGovern is the new Director of <A HREF="http://sourceforge.net/">SourceForge.net</A>. We're glad to have Pat on board, as he used to run <A HREF="http://www.valinux.com/">valinux.com</A>, so he knows a thing or two about running important web sites.</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=dlb_maillink_users.sourceforge.net">Dan Bressler</a></td><td>(dlb)</td><td>Dan is the "Product Manager" for SourceForge. We're not sure what that means, only that he likes timelines and handles business development issues.</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=bigdisk_maillink_users.sourceforge.net">Tim Perdue</a></td><td>(bigdisk)</td><td>Tim is the technical lead on SourceForge and is from Iowa. Yes Iowa. Not Idaho and not Ohio. Iowa. When he's not working you can locate him fairly easy as he has the only BMW Z3 in Iowa.<P>Tim founded <A HREF="http://www.phpbuilder.com/">PHPBuilder.com</A> and <A HREF="http://www.geocrawler.com/">Geocrawler.com</A>.</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=pfalcon_maillink_users.sourceforge.net">Paul Sokolovsky</a></td><td>(pfalcon)</td><td>Paul is a developer, living in Ukraine. Yep, it's where Chernobyl is located. He *claims* he had nothing to do with what happened. He describes himself as a "confirmed geek/workaholic type".</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=zelphyr_maillink_users.sourceforge.net">Darrell Brogdon</a></td><td>(zelphyr)</td><td>Darrell is also on the SourceForge development team. He worked for another company, but they wanted to ditch Open Source and move to ASP for their web applications... Now he works for us.</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=precision_maillink_users.sourceforge.net">Uriah Welcome</a></td><td>(precision)</td><td>Uriah is a system administrator/developer from the frosty regions of Minnesota. When he's not shoveling his driveway or defrosting his car you'll find him locked away in a dark room somewhere in front of a computer.</td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=moorman_maillink_users.sourceforge.net">Jacob Moorman</a></td><td>(moorman)</td><td>Jacob (aka roguemtl) is the Quality of Service Manager for SourceForge. He currently handles the bulk of the level two support requests, maintains the site status page, and helps to ensure everyone who logs a support request gets timely, correct service. He works from the northeastern US.</td></tr><TR><TD COLSPAN="2"><B>Founders:</B></TD></TR><tr valign=top><td><a href="/sendmessage.php?toaddress=fusion94_maillink_users.sourceforge.net">Tony Guntharp</a></td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=dtype_maillink_users.sourceforge.net">Drew Streib</a></td></tr><tr valign=top><td><a href="/sendmessage.php?toaddress=bigdisk_maillink_users.sourceforge.net">Tim Perdue</a></td></TR><tr valign=top><td><a href="/sendmessage.php?toaddress=precision_maillink_users.sourceforge.net">Uriah Welcome</a></td></TR><TR><TD COLSPAN="2"> <P><B>Signicant Outside Contributors:</B></TD></TR><tr valign=top><td><a href="/sendmessage.php?toaddress=wallace_maillink_users.sourceforge.net">Wallace Lee</a></td><td>(wallace)</td><td>Wallace has contributed significant tweaks and improvements to the SourceForge core code base. We appreciate his efforts, as do the users who benefit from his contributions.</td></tr></table>
+survey title Surveys For $1
+survey_admin section Survey Tool
+survey_admin title Administration
+survey_admin_add_question section Survey Tool Administration
+survey_admin_add_question title Add Survey Question
+survey_admin_add_survey section Survey Tool Administration
+survey_admin_add_survey title Add Survey
+survey_admin_edit_question section Survey Tool Administration
+survey_admin_edit_question title Edit A Survey Question
+survey_admin_edit_survey section Survey Tool Administration
+survey_admin_edit_survey title Edit Survey
+survey_admin_show_questions section Survey Tool Administration
+survey_admin_show_questions title Show Survey Questions
+survey_admin_show_results section Survey Tool Administration
+survey_admin_show_results title Show Survey Results
+survey_admin_show_results_aggregate section Survey Tool Administration
+survey_admin_show_results_aggregate title Show A Surveys Results
+survey_admin_show_results_comments section Survey Tool Administration
+survey_admin_show_results_comments title Show Survey Comments
+survey_admin_show_results_individual section Survey Tool Administration
+survey_admin_show_results_individual title Show Individual Survey Results
+survey_survey section Survey Tool
+survey_survey title Display Survey
+survey_survey_resp section Survey Tool
+survey_survey_resp title Survey Processing / Response
+thanks about_blurb <P><h2>SourceForge Acknowledgements</h2>The Developers of SourceForge would like to thank the following people for their support and encouragement:<ul><li>VA Linux Systems<li>Larry Augustin<li>Brian Biles<li>John Hall<li>Steve Westmoreland<li>Chris DiBona<li>Joe Arruda<li>Jeff Ritter<li>Trae McCombs<li>Patrick Wong<li>Neil Doane<li>Rob Walker<li>Robert Flemming<li>Michael Turner<li>Dan Cox<li>Garrett LeSage<li>John Goebel<li>Kit Cosper<li>Eureka Endo<li>Kevin Collins<li>Steve Schaefer<li>Greg Pryzby<li>Adam Frey<li>James Byers<li>Lion Templin</ul>
+themes section Account Preferences
+themes title View/Change Theme
+top about_blurb We track many project usage statistics on SourceForge, and display here the top ranked projects in several categories.
+top active_all_time Most Active All Time
+top active_weekly Most Active This Week
+top downloads Top Downloads
+top downloads_7_days Top Downloads (Past 7 Days)
+top forum_posts Top Forum Post Counts
+top pageviews Top Project Pageviews - Measured by impressions of the SourceForge 'button' logo
+top title Top Projects
+top_mostactive section Top Projects
+top_mostactive title Most Active Projects: $1
+top_toplist section Top Projects
+top_toplist title Top Project Lists
+tracker section Project: $1
+tracker title Trackers
+tracker_add section $1
+tracker_add title Submit Tracker Item
+tracker_admin section Tracker
+tracker_admin title Administration
+tracker_admin_add_canned section Tracker Administration
+tracker_admin_add_canned title Add Canned Responses To: $1
+tracker_admin_add_cat section Tracker Administration
+tracker_admin_add_cat title Add Categories To: $1
+tracker_admin_add_group section Tracker Administration
+tracker_admin_add_group title Add Groups To: $1
+tracker_admin_update_canned section Tracker Administration
+tracker_admin_update_canned title Modify Canned Respnses In: $1
+tracker_admin_update_cat section Tracker Administration
+tracker_admin_update_cat title Modify Category In: $1
+tracker_admin_update_group section Tracker Administration
+tracker_admin_update_group title Modify A Group In: $1
+tracker_admin_update_type section Tracker Administration
+tracker_admin_update_type title Update $1
+tracker_admin_update_users section Tracker Administration
+tracker_admin_update_users title Add/Update Tracker User Permissions
+tracker_browse section Project: $1
+tracker_browse title Browse $1
+tracker_detail section $1
+tracker_detail title Tracker Detailed View
+tracker_reporting section $1
+tracker_reporting title Tracker Reporting
+users title User Summary
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Bulgarian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Bulgarian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Bulgarian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,84 @@
+#/**
+# *
+# * Bulgarian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Delyan Toshev
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-14 Delyan Toshev
+# * Initial translation
+#
+menu account_maintenance Ïðîôèë
+menu bookmark_page Îòáåëåæè ñòðàíèöàòà
+home breaking_down_barriers Äà ïðåìàõíåì ïðå÷êèòå ïðåä ðàçðàáîòâàíåòî íà ñîôòóåð ñ îòâîðåí êîä
+menu change_my_theme Âúíøåí âèä
+menu code_snippet_library Ñîôòóåðíà áèáëèîòåêà
+menu compile_farm Ôàáðèêà çà êîìïèëèðàíå
+menu contact_us Âðúçêà ñ íàñ
+group developers Ðàçðàáîò÷èöè
+group developer_info Ó÷àñòíèöè â ïðîåêòà
+menu discussion_forums Äèñêóñèîííè ôîðóìè
+menu documentation Äîêóìåíòè
+frs file_download Èçòåãëè
+frs file_monitor Íàáëþäåíèå
+frs file_notes Áåëåæêè
+frs file_package Ìîäóë
+frs file_version Âåðñèÿ
+group long_bugs Ïðîñëåäÿâàíå íà ãðåøêè
+group long_cvs CVS õðàíèëèùå
+group long_docman Ïðîåêòíà äîêóìåíòàöèÿ
+group long_forum Ïóáëè÷íè ôîðóìè
+group long_ftp Àíîíèìíî FTP ïðîñòðàíñòâî
+group long_homepage Íà÷àëíà ñòðàíèöà íà ïðîåêòà
+group long_mail Ñïèñúöè ñ ïîëó÷àòåëè
+group long_news Ïîñëåäíè íîâèíè
+group long_patch Óïðàâëÿâàíå íà ïîïðàâêèòå
+group long_pm Óïðàâëÿâàíå íà çàäà÷èòå
+group long_support Óïðàâëÿâàíå íà ïîääðúæêàòà
+group long_survey Äîïèòâàíå
+group short_bugs Ãðåøêè
+group short_cvs CVS
+group short_docman Äîêóìåíòè
+group short_files Filesgroup short_forum Ôîðóìè
+group short_homepage Íà÷àëî
+group short_mail Ïîëó÷àòåëè
+group short_main Îñíîâíî
+group short_news Íîâèíè
+group short_patch Ïîïðàâêè
+group short_pm Çàäà÷è
+group short_summary Ðåçþìå
+group short_support Ïîääðúæêà
+group short_survey Ïðîó÷âàíèÿ
+home highest_ranked_users Íàé-ïîïóëÿðíèòå ïîòðåáèòåëè
+home about_blurb SourceForge å <B>áåçïëàòíà óñëóãà çà ðàçðàáîòâàùèòå ñîôòóåð ñ <A href="http://www.opensource.org">îòâîðåí êîä</A></B>, ïðåäëàãàùà ëåñåí äîñòúï äî íàé-äîáðîòî îò CVS, äèñêóñèîííè ôîðóìè, ïðîñëåäÿâàíå íà ãðåøêè, óïðàâëåíèå íà çàäà÷è, áåçïëàòíî óåá ïðîñòðàíñòâî, ïîñòîÿííî àðõèâèðàíå íà ôàéëîâåòå, ïúëíî ðåçåðâíî ïîäñèãóðÿâàíå íà ïðîåêòà, è íàïúëíî óåá áàçèðàíî àäìèíèñòðèðàíå. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ ïîâå÷å ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Âêëþ÷âàíå è îáðàòíà âðúçêà</B> <P> Çà äà ìîæå äà èçïîëçâàòå íàé-åôåêòèâíî SourceForge, ùå òðÿáâà äà ñå <A href="/account/register.php">ðåãèñòðèðàòå</A> êàòî ïîòðåáèòåë. Òîâà ùå âè ïîçâîëè äà ó÷àñòâàòå íàïúëíî âúâ âñè÷êî, êîåòî ïðåäëàãàìå. Ðàçáèðà ñå, ìîæåòå äà ðàçãëåæäàòå âñè÷êî è áåç ðåãèñòðèðàíå, íî òàêà ùå ñå ëèøèòå îò âúçìîæíîñòòà çà ïúëíî âêëþ÷âàíå â ðàçëè÷íèòå óñëóãè. <P> <BR> <B>Ñúçäàéòå ñâîé ïðîåêò</B> <P> <A href="/account/register.php">Ðåãèñòðèðàéòå ñå êàòî ïîòðåáèòåë</A>, ñëåä êîåòî <A HREF="/account/login.php">âëåçòå</A> â ñâîÿò ïðîôèë è íàêðàÿ <A HREF="/register/">ðåãèñòðèðàéòå âàøèÿò ïðîåêò.</A> <P> Áëàãîäàðèì âè... è ïðèÿòíî ïîëçâàíå íà óñëóãèòå íè.
+frs latest_file_releases Ïîñëåäíèòå èçëåçëè ôàéëîâå
+menu login Âõîä (SSL çàùèòåíà âðúçêà)
+menu logout Èçõîä
+home most_active_this_week Íàé-àêòèâíè ïðåç òàçè ñåäìèöà
+menu my_personal_page Ëè÷íà ñòðàíèöà
+menu new_project Ðåãèñòðèðàíå íà íîâ ïðîåêò
+menu new_releases Íîâîèçëåçëè
+menu new_user Íîâ ïîòðåáèòåë (SSL çàùèòåíà âðúçêà)
+menu other_site_mirrors Îãëåäàëíè êîïèÿ
+menu project_admin Àäìèíèñòðèðàíå íà ïðîåêò
+group project_admins Àäìèíèñòðàòîðè
+menu project_help_wanted Ïðîåêòè òúðñåùè ïîìîù
+menu project_summary Îáùà èíôîðìàöèÿ çà ïðîåêòà
+group public_area Îáùîäîñòúïíè ìåñòà
+menu search Òúðñåíå
+menu software_map Êàðòà íà ñîôòóåðà
+home sourceforge_statistics SourceForge ñòàòèñòèêà
+menu top_projects Òîï ïðîåêòè
+home top_project_downloads Íàé-ïîïóëÿðíèòå ïðîåêòè
+conf content_encoding windows-1251
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code bg
+conf language_id 20
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Catalan.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Catalan.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Catalan.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,90 @@
+#/**
+# *
+# * Catalan message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Enric Martnez
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-23 Enric Martnez
+# * Initial translation
+# 2000-10-16 Evilio del Rio
+# * Corrections:
+# Els meus criteris de correcciã s'han basat en els
+# segìents punts:
+#
+# . Correciã ortogr fica (catal central)
+# . Correciã teminolâgica (programari, etc.)
+# . Nom©s hi majêscules a la lletra inicial i noms propis.
+# . D'altres criteris trets de Soft Catal (utilitzaciã del "vos").
+#
+menu account_maintenance Manteniment de compte
+menu bookmark_page Página de marcadors
+home breaking_down_barriers Trencant les barreres per al desenvolupament de codi obert
+menu change_my_theme Canviar el meu tema
+menu code_snippet_library Biblioteca de bocinets de codi
+menu compile_farm Granja de compilació
+menu contact_us Contacteu
+group developers Desenvolupadors
+group developer_info Informació del desenvolupador
+menu discussion_forums Fòrums de discussiò
+menu documentation Documentació local
+frs file_download Descàrrega
+frs file_monitor Monitor
+frs file_notes Notes
+frs file_package Paquet
+frs file_version Versió
+group long_bugs Seguiment d'errors
+group long_cvs Repositori CVS
+group long_docman Gestor de documents
+group long_forum Fòrums públics
+group long_ftp Espai de FTP anònim
+group long_homepage Pàgina d'inici del projecte
+group long_mail Llistas de correu
+group long_news Últimes notícies
+group long_patch Gestor de pegats
+group long_pm Gestor de tasques
+group long_support Gestor de suport tècnic
+group long_survey Enquestes
+group short_bugs Errades
+group short_cvs CVS
+group short_docman Documents
+group short_files Filesgroup short_forum Fòrums
+group short_homepage Pàgina de inici
+group short_mail Llistes
+group short_news Notícies
+group short_patch Pegats
+group short_pm Tasques
+group short_summary Sumari
+group short_support Suport tècnic
+group short_survey Enquestes
+home highest_ranked_users Usuaris més actius
+home about_blurb SourceForge és un<B>servei gratuït per a desenvolupadors de<A href="http://www.opensource.org">Codi obert</A></B> oferint fàçil accés als millors repositoris CVS, llistes de discussió, seguiment d'errors, taulers de anuncis, fòrums, gestió de tasques, hostatge de llocs web, arxius permanent de fitxers, còpies de seguretat completes i administració totalment basada en web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ mes ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Retorn i participació</B> <P> Per poder obtenir el màxim de SourceForge, haureu d'<A href="/account/register.php">enregistrar-vos com a usuari del lloc</A>. Això us permetrà participar plenament en tot el que tenim per oferir. Podreu, és clar, navegar pel lloc sense enregistrar-vos, però no tindreu l'opció de participar plenament. <P> <BR> <B>Feu el vostre propi projecte</B> <P> <A href="/account/register.php">Enregistreu-vos com a usuari del lloc</A>, <A HREF="/account/login.php"entreu </A>amb el vostre usuari i finalment, <A HREF="/register/">Doneu d'alta el vostre projecte.</A> <P> Moltes Gràcies... i gaudiu del lloc.
+frs latest_file_releases Últimes versions dels arxius
+menu login Accés via SSL
+menu logout Sortir
+home most_active_this_week El més actiu aquesta setmana
+menu my_personal_page La meva pàgina personal
+menu new_project Enregistrar un projecte nou
+menu new_releases Noves sortides
+menu new_user Usuari nou via SSL
+menu other_site_mirrors Miralls d'altres llocs
+menu project_admin Admininstració de projectes
+group project_admins Administradors del projecte
+menu project_help_wanted Es necessita ajuda per projectes
+menu project_summary Sumari de projectes
+group public_area Área pública
+menu search Cercar
+menu software_map Mapa de programari
+home sourceforge_statistics Estadístiques de SourceForge
+menu top_projects Projectes senyers
+home top_project_downloads Projectes més descarregats
+conf language_code ca
+conf language_id 14
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Chinese.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Chinese.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Chinese.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,82 @@
+#/**
+# *
+# * Traditional Chinese message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Yu-Jui Lee
+# *
+# */
+# ChangeLog:
+#
+# 2000-10-01 Yu-Jui Lee
+# * Initial translation
+#
+menu account_maintenance ±b¸¹ºûÅ@
+menu bookmark_page ®ÑÅÒ
+home breaking_down_barriers ¬°¶}©ñ·½½Xªºµo®i¶}ÅP¤@±ø©Z³~
+menu change_my_theme ¥DÃDÅܧó
+menu code_snippet_library ¤p¤ùÂ_·½½Xµ{¦¡®w
+menu compile_farm ½sĶ¥D¾÷¸s
+menu contact_us Ápµ¸§ÚÌ
+group developers ¶}µoªÌ
+group developer_info ¶}µoªÌ¸ê°T
+menu discussion_forums ½×¾Â
+menu documentation ¤å¥ó
+frs file_download ÀɮפU¸ü
+frs file_monitor ºÊ¬Ý
+frs file_notes ªþµù
+frs file_package ÀÉ®×¥]»q
+frs file_version Àɮת©¥»
+group long_bugs ¯ä¦ä°lÂÜ
+group long_cvs CVSµ{¦¡®w
+group long_docman ±M®×¤å¥ó
+group long_forum ¤½¦@½×¾Â
+group long_ftp °Î¦WFTPªÅ¶¡
+group long_homepage ±M®×º¶
+group long_mail ¹q¤l¶l¥ó°Q½×¸s
+group long_news ³Ì·s®ø®§
+group long_patch ׸ɺ޲zªÌ
+group long_pm ¤u§@ºÞ²zªÌ
+group long_support §Þ³N¤ä´©ºÞ²zªÌ
+group long_survey ½Õ¬d
+group short_bugs ¯ä¦ä
+group short_cvs CVS
+group short_docman ¤å¥ó
+group short_files Filesgroup short_forum ½×ôÎ
+group short_homepage º¶
+group short_mail ¹q¤l¶l¥ó
+group short_main ¥Dn
+group short_news ·s»D
+group short_patch ׸É
+group short_pm ¤u¥ó
+group short_summary ºKn
+group short_support ¤ä´©
+group short_survey ½Õ¬d
+home highest_ranked_users ³Ì°ªµû»ù¥Î¤á±Æ¦æº]
+home about_blurb SourceForge¬°¤@<B>´£¨Ñ§K¶OªA°Èµ¹ <A href="http://www.opensource.org">¶}©ñ·½½X</A>µo®iªÌªººô¯¸</B> ¥]¬A¤FCVS, ¶l¥ó°Q½×¸s, ¯ä¦ä°lÂܨt²Î, °T®§½×¾Â, ¤u§@ºÞ²z, ºô¯¸ªÅ¶¡, ÀÉ®×Àx¦s, §¹¾ãªºÀɮ׳ƥ÷, ¥B§¹¥þ¥Hweb-based¨ÓºÞ²z. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ more ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>½Ð¥ß§Y¥[¤J¨Ã¤£§[«ü±Ð</B> <P> ¬°¥R¤À§Q¥ÎSourceForge©Ò´£¨ÑªºªA°È, <A href="/account/register.php">½Ð¥ß§Yµù¥U¦¨¬° ¥»¯¸¥Î¤á</A>. ±z±N¯à¥R¤À°Ñ»P¥»¯¸©Ò´£¨Ñªº¦U¶µ¬¡°Ê, ±zY©|¥¼µù¥U¦¨¬°¥Î¤á, ¤´¯àÂsÄý¥»¯¸, ¦ýµLÅv¥R¥÷°Ñ»P¥»¯¸¬¡°Ê. <P> <BR> <B>³]¸m±z¦Û¤vªº±M®×</B> <P> <A href="/account/register.php">µù¥U¦¨¬°¥»¯¸¥Î¤á</A>, ±µµÛ <A HREF="/account/login.php">µn¤J</A> ³Ì«á, <A HREF="/register/">µù¥U±zªº±M®×.</A> <P> ÁÂÁ±z... ¨Ã¯¬¨Ï¥Î¥»¯¸´r§Ö.
+frs latest_file_releases ³Ì·sÀÉ®×µoªí
+menu login ¸g¥ÑSSLµn¤J
+menu logout µn¥X
+home most_active_this_week ¥»¶g¬¡°Ê¤O³Ì±j±Æ¦æº]
+menu my_personal_page §Úªºº¶
+menu new_project ·s±M®×µn¿ý
+menu new_releases ·sµoªí³nÅé
+menu new_user ¸g¥ÑSSL·s¥Î¤áµù¥U
+menu other_site_mirrors ¨ä¥¦¬M®gºô¯¸
+menu project_admin ±M®×ºûÅ@
+group project_admins ±M®×ºÞ²zªÌ
+menu project_help_wanted ¼x¨D¨ó§U
+menu project_summary ±M®×ºKn
+group public_area ¤½¦@°Ï°ì
+menu search ·j´M
+menu software_map ³nÅé¤ÀÃþªí
+home sourceforge_statistics SourceForge²Îp¸ê®Æ
+menu top_projects ¼öªù±M®×
+home top_project_downloads ¼öªù±M®×¤U¸ü±Æ¦æº]
+conf content_encoding BIG5
+conf language_code zh-TW
+conf language_id 11
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Dutch.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Dutch.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Dutch.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,83 @@
+#/**
+# *
+# * Dutch message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-01
+# * Initial translation, based on CVS revision 1.15 of BaseLanguage.class
+#
+menu account_maintenance Account onderhouden
+menu bookmark_page Bladwijzer van deze pagina maken
+home breaking_down_barriers Breaking Down the Barriers to Open Source Development
+menu change_my_theme Mijn thema wijzigen
+menu code_snippet_library Code-knipsels bibliotheek
+menu compile_farm Compilatie boerderij
+menu contact_us Neem contact met ons op
+group developers Ontwikkelaars
+group developer_info Ontwikkelaar Info
+menu discussion_forums Discussie forums
+menu documentation Site documentatie
+frs file_download Downloaden
+frs file_monitor Monitor
+frs file_notes Notitites
+frs file_package Pakket
+frs file_version Versie
+group long_bugs Bug Tracking
+group long_cvs CVS Repository
+group long_docman DocManager: documentatie van project
+group long_forum Publieke Forums
+group long_ftp Anonieme FTP-ruimte
+group long_homepage Homepage van project
+group long_mail Mailing Lijsen
+group long_news Laatste nieuws
+group long_patch Patch Manager
+group long_pm Takenmanager
+group long_support Technische ondersteuningsmanager
+group long_survey Enquêtes
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Documentatie
+group short_files Filesgroup short_forum Forums
+group short_homepage Homepage
+group short_mail Lijsten
+group short_main Hoofd
+group short_news Nieuws
+group short_patch Patches
+group short_pm Taken
+group short_summary Samenvatting
+group short_support Ondersteuning
+group short_survey Enquêtes
+home highest_ranked_users Gebruikers met de hoogste rang
+home about_blurb SourceForge is een <B>gratis service voor <A href="http://www.opensource.org">Open Source</A> ontwikkelaars</B> die gemakkelijke toegang tot het beste in CVS, mailing lijsen, bug tracking, berichtborden/forums, task management, site hosting, permanent file archival, full backups, en totale web-gebaseerde administratie geeft. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ meer ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Site feedback en hoe mee te doen</B> <P> Om het meeste uit SourceForge te halen, moet u naar <A href="/account/register.php">registreren als een site gebruiker</A> gaan. Dit stelt u in staat om volledig mee te doen met alles wat we te bieden hebben. U kan natuurlijk de site doorkijken zonder te registreren, maar u kan niet volledig meedoen. <P> <BR> <B>Uw eigen project opzetten</B> <P> <A href="/account/register.php">Registreren als een site gebruiker</A>, dan <A HREF="/account/login.php">Inloggen</A> en uiteindelijk, <A HREF="/register/">Nieuw project registreren.</A> <P> Bendankt... en veel succes met de site.
+frs latest_file_releases Laatste bestandsuitgaven
+menu login Inloggen via SSL
+menu logout Uitloggen
+home most_active_this_week Meest actief deze week
+menu my_personal_page Mijn persoonlijke pagina
+menu new_project Nieuw project registreren
+menu new_releases Nieuwe uitgaves
+menu new_user Nieuwe gebruiker via SSL
+menu other_site_mirrors Andere site mirrors
+menu project_admin Projectadministratie
+group project_admins Project administrators
+menu project_help_wanted Hulp gevraagd bij projecten
+menu project_summary Projectsamenvatting
+group public_area Publieke gebieden
+menu search Zoeken
+menu software_map Software kaart
+home sourceforge_statistics SourceForge Statistieken
+menu top_projects Top Projecten
+home top_project_downloads Top projectendownloads
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code nl
+conf language_id 12
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/English.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/English.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/English.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,11 @@
+#/**
+# *
+# * English message catalog (empty)
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# *
+# */
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Esperanto.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Esperanto.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Esperanto.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,97 @@
+#/**
+# *
+# * Esperanto message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Jim Kingdon <kingdon at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-14 Jim Kingdon <kingdon at users.sourceforge.net>
+# * Initial translation
+# 2000-10-26 FAGOT Alain <kameleono at users.sourceforge.net>
+# * surbaze de jam ekzistanta traduko, gxustigoj laux
+# Komputada Leksikono (spelling/lexical corrections)
+#
+# Mozilo, kaj (mi kredas) IE povas uzi la e-a signojn de
+# UTF-8. Netcapo 4.x havas UTF-8, sed sen la e-aj signoj.
+# Majuskla Minuskla
+# Cx: Ĉ cx: ĉ
+# Gx: Ĝ gx: ĝ
+# Hx: Ĥ hx: ĥ
+# Jx: Ĵ jx: ĵ
+# Sx: Ŝ sx: ŝ
+# Ux: Ŭ ux: ŭ
+about_foundries about_blurb Pri fandejoj
+menu about_sourceforge Pri SourceForge
+menu account_maintenance Modifu konton
+menu bookmark_page Legosignoj
+home breaking_down_barriers Forigu obstaklojn por skribi liberajn programojn
+menu change_my_theme Ŝanĝu aspekton
+menu code_snippet_library Biblioteko de programeroj
+menu compile_farm Muntejaj komputiloj
+menu contact_us Kontaktu nin
+group developers Programantoj
+group developer_info Programanta informo
+menu discussion_forums Forumoj de diskuto
+menu documentation Dokumentado
+frs file_download Elŝutu
+frs file_monitor Priatenti dosieron
+frs file_notes Notoj
+frs file_package Pakaĵo
+frs file_version Redakto
+group long_bugs Cimilo
+group long_cvs CVSejo
+group long_docman Dokumentilo
+group long_forum Publikaj Forumoj
+group long_ftp Anonima FTPejo
+group long_homepage Projekta hejmpaĝo
+group long_mail Dissendolistoj
+group long_news Lastaj novaĵoj
+group long_patch Flikilo
+group long_pm Taskilo
+group long_support Subtenilo
+group long_survey Demandilo
+group short_bugs Cimoj
+group short_cvs CVS
+group short_docman Dokumentoj
+group short_files Filesgroup short_forum Forumoj
+group short_homepage Hejmpaĝo
+group short_mail Listoj
+group short_main Ĉefa paĝo
+group short_news Novaĵoj
+group short_patch Flikoj
+group short_pm Taskoj
+group short_summary Resumo
+group short_support Subteno
+group short_survey Demandilo
+home highest_ranked_users Supre Rangitaj uzantoj
+home about_blurb SourceForge estas <B>senpaga servo por programantoj de <A href="http://www.opensource.org">Liberaj Programoj</A></B>, kiu enhavas facilan uzon de la plej bonaj ecoj en CVS, retpoŝtaj listoj, cimilo, diskutforumoj, taskilo, reta gastigo, daŭra arkivo de dosieroj, bendarkivado, kaj TTTeja administrado. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ pli ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ OD ]</font></A> <BR> <P> <B>SourceForge reenmeto kaj partoprenado</B> <P> Por uzi SourceForge plene, vi bezonas <A href="/account/register.php">registriĝi kiel uzanto</A>. Vi povas rigardi SourceForge sen registriĝi sed ne partopreni plene. <P> <BR> <B>Aldonu Projekton</B> <P> <A href="/account/register.php">Registriĝi kiel uzanto</A>, poste <A HREF="/account/login.php">Saluti</A> kaj finfine, <A HREF="/register/">Registriĝi vian projekton.</A> <P> Dankon... kaj ĝuu SourceForge.
+frs latest_file_releases Lastaj dosieraj redaktoj
+menu login Salutu per SSL
+menu logout Adiaŭu
+home most_active_this_week Plej aktiva ĉi tiu semajno
+menu my_personal_page Mia propra paĝo
+menu new_project Nova projekto
+menu new_releases Novaj versioj
+menu new_user Nova uzanto per SSL
+menu other_site_mirrors Speguloj
+menu project_admin Administru projekton
+group project_admins Projektaj estraranoj
+menu project_help_wanted Projekthelpo dezirata
+menu project_summary Projekta resumo
+group public_area Publikaj regionoj
+menu search Serĉu
+menu software_map Mapo de programoj
+home sourceforge_statistics Statistikaĵoj de SourceForge
+menu top_projects Plej aktivaj projektoj
+home top_project_downloads Plej aktivaj projektaj elŝutoj
+conf content_encoding UTF-8
+conf language_code eo
+conf language_id 13
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/French.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/French.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/French.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,86 @@
+#/**
+# *
+# * French message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Olivier Gerard
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-25 Olivier Gerard
+# * Initial translation
+# 2000-10-15 Alexandre Aufrere <nikopol at users.sourceforge.net>
+# * Translation and correction
+#
+menu account_maintenance Gestion du Compte
+menu bookmark_page Favoris
+home breaking_down_barriers Abaisser les barrières du développement Open Source
+menu change_my_theme Changement du Thème
+menu code_snippet_library Bibliothèque de Code
+menu compile_farm Ferme de Compilation
+menu contact_us Contact
+group developers Développeurs
+group developer_info Informations pour Développeurs
+menu discussion_forums Forums de Discussion
+menu documentation Documentation
+frs file_download Téléchargement
+frs file_monitor Surveillance
+frs file_notes Remarques
+frs file_package Package
+frs file_version Version
+group long_bugs Gestion des Bugs
+group long_cvs Référentiel CVS
+group long_docman Gestion de la Documentation
+group long_forum Forums de Discussion
+group long_ftp Espace FTP Anonyme
+group long_homepage Page d'Accueil
+group long_mail Listes de Diffusion
+group long_news Dernières nouveautés
+group long_patch Gestion des Corrections
+group long_pm Gestion de Projet
+group long_support Support Technique
+group long_survey Sondages
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Documentation
+group short_files Filesgroup short_forum Forums
+group short_homepage Accueil
+group short_mail Mailing-listes
+group short_main Ecran Principal
+group short_news Nouveautés
+group short_patch Patches
+group short_pm Tâches
+group short_summary Survol
+group short_support Support
+group short_survey Sondages
+home highest_ranked_users Les Développeurs les Mieux Classés
+home about_blurb SourceForge est un <b>service gratuit pour les développeurs <A href="http://www.opensource.org">Open Source</A></b>. SourceForge offre l'accès le plus simple aux meilleurs services CVS, listes de diffusion, gestion des bugs, forums de discussion, gestion des tâches, hébergement de site, archivage de fichiers, sauvegardes complètes, etc. via une interface d'administration entièrement par le web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ plus ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Participation des développeurs</B> <P> Pour pouvoir utiliser SourceForge au mieux, il est necéssaire de <A href="/account/register.php">s'enregistrer comme un développeur officiel</a>. Cela vous permettra de profiter de tous ce que nous avons à vous offrir. Vous pouvez bien entendu parcourir le site sans vous enregistrer, mais vous ne pourrez pas y participer pleinement. <P> <BR> <B>Créer un nouveau projet</B> <P> <A href="/account/register.php">Enregistrez-vous comme développeur</A>, then <A HREF="/account/login.php">Connectez-vous</A> puis, <A HREF="/register/">Enregistrez votre Projet.</A> <P> Merci... et nous espérons que vous aimerez SourceForge!
+frs latest_file_releases Dernières révisions des fichiers
+menu login Connexion via SSL
+menu logout Sortir
+home most_active_this_week Les Plus Actifs cette Semaine
+menu my_personal_page Ma Page Personnelle
+menu new_project Nouveau Projet
+menu new_releases Nouvelles Révisions
+menu new_user Nouvel Utilisateur via SSL
+menu other_site_mirrors Mirroirs d'Autres Sites
+menu project_admin Admin. du Projet
+group project_admins Admins. du Projet
+menu project_help_wanted Demande d'Aide
+menu project_summary Résumé du Projet
+group public_area Zones Publiques
+menu search Recherche
+menu software_map Rech. Thématique
+home sourceforge_statistics Statistiques de SourceForge
+menu top_projects Meilleurs Projets
+home top_project_downloads Projets les plus Téléchargés
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code fr
+conf language_id 7
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/German.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/German.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/German.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,84 @@
+#/**
+# *
+# * German message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Matthias Bauer
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-15 Matthias Bauer
+# * Initial translation
+#
+menu about_sourceforge Über SourceForge
+menu account_maintenance Accountverwaltung
+menu bookmark_page Lesezeichen
+home breaking_down_barriers Wir reissen die Mauern zu Open-Source-Entwicklung nieder
+menu change_my_theme Theme ändern
+menu code_snippet_library Codeschnipsel-Sammlung
+menu compile_farm Compile-Farm
+menu contact_us Kontakt
+group developers Entwickler
+group developer_info Entwicklerinformationen
+menu discussion_forums Diskussionsforen
+menu documentation Dokumentation
+frs file_download Downloaden
+frs file_monitor Überwachen
+frs file_notes Anmerkungen
+frs file_package Paket
+frs file_version Version
+group long_bugs Bugtracking
+group long_cvs CVS-Baum
+group long_docman DocManager: Projekt-Dokumentation
+group long_forum Öffentliche Foren
+group long_ftp Anonymer FTP-Zugriff
+group long_homepage Projekthomepage
+group long_mail Mailinglisten
+group long_news Letzte Neuigkeiten
+group long_patch Patch-Verwaltung
+group long_pm Aufgaben-Verwaltung
+group long_support Support-Verwaltung
+group long_survey Umfragen
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Dokumentation
+group short_files Filesgroup short_forum Foren
+group short_homepage Homepage
+group short_mail Mailinglisten
+group short_news Neuigkeiten
+group short_patch Patches
+group short_pm Aufgaben
+group short_summary Überblick
+group short_support Support
+group short_survey Umfragen
+home highest_ranked_users Am höchsten eingestufte Benutzer
+home about_blurb SourceForge ist ein <b>freier Dienst</b> für <a href="http://www.opensource.org">Open Source</a> Entwickler und bietet einfachen Zugang zu dem Besten aus CVS, Mailinglisten, Bug-Tracking, Diskussionsforen, Aufgabenverwaltung, Webhosting, dauerhafte Dateiarchivierung, Backups und vollständige Verwaltung per Web-Interface. <a href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ mehr ]</font></A> <a href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <br> <p> <b>Feedback und Teilnahme an der Site</b> <p> Um SourceForge bestmöglich zu nutzen, sollten Sie sich <a href="/account/register.php">als Benutzer anmelden</a>. Mit einem Benutzeraccount können Sie am vollen Spektrum der Website teilhaben. Natürlich können Sie SourceForge auch ohne Registrierung nutzen, haben dann allerdings nicht auf alle Bereiche vollen Zugriff. <p> <br> <b>Starten Sie Ihr eigenes Projekt</b> <p> <a href="/account/register.php">Melden Sie sich als Benutzer an</a>, <a href="/account/login.php">loggen Sie sich ein</a> und <a href="/register/">registrieren Sie Ihr Projekt</a>! <p> Vielen Dank. Sie machen eine einfache Webseite sehr glücklich.
+frs latest_file_releases Letzte Dateireleases
+menu login Einloggen (SSL)
+menu logout Ausloggen
+home most_active_this_week Aktivste Projekte in dieser Woche
+menu my_personal_page Personalisierte Seite
+menu new_project Neues Projekt
+menu new_releases Neue Releases
+menu new_user Neuer Benutzer (SSL)
+menu other_site_mirrors Mirrors
+menu project_admin Projektadministrator
+group project_admins Projektbetreuer
+menu project_help_wanted Projekthilfe gesucht
+menu project_summary Projektübersicht
+group public_area Öffentliche Bereiche
+menu search Suche
+menu software_map Softwarekarte
+home sourceforge_statistics SourceForge Statistieken
+menu top_projects Top-Projekte
+home top_project_downloads Populärste Downloads (nach Projekten)
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code de
+conf language_id 6
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Greek.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Greek.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Greek.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,84 @@
+#/**
+# *
+# * Greek message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Simos Xenitellis
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-15 Simos Xenitellis
+# * Initial translation
+#
+menu account_maintenance ÅíçìÝñùóç Ëïãáñéáóìïý
+menu bookmark_page Óåëßäá ÁãáðçìÝíùí
+home breaking_down_barriers Êáôáëýùíôáò ôïõò öñáãìïýò óôçí ÁíÜðôõîç Åëåýèåñïõ Ëïãéóìéêïý
+menu change_my_theme ÁëëáãÞ ôïõ ÈÝìáôüò Ìïõ
+menu code_snippet_library ÂéâëéïèÞêç ØçãìÜôùí Êþäéêá
+menu compile_farm ÖÜñìá Ìåôáãëþôôéóçò
+menu contact_us Åðéêïéíùíßóôå ìáæß ìáò
+group developers ÐñïãñáììáôéóôÝò
+group developer_info Ðëçñïöïñßåò ÐñïãñáììáôéóôÞ
+menu discussion_forums ÂÞìá ÓõæçôÞóåùí
+menu documentation Ôåêìçñßùóç ÓõóôÞìáôïò
+frs file_download Ìåôáöüñôùóç
+frs file_monitor Ðáñáêïëïýèçóç
+frs file_notes Óçìåéþóåéò
+frs file_package ÐáêÝôï
+frs file_version ¸êäïóç
+group long_bugs Ðáñáêïëïýèçóç ÓöáëìÜôùí
+group long_cvs ÁðïèÞêç CVS
+group long_docman DocManager: Project Documentation
+group long_forum Äçìüóéá ÂÞìáôá
+group long_ftp ×þñïò Áíþíõìïõ FTP
+group long_homepage Áñ÷éêÞ Óåëßäá ¸ñãïõ
+group long_mail Ëßóôåò Óõíäñïìçôþí
+group long_news Ôåëåõôáßá ÍÝá
+group long_patch Äéá÷åéñéóôÞò ÅðéññáìÜôùí
+group long_pm Äéá÷åéñéóôÞò Åñãáóéþí
+group long_support Äéá÷åéñéóôÞò ÕðïóôÞñéîçò ÐñïãñÜììáôïò
+group long_survey ¸ñåõíåò
+group short_bugs ÓöÜëìáôá
+group short_cvs CVS
+group short_docman Ôåêìçñßùóç
+group short_files Filesgroup short_forum ÂÞìáôá
+group short_homepage Ðñþôç Óåëßäá
+group short_mail Ëßóôåò
+group short_main Êýñéï
+group short_news ÍÝá
+group short_patch ÅðéññÜìáôá
+group short_pm Åñãáóßåò
+group short_summary ÐåñéëÞøç
+group short_support ÕðïóôÞñéîç
+group short_survey ¸ñåõíåò
+home highest_ranked_users ×ñÞóôåò Ìåãáëýôåñçò Áîéïëüãçóçò
+home about_blurb Ôï SourceForge åßíáé ìéá <B>åëåýèåñç õðçñåóßá ãéá <A href="http://www.opensource.org">Open Source</A> ðñïãñáììáôéóôÝò</B> ðïõ ðñïóöÝñåé åýêïëç ðñüóâáóç óôá êáëýôåñá ÷áñáêôçñéóôéêÜ ôïõ CVS, ôùí ëéóôþí óõíäñïìçôþí, ôçò ðáñáêïëïýèçóçò óöáëìÜôùí, ôùí âçìÜôùí óõæçôÞóåùí, ôçò äéá÷åßñçóçò åñãáóéþí, ôçò åîõðçñÝôçóçò äéêôõáêþí ôüðùí, ôçò ìüíéìçò áñ÷åéïèÝôçóçò áñ÷åßùí, ôçò äçìéïõñãßáò ðëÞñùí áíôéãñÜöùí áóöáëåßáò êáé ôçò ïëéêÞò äéá÷åßñéóçò ìÝóá áðü ôï WWW. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ more ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>ÁíÜäñáóç Äéêôõáêïý Ôüðïõ êáé Óõììåôï÷Þ</B> <P> Ãéá íá åðùöåëçèåßôå ôá ìÝãéóôá áðü ôï SourceForge, èá ðñÝðåé íá <A href="/account/register.php"> åããñáöåßôå ùò ÷ñÞóôçò óõóôÞìáôïò</A>. Áõôü èá óáò åðéôñÝøåé íá óõììåôÜó÷åôå ðëÞñùò óå üëá üóá Ý÷ïõìå íá ðñïóöÝñïõìå. ÖõóéêÜ, ìðïñåßôå íá ðåñéçãçèÞôå óå áõôü ôï äéêôõáêü ôüðï ÷ùñßò åããñáöÞ, ùóôüóï äå èá Ý÷åôå ðñüóâáóç íá óõììåôÜó÷åôå ðëÞñùò. <P> <BR> <B>Åêêßíçóç ôïõ Äéêïý óáò ¸ñãïõ</B> <P> <A href="/account/register.php">Åããñáöåßôå ùò ÷ñÞóôçò óõóôÞìáôïò</A>, Ýðåéôá <A HREF="/account/login.php">Óýíäåèåßôå</A> êáé ôÝëïò, <A HREF="/register/">ÅããñÜøåôå ôï ¸ñãï óáò.</A> <P> Åõ÷áñéóôïýìå... êáé íá ðåñÜóåôå êáëÜ óôï äéêôõáêü óáò ôüðï.
+frs latest_file_releases Ôåëåõôáßåò Åêäüóåéò Áñ÷åßùí
+menu login Óýíäåóç ìÝóù SSL
+menu logout Áðïóýíäåóç
+home most_active_this_week Ðåñéóóüôåñï Åíåñãü ãéá ÁõôÞí ôçí ÅâäïìÜäá
+menu my_personal_page Ç ÐñïóùðéêÞ ìïõ Óåëßäá
+menu new_project Êáôá÷þñéóç ÍÝïõ ¸ñãïõ
+menu new_releases ÍÝåò Åêäüóåéò
+menu new_user ÍÝïò ×ñÞóçò ìÝóù SSL
+menu other_site_mirrors ¶ëëá ÓõóôÞìáôá Êáèåðôñéóìïý
+menu project_admin Äéá÷åéñéóôÞò ¸ñãïõ
+group project_admins Äéá÷åéñéóôÝò ¸ñãïõ
+menu project_help_wanted Æçôåßôå ÂïÞèåéá ¸ñãïõ
+menu project_summary Ðåñßëçøç ¸ñãïõ
+group public_area Äçìüóéåò Ðåñéï÷Ýò
+menu search ÁíáæÞôçóç
+menu software_map ×Üñôçò Ëïãéóìéêïý
+home sourceforge_statistics ÓôáôéóôéêÜ SourceForge
+menu top_projects Êïñõöáßá ¸ñãá
+home top_project_downloads Êïñõöáßåò Ìåôáöïñôþóåéò ¸ñãùí
+conf content_encoding iso-8859-7
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code el
+conf language_id 19
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Hebrew.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Hebrew.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Hebrew.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,78 @@
+#/**
+# *
+# * Hebrew message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Sagi Bashari <sagi at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-24 Sagi Bashari <sagi at users.sourceforge.net>
+# * Initial translation
+#
+menu account_maintenance ïåáùç ú÷åæçú
+menu bookmark_page íéôãòåî
+home breaking_down_barriers éùôåç ãå÷ çåúéôì íåñçîä úà íéøáåù
+menu change_my_theme øúàä äàøî úà äðù
+menu code_snippet_library ãå÷ éòè÷ úééøôñ
+menu compile_farm äéöéìôîå÷ úååç
+menu contact_us øù÷ øåö
+group developers íéçúôî
+group developer_info çúôîä éèøô
+menu discussion_forums íéîåøåô
+menu documentation íéðåù íéëîñî
+frs file_download äãøåä
+frs file_monitor çéâùî
+frs file_notes úåøòä
+frs file_package úåìéáç
+frs file_version úåàñøâ
+group long_bugs úåì÷ú øçà á÷òî
+group long_cvs CVS øâàî
+group long_docman íéëîñî ìäðî
+group long_forum íéçåúô íéîåøåô
+group long_ftp éîéðåðà éôéèôà úåøù
+group long_homepage è÷éåøôä øúà
+group long_mail øååéã úåîéùø
+group long_news úåðåøçà úåùãç
+group long_patch íéðå÷éú ìäðî
+group long_pm úåîéùî ìäðî
+group long_support úéðëè äëéîú ìäðî
+group long_survey úåøé÷ñ
+group short_bugs úåì÷ú
+group short_cvs CVS
+group short_docman íéëîñî
+group short_files Filesgroup short_forum íéîåøåô
+group short_homepage úéá øúà
+group short_mail úåîéùø
+group short_news úåùãç
+group short_patch íéðå÷éú
+group short_pm úåîéùî
+group short_summary íéèøô
+group short_support äëéîú
+group short_survey úåøé÷ñ
+home highest_ranked_users íéìéòô éëä íéùîúùîä
+home about_blurb <P ALIGN="right"> <BR>.éùôåç øå÷î ãå÷ éçúôîì úåøù àåä SourceForge <BR> ,íéîåøåô ,íéâàá øçà á÷òî ,øååéã úåîéùø ,CVS ì äèåùôå äáåè äùéâ íé÷ôñî åðçðà <BR>.áååäî ìåäéðì äùéâå ,íéàìî íééåáéâ ,òåá÷ íéöá÷ øâàî ,íéøúà úðñçà ,úåîéùî éìäðî <BR><A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ úåáåùúå úåìàù ]</font></A> <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ ãåò ]</font></A> </P> <P ALIGN="RIGHT"> <B>úåôúúùäå áåùî</B> <P ALIGN="RIGHT"> êøúöú äúà SourceForge î øúåéá áåèä úà ìá÷ì ìéáùá <BR>.íéòéöî åðçðàù äî ìëì äàìî äùéâ êì àéáé äæ <A href="/account/register.php">.øúàá ùîúùîë íùøäì</A> <BR>.äàìî äùéâ êì äéäú àì ìáà ,íùøéäì éìá øúàá ùåìâì ïáåîë ìåëé äúà <P ALIGN="RIGHT" > <BR> <B>êìù è÷éåøôä úà íåùø</B> <P ALIGN="RIGHT"> <A HREF="/register/">.êìù è÷éåøôä úà íåùø</A> óåñáìå ,<A HREF="/account/login.php">ñðëú</A> æàå <A href="/account/register.php">øúàá ùîúùéîë íùøä</A> <BR> <P ALIGN="RIGHT"> .øúàä êúééäùî äðäúå ..äãåú </P>
+frs latest_file_releases úåðåøçà äðëåú úåàñøâ
+menu login çèáåàî úøù êøã äñéðë
+menu logout äàéöé
+home most_active_this_week òåáùä íéìéòô éëä
+menu my_personal_page éùéà ãåîò
+menu new_project ùãç è÷éåøô íåùø
+menu new_releases úåùãç úåàñøâ
+menu project_admin è÷éåøô ìäðî
+group project_admins íéè÷éåøô éìäðî
+menu project_help_wanted íéè÷éåøôì íéùåøã
+menu project_summary è÷éåøô úåöîú
+menu search ùåôéç
+menu software_map úåðëåú úôî
+home sourceforge_statistics SourceForge úå÷éèñéèñ
+home top_project_downloads íéìéòô éëä íéè÷éåøôä
+conf content_encoding iso-8859-8
+conf default_font xxzx-random-font\" size=\"1
+conf language_id 3
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Indonesian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Indonesian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Indonesian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,84 @@
+#/**
+# *
+# * Indonesian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Antonio Wawolangi <scientist at catholic.org>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-17 Antonio Wawolangi <scientist at catholic.org>
+# * Initial translation
+#
+menu account_maintenance Pemeliharaan Account
+menu bookmark_page Halaman Bookmark
+home breaking_down_barriers Menumpas Halangan Dalam Pengembangan Open Source
+menu change_my_theme Rubah Theme
+menu code_snippet_library Pustaka Code Snippet
+menu compile_farm Peternakan Kompilasi
+menu contact_us Kontak Kami
+group developers Developer
+group developer_info Info Developer
+menu discussion_forums Forum-forum Diskusi
+menu documentation Dokumentasi Situs
+frs file_download Download
+frs file_monitor Monitor
+frs file_notes Catatan
+frs file_package Paket
+frs file_version Versi
+group long_bugs Bug Tracking
+group long_cvs Gudang CVS
+group long_docman DocManager: Dokumentasi Proyek
+group long_forum Forum Publik
+group long_ftp Tempat Anonymous FTP
+group long_homepage Home Page Proyek
+group long_mail Milis
+group long_news Berita Terbaru
+group long_patch Manajer Patch
+group long_pm Manajer Tugas
+group long_support Manajer Tech Support
+group long_survey Survey
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Dokumentasi
+group short_files Filesgroup short_forum Forum
+group short_homepage Home Page
+group short_mail Daftar
+group short_main Utama
+group short_news Berita
+group short_patch Patches
+group short_pm Tugas
+group short_summary Ringkasan
+group short_support Support
+group short_survey Survey
+home highest_ranked_users Pengguna Peringkat Tertinggi
+home about_blurb SourceForge adalah <B>layanan gratis untuk developer <A href="http://opensource.or.id">Open Source</A></B> yang menawarkan akses mudah ke gudang CVS terbaik, milis, pencarian bug, papan pesan/forum-forum, manajemen tugas, hosting situs, pengarsipan file permanen, backup lengkap, dan semua diatur lewat web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ selengkapnya ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Site Feedback and Partisipasi</B> <P> Untuk dapat menggunakan SourceForge secara maksimal, anda perlu <A href="/account/register.php"> mendaftarkan diri</A> sebagai pengguna situs. Ini berarti memperbolehkan anda untuk berpartisipasi penuh dalam semua yang kami tawarkan. Walaupun tanpa pendaftaran anda dapat menggunakan SourceForge, akan tetapi tanpa mendaftarkan diri anda tidak dapat berpartisipasi secara penuh. <P> <BR> <B>Mendirikan Proyek Pribadi Anda</B> <P> <A href="/account/register.php">Pendaftaran sebagai pengguna situs</A>, then <A HREF="/account/login.php">Login</A> dan terakhir, <A HREF="/register/">Mendaftarkan Proyek Anda.</A> <P> Terima Kasih... dan selamat bergabung dengan SourceForge.
+frs latest_file_releases File Keluaran Terbaru
+menu login Login lewat SSL
+menu logout Logout
+home most_active_this_week Paling Aktif Minggu Ini
+menu my_personal_page Halaman Pribadi
+menu new_project Pendaftaran Proyek Baru
+menu new_releases Keluaran Baru
+menu new_user Pengguna Baru dengan SSL
+menu other_site_mirrors Mirror Situs
+menu project_admin Administrasi Proyek
+group project_admins Adminstrator Proyek
+menu project_help_wanted Proyek-proyek Perlu Bantuan
+menu project_summary Ringkasan Proyek
+group public_area Area Publik
+menu search Cari
+menu software_map Peta Software
+home sourceforge_statistics Statistik SourceForge
+menu top_projects Proyek-proyek Top
+home top_project_downloads Proyek Top Downloads
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code id
+conf language_id 21
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Italian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Italian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Italian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,82 @@
+#/**
+# *
+# * Italian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Dakkar
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-23 Dakkar
+# * Initial translation
+#
+menu account_maintenance Gestione account
+menu bookmark_page Segna pagina
+home breaking_down_barriers Abbattere le barriere allo sviluppo Open Source
+menu change_my_theme Cambia il tema
+menu code_snippet_library Raccolta frammenti di codice
+menu compile_farm Compile Farm
+menu contact_us Contattaci
+group developers Sviluppatori
+group developer_info Informazioni sugli Sviluppatori
+menu discussion_forums Aree di Discussione
+menu documentation Documentazione
+frs file_download Scarica
+frs file_monitor Controlla
+frs file_notes Note
+frs file_package Pacchetto
+frs file_version Versione
+group long_bugs Gestione Bug
+group long_cvs Repository CVS
+group long_docman Gestione Documentazione
+group long_forum Aree di Discussione pubbliche
+group long_ftp Spazio FTP anonimo
+group long_homepage Home Page del progetto
+group long_mail Mailing List
+group long_news Ultime notizie
+group long_patch Gestione Patch
+group long_pm Gestione attività
+group long_support Gestione supporto tecnico
+group long_survey Sondaggi
+group short_bugs Bug
+group short_cvs CVS
+group short_docman Doc.
+group short_files Filesgroup short_forum Discussioni
+group short_homepage Home Page
+group short_mail ML
+group short_main Principale
+group short_news Notizie
+group short_patch Patch
+group short_pm Attività
+group short_summary Sommario
+group short_support Supporto
+group short_survey Sondaggi
+home highest_ranked_users I Migliori
+home about_blurb SourceForge è un <B>servizio gratuito per gli sviluppatori <A href="http://www.opensource.org">Open Source</A></B> che offre un facile accesso ai migliori strumenti per CVS, mailing list, gestione bug, aree di discussione, gestione attività, pubblicazione su web, archiviazione permanente dei file, backup completi, e amministrazione totalmente via web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ per saperne di più ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Partecipate!</B> <P> Per ottenere il massimo da SourceForge, dovete <A href="/account/register.php">registrarvi come utente </A>. Questo vi permetterà di partecipare appieno a quello che abbiamo da offrirvi. Ovviamente potete visitare il sito senza registrarvi, ma non avrete la possibilità di partecipare. <P> <BR> <B>Avviate il vostro progetto</B> <P> <A href="/account/register.php">Registratevi come utenti</A>, quindi <A HREF="/account/login.php">accedete</A> e finalmente <A HREF="/register/">registrate il vostro progetto.</A> <P> Grazie... e divertitevi.
+frs latest_file_releases Ultime Release
+menu login Accesso via SSL
+menu logout Fine sessione
+home most_active_this_week I più attivi della settimana
+menu my_personal_page La mia pagina personale
+menu new_project Registra un nuovo progetto
+menu new_releases Nuove Release
+menu new_user Nuovo utente
+menu other_site_mirrors Mirror di altri siti
+menu project_admin Amministrazione Progetto
+group project_admins Amministratori di Progetto
+menu project_help_wanted Progetti in cerca di aiuto
+menu project_summary Sommario del Progetto
+group public_area Aree Pubbliche
+menu search Ricerca
+menu software_map Mappa Programmi
+home sourceforge_statistics Statistiche SourceForge
+menu top_projects Classifica Progetti
+home top_project_downloads Progetti più scaricati
+conf content_encoding iso-8859-1
+conf language_id 8
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Japanese.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Japanese.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Japanese.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,87 @@
+#/**
+# *
+# * Japanese message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Atsushi Kamoshida
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-24 Atsushi Kamoshida
+# * Initial translation
+# 2000-10-28 Hirotaka Mizutani
+# * Update
+#
+about_foundries about_blurb ¥Õ¥¡¥ó¥É¥ê¡¼¤Ë¤Ä¤¤¤Æ
+menu about_sourceforge SourceForge¤Ë¤Ä¤¤¤Æ
+menu account_maintenance ¥¢¥«¥¦¥ó¥È´ÉÍý
+menu bookmark_page ¥Ö¥Ã¥¯¥Þ¡¼¥¯
+home breaking_down_barriers Breaking Down the Barriers to Open Source Development
+menu change_my_theme ¥Æ¡¼¥Þ¤ÎÊѹ¹
+menu code_snippet_library Code Snippet Library
+menu compile_farm ¥³¥ó¥Ñ¥¤¥ë´Ä¶
+menu contact_us Ï¢ÍíÀè
+group developers ³«È¯¼Ô
+group developer_info ³«È¯¼Ô¾ðÊó
+menu discussion_forums ¥Ç¥£¥¹¥«¥Ã¥·¥ç¥ó¥Õ¥©¡¼¥é¥à
+menu documentation ¥µ¥¤¥È¥É¥¥å¥á¥ó¥È
+frs file_download ¥À¥¦¥ó¥í¡¼¥É
+frs file_monitor ´Æ»ë
+frs file_notes Ãí°Õ
+frs file_package ¥Ñ¥Ã¥±¡¼¥¸
+frs file_version ¥Ð¡¼¥¸¥ç¥ó
+group long_bugs ¥Ð¥°ÄÉÀ×
+group long_cvs CVS¥ê¥Ý¥¸¥È¥ê
+group long_docman ¥É¥¥å¥á¥ó¥È¥Þ¥Í¡¼¥¸¥ã
+group long_forum °ìÈ̸þ¤±¥Õ¥©¡¼¥é¥à
+group long_ftp ƿ̾ FTP ¥¹¥Ú¡¼¥¹
+group long_homepage ¥×¥í¥¸¥§¥¯¥È¥Û¡¼¥à¥Ú¡¼¥¸
+group long_mail ¥á¡¼¥ê¥ó¥°¥ê¥¹¥È
+group long_news ºÇ¿·¥Ë¥å¡¼¥¹
+group long_patch ¥Ñ¥Ã¥Á¥Þ¥Í¡¼¥¸¥ã
+group long_pm ¥¿¥¹¥¯¥Þ¥Í¡¼¥¸¥ã
+group long_support µ»½Ñ¥µ¥Ý¡¼¥È¥Þ¥Í¡¼¥¸¥ã
+group long_survey Ä´ºº
+group short_bugs ¥Ð¥°
+group short_cvs CVS
+group short_docman ¥É¥¥å¥á¥ó¥È
+group short_files Filesgroup short_forum ¥Õ¥©¡¼¥é¥à
+group short_homepage ¥Û¡¼¥à¥Ú¡¼¥¸
+group short_mail ¥ê¥¹¥È
+group short_main ¥á¥¤¥ó
+group short_news ¥Ë¥å¡¼¥¹
+group short_patch ¥Ñ¥Ã¥Á
+group short_pm ¥¿¥¹¥¯
+group short_summary ¥µ¥Þ¥ê
+group short_support ¥µ¥Ý¡¼¥È
+group short_survey Ä´ºº
+home highest_ranked_users ¥æ¡¼¥¶ÊÌ¥é¥ó¥¥ó¥°
+home about_blurb SourceForge¤È¤Ï<a href="http://www.opensource.org/">¥ª¡¼¥×¥ó¥½¡¼¥¹</A>³« ȯ¼Ô¤ËCVS¡¢¥á¡¼¥ê¥ó¥°¥ê¥¹¥È¡¢¥Ð¥°ÄÉÀס¢·Ç¼¨ÈÄ¡¦¥Õ¥©¡¼¥é¥à¡¢¥¿¥¹¥¯´ÉÍý¡¢ ¥Û¥¹¥È¥Û¥¹¥Æ¥£¥ó¥°¡¢±Êµ×Ū¤Ê¥Õ¥¡¥¤¥ë¤ÎÊÝ´É¡¢´°Á´¤Ê¥Ð¥Ã¥¯¥¢¥Ã¥×¤µ¤é¤ËWeb¥Ù¡¼¥¹ ¤ÎÁí¹çŪ¤Ê´ÉÍý¤Ø¤ÎÍưפǺǹâ¤ÊÍøÍѤòÄ󶡤¹¤ë̵ÎÁ¤Î¥µ¡¼¥Ó¥¹¤Ç¤¹¡£ <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ ¾ÜºÙ ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>¥µ¥¤¥È¤Ø¤Î°Õ¸«¤È»²²Ã</B> <P> SourceForge¤òºÇÂç¸Â³èÍѤ¹¤ë¤Ë¤Ï<a href="http://sourceforge.net/account/register.php">¥æ¡¼¥¶ÅÐÏ¿</a>¤¹¤ëɬ Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤¹¤ë¤³¤È¤Ë¤è¤ê¤ï¤ì¤ï¤ì¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ó¥¹¤Ë»²²Ã ¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤â¤Á¤í¤óÅÐÏ¿¤·¤Ê¤¯¤È¤â¥µ¥¤¥È¤ò±ÜÍ÷¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤¹ ¤¬¡¢ÍøÍѤËÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£ <P> <BR> <B>¼«Ê¬¤Î¥×¥í¥¸¥§¥¯¥È¤òºî¤ë</B> <P> ¤Þ¤º<a href="http://sourceforge.net/account/register.php">¥æ¡¼¥¶ÅÐÏ¿ </a>¤·¡¢<a href="http://sourceforge.net/account/login.php">¥í¥°¥¤¥ó </a>¤·¤Þ¤¹¡£¤½¤·¤Æ<a href="http://sourceforge.net/register/">¥×¥í¥¸¥§¥¯ ¥È¤òÅÐÏ¿</a>¤·¤Þ¤¹¡£ <P> ¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£¤½¤·¤Æ¤³¤Î¥µ¥¤¥È¤Ç¤¼¤Ò³Ú¤·¤ó¤Ç¤¯¤À¤µ¤¤¡£
+frs latest_file_releases ºÇ¿·¤Î File ¥ê¥ê¡¼¥¹
+menu login SSL·Ðͳ¤Ç¥í¥°¥¤¥ó
+menu logout ¥í¥°¥¢¥¦¥È
+home most_active_this_week ºÇ¶á°ì½µ´Ö¤Ç³èȯ¤Ê¥×¥í¥¸¥§¥¯¥È
+menu my_personal_page ¼«Ê¬¤Î¥Ú¡¼¥¸
+menu new_project ¿·µ¬¥×¥í¥¸¥§¥¯¥È¤ÎÅÐÏ¿
+menu new_releases ¿·µ¬¥ê¥ê¡¼¥¹
+menu new_user SSL·Ðͳ¤Ç¿·µ¬¥æ¡¼¥¶ºîÀ®
+menu other_site_mirrors ¾¤Î¥ß¥é¡¼¥µ¥¤¥È
+menu project_admin ¥×¥í¥¸¥§¥¯¥È´ÉÍý
+group project_admins ¥×¥í¥¸¥§¥¯¥È´ÉÍý¼Ô
+menu project_help_wanted ¥×¥í¥¸¥§¥¯¥È¶¨ÎϼÔÊ罸
+menu project_summary ¥×¥í¥¸¥§¥¯¥È¥µ¥Þ¥ê
+group public_area ¸ø³«¥¨¥ê¥¢
+menu search ¸¡º÷
+menu software_map ¥½¥Õ¥È¥¦¥§¥¢¥Þ¥Ã¥×
+home sourceforge_statistics SourceForgeÅý·×
+menu top_projects ¥È¥Ã¥×¥×¥í¥¸¥§¥¯¥È
+home top_project_downloads ¥×¥í¥¸¥§¥¯¥È¥À¥¦¥ó¥í¡¼¥É¿ô
+conf content_encoding EUC-JP
+conf language_code ja
+conf language_id 2
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Korean.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Korean.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Korean.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,89 @@
+#/**
+# *
+# * Korean message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Kim SeungBaeck <kongsi at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2001-01-15 Kim SeungBaeck <kongsi at users.sourceforge.net>
+# * Initial translation
+#
+about_foundries about_blurb â¼³ÀÚ¿¡ ´ëÇÏ¿©
+menu about_sourceforge SourceForge¿¡ ´ëÇÏ¿©
+menu account_maintenance Á¢¼Ó À¯Áö
+menu bookmark_page Ã¥°¥ÇÇ
+home breaking_down_barriers ¿¸°¼Ò½º °³¹ß·Î À庮À» Çã¹°¾ú½À´Ï´Ù.
+menu change_my_theme Å׸¶ º¯°æ
+menu code_snippet_library °£´ÜÇÑ ¶óÀ̺귯¸®ÄÚµåÈ
+menu compile_farm ÆíÁýÀÚ ¾ç¼º
+menu contact_us SourceForge¿Í ±³Á¦
+group developers °³¹ßÀÚ
+group developer_info °³¹ßÀÚ Á¤º¸
+menu discussion_forums Åä·Ðȸ
+menu documentation »çÀÌÆ® ¹®¼
+frs file_download ¹Þ±â
+frs file_monitor °¨½Ã
+frs file_notes ÁÖ¼®
+frs file_package ²Ù·¯¹Ì
+frs file_rel_date ³¯Â¥
+frs file_version ÆǹøÈ£
+group long_bugs ¹ú·¹ÀâÀÌ
+group long_cvs CVS ÀúÀå¼Ò
+group long_docman ¹®¼°ü¸®ÀÚ: ÀϰŸ® ¹®¼È
+group long_forum ¿¸° Åä·ÐÀå
+group long_foundries SourceForge °³¹ß °ø°£
+group long_ftp À͸í FTP °ø°£
+group long_homepage ȨÆäÀÌÁö
+group long_mail ¸ÞÀϸµ ¸®½ºÆ®
+group long_news ÃÖ±Ù ¼Ò½Ä
+group long_patch ÆÐÄ¡ °ü¸®ÀÚ
+group long_pm ÀÛ¾÷ °ü¸®ÀÚ
+group long_support ±â¼úÁö¿ø °ü¸®ÀÚ
+group long_survey ÅõÇ¥
+group short_bugs ¹ú·¹
+group short_cvs CVS
+group short_docman ¹®¼
+group short_files Filesgroup short_forum Åä·ÐÀå
+group short_homepage ȨÆäÀÌÁö
+group short_mail ¸ñ·Ï
+group short_main ¸ÞÀÎ
+group short_memberlist °³¹ßÀÚµé
+group short_news »õ¼Ò½Ä
+group short_patch ÆÐÄ¡
+group short_pm ÀÛ¾÷
+group short_summary ¿ä¾à
+group short_support Áö¿ø
+group short_survey ÅõÇ¥
+home highest_ranked_users °¡Àå ¸¹Àº Âü¿©ÀÚ ±×·ì
+home about_blurb SourceForge ´Â <B> <A href="http://www.opensource.org">¿¸° ¼Ò½º</A> °³¹ßÀÚ</B>¿¡°Ô ½±°Ô Á¢±ÙÇÒ¼ö ÀÖ´Â CVS, ¸ÞÀϸµ¸®½ºÆ®, ¹ú·¹ÀâÀÌ, °Ô½ÃÆÇ/Åä·ÐÀå, ÀÛ¾÷°ü¸®, È£½ºÆÃ,¿µ±¸ÀûÀÎ ÈÀÏ ÀúÀå, ¹é¾÷µî À¥±â¹Ý °ü¸®µîÀ» ¹«·á·Î Áö¿ø ÇÕ´Ï´Ù. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ ´õ ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ ÀæÀºÁú´ä ]</font></A> <BR> <P> <B>»çÀÌÆ®ÀÇ ÀÇ°ß¿Í Âü¿©</B> <P> SourceForgeÀÇ Áú¼¸¦ À§Çؼ, ´ç½ÅÀÌ ¿øÇÏÇÏ½Ã¸é ¸ÕÀú <A href="/account/register.php">»ç¿ëÀÚ·Î µî·Ï ÇϽʽÿÀ</A>. ÀÌ°ÍÀ¸·Î ´ç½ÅÀº ¿ì¸®¿Í ÇÔ²²ÇÏ°Ô µÉ°ÍÀ̸ç, ¿ì¸®°¡ ÇÒ ¼ö ÀÖ´Â ¸ðµç Áö¿ø ÇÒ°ÍÀÔ´Ï´Ù. ´ç½ÅÀº µî·ÏÇÏÁö¾Ê°íµµ º¼¼ö ÀÖÀ¸³ª, ¸ðµÎ »ç¿ë ÇÒ ¼ö´Â ¾ø½À´Ï´Ù. <P> <BR> <B>´ç½Å¸¸ÀÇ ÇÁ·ÎÁ§Æ®¸¦ ¸¸µå¼¼¿ä</B> <P> <A href="/account/register.php">»çÀÌÆ®ÀÇ »ç¿ëÀÚ·Î µî·ÏÇϽðí</A>, <A HREF="/account/login.php">Á¢¼Ó</A>ÇϽøé, <A HREF="/register/">´ç½ÅÀÇ ÇÁ·ÎÁ§Æ®¸¦ µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù.</A> °¨»çÇÕ´Ï´Ù... Áñ°Å¿î ½Ã°£ µÇ½Ê½Ã¿À.
+frs latest_file_releases ¸¶Áö¸· ÈÀÏ ¹ßÇ¥
+menu login SSLÀ» »ç¿ëÇÑ Á¢¼Ó
+menu logout Á¢¼ÓÇØÁ¦
+home most_active_this_week ±ÝÁÖ °¡ÀåÈ°¹ßÇÑ ÇÁ·ÎÁ§Æ®
+menu my_personal_page °³ÀÎ ÆäÀÌÁö
+menu new_project »õ ÀϰŸ® µî·Ï
+menu new_releases »õ·Î¿î ¹èÆ÷ÆÇ
+menu new_user SSLÀ» »ç¿ëÇÑ »õ »ç¿ëÀÚ
+menu other_site_mirrors ´Ù¸¥ ¹Ì·¯ »çÀÌÆ®
+menu project_admin ÇÁ·ÎÁ§Æ® °ü¸®ÀÚ
+group project_admins ÀϰŸ® °ü¸®ÀÚ
+menu project_help_wanted µµ¿òÀ» ¿øÇÏ´Â ÇÁ·ÎÁ§Æ®
+menu project_summary ÀϰŸ® ¿ä¾à
+group public_area ¿¸°°ø°£
+menu search °Ë»ö
+menu software_map ÀÀ¿ëÇÁ·Î±×·¥ ¸ñ·Ï
+home sourceforge_statistics SourceForge Åë°è
+menu top_projects »óÀ§ ÇÁ·ÎÁ§Æ®
+home top_project_downloads °¡Àå ¸¹ÀÌ ¹ÞÀº ±×·ì
+conf content_encoding EUC-KR
+conf default_font gulim,verdana,arial,helvetica,sans-serif
+conf language_code ko
+conf language_id 22
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Norwegian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Norwegian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Norwegian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,82 @@
+#/**
+# *
+# * Norwegian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Ragnvald Larsen <ragnvald at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-26 Ragnvald Larsen <ragnvald at users.sourceforge.net>
+# * Initial translation. Norsk bokmaal oversettelse.
+#
+menu account_maintenance Vedlikehold av brukerinformasjon
+menu bookmark_page Bokmerke
+home breaking_down_barriers Gjør det lettere å utvikle Open Source programvare
+menu change_my_theme Nytt webtema
+menu code_snippet_library Kodebibliotek
+menu compile_farm Komplieringsverksted
+menu contact_us Kontakt oss
+group developers Utvikler
+group developer_info Utviklerinformasjon
+menu discussion_forums Diskusjonsfora
+menu documentation Dokumentasjon
+frs file_download Last ned
+frs file_monitor Overvåk
+frs file_notes Notater
+frs file_package Pakke
+frs file_version Versjon
+group long_bugs Feilretting
+group long_cvs CVS-repository
+group long_docman Administrere prosjektdokumentsjon
+group long_forum Åpne fora
+group long_ftp Anonym FTP-tilgang
+group long_homepage Prosjektside
+group long_mail Epostlister
+group long_news Siste nyheter
+group long_patch Administrere retting
+group long_pm Prosjektstyring
+group long_support Administrere brukerstøtte
+group long_survey Spørreundersøkelser
+group short_bugs Feil
+group short_cvs CVS
+group short_docman Dokumentasjon
+group short_files Filesgroup short_forum Fora
+group short_homepage Hjemmeside
+group short_mail Epostlister
+group short_main Topp
+group short_news Nyheter
+group short_patch Rettinger
+group short_pm Oppgaver
+group short_summary Overblikk
+group short_support Brukerstøtte
+group short_survey Spørreundersøkelser
+home highest_ranked_users Høyest rangerte brukere
+home about_blurb SourceForge er en <B>fri tjeneste som tilbys utviklere av <A href="http://www.opensource.org">Open Source</A>-programvare</B>. Her får du enkel tilgang til det beste innen CVS, epostlister, feilkontroll, meldingsforum, prosjektstyring, webhosting, filarkiver, backup-løsninger og web-basert administrering. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ mer ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Tilbakemelding og deltakelse</B> <P> For å få mest igjen fra Sourceforge må du <A href="/account/register.php">registrere deg som bruker hos oss</A>. Da kan du ta del i alt vi kan tilby. Du kan selvsagt bla deg gjennom sidene uten å være registrert, men du vil ikke kunne delta på linje med registrerte brukere. <P> <BR> <B>Sett opp dine egne prosjekter</B> <P> <A href="/account/register.php">Registrer deg som bruker</A>, then <A HREF="/account/login.php">Login</A> til slutt, <A HREF="/register/">Registrer ditt eget prosjekt.</A> <P> Takk... og velkommen som bruker
+frs latest_file_releases Nyeste filutgivelser
+menu login Logg inn via SSL
+menu logout Logg av
+home most_active_this_week Mest aktive denne uken
+menu my_personal_page Min side
+menu new_project Meld inn et nytt prosjekt
+menu new_releases Nye utgaver
+menu new_user Ny bruker via SSL
+menu other_site_mirrors Speil
+menu project_admin Prosjektadministrator
+group project_admins Prosjektadministratorer
+menu project_help_wanted Prosjekthjelp søkes
+menu project_summary Prosjektoversikt
+group public_area Fellesområde
+menu search Søk
+menu software_map Programvareoversikt
+home sourceforge_statistics SourceForge statistikk
+menu top_projects Topp-prosjekter
+home top_project_downloads Flest nedlastinger
+conf content_encoding iso-8859-1
+conf language_id 9
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Polish.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Polish.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Polish.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,87 @@
+#/**
+# *
+# * Polish message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Max Gilead <gilead at linart.pl>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-06 Max Gilead <gilead at linart.pl>
+# * Initial translation
+# 2000-10-16 Max Gilead <gilead at linart.pl>
+# * Better translation, added new strings
+#
+about_foundries about_blurb O dzia³ach
+menu about_sourceforge About SourceForge
+menu account_maintenance Zarz±dzanie kontem
+menu bookmark_page Zrób zak³adkê
+home breaking_down_barriers Prze³amujemy bariery w rozwoju oprogramowania Open Source
+menu change_my_theme Zmieñ wygl±d
+menu code_snippet_library Teczka wycinków kodu
+menu compile_farm Kompilatory
+menu contact_us Kontakt z nami
+group developers Programi¶ci
+group developer_info Informacja o programi¶cie
+menu discussion_forums Forum dyskusyjne
+menu documentation Dokumentacja serwera
+frs file_download Download
+frs file_monitor Monitor
+frs file_notes Notatki
+frs file_package Pakiet
+frs file_version Wersja
+group long_bugs ¶ledzenie pluskiew
+group long_cvs Repozytorium CVS
+group long_docman DocManager: dokumentacja projektu
+group long_forum Forum publiczne
+group long_ftp Anonimowy FTP
+group long_homepage Strona domowa projektu
+group long_mail Listy dyskusyjne
+group long_news Naj¶wie¿sze wie¶ci
+group long_patch Centrum ³at
+group long_pm Centrum zadañ
+group long_support Centrum pomocy technicznej
+group long_survey Sonda¿e
+group short_bugs Pluskwy
+group short_cvs CVS
+group short_docman Dokumentacja
+group short_files Filesgroup short_forum Forum
+group short_homepage Strona domowa
+group short_mail Listy dyskusyjne
+group short_main G³ówna
+group short_news Nowo¶ci
+group short_patch £aty
+group short_pm Zadania
+group short_summary Podsumowanie
+group short_support Wsparcie
+group short_survey Sonda¿e
+home highest_ranked_users Najwy¿ej oceniani u¿ytkownicy
+home about_blurb SourceForge to <B>wolny serwis dla programistów <A href="http://www.opensource.org">Open Source</A></B> oferuj±cy ³atwy dostêp to najlepszego CVS, list dyskusyjnych, ¶ledzenia b³êdów, grup i forum dyskusyjnych, zarz±dzania zadaniami, hostingu stron, sta³ego archiwizowania plików, pe³nego backupu; zarz±dzni ca³kowicie z poziomu WWW. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ wiêcej ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Opinie i wspó³praca nad serwisem</B> <P> Aby w pe³ni skorzystaæ z SourceForge, powiniene¶ <A href="/account/register.php">zarejestrowaæ siê jako u¿ytkownik serwisu</A>. Pozwoli Ci to korzystaæ ze wszystkiego, co mamy do zaoferowania. Oczywi¶cie mo¿esz korzystaæ z serwisu tak¿e bez rejestracji, jednak pewne opcje bêd± niedostêpne. <P> <BR> <B>Za³ó¿ Swój W³asny Projekt</B> <P> <A href="/account/register.php">Zarejestruj siê jako u¿ytkownik serwisu</A>, nastêpnie <A HREF="/account/login.php">zaloguj siê</A> i <A HREF="/register/">Za³ó¿ swój w³asny projekt.</A> <P> Dziêkujemy. Przyjemnego korzystania z serwisu.
+frs latest_file_releases Najnowsze pliki
+menu login Zaloguj przez SSL
+menu logout Wyloguj
+home most_active_this_week Najbardziej aktywny w tym tygodniu
+menu my_personal_page Moja strona osobista
+menu new_project Zarejestruj nowy projekt
+menu new_releases Nowo¶ci
+menu new_user Nowy u¿ytkownik przez SSL
+menu other_site_mirrors Inne mirrory
+menu project_admin Admin projektu
+group project_admins Admini projektu
+menu project_help_wanted Potrzeba pomoc do projektu
+menu project_summary Podsumowanie projektu
+group public_area Obszar publiczny
+menu search Szukaj
+menu software_map Mapa projektów
+home sourceforge_statistics Statystyki SourceForge
+menu top_projects Najlepsze projekty
+home top_project_downloads Najczê¶ciej pobierane projekty
+conf content_encoding iso-8859-2
+conf language_code pl
+conf language_id 15
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Portuguese.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Portuguese.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Portuguese.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,90 @@
+#/**
+# *
+# * Portuguese message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Doomed <doomed at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2001-02-25 Doomed <doomed at users.sourceforge.net>
+# * Initial translation
+# 2001-02-25 Nuno Amaral <namaral at users.sourceforge.net>
+# * Contributed some strings
+#
+about_foundries about_blurb Sobre as Foundries
+menu about_sourceforge Sobre a SourceForge
+menu account_maintenance Manutenção da Conta
+menu bookmark_page Página de Bookmarks
+home breaking_down_barriers Quebrando as Barreiras contra o Desenvolvimento do Open Source
+menu change_my_theme Mudar Tema
+menu code_snippet_library Biblioteca de Código
+menu compile_farm Colecção de Compiladores
+menu contact_us Contacte a SourceForge
+group developers Programadores
+group developer_info Informação s/ Programador
+menu discussion_forums Fóruns de Discussão
+menu documentation Documentação do Site
+frs file_download Download
+frs file_monitor Monitor
+frs file_notes Observações
+frs file_package Pacotes
+frs file_rel_date Data
+frs file_version Versão
+group long_bugs Procura de Bugs
+group long_cvs Arquivo do CVS
+group long_docman Gestor da Documentação do Projecto
+group long_forum Fóruns Públicos
+group long_foundries Foundries de Desenvolvimento da SourceForge
+group long_ftp Espaço p/ FTP Anónimo
+group long_homepage Home Page do Projecto
+group long_mail Mailing Lists
+group long_news Notícias Mais Recentes
+group long_patch Gestor dos Patches
+group long_pm Gestor de Tarefas
+group long_support Gestor do Suporte Técnico
+group long_survey Inquéritos
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Documentação
+group short_files Filesgroup short_forum Fóruns
+group short_homepage Página de Entrada
+group short_mail Listas
+group short_main Principal
+group short_memberlist Programadores
+group short_news Notícias
+group short_patch Patches
+group short_pm Tarefas
+group short_summary Resumo
+group short_support Suporte
+group short_survey Inquéritos
+home highest_ranked_users Utilizadores mais Destacados
+home about_blurb A SourceForge é um <B>serviço gratuito para os programadores em <A href="http://www.opensource.org">Open Source</A></B> que oferece fácil acesso ao que melhor se faz em CVS, Mailing Lists, Procura de bugs, Fóruns, Administração de Tarefas, Alojamento de Sites, Arquivo permanente de Ficheiros, Backups completos e ainda Administração dos Projectos totalmente baseada numa interface web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ mais informação ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Contacto e Participação no Site</B> <P> De forma a obter o máximo da SourceForge, vai precisar de se <A href="/account/register.php">registar como utilizador do site</A>. Isto permitirá que participe em todos os serviços que temos disponíveis. Pode obviamente visitar o site sem se registar mas não terá acesso a uma participação completa. <P> <BR> <B>Crie o Seu Próprio Projecto</B> <P> <A href="/account/register.php">Registe-se como utilizador do site</A>, faça o respectivo <A HREF="/account/login.php">Login</A> e por fim, <A HREF="/register/">Registe o Seu Projecto.</A> <P> Obrigado... e tire bom partido do site.
+frs latest_file_releases Lançamentos Mais Recentes
+menu login Login por SSL
+menu logout Logout
+home most_active_this_week O Mais Activo nesta Semana
+menu my_personal_page Página Pessoal
+menu new_project Criar um Projecto Novo
+menu new_releases Novos Lançamentos
+menu new_user Utilizador Novo por SSL
+menu other_site_mirrors Outros Mirrors
+menu project_admin Administração do Projecto
+group project_admins Administradores do Projecto
+menu project_help_wanted Projectos que Precisam de Ajuda
+menu project_summary Resumo do Projecto
+group public_area Áreas Públicas
+menu search Procurar
+menu software_map Listagem do Software
+home sourceforge_statistics Estatísticas da SourceForge
+menu top_projects Projectos Principais
+home top_project_downloads Projectos com mais Downloads
+conf content_encoding iso-8859-1
+conf language_code pt
+conf language_id 18
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/PortugueseBrazillian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/PortugueseBrazillian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/PortugueseBrazillian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,89 @@
+#/**
+# *
+# * Portuguese Brazillian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id: PortugueseBrazillian.tab,v 1.2 2001/06/14 17:51:56 pfalcon Exp $
+# * @author Vilson Cristiano G¤rtner <vgartner at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-?? Vilson Cristiano G¤rtner <vgartner at users.sourceforge.net>
+# * Initial translation
+# 2001-03-26 Vilson Cristiano G¤rtner <vgartner at users.sourceforge.net>
+# * Updates
+#
+about_foundries about_blurb Sobre as Foundries
+menu about_sourceforge Sobre o SourceForge
+menu account_maintenance Manutenção da Conta
+menu bookmark_page Adicionar aos Favoritos
+home breaking_down_barriers Quebrando as Barreiras para o Desenvolvimento em Código Aberto
+menu change_my_theme Mudar Meu Tema
+menu code_snippet_library Biblioteca de Código
+menu compile_farm Compilação de Programas
+menu contact_us Entre em Contato
+group developers Desenvolvedores
+group developer_info Info Desenvolvedor
+menu discussion_forums Fórums de Discussão
+menu documentation Documentação do Site
+frs file_download Download
+frs file_monitor Monitorar
+frs file_notes Notas
+frs file_package Pacote
+frs file_rel_date Data
+frs file_version Versão
+group long_bugs Mapeamento de Bugs
+group long_cvs Repositório CVS
+group long_docman DocManager: Documentação do Projeto
+group long_forum Fórums Públicos
+group long_foundries Foundries de Desenvolvimento do SourceForge
+group long_ftp Espaço de FTP Anônimo
+group long_homepage Home Page do Projeto
+group long_mail Mailing Lists
+group long_news Últimas Notícias
+group long_patch Gerenciador de Alterações
+group long_pm Gerenciador de Tarefas
+group long_support Gerenciador de Suporte
+group long_survey Pesquisas
+group short_bugs Bugs
+group short_cvs CVS
+group short_docman Documentação
+group short_files Filesgroup short_forum Fórums
+group short_homepage Home Page
+group short_mail Listas
+group short_main Principal
+group short_memberlist Membros
+group short_news Notícias
+group short_patch Alterações
+group short_pm Tarefas
+group short_summary Sumário
+group short_support Suporte
+group short_survey Pesquisas
+home highest_ranked_users Usuários Mais Pontuados
+home about_blurb SourceForge é um <B>serviço gratuido para desenvolvedores em <A href="http://www.opensource.org">Código Aberto</A> </B> oferecendo fácil acesso ao que há de melhor em CVS, listas, controle de bugs, quadro de mensagens/fórums, gerenciador de tarefas, hospedagem, arquivamento permanente de arquivos, backups completos, e administração totalmente baseado na web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ mais ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Conteúdo do Site e Participação</B> <P> Para tirar o máximo proveito do SourceForge, você deve se <A href="/account/register.php">registrar como um usuário do site</A>. Isso permitirá que você participe plenamente em tudo o que temos a oferecer. É claro que você pode ver o conteúdo do site sem se registrar, mas não terá accesso para participar plenamente. <P> <BR> <B>Registre seu próprio Projeto</B> <P> <A href="/account/register.php">Registre-se como um usuário do site</A>, em seguida efetue <A HREF="/account/login.php">Login</A> e finalmente, <A HREF="/register/">Registre seu Projeto.</A> <P> Obrigado... e aproveite o site.
+frs latest_file_releases Últimos Arquivos Enviados
+menu login Login via SSL
+menu logout Logout
+home most_active_this_week Mais Ativo da Semana
+menu my_personal_page Minha Página Pessoal
+menu new_project Registrar Novo Projeto
+menu new_releases Novas Atualizações
+menu new_user Novo Usuário via SSL
+menu other_site_mirrors Outros Mirrors
+menu project_admin Administração do Projeto
+group project_admins Administradores
+menu project_help_wanted Projetos que Precisam de Ajuda
+menu project_summary Sumário do Projeto
+group public_area Áreas Públicas
+menu search Procurar
+menu software_map Mapa dos Softwares
+home sourceforge_statistics Estatísticas do SourceForge
+menu top_projects Principais Projetos
+home top_project_downloads Projetos Mais Baixados
+conf language_code pt
+conf language_id 16
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Russian.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Russian.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Russian.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,90 @@
+#/**
+# *
+# * Russian message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Paul Sokolovsky <pfalcon at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-08 Paul Sokolovsky <pfalcon at users.sourceforge.net>
+# * Initial translation
+#
+about_foundries about_blurb Î öåõàõ SourceForge
+menu about_sourceforge Î SourceForge
+menu account_maintenance Ìîè íàñòðîéêè
+menu bookmark_page Ïîìåòèòü òåê. ñòðàíèöó çàêëàäêîé
+home breaking_down_barriers Ïðåîäîëåâàÿ áàðüåðû íà ïóòè ðàçðàáîòêè ñ îòêðûòûì èñõîäíûì êîäîì
+menu change_my_theme Èçìåíèòü web-òåìó
+menu code_snippet_library Áèáèîòåêà Code Snippet'îâ
+menu compile_farm Ôàáðèêà êîìïèëÿöèè
+menu contact_us Îáðàòíàÿ ñâÿçü
+group developers Ðàçðàáîò÷èêè
+group developer_info Ó÷àñòíèêè ïðîåêòà
+menu discussion_forums Äèñêóññèîííûå ôîðóìû
+menu documentation Äîêóìåíòàöèÿ ñàéòà
+frs file_download Ñêà÷àòü
+frs file_monitor Ñëåäèòü
+frs file_notes Èíôîðìàöèÿ
+frs file_package Ìîäóëü
+frs file_version Âåðñèÿ
+group long_bugs Ìåíåäæåð îøèáîê
+group long_cvs CVS ðåïîçèòîðèé
+group long_docman Ìåíåäæåð äîêóìåíòàöèè
+group long_forum Îáùåäîñòóïíûå ôîðóìû
+group long_ftp Àíîíèìíûé FTP ïðîåêòà
+group long_homepage Äîìàøíÿÿ ñòðàíèöà ïðîåêòà
+group long_mail Ñïèñêè ðàññûëêè
+group long_news Íîâîñòè
+group long_patch Ìåíåäæåð ïàò÷åé (èñïðàâëåíèé)
+group long_pm Çàäà÷è ïðîåêòà
+group long_support Ìåíåäæåð òåõ. ïîääåðæêè
+group long_survey Îïðîñû
+group short_admin Àäìèí
+group short_bugs Îøèáêè
+group short_cvs CVS
+group short_docman Äîêóìåíòàöèÿ
+group short_files Ôàéëû
+group short_forum Ôîðóìû
+group short_homepage Äîì.ñòðàíèöà
+group short_mail Ñï.ðàññûëêè
+group short_main Main
+group short_memberlist Ðàçðàáîò÷èêè
+group short_news Íîâîñòè
+group short_patch 수֏
+group short_pm Çàäà÷è
+group short_summary Ðåçþìå
+group short_support Ïîääåðæêà
+group short_survey Îïðîñû
+group short_tracker Óíèâ.Òðåêåð
+home highest_ranked_users Ïîëüçîâàòåëè ñ âûñîêèì ðåéòèíãîì
+home about_blurb SourceForge - <B>ñâîáîäíûé è áåñïëàòíûé ñåðâèñ äëÿ ðàçðàáîò÷èêîâ, ðàáîòàþùèõ ïî ïðèíöèïó Îòêðûòîãî Èñõîäíîãî Êîäà/Íàïîëíåíèÿ (<A href="http://www.opensource.org">Open Source</A>)</B> è ïðåäëàãàþùèé áûñòðûé è ëåãêèé äîñòóï ê òàêèì ñåðâèñàì, êàê CVS (ñèñòåìà óïðàâëåíèÿ âåðñèÿìè ôàéëîâ), ñïècêè ðàññûëêè, ñèñòåìà ðåãèñòðàöèè îøèáîê, äîñêè ñîîáùåíèé è ôîðóìû, ìåíåäæåð ïðîåêòîâ, web-õîñòèíã, ïîñòîÿííîå ôàéëîâîå õðàíèëèùå, àâòîìàòè÷åñêîå ðåçåðâíîå êîïèðîâàíèå - âñå âìåñòå óïðàâëÿåìîå ÷åðåç Web.<br> <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ Ïîäðîáíåå (ïî-àíãëèéñêè) ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>Èñïîëüçîâàíèå ñåðâèñîâ è ó÷àñòèå â ïðîåêòàõ</B> <P> Äëÿ òîãî, ÷òîáû ïîëó÷èòü äîñòóï êî âñåìó ìíîãîîáðàçèþ ñåðâèñîâ, ïðåäëàãàåìûõ íà SourceForge, âàì íóæíî <A href="/account/register.php">çàðåãèñòðèðîâàòüñÿ â êà÷åñòâå ïîëüçîâàòåëÿ ñàéòà</A>. Êîíå÷íî æå, âû ìîæåòå ïóòåøåñòâîâàòü ïî ñàéòó áåç ðåãèñòðàöèè, íî âû íå áóäåòå èìåòü äîñòóï êî ìíîãèì âîçìîæíîñòÿì. <P> <BR> <B>Ñîçäàíèå ñîáñòâåííîãî ïðîåêòà</B> <P> <A href="/account/register.php">Çàðåãèñòðèðóéòåñü êàê ïîëüçîâàòåëü ñàéòà</A>, <A HREF="/account/login.php">âîéäèòå â ñèñòåìó</A> è íàêîíåö, <A HREF="/register/">çàðåãèñòðèðóéòå âàø ïðîåêò</A>. <P> Ñïàñèáî çà âûáîð SourceForge... È ìû æåëàåì âàì ïðèÿòíîãî è ïîëåçíîãî âðåìÿïðîâîæäåíèÿ!
+frs latest_file_releases Ïîñëåäíèå ôàéë-ðåëèçû
+menu login Ëîãèí (÷/ç çàùèùåííîå ñîåäèíåíèå)
+menu logout Âûõîä
+home most_active_this_week Íàèáîëåå àêòèâíûå çà ýòó íåäåëþ
+menu my_personal_page Ìîÿ ïåðñîíàëüíàÿ ñòðàíèöà
+menu new_project Çàðåãèñòðèðîâàòü ïðîåêò
+menu new_releases Ïîñëåäíèå ðåëèçû
+menu new_user Íîâûé ïîëüçîâàòåëü
+menu other_site_mirrors Çåðêàëà äðóãèõ ñàéòîâ
+menu project_admin Àäìèíèñòðèðîâàíèå ïðîåêòà
+group project_admins Àäìèíèñòðàòîðû
+menu project_help_wanted Ïðîåêòû, íóæäàþùèåñÿ â ïîìîùè
+menu project_summary Áàçà ïðîåêòà
+group public_area Ñåðâèñû ïðîåêòà
+menu search Ïîèñê
+menu site_status Ñòàòóñ Ñàéòà
+menu software_map Êàðòà ïðîåêòîâ
+home sourceforge_statistics Ñòàòèñòèêà SourceForge
+menu top_projects Òîï-ïðîåêòû
+home top_project_downloads Íàèáîëåå çàãðóæàåìûå ïðîåêòû
+conf content_encoding windows-1251
+conf language_code ru
+conf language_id 17
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/SimplifiedChinese.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/SimplifiedChinese.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/SimplifiedChinese.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,95 @@
+#/**
+# *
+# * Simplified Chinese message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Hunte Swee <hunte at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-11-11 Hunte Swee <hunte at users.sourceforge.net>
+# * Translated from the Chinese.class(Big5)
+# 2001-02-20 Hunte Swee <hunte at users.sourceforge.net>
+# * Change the font to BaseLanguage default
+# * Change the language code from zh-CN to zh-cn
+# * Add some new variables that BaseLanguage added
+#
+about_foundries about_blurb ¹ØÓÚ Foundries
+menu about_sourceforge ¹ØÓÚ SourceForge
+menu account_maintenance ÕʺÅά»¤
+menu bookmark_page ÊéÇ©
+home breaking_down_barriers Ϊ¿ª·ÅÔ´ÂëµÄ·¢Õ¹¿ª±ÙÒ»Ìõ̹;
+menu change_my_theme ¸ü»»Íâ¹Û
+menu code_snippet_library ´úÂëƬ¶Ï
+menu compile_farm ±àÒ빤³§
+menu contact_us ÁªÏµÎÒÃÇ
+group developers ¿ª·¢Õß
+group developer_info ¿ª·¢ÕßÐÅÏ¢
+menu discussion_forums ÂÛ̳
+menu documentation Îĵµ
+frs file_download ÏÂÔØ
+frs file_monitor ¸ú×Ù
+frs file_notes ±¸×¢
+frs file_package Èí¼þ°ü
+frs file_rel_date ÈÕÆÚ
+frs file_version °æ±¾
+group long_bugs BUG¸ú×Ù
+group long_cvs CVS²Ö¿â
+group long_docman ÏîÄ¿Îĵµ
+group long_forum ¹«¹²ÂÛ̳
+group long_ftp ÄäÃûFTP
+group long_homepage ÏîÄ¿Ê×Ò³
+group long_mail ÓʼþÁбí
+group long_news ×îÐÂÏûÏ¢
+group long_patch ²¹¶¡¹ÜÀí
+group long_pm ÈÎÎñ¹ÜÀí
+group long_support ¼¼ÊõÖ§³Ö
+group long_survey µ÷²é
+group short_admin ¹ÜÀí
+group short_bugs BUG
+group short_cvs CVS
+group short_docman Îĵµ
+group short_files Filesgroup short_forum ÂÛ̳
+group short_homepage Ê×Ò³
+group short_mail µç×ÓÓʼþ
+group short_main Ö÷Òª
+group short_memberlist ¿ª·¢Õß
+group short_news ÐÂÎÅ
+group short_patch ²¹¶¡
+group short_pm ÈÎÎñ
+group short_summary ÕªÒª
+group short_support Ö§³Ö
+group short_survey µ÷²é
+group short_tracker ¸ú×Ù
+home highest_ranked_users Óû§ÆÀ¼ÛÅÅÐаñ
+home about_blurb SourceForgeΪ<b><a href="http://www.opensource.org">¿ª·ÅÔ´´úÂëÈí¼þ</a>¿ª·¢ÕßÌṩȫ·½ÃæµÄÃâ·Ñ·þÎñ</b>£¬°üÀ¨CVS²Ö¿â, ÓʼþÁбí, BUG¸ú×Ù, ÔÚÏßÂÛ̳, ÈÎÎñ¹ÜÀí, ÍøÕ¾¿Õ¼ä, ÏîÄ¿´æ´¢¼°ÍêÕûµÄ±¸·Ý, ²¢ÇÒÍêÈ«ÊÇͨ¹ýWEB·½Ê½À´¹ÜÀíµÄ¡£ <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ ¸ü¶à ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ ³£¼ûÎÊÌâ ]</font></A> <BR> <P> <B>ÇëÁ¢¼´¼ÓÈ룬²¢Ìá³öÄúµÄ±¦¹óÒâ¼û</B> <P> ΪÁ˳ä·ÖÀûÓÃSourceForgeËùÌṩµÄ·þÎñ, <A href="/account/register.php">ÇëÁ¢¼´×¢²á³ÉΪ ±¾Õ¾Óû§</A>£¬ÕâÑùÄú¾Í¿ÉÒÔ²ÎÓë±¾Õ¾µÄ¸÷Ïî»î¶¯¡£ÈôÄúÉв»ÊÇ×¢²áÓû§, ÈÔÄÜä¯ÀÀ±¾Õ¾, µ«ÎÞȨ²ÎÓë±¾Õ¾µÄ»î¶¯¡£ <P> <BR> <B>¿ªÊ¼Äú×Ô¼ºµÄÏîÄ¿</B> <P> <A href="/account/register.php">ÏÈ×¢²á³ÉΪ±¾Õ¾Óû§</A>, È»ºó<A HREF="/account/login.php">µÇ¼</A>×îºó<A HREF="/register/">¿ªÊ¼ÄúµÄÏîÄ¿¡£</A> <P> лл²ÎÓ룬Çë³ä·ÖÏíÊܱ¾Õ¾ÌṩµÄ·þÎñ°É£¡
+frs latest_file_releases ×îз¢²¼ÏîÄ¿
+menu login ͨ¹ýSSLµÇ¼
+menu logout Í˳öµÇ¼
+home most_active_this_week ±¾ÖܻÁ¦×îÇ¿ÅÅÐаñ
+menu my_personal_page ÎÒµÄÊ×Ò³
+menu new_project µÇ¼ÇÐÂÏîÄ¿
+menu new_releases з¢²¼Èí¼þ
+menu new_user ÐÂÓû§Í¨¹ýSSL×¢²á
+menu other_site_mirrors ÆäËüÍøÕ¾¾µÏñ
+menu project_admin ÏîĿά»¤
+group project_admins ÏîÄ¿¹ÜÀíÔ±
+menu project_help_wanted Ñ°ÇóÐÖú
+menu project_summary ÏîÄ¿ÕªÒª
+group public_area ¹«¹²ÇøÓò
+menu search ²éÕÒ
+menu site_status Õ¾µã״̬
+menu software_map Èí¼þ·ÖÀà±í
+home sourceforge_statistics SourceForgeͳ¼Æ×ÊÁÏ
+menu top_projects ÈȵãÏîÄ¿
+home top_project_downloads ÏîÄ¿ÏÂÔØÅÅÐаñ
+conf content_encoding gb2312
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code zh-cn
+conf language_id 23
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Spanish.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Spanish.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Spanish.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,80 @@
+#/**
+# *
+# * Spanish message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Enric Martnez <exter at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-23 Enric Martnez <exter at users.sourceforge.net>
+# * Initial translation
+#
+menu account_maintenance Mantenimiento de Cuenta
+menu bookmark_page Marcar Página
+home breaking_down_barriers Derribando las Barreras al Desarrollo de Código Abierto
+menu change_my_theme Cambiar Mi Tema
+menu code_snippet_library Biblioteca de Recortes de Código
+menu compile_farm Granja de Compilación
+menu contact_us Contáctenos
+group developers Desarrolladores
+group developer_info Info sobre el Desarrollador
+menu discussion_forums Foros de Discusión
+menu documentation Documentación Local
+frs file_download Descarga
+frs file_monitor Monitor
+frs file_notes Notas
+frs file_package Paquete
+frs file_version Versión
+group long_bugs Seguimiento de Errores
+group long_cvs Repositorio CVS
+group long_docman Admin. de Documentación
+group long_forum Foros Públicos
+group long_ftp Espacio de FTP Anónimo
+group long_homepage Página de Inicio de Proyecto
+group long_mail Listas de Correo
+group long_news Últimas Noticias
+group long_patch Admin. de Parches
+group long_pm Admin. de Tareas
+group long_support Admin. de Soporte Técnico
+group long_survey Servicios
+group short_bugs Fallos
+group short_cvs CVS
+group short_docman Documentos
+group short_files Filesgroup short_forum Foros
+group short_homepage Página de Inicio
+group short_mail Listas
+group short_news Noticias
+group short_patch Parches
+group short_pm Tareas
+group short_summary Resumen
+group short_support Soporte Técnico
+group short_survey Servicios
+home highest_ranked_users Usuarios de Más Activos
+home about_blurb SourceForge es un <B>servicio gratuito para desarrolladores de <A href="http://www.opensource.org">Código Abierto</A></B> ofreciendo fácil acceso a los mejores repositorios CVS, listas de discusión, seguimiento de errores, tablones de anuncios/foros, gestión de tarifas, hospedaje de sitios web, archivado permanente de ficheros, copias de seguridad completas y administración totalmente basada en web. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ más ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ PF ]</font></A> <BR> <P> <B>Retorno (feedback) al Sitio de Participación</B> <P> Para poder obtener el máximo de SourceForge, habrá de <A href="/account/register.php">registrarse como usuario del sitio</A>. Esto le permitirá participar plenamente en todo lo que tenemos para ofrecerle. Podrá, por supuesto, navegar por el sitio sin registrarse, pero no tendrá la opción de participar plenamente. <P> <BR> <B>Monte Su Propio Proyecto</B> <P> <A href="/account/register.php">Regístrese como usuario del sitio</A>, acceda, <A HREF="/account/login.php">Acceso</A> y finalmente, <A HREF="/register/">Registre Su Proyecto.</A> <P> Muchas Gracias... y disfrute del sitio.
+frs latest_file_releases Últimas Versiones de Archivos
+menu login Acceso vía SSL
+menu logout Salir
+home most_active_this_week El Más Activo esta Semana
+menu my_personal_page Mi Página Personal
+menu new_project Registrar Proyecto Nuevo
+menu new_releases Nuevas Salidas
+menu new_user Nuevo Usuario vía SSL
+menu project_admin Admininstración de Proyectos
+group project_admins Admins de Proyecto
+menu project_help_wanted Petición de Ayuda para Proyecto
+menu project_summary Sumario de Proyectos
+group public_area Áreas Públicas
+menu search Buscar
+menu software_map Mapa de Software
+home sourceforge_statistics Estadísticas de SourceForge
+menu top_projects Proyectos Estrella
+home top_project_downloads Proyectos más descargados
+conf language_code es
+conf language_id 4
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Swedish.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Swedish.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Swedish.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,88 @@
+#/**
+# *
+# * Swedish message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Christian Rose <menthos at users.sourceforge.net>
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-10-17 Christian Rose <menthos at users.sourceforge.net>
+# * Initial translation
+# 2001-03-23 Christian Rose <menthos at users.sourceforge.net>
+# * Updates
+#
+about_foundries about_blurb Om Foundries
+menu about_sourceforge Om SourceForge
+menu account_maintenance Kontounderhåll
+menu bookmark_page Lägg till bokmärke
+home breaking_down_barriers Bryter ner gränserna för open source-utveckling
+menu change_my_theme Byt mitt tema
+menu code_snippet_library Kodbibliotek
+menu compile_farm Kompileringsverkstad
+menu contact_us Kontakta oss
+group developers Utvecklare
+group developer_info Utvecklarinformation
+menu discussion_forums Diskussionsforum
+menu documentation Webbplatsdokumentation
+frs file_download Hämta
+frs file_monitor Bevaka
+frs file_notes Anteckningar
+frs file_package Paket
+frs file_version Version
+group long_bugs Felrättning
+group long_cvs CVS-förvar
+group long_docman DocManager: Projektdokumentation
+group long_forum Öppna forum
+group long_ftp Anonymt FTP-utrymme
+group long_homepage Projekthemsida
+group long_mail Sändlistor
+group long_news Senaste nyheterna
+group long_patch Administrera felrättelser
+group long_pm Projektstyrning
+group long_support Administrera användarsupport
+group long_survey Undersökningar
+group short_bugs Buggar
+group short_cvs CVS
+group short_docman Dokumentation
+group short_files Filesgroup short_forum Forum
+group short_homepage Hemsida
+group short_mail Listor
+group short_main Huvudsida
+group short_news Nyheter
+group short_patch Felrättningar
+group short_pm Uppgifter
+group short_summary Sammanfattning
+group short_support Support
+group short_survey Undersökningar
+home highest_ranked_users Högst rankade användare
+home about_blurb SourceForge är en <B>fri tjänst för <A href="http://www.opensource.org">open source</A>-utvecklare </B>som erbjuder enkel tillgång till det bästa i CVS, sändlistor, felhantering, meddelandeforum, uppgiftshantering, webbplatsutrymme, permanent filarkivering, fullständiga backuper, och en helt webbaserad administration. <A href="/docman/display_doc.php?docid=753&group_id=1"> <font size="-1">[ mer ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"> <font size="-1">[ frågor och svar ]</font></A><BR> <P> <B>Deltagande och synpunkter på webbplatsen</B> <P> För att få ut det mesta av SourceForge måste du <A href="/account/register.php">registrera dig som en webbplatsanvändare</A>. Det gör att du kan deltaga i allt vi har att erbjuda. Du kan naturligtvis surfa på webbplatsen utan att att registrera dig, men du kommer då inte att kunna deltaga i allt. <P> <BR> <B>Skapa ditt eget projekt</B> <P> <A href="/account/register.php">Registrera dig som en webbplatsanvändare</A>, <A HREF="/account/login.php"> logga sedan in</A> och till sist <A HREF="/register/"> registrerar du ditt projekt.</A> <P> Tack... och ha det så trevligt på webbplatsen.
+frs latest_file_releases Senaste filutgåvorna
+menu login Logga in via SSL
+menu logout Logga ut
+home most_active_this_week Mest aktiva denna vecka
+menu my_personal_page Min personliga sida
+menu new_project Registrera nytt projekt
+menu new_releases Nya utgåvor
+menu new_user Ny användare via SSL
+menu other_site_mirrors Andra webbplatsspeglar
+menu project_admin Projektadministratör
+group project_admins Projektadministratörer
+menu project_help_wanted Projekthjälp sökes
+menu project_summary Projektsammanfattning
+group public_area Öppet utrymme
+menu search Sök
+menu software_map Programvaruöversikt
+home sourceforge_statistics SourceForge-statistik
+menu top_projects Topprojekt
+home top_project_downloads Projekt med flest hämtningar
+conf content_encoding iso-8859-1
+conf default_font verdana,arial,helvetica,sans-serif
+conf language_code sv
+conf language_id 10
Added: trunk/gforge_base/evolvisforge/gforge/www/include/languages/Thai.tab
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/include/languages/Thai.tab (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/include/languages/Thai.tab 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,89 @@
+#/**
+# *
+# * Thai message catalog
+# *
+# * SourceForge: Breaking Down the Barriers to Open Source Development
+# * Copyright 1999-2001 (c) VA Linux Systems
+# * http://sourceforge.net
+# *
+# * @version $Id$
+# * @author Korakot Chaovavanich
+# *
+# */
+#
+# ChangeLog:
+#
+# 2000-09-25 Korakot Chaovavanich
+# * Initial translation:
+# National Electronic and Computer Technology Center.
+# çR Áôúòúiæ, 25 ó¿÷ô÷¿ 2543
+# éý¿÷ÍÁ׿×å÷èîæÁåçî¿æëÍÂåòîâ?æúÁÞîçÍÂìÉôÞæ
+#
+# According to Information Technology Vocabulary version of Royal Acadamy
+# îæÞôâ éó?ÍÁ׿×å÷èëôçë¿Áé cóçôói+æÞ÷ëô¿
+# Sorry that I can't translate all of them... There seems no standard translation
+# for Software Development Vocab. Some thai may even prefer English than translation.
+#
+menu account_maintenance ´ÙáźѪռÙéãªé
+menu bookmark_page ãÊè·Õè¤Ñè¹Ë¹éÒ
+home breaking_down_barriers ·ÐÅÒÂÍØ»ÊÃäÊÙè¡ÒþѲ¹ÒẺâÍà¾è¹«ÍÃìÊ
+menu change_my_theme à»ÅÕè¹ Theme
+menu code_snippet_library ¤Åѧâ»Ãá¡ÃÁàÅç¡
+menu contact_us µÔ´µè;ǡàÃÒ
+group developers ¼Ùé¾Ñ²¹Ò
+group developer_info ¢éÍÁÙżÙé¾Ñ²¹Ò
+menu discussion_forums ¡Ãдҹʹ·¹Ò
+menu documentation àÍ¡ÊÒäÙèÁ×Í䫵ì
+frs file_download ´ÒÇâËÅ´
+frs file_monitor à½éÒÊѧࡵ
+frs file_notes ºÑ¹·Ö¡¢éͤÇÒÁ
+frs file_package á¾ç¡à¡¨
+frs file_version ÃØè¹
+group long_bugs µÔ´µÒÁºÑê¡
+group long_cvs ·ÕèÃÇÁ CVS
+group long_docman ¨Ñ´¡ÒÃàÍ¡ÊÒÃ: ¤ÙèÁ×Íâ»Ãਡµì
+group long_forum ¡ÃдҹÊÒ¸ÒóÐ
+group long_ftp ¾×é¹·Õè FTP ¹ÔùÒÁ
+group long_homepage âÎÁྨâ¤Ã§¡ÒÃ
+group long_mail ¨´ËÁÒ¡ÅØèÁ
+group long_news ¢èÒÇÅèÒÊØ´
+group long_patch ¨Ñ´¡ÒÃá¾µªì
+group long_pm ¨Ñ´¡ÒÃÀÒáԨ
+group long_support ºÃÔ¡Ò÷ҧ෤¹Ô¡
+group long_survey ẺÊÓÃǨ
+group short_bugs ºÑê¡
+group short_docman àÍ¡ÊÒÃ
+group short_files Filesgroup short_forum ʹ·¹Ò
+group short_homepage âÎÁྨ
+group short_mail ¨´ËÁÒÂ
+group short_news ¢èÒÇ
+group short_patch á¾µªì
+group short_pm ÀÒáԨ
+group short_summary ÊÃØ»
+group short_support ºÃÔ¡ÒÃ
+group short_survey ÊÓÃǨ
+home highest_ranked_users ¤¹¤Ðá¹¹ÊÙ§ÊØ´
+home about_blurb SourceForge à»ç¹ <B>ºÃÔ¡ÒÿÃÕá¡è¹Ñ¡¾Ñ²¹Ò <A href="http://opensource.thai.net">âÍà¾è¹«ÍÃìÊ</A></B> â´ÂÁÕºÃÔ¡Ò÷ÕèÊдǡáÅдշÕèÊØ´ ·Ñé§ Ãкº CVS, ¨´ËÁÒ¡ÅØèÁ, ÃкºµÔ´µÒÁºÑê¡, ¡Ãдҹʹ·¹Ò, Ãкº¨Ñ´¡ÒÃÀÒáԨ, ãËéà¹×éÍ·ÕèàÇçºä«µì, Ãкº¨Ñ´à¡çºä¿Åì¶ÒÇÃ, ÁÕ¡ÒÃÊÓÃͧä¿Åì·Ñé§ËÁ´, ÃÇÁ·Ñé§ãËéºÃÔËÒÃÃкºµèÒ§ æ ä´é¼èÒ¹àÇ纷Ñé§ËÁ´. <A href="/docman/display_doc.php?docid=753&group_id=1"><font size="-1">[ more ]</font></A> <A href="/docman/display_doc.php?docid=756&group_id=1"><font size="-1">[ FAQ ]</font></A> <BR> <P> <B>¡ÒÃÁÕÊèǹÃèÇÁ áÅлé͹¡ÅѺ¡Ñºä«µì</B> <P> à¾×èÍãËéä´éÃѺ»ÃÐ⪹ì¨Ò¡ SourceForge ÊÙ§ÊØ´, ¤Ø³¨Óà»ç¹µéͧ <A href="/account/register.php">ŧ·ÐàºÕ¹à»ç¹ÊÁҪԡ䫵ì</A>. ¤Ø³¨Ðä´éÃѺ͹ØÒµãËéà¢éÒÁÕÊèǹÃèÇÁàµçÁ·Õèã¹·Ø¡ÊÔ觷ÕèàÃÒÁÕºÃÔ¡ÒÃ. ¤Ø³ÊÒÁÒöà¢éÒªÁ䫵ìä»àÃ×èÍ æ â´ÂäÁè¨Óà»ç¹µéͧŧ·ÐàºÕ¹ áµè¤Ø³ÍÒ¨äÁèÊÒÁÒöà¢éÒãªéºÃÔ¡ÒúҧÍÂèÒ§ä´é¤Ãº·Ñé§ËÁ´. <P> <BR> <B>µÑé§â»Ãਡµì¢Í§¤Ø³àͧ</B> <P> <A href="/account/register.php">ŧ·ÐàºÕ¹à»ç¹ÊÁҪԡ䫵ì</A>, áÅéÇ <A HREF="/account/login.php">ŧºÑ¹·Ö¡à¢éÒ</A> áÅÐÊØ´·éÒ¡ç <A HREF="/register/">µÑé§â»ÃਡµìãËÁè¢Í§¤Ø³àͧ</A>. <P> ¢Íº¤Ø³¤ÃѺ... ¢ÍãËéʹء¡ÑººÃÔ¡ÒâͧàÃÒ.
+frs latest_file_releases ä¿ÅìÍÍ¡ãËÁèÅèÒÊØ´
+menu login ŧºÑ¹·Ö¡à¢éÒ´éÇ SSL
+menu logout ŧºÑ¹·Ö¡ÍÍ¡
+home most_active_this_week µ×è¹µÑÇÊÙ§ÊØ´ã¹ÊÑ»´ÒËì
+menu my_personal_page ˹éÒÊèǹµÑÇ
+menu new_project µÑé§â»ÃਡµìãËÁè
+menu new_releases ªØ´ÍÍ¡ãËÁè
+menu new_user ÊÁѤÃÊÁÒªÔ¡ãËÁè
+menu other_site_mirrors Mirror ·ÕèÍ×è¹ æ
+menu project_admin ºÃÔËÒÃâ»Ãਡµì
+group project_admins ¼Ùé´ÙáÅâ»Ãਡµì
+menu project_help_wanted µéͧ¡Ò乪èÇÂ
+menu project_summary ÊÃØ»â»Ãਡµì
+group public_area ¾×é¹·ÕèÊÒ¸ÒóÐ
+menu search ¤é¹ËÒ
+menu software_map á¼¹·Õè«Í¿µìáÇÃì
+home sourceforge_statistics Ê¶ÔµÔ SourceForge
+menu top_projects â»ÃਡµìÊØ´ÂÍ´
+home top_project_downloads â»Ãਡµì´ÒÇâËÅ´ÊÙ§ÊØ´
+conf content_encoding tis-620
+conf default_font MS Sans Serif,Thonburi,sans-serif
+conf language_code th
+conf language_id 5
Added: trunk/gforge_base/evolvisforge/gforge/www/kernel_traffic.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/kernel_traffic.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/kernel_traffic.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,83 @@
+<?php
+/**
+ *
+ * The Kernel Traffic page
+ *
+ * This page displays the retrieved Kernel Traffic page within a
+ * SourceForge look-and-feel.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: kernel_traffic.php,v 1.4 2001/05/22 21:39:31 pfalcon Exp $
+ * @author: Darrell Brogdon <dbrogdon at valinux.com>
+ *
+ */
+
+
+require_once('pre.php');
+require_once('www/news/news_utils.php');
+require_once('features_boxes.php');
+require_once('cache.php');
+
+/**
+ * getKernelTraffic() - Pull the downloaded contents of Kernel Traffic from the database
+ *
+ * This function mostly exists so we can cache the results.
+ */
+function getKernelTraffic()
+{
+ $sql = "SELECT kt_data FROM kernel_traffic";
+ $res = db_query($sql);
+ return db_result($res,0,0);
+}
+
+//set up the group_id
+$group_id='18435';
+
+//set up a foundry object for reference all over the place
+$foundry=&group_get_object($group_id);
+
+$HTML->header(array('title'=>'Kernel Traffic','group'=>$group_id));
+
+echo' <TABLE cellspacing="0" cellpadding="10" border="0" width="100%">
+ <TR>
+ <TD valign="top" align="left">
+';
+
+echo ' <table><tr><td>'; // Needed to make the formatting show properly
+
+echo cache_display('kerneltraffic','getKernelTraffic()',(24*3600));
+?>
+
+<hr>
+<b>Legal And Historical Notice</b><br>
+<br>
+All KT and KC issues are Copyright their respective authors and released under the GPL.<br>
+<br>
+Linux ® is a registered trademark of Linus Torvalds<br>
+<br>
+Kernel Traffic is copyright © Zack Brown<br>
+<br>
+Kernel Cousins are copyright © their respective authors.<br>
+<br>
+Kernel Traffic and the Cousins are distributed under the terms of the GNU General Public Licence, version 2, or (at your discretion) any later version.<br>
+<br>
+Kernel Traffic and the Cousins will always be indebted to Mark Constable, of http://www.renta.net/, who hosted all of the Kernel Traffic and Kernel Cousin pages at http://www.opensrc.org from January through September 1999. The Open Source movement never had a truer friend.<br>
+<br>
+
+<?php
+
+echo '</TD><TD VALIGN="TOP" WIDTH="30%">';
+
+// Display the sponsor info if any
+echo $foundry->getSponsorHTML1();
+
+// Display the Stat's features boxes on the right
+echo cache_display('foundry'.$group_id.'_features_boxes','foundry_features_boxes()',(24*3600));
+
+echo '</TD></TR></TABLE>';
+
+$HTML->footer(array());
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/my/intelagreement.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/my/intelagreement.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/my/intelagreement.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,197 @@
+<?php
+/**
+ *
+ * SourceForge User's Personal Page
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: intelagreement.php,v 1.16 2001/05/22 18:54:24 pfalcon Exp $
+ *
+ */
+
+
+require_once('pre.php');
+
+if (user_isloggedin()) {
+
+ if ($ACCEPT) {
+ //first delete any prior request
+ db_query("DELETE FROM intel_agreement WHERE user_id='". user_getid() ."'");
+
+ //insert their new request with an is_approved flag=false
+ $sql="INSERT INTO intel_agreement (user_id,message,is_approved) ".
+ "VALUES ('". user_getid() ."','". htmlspecialchars($message) ."','0')";
+ $result=db_query($sql);
+ if (!$result || db_affected_rows($result) < 1) {
+ $feedback .= ' ERROR inserting data ';
+ echo db_error();
+ } else {
+ site_user_header(array('title'=>'Agreement'));
+ echo '<P>
+ <H2>Received</H2>
+ <P>
+ Your request has been received. You will
+ receive an email when it is accepted or rejected';
+ site_user_footer(array());
+ exit;
+ }
+ } else if ($REJECT) {
+ header ("Location: /my/");
+ }
+
+ site_user_header(array('title'=>'Agreement'));
+ html_feedback_top($feedback);
+
+ echo '<P>';
+?>
+<H2>OPEN-SOURCE CLICKWRAP IPLA</H2>
+<P>
+Intel would like to invite you to participate in Intel's efforts to prepare
+software targeted for the Linux operating system running on the Intel(R) Itanium(tm)
+processor by providing you access to software created by Intel and its licensors and
+related documentation and materials (the "Intel Software") and Intel supplied
+equipment ("Intel Equipment") under the following terms and conditions:
+<P>
+1. To the extent that you are using software that is not supplied by Intel and/or
+its licensors such as the Linux operating system and the GCC compiler, this Agreement
+has no effect on your rights and your use of that software is subject to the applicable
+license such as the Gnu General Public License or other applicable license.
+<P>
+2. This license to use the Intel Software and Intel Equipment is being provided to you
+royalty-free, in consideration of your adherence to the other terms and conditions of
+this license. You may distribute software that you create ("Your Software") using this
+equipment through any distribution scheme you wish to use, including distributing Your
+Software under an open source license agreement such as the Gnu General Public License
+or distributing binaries of Your Software for a fee and subject to a different license.
+<P>
+3. You may modify portions of the Intel Software provided by Intel as sample source code
+and incorporate such sample source or modified portions thereof into your programs and
+may distribute Your Software incorporating sample source code or modifications thereof
+under any license agreement of your choosing. You may not reverse engineer, decompile,
+license or disassemble portions of any Intel Software provided in object code form.
+<P>
+4. Since the Intel Equipment that you are using is pre-release hardware and incorporates
+pre-release software and is configured to permit multiple people to test code on the
+equipment, this equipment will not generate reliable benchmarking data. I understand
+that no reliable benchmarking data can be generated on the Intel Equipment. Therefore,
+you agree that you will not disclose publicly or share with any third party any
+benchmarks generated using the Intel Equpment and/or Intel Software.
+<P>
+5. The Intel Software provided in binary form contains confidential information of Intel
+regarding technical aspects of the Itanium processor. You must use the same degree of
+care to protect this confidential information of Intel that you use to protect your own
+confidential information, but no less than a reasonable degree of care. You must
+restrict access to the Intel Software provided in binary form to your employees who have
+executed written agreements with you obligating them to protect confidential information
+as required under this paragraph. The obligations of this paragraph do not apply to any
+information that is or becomes published by Intel without restriction, or otherwise
+becomes rightfully available to the public other than by breach of confidentiality
+obligation to Intel.
+<P>
+6. THE SOFTWARE AND EQUIPMENT IS PROVIDED BY INTEL AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL INTEL BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+<P>
+7. You may provide to Intel additional feedback regarding the Intel Software and/or the
+Intel Equipment, including suggested enhancements or modifications to the Software or
+related materials. To the extent that you provide feedback to Intel, you agree that Intel
+shall have no use or confidentiality restrictions on such feedback.
+<P>
+8. Intel retains all ownership of the Intel Software. No other rights or licenses are given
+to you, except as expressly provided in this license. Upon termination, you agree to destroy
+all copies of the Intel Software in your possession other than Intel Software that you
+incorporated into Your Software as permitted under paragraph 2.
+<P>
+9. You shall comply with all US Export Regulations governing the Intel Software and Intel
+Equipment. You shall not sell or otherwise transfer the Intel Software or any confidential
+information of Intel to any person or any entity listed on a denial order published by the
+US Government. You understand that this requirement is imposed for all transactions,
+including sales, servicing, and training. You hereby certify that you are not involved in
+nuclear, missile, chemical and/or biological weapons activities in violation of US Export
+Regulations.
+<P>
+10. U.S. GOVERNMENT RESTRICTED RIGHTS: The Materials are provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as set forth in
+FAR52.227-14 and DFAR252.227-7013 et seq. or its successor. Use of the Materials by the
+Government constitutes acknowledgment of Intel's proprietary rights in them.
+<P>
+11. USER SUBMISSIONS: Any material, information or other communication you transmit or post
+to this Site will be considered non-confidential and non-proprietary ("Communications").
+Intel will have no obligations with respect to the Communications. Intel and its designees
+will be free to copy, disclose, distribute, incorporate and otherwise use the Communications
+and all data, images, sounds, text, and other things embodied therein for any and all commercial
+or non-commercial purposes. You are prohibited from posting or transmitting to or from this
+Site any unlawful, threatening, libelous, defamatory, obscene, pornographic, or other material
+that would violate any law.
+<P>
+12. USER CHAT ROOMS: Intel may, but is not obligated to, monitor or review any areas on the
+Site where users transmit or post Communications or communicate solely with each other,
+including but not limited to chat rooms, bulletin boards or other user forums, and the content
+of any such Communications. Intel, however, will have no liability related to the content of
+any such Communications, whether or not arising under the laws of copyright, libel, privacy,
+obscenity, or otherwise.
+<P>
+13. USE OF PERSONALLY IDENTIFIABLE INFORMATION: Information submitted to Intel through forms
+on the website is governed according to Intel's Electronic Personal Information Privacy Policy
+(http://www.intel.com/sites/corporate/privacy.htm.)
+<P>
+14. LINKS TO OTHER MATERIALS: The linked sites are not under the control of Intel and Intel is
+not responsible for the content of any linked site or any link contained in a linked site.
+Intel reserves the right to terminate any link or linking program at any time. Intel does not
+endorse companies or products to which it links and reserves the right to note as such on its
+web pages. If you decide to access any of the third party sites linked to this Site, you do
+this entirely at your own risk.
+<P>
+15. APPLICABLE LAWS: This site is controlled by Intel from its offices within the United
+States of America. Intel makes no representation that Materials in the site are appropriate or
+available for use in other locations, and access to them from territories where their content
+is illegal is prohibited. Those who choose to access this site from other locations do so on
+their own initiative and are responsible for compliance with applicable local laws. You may not
+use or export the Materials in violation of U.S. export laws and regulations. Any claim relating
+to the Materials shall be governed by the internal substantive laws of the State of Delaware.
+<P>
+16. GENERAL: Intel may revise these Terms at any time by updating this posting. You should
+visit this page from time to time to review the then-current Terms because they are binding on
+you. Certain provisions of these Terms may be superseded by expressly designated legal notices
+or terms located on particular pages at this Site.
+<P>
+17. This license forms the entire agreement between you and Intel with respect to the subject
+matter hereof, and may only be amended in writing by authorized representatives of both parties.
+The failure of either party to enforce any rights resulting from breach will not be deemed a
+waiver. This license shall be governed by, subject to, and construed according to the laws of
+the United States and the State of Delaware, excluding its conflicts of laws provisions. If the
+Software is used outside the United States of America, you agree that all disputes regarding
+this license and the Software shall be referred to the United States District Court for Delaware
+or, if there is no federal jurisdiction, to the applicable state court in Delaware.
+<P>
+18. You are not required to accept this agreement, since you have not signed it. However, nothing
+else grants you permission to use the Intel Software or Intel Equipment. Therefore, by using the
+Intel Equipment or Intel Software, you indicate your acceptance of this agreement to do so, and
+all its terms and conditions for using the Intel Software and Intel Equipment.
+<P>
+<?php
+ echo '
+ <FORM ACTION="'. $PHP_SELF .'" METHOD="POST">
+ <B>Enter A Brief description of the work you would like to do on the Itanium(tm) processor prototype machines:</B><BR>
+ <TEXTAREA NAME="message" ROWS="20" COLS="60" WRAP="SOFT"></TEXTAREA>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="ACCEPT" VALUE="Yes - I Agree">
+ <INPUT TYPE="SUBMIT" NAME="REJECT" VALUE="No - I Don\'t Agree">
+ </FORM>';
+
+ site_user_footer(array());
+
+} else {
+
+ exit_not_logged_in();
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/news/admin/news_admin_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/news/admin/news_admin_utils.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/news/admin/news_admin_utils.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,114 @@
+<?php
+/**
+ *
+ * SourceForge News Facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+function show_news_approve_form($sql_pending, $sql_rejected, $sql_approved) {
+
+ /*
+ Show list of waiting news items
+ */
+
+ // function to show single news item
+ // factored out because called 3 time below
+ function show_news_item($result,$i,$approved,$selectable) {
+
+ global $PHP_SELF;
+
+ echo '<tr bgcolor="'.html_get_alt_row_color($i).'"><td>';
+ if ($selectable) {
+ echo '<input type="checkbox" '
+ .'name="news_id[]" value="'
+ .db_result($result, $i, 'id').'">';
+ }
+ echo date('Y-m-d', db_result($result,$i,'date')).'</td>
+ <td>';
+ echo '
+ <a href="'.$PHP_SELF.'?approve=1&id='.db_result($result,$i,'id').'">'.db_result($result,$i,'summary').'</A>
+ </td>
+
+ <td>
+ <a href="/projects/'
+ .db_result($result,$i,'unix_group_name').'/">'
+ .db_result($result,$i,'group_name')
+ .' ('.db_result($result,$i,'unix_group_name').')'
+ .'</a>
+ </td>
+ </tr>'
+ ;
+ }
+
+ $title_arr=array();
+ $title_arr[]='Date';
+ $title_arr[]='Title';
+ $title_arr[]='Project';
+
+ $result=db_query($sql_pending);
+ $rows=db_numrows($result);
+
+ echo '<form ACTION="'. $PHP_SELF .'" METHOD="POST">';
+ echo '<input type="hidden" name="mass_reject" value="1">';
+ echo '<input type="hidden" name="post_changes" value="y">';
+
+ if ($rows < 1) {
+ echo '
+ <H4>No Queued Items Found</H4>';
+ } else {
+ echo '<H4>These items need to be approved (total: '.$rows.')</H4>';
+ echo html_build_list_table_top($title_arr);
+ for ($i=0; $i<$rows; $i++) {
+ show_news_item($result,$i,false,true);
+ }
+ echo '</table>';
+ echo '<br><input type="submit" name="submit" value="Reject Selected">';
+ }
+ echo '</form>';
+
+ /*
+ Show list of rejected news items for this week
+ */
+
+ $result=db_query($sql_rejected);
+ $rows=db_numrows($result);
+ if ($rows < 1) {
+ echo '
+ <H4>No rejected items found for this week</H4>';
+ } else {
+ echo '<H4>These items were rejected this past week (total: '.$rows.')</H4>';
+ echo html_build_list_table_top($title_arr);
+ for ($i=0; $i<$rows; $i++) {
+ show_news_item($result,$i,false,false);
+ }
+ echo '</table>';
+ }
+
+ /*
+ Show list of approved news items for this week
+ */
+
+ $result=db_query($sql_approved);
+ $rows=db_numrows($result);
+ if ($rows < 1) {
+ echo '
+ <H4>No approved items found for this week</H4>';
+ } else {
+ echo '<H4>These items were approved this past week (total: '.$rows.')</H4>';
+ echo html_build_list_table_top($title_arr);
+ for ($i=0; $i<$rows; $i++) {
+ show_news_item($result,$i,true,false);
+ }
+ echo '</table>';
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/project/admin/database.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/project/admin/database.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/project/admin/database.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,241 @@
+<?php
+/**
+ *
+ * Project Admin page to manage group's databases
+ *
+ * This page allows to request, change password of, and delete database.
+ * Group may have single database of each type that provided (e.g., mysql,
+ * pgsql, etc).
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('common/include/vars.php');
+require_once('www/project/admin/project_admin_utils.php');
+
+session_require(array('group'=>$group_id,'admin_flags'=>'A'));
+
+$group =& group_get_object($group_id);
+exit_assert_object($group, 'Group');
+
+if ($createdb) {
+
+ //mysql takes issue with database names that have dashes in them - so strip the dashes, replace with ""
+ //e.g. free-mysql becomes freemysql (it's a workaround)
+ //if there is a dash in the groupname
+ $dbname = str_replace("-", "", $group->getUnixName());
+
+ //check there is no name double up - if there is - add an incrementing to the number to the end
+
+ $dbname = prdb_namespace_seek($dbname);
+ $randompw = random_pwgen();
+
+ $res = db_query("
+ INSERT INTO prdb_dbs(group_id,dbname,dbusername,dbuserpass,requestdate,dbtype,created_by,state)
+ VALUES($group_id,'$dbname','$dbname','$randompw','".time()."',$newdbtypeid,".$LUSER->getID().",2)
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= 'Cannot add database entry: '.db_error();
+ } else {
+
+ $feedback .= "Database scheduled for creation.";
+ group_add_history('Created database '.$dbname.' type '.$row_db['dbsoftware'].' ','',$group_id);
+
+ }
+
+}
+
+if ($updatedbrec) {
+
+ if ($pw == $pwconfirm) {
+
+ //sync new password, and flag it as 'pending (an) update'
+
+ $res = db_query("
+ UPDATE prdb_dbs
+ SET dbuserpass = '$pw',
+ state = '4'
+ WHERE dbid = '$dbid'
+ AND group_id = '$group_id'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= "Update failure - ".db_error()."";
+ } else {
+ $res = db_query("
+ SELECT *
+ FROM prdb_types
+ WHERE dbtypeid='$newdbtypeid'
+ ");
+ $row_db = db_fetch_array($res);
+ group_add_history('Updated database - (type: '.$row_db['dbsoftware'].')','',$group_id);
+ }
+ } else {
+
+ $feedback .= "Operation failed. Password and Password Confirm are not the same";
+
+ }
+
+}
+
+if ($deletedbconfirm) {
+
+ //schedule for deletion
+
+ $res = db_query("
+ UPDATE prdb_dbs
+ SET state=3
+ WHERE dbid='$dbid'
+ AND group_id='$group_id'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= 'Cannot delete database: '.db_error();
+ } else {
+ $feedback .= "Database scheduled for deletion";
+ }
+
+}
+
+project_admin_header(array('title'=>'Editing Database Info','group'=>$group_id,'pagename'=>'project_admin_database','sectionvals'=>array(group_getname($group_id))));
+
+if ($deletedb == 1) {
+
+ print "<hr><b><center>Click to confirm deletion [ <a href=\"".$PHP_SELF."?deletedbconfirm=1&group_id=".$group_id."&dbid=$dbid\">CONFIRM DELETE</a> ] </center></b> <hr>";
+
+}
+
+$res_db = db_query("
+ SELECT *
+ FROM prdb_types
+ WHERE dbsoftware NOT IN (
+ SELECT dbsoftware
+ FROM prdb_dbs,prdb_types
+ WHERE dbtypeid=dbtype
+ AND group_id='$group_id'
+ AND state IN (1,2,4)
+ )
+");
+
+if (db_numrows($res_db) > 0) {
+
+ print '
+
+ <p>
+
+ <b><u>Add New Database</u></b>
+ <p>
+ <i>Clicking on "create" will schedule the creation of the database, and email the
+ details to the project administrators.</i>
+
+ <p>
+ <b>Database Type:</b>
+ <p>
+
+ <FORM action="'.$PHP_SELF.'" method="post">
+ <INPUT type="hidden" name="createdb" value="1">
+ <INPUT type="hidden" name="group_id" value="'.$group_id.'">
+
+ <select name="newdbtypeid">
+
+ ';
+
+ while ($res_row = db_fetch_array($res_db)) {
+
+ print "<option value=\"".$res_row['dbtypeid']."\">".$res_row['dbsoftware']."</option>";
+ }
+
+ print '
+
+ </select>
+
+ <INPUT type="submit" name="Create" value="Create">
+
+ </p>
+ </form>
+ ';
+
+} else {
+?>
+
+Documentation: <a href="https://sourceforge.net/docman/display_doc.php?docid=3052&group_id=1">Basic MySQL database access</a><p>
+Maximum number of databases of all types have been allocated. <p>
+
+<?php
+}
+
+$res_db = db_query("
+ SELECT *
+ FROM prdb_dbs,prdb_states,prdb_types
+ WHERE group_id='$group_id'
+ AND stateid=state
+ AND dbtype=dbtypeid
+");
+
+if (db_numrows($res_db) > 0) {
+
+ $title=array();
+ $title[]='DB Type';
+ $title[]='State';
+ $title[]='New Password';
+ $title[]='Confirm New';
+ $title[]='Operations';
+
+ echo html_build_list_table_top($title);
+
+ while ($row_db = db_fetch_array($res_db)) {
+
+ print '
+ <tr bgcolor="'.html_get_alt_row_color($i++).'">
+
+ <td>'.$row_db['dbsoftware'].'</td>
+ <td>'.$row_db['statename'].'</td>
+ ';
+
+ //if database is active or pending update allow the record to be deleted or password changed
+
+ if (($row_db['state'] == 1) || ($row_db['state'] == 4) || ($row_db['state'] == 2)) {
+
+ print '<form name="dbupdate" method="POST" action="'.$PHP_SELF.'?group_id='.$group_id.'">
+ <input type="hidden" name="dbid" value="'.$row_db['dbid'].'">
+ <input type="hidden" name="updatedbrec" value="1">
+ <td><input type="text" name="pw" size="8" maxlength="16"> </td>
+ <td><input type="text" name="pwconfirm" size="8" maxlength="16"> </td>
+ <td>
+ <input type="submit" name="submit" value="Update">
+ </td>
+ </form>
+ ';
+
+ } else {
+ print '
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ ';
+ }
+
+ print '</tr>';
+
+ }
+
+
+ print '</table>';
+
+} else {
+
+ print '<b><u>Current Databases</u></b><p>There are no databases currently allocated to this group.';
+
+}
+
+project_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/project/admin/rmuser.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/project/admin/rmuser.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/project/admin/rmuser.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,87 @@
+<?php
+/**
+ *
+ * Group Admin page to confirm removal of user from group
+ *
+ * This page is called from Project/Foundry Admins when admin requests
+ * removal of a developer. This page checks whether it is possible
+ * to remove one, if no, shows decription why not, else presents
+ * admin with the confirmation form. Results of this form are submitted
+ * back to calling Project/Foundry Admin page (i.e. very removal is
+ * performed there). Since Project/Foundry Admins use slightly different
+ * parameter passing interface, there's a bit of dirty magic here.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('pre.php');
+require_once('www/project/admin/project_admin_utils.php');
+
+session_require(array('group'=>$group_id));
+
+$group =& group_get_object($group_id);
+exit_assert_object($group, 'Group');
+
+// Do some text substitutions below
+if ($group->getType()==2) {
+ $type = 'foundry';
+ // foundries hate explicit group_id
+ $passed_group_id = '';
+} else {
+ $type = 'project';
+ $passed_group_id = '<input type="hidden" name="group_id" value="'.$group_id.'">';
+}
+
+// Need to check if user being removed is admin
+$rm_user =& user_get_object($rm_id);
+exit_assert_object($rm_user, 'User');
+$perm = $group->getPermission($rm_user);
+
+if ($perm->isAdmin()) {
+ exit_error(
+ 'Operation Not Permitted',
+ 'You cannot remove '.$type.' admin.'
+ );
+}
+
+
+project_admin_header(array('title'=>"Project Admin: ".group_getname($group_id),'group'=>$group_id));
+
+?>
+
+<h3>Removing Developer from <?php echo ucfirst($type); ?></h3>
+<p>
+You are about to remove developer from the <?php echo $type; ?>. Please
+confirm your action:
+</p>
+
+<table>
+<tr><td>
+
+<form action="<?php echo $return_to; ?>" method="POST">
+<input type="hidden" name="func" value="rmuser">
+<?php echo $passed_group_id; ?>
+<input type="hidden" name="rm_id" value="<?php echo $rm_id; ?>">
+<input type="submit" value="Remove">
+</form>
+
+</td><td>
+
+<form action="<?php echo $return_to; ?>" method="GET">
+<?php echo $passed_group_id; ?>
+<input type="submit" value="Cancel">
+</form>
+
+</td></tr>
+</table>
+
+<?php
+
+project_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/project/admin/userpermedit.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/project/admin/userpermedit.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/project/admin/userpermedit.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,369 @@
+<?php
+/**
+ *
+ * Project Admin page to edit permissions for the specific group member
+ *
+ * This page is linked from userperms.php and from forms to add users
+ * to group (located on Project/Foundry Admin main pages).
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('www/project/admin/project_admin_utils.php');
+require_once('common/tracker/ArtifactType.class');
+
+session_require(array('group'=>$group_id,'admin_flags'=>'A'));
+
+// Builds role selection box with given selected item
+function member_role_box($name, $checked) {
+ global $member_roles;
+ if (!$member_roles) {
+ $sql="SELECT category_id,name FROM people_job_category";
+ $member_roles=db_query($sql);
+ }
+ return html_build_select_box($member_roles,$name,$checked,true,'Undefined');
+}
+
+// Since there're lot of permissions, and each of them has complex
+// HTML rendition (SELECT boxes, etc.), this function is used to reduce
+// the background noise.
+function render_row($name, $val, $i) {
+ print '
+ <tr bgcolor="'.html_get_alt_row_color($i).'">
+ <td>'.$name.'</td>
+ <td>'.$val.'</td></tr>
+ ';
+}
+
+$group =& group_get_object($group_id);
+exit_assert_object($group, 'Group');
+
+// ########################### form submission, make updates
+
+// Netscape allows to submit single-field form by pressing
+// Return in the field. In this case, it won't set value for
+// submit button
+if ($submit || $form_unix_name) {
+
+
+ if ($GLOBALS['func']=='adduser') {
+
+ /*
+ We came here from Add User page, need to add user
+ and fall thru to show permissions for one
+ */
+
+ $u =& user_get_object_by_name($form_unix_name);
+ if (!$u || !is_object($u)){
+ exit_error(
+ 'Invalid user',
+ 'User does not exist.'
+ );
+ }
+
+ if (!$group->addUser($u->getUnixName())) {
+ exit_error('Error', $u->getErrorMessage());
+ } else {
+ $feedback = ' User Added Successfully<br>';
+ }
+
+ $user_id = $u->getID();
+
+ } elseif ($addtotracker) {
+
+ $u =& user_get_object($user_id);
+ exit_assert_object($u, 'User');
+
+ //
+ // if "add all" option, get list of ArtifactTypes
+ // that this user is not already a member of
+ //
+ if ($add_all) {
+ $sql="SELECT group_artifact_id
+ FROM artifact_group_list
+ WHERE group_id='$group_id'
+ AND NOT EXISTS (SELECT user_id
+ FROM artifact_perm
+ WHERE artifact_perm.group_artifact_id=artifact_group_list.group_artifact_id
+ AND user_id='".$u->getID()."')";
+
+ $addtoids = util_result_column_to_array(db_query($sql));
+ }
+
+ //
+ // Now take the array of ids and add this user to them
+ //
+ $count = count($addtoids);
+
+ for ($i=0; $i<$count; $i++) {
+ $ath = new ArtifactType($group,$addtoids[$i]);
+
+ $ath->addUser($u->getID());
+ if ($ath->isError()) {
+ $feedback .= $addtoids[$i] .': '. $ath->getErrorMessage();
+ $was_error = true;
+ }
+ }
+
+ } else {
+
+ /*
+ Else, we are updating user's permissions
+ */
+
+ $u =& user_get_object($user_id);
+ exit_assert_object($u, 'User');
+
+ // XXX: remove when CVS roles will be activated!
+ $cvs_flags = 1;
+
+ //call to control function in the $Group object
+ if ($group->updateUser($user_id,
+ $admin_flags, $bug_flags, $forum_flags,
+ $project_flags, $patch_flags, $support_flags,
+ $doc_flags, $cvs_flags, $release_flags,
+ $member_role, $artifact_flags)) {
+
+ group_add_history ('Changed Permissions for',$u->getUnixName(),$group_id);
+
+
+ //
+ // Delete the checked ids
+ //
+
+ // keep an assoc array of artifacts this user
+ // was removed from, so we don't then try to update
+ // those artifact type perms in the next step
+ $del_arr=array();
+
+ $count=count($deletefrom);
+ for ($i=0; $i<$count; $i++) {
+ $del_arr["$deletefrom[$i]"]=true;
+ $ath = new ArtifactType($group,$deletefrom[$i]);
+ $ath->deleteUser($user_id);
+ if ($ath->isError()) {
+ $feedback .= $deletefrom[$i] .': '. $ath->getErrorMessage();
+ $was_error=true;
+ }
+ }
+
+ //
+ // Handle the 2-D array of group_artifact_id/permission level
+ //
+ $count=count($updateperms);
+
+ for ($i=0; $i<$count; $i++) {
+ //
+ // quick check of that assoc array to prevent
+ // updating of perms that don't exist anymore
+ //
+ if (!$del_arr["$updateperms[$i][0]"]) {
+ $ath = new ArtifactType($group,$updateperms[$i][0]);
+ $ath->updateUser($user_id,$updateperms[$i][1]);
+ if ($ath->isError()) {
+ $feedback .= $updateperms[$i][0] .': '. $ath->getErrorMessage();
+ $was_error=true;
+ }
+ }
+ }
+
+ //if no errors occurred, show just one feedback message
+ //instead of the coredump of messages;
+ if (!$was_error) {
+ $feedback = ' Permissions Updated<br>';
+ }
+ } else {
+ $feedback .= $group->getErrorMessage();
+ }
+
+ }
+
+} else {
+ //
+ // Set up this user's object
+ //
+ $u =& user_get_object($user_id);
+ if (!$u || !is_object($u)) {
+ exit_error('Error', 'Error creating user object');
+ } else if ($u->isError()) {
+ exit_error('Error', $u->getErrorMessage());
+ }
+}
+
+project_admin_header(array('title'=>'Project Developer Permissions','group'=>$group_id,'pagename'=>'project_admin_userpermedit','sectionvals'=>array(group_getname($group_id))));
+
+// Show description of roles/permissions
+echo permissions_blurb();
+
+$res_dev = db_query("
+ SELECT *
+ FROM user_group
+ WHERE group_id='$group_id'
+ AND user_id='$user_id'
+");
+
+if (!$res_dev || db_numrows($res_dev) < 1) {
+ echo '<H2>Developer Not Found In This Group</H2>';
+ echo db_error();
+} else {
+ echo '
+ <P>
+ <FORM action="'.$PHP_SELF.'?group_id='.$group_id.'&user_id='. $user_id .'" method="post">';
+
+ $row_dev = db_fetch_array($res_dev);
+
+ $arr=array();
+ $arr[]='Property';
+ $arr[]='Value';
+
+ echo html_build_list_table_top($arr);
+
+ render_row(
+ 'Project role',
+ member_role_box('member_role',$row_dev['member_role']),
+ $i++
+ );
+
+ render_row(
+ 'Project Admin',
+ html_build_checkbox('admin_flags', 'A', stristr($row_dev['admin_flags'],'A')),
+ $i++
+ );
+
+ render_row(
+ 'Release Technician',
+ html_build_checkbox('release_flags', '1', $row_dev['release_flags']==1),
+ $i++
+ );
+
+/*
+ render_row(
+ 'CVS Access',
+ html_build_select_box_from_arrays(
+ array(0,1,2),
+ array('Read-only','Write','Admin'),
+ 'cvs_flags',$row_dev['cvs_flags'],false
+ ),
+ $i++
+ );
+*/
+
+ render_row(
+ 'Tracker Manager',
+ html_build_select_box_from_arrays(
+ array(0,2),
+ array('-','Admin'),
+ 'artifact_flags',$row_dev['artifact_flags'],false
+ ),
+ $i++
+ );
+
+ $tracker_ids = array(0,1,2,3);
+ $tracker_texts = array('-','Technician','Admin & Tech','Admin');
+
+ render_row(
+ 'Project/Task Manager',
+ html_build_select_box_from_arrays(
+ $tracker_ids,
+ $tracker_texts,
+ 'project_flags',$row_dev['project_flags'],false
+ ),
+ $i++
+ );
+
+ render_row(
+ 'Forums',
+ html_build_select_box_from_arrays(
+ array(0,2),
+ array('-','Moderator'),
+ 'forum_flags',$row_dev['forum_flags'],false
+ ),
+ $i++
+ );
+
+ render_row(
+ 'Documentation Manager',
+ html_build_select_box_from_arrays(
+ array(0,1),
+ array('-','Editor'),
+ 'doc_flags',$row_dev['doc_flags'],false
+ ),
+ $i++
+ );
+
+ //
+ // Get the list of permissions that this user has
+ // for ArtifactTypes in this Group
+ //
+ $res = db_query("SELECT * FROM artifactperm_artgrouplist_vw
+ WHERE user_id='$user_id'
+ AND group_id='$group_id'");
+
+ $rows=db_numrows($res);
+
+ // Iterate over all trackers of the group
+ for ($i=0; $i<$rows; $i++) {
+ print '
+ <INPUT TYPE="HIDDEN" NAME="updateperms['.$i.'][0]" VALUE="'. db_result($res,$i,'group_artifact_id').'">
+ <TR BGCOLOR="'. html_get_alt_row_color($i) .'">
+
+ <TD>'. db_result($res,$i,'name') .'</TD>
+
+ <TD><FONT size="-1"><SELECT name="updateperms['.$i.'][1]">
+ <OPTION value="0"'.((db_result($res,$i,'perm_level')==0)?' selected':'').'>-
+ <OPTION value="1"'.((db_result($res,$i,'perm_level')==1)?' selected':'').'>Technician
+ <OPTION value="2"'.((db_result($res,$i,'perm_level')==2)?' selected':'').'>Tech & Admin
+ <OPTION value="3"'.((db_result($res,$i,'perm_level')==3)?' selected':'').'>Admin Only
+ </SELECT></FONT> <INPUT TYPE="CHECKBOX" NAME="deletefrom[]" VALUE="'. db_result($res,$i,'group_artifact_id').'"> Remove</TD>
+
+ </TR>';
+ }
+
+ ?>
+
+ <TR><TD COLSPAN=2><p align="center">
+ <INPUT type="submit" name="submit" value="Update Developer Permissions">
+ <INPUT type="reset" value="Reset Changes">
+ </FORM>
+ </TD></TR>
+
+ </TABLE>
+
+ <P>
+ <h3>Add User To These Trackers:</H3>
+ <P>
+ You can pick and choose which trackers this user has any privileges in,
+ or simply add the user to all trackers by checking "Add To All".
+ <P>
+ <CENTER>
+ <FORM action="<?php echo $PHP_SELF.'?group_id='.$group_id.'&user_id='.$user_id ?>" method="post">
+ <INPUT TYPE="HIDDEN" NAME="addtotracker" VALUE="y">
+ <?php
+ $sql="SELECT group_artifact_id,name
+ FROM artifact_group_list
+ WHERE group_id='$group_id'
+ AND NOT EXISTS (SELECT user_id
+ FROM artifact_perm
+ WHERE artifact_perm.group_artifact_id=artifact_group_list.group_artifact_id
+ AND user_id='$user_id')";
+
+ $res=db_query($sql);
+ echo db_error();
+ echo html_build_multiple_select_box ($res,'addtoids[]',array(),8,false);
+ echo '<P>
+ <INPUT type="submit" name="submit" value="Add To Tracker"> <INPUT type="checkbox" name="add_all"> Add To All
+ </FORM>
+ </CENTER>';
+
+}
+
+project_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/project/admin/vhost.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/project/admin/vhost.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/project/admin/vhost.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,149 @@
+<?php
+/**
+ *
+ * Project Admin page to manage group's VHOST entries
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('common/include/vars.php');
+require_once('www/project/admin/project_admin_utils.php');
+
+session_require(array('group'=>$group_id,'admin_flags'=>'A'));
+
+$group = &group_get_object($group_id);
+
+if (!$group || !is_object($group)) {
+ exit_error('Error','Error creating group object');
+} else if ($group->isError()) {
+ exit_error('ERROR',$group->getErrorMessage());
+}
+
+if ($createvhost) {
+
+ $homedir = account_group_homedir($group->getUnixName());
+ $docdir = $homedir.'/htdocs/';
+ $cgidir = $homedir.'/cgi-bin/';
+
+ if (valid_hostname($vhost_name)) {
+
+ $res = db_query("
+ INSERT INTO prweb_vhost(vhost_name, docdir, cgidir, group_id)
+ values ('$vhost_name','$docdir','$cgidir',".$group->getID().")
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= "Cannot insert VHOST entry: ".db_error();
+ } else {
+ $feedback .= "Virtual Host scheduled for creation.";
+ $group->addHistory('Added vhost '.$vhost_name.' ','');
+ }
+
+ } else {
+
+ $feedback .= "Not a valid hostname - $vhost_name";
+
+ }
+}
+
+
+if ($deletevhost) {
+
+ //schedule for deletion
+
+ $res = db_query("
+ SELECT *
+ FROM prweb_vhost
+ WHERE vhostid='$vhostid'
+ ");
+
+ $row_vh = db_fetch_array($res);
+
+ $res = db_query("
+ DELETE FROM prweb_vhost
+ WHERE vhostid='$vhostid'
+ AND group_id='$group_id'
+ ");
+
+ if (!$res || db_affected_rows($res) < 1) {
+ $feedback .= "Could not delete VHOST entry:".db_error();
+ } else {
+ $feedback .= "VHOST deleted";
+ $group->addHistory('Virtual Host '.$row_vh['vhost_name'].' Removed','');
+
+ }
+
+}
+
+project_admin_header(array('title'=>'Editing Virtual Host Info','group'=>$group->getID(),'pagename'=>'project_admin_vhost','sectionvals'=>array(group_getname($group_id))));
+
+?>
+
+<p>
+
+<b><u>Add New Virtual Host</u></b>
+<p>
+To add a new virtual host - simply point a <b>CNAME</b> for <i>yourhost.org</i> at
+<b>usw-pr-vhost.sourceforge.net</b>. SourceForge does not currently host mail (i.e. cannot be an MX)
+or DNS</b>.
+<p>
+Clicking on "create" will schedule the creation of the Virtual Host. This will be
+synced to the project webservers - such that <i>yourhost.org</i> will display the
+material at <i><?php echo $group->getUnixName(); ?>.sourceforge.net</i>.
+
+<p>
+
+<form name="new_vhost" action="<?php echo $PHP_SELF.'?group_id='.$group->getID().'&createvhost=1'; ?>" method="post">
+<table border = 0>
+<tr>
+ <td> New Virtual Host <i>(e.g. vhost.org)</i> </td>
+ <td> <input type="text" size="15" maxlength="255" name="vhost_name"> </td>
+ <td> <input type="submit" value="Create"> </td>
+</tr>
+</table>
+</form>
+
+<?php
+
+$res_db = db_query("
+ SELECT *
+ FROM prweb_vhost
+ WHERE group_id='".$group->getID()."'
+");
+
+if (db_numrows($res_db) > 0) {
+
+ print '<table width="50%"><tr><td>';
+
+ $title=array();
+ $title[]='Virtual Host';
+ $title[]='Operations';
+ echo html_build_list_table_top($title);
+
+ while ($row_db = db_fetch_array($res_db)) {
+
+ print ' <tr>
+ <td>'.$row_db['vhost_name'].'</td>
+ <td>[ <b><a href="'.$PHP_SELF.'?group_id='.$group->getID().'&vhostid='.$row_db['vhostid'].'&deletevhost=1">Delete</a> </b>]
+ </tr>
+ ';
+
+ }
+ print ' </table>';
+
+ print '</td></tr></table>';
+
+} else {
+ echo '<p>No VHOSTs defined</p>';
+}
+
+project_admin_footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/register/projectinfo.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/register/projectinfo.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/register/projectinfo.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,294 @@
+<?php
+/**
+ *
+ * Project Registration: Project Information.
+ *
+ * This page is used to request data required for project registration:
+ * o Project Public Name
+ * o Project Registartion Purpose
+ * o Project License
+ * o Project Public Description
+ * o Project Unix Name
+ * All these data are more or less strictly validated.
+ *
+ * This is last page in registartion sequence. Its successful subsmission
+ * leads to creation of new group with Pending status, suitable for approval.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('common/include/vars.php');
+
+session_require(array('isloggedin'=>'1'));
+
+if ($submit) {
+ $full_name = trim($full_name);
+ $purpose = trim($purpose);
+ $license_other = trim($license_other);
+ $description = trim($description);
+ $unix_name = strtolower($unix_name);
+
+ /*
+ Fierce validation
+ */
+
+ if (strlen($full_name)<3) {
+ $feedback .= "Invalid Full Name";
+ } else if (!account_groupnamevalid($unix_name)) {
+ $feedback .= "Invalid Unix Name";
+ } else if (db_numrows(db_query("SELECT group_id FROM groups WHERE unix_group_name='$unix_name'")) > 0) {
+ $feedback .= "Unix group name already taken";
+ } else if (strlen($purpose)<20) {
+ $feedback .= "Please describe your
+ Registration Purpose in a more comprehensive manner";
+ } else if (strlen($description)<10) {
+ $feedback .= "Please use more comprehensive Project Description";
+ } else if (!$license) {
+ $feedback .= "You have not chosen a license";
+ } else if ($license!="other" && $license_other) {
+ $feedback .= "Conflicting licenses choice";
+ } else if ($license=="other" && strlen($license_other)<50) {
+ $feedback .= "Please give more comprehensive licensing description";
+ } else {
+ $group = new Group();
+ $u =& session_get_user();
+ $res = $group->create(
+ $u,
+ $full_name,
+ $unix_name,
+ $description,
+ $license,
+ $license_other,
+ $purpose
+ );
+
+ if (!$res) {
+ $feedback .= $group->getErrorMessage();
+ } else {
+ $HTML->header(array('title'=>'Registration Complete','pagename'=>'register_complete'));
+
+ ?>
+
+ <p>Your project has been submitted to the SourceForge admininstrators.
+ Within 72 hours, you will receive decision notification and further
+ instructions.
+ </p>
+ <p>
+ Thank you for choosing SourceForge.
+ </p>
+
+ <?php
+
+ $HTML->footer(array());
+ exit();
+ }
+
+ }
+} else if ($i_disagree) {
+ session_redirect("/");
+}
+
+site_header(array('title'=>'Project Information','pagename'=>'register_projectinfo'));
+?>
+
+<p>
+To apply for project registration, you should fill in basic information
+about it. Please read descriptions below carefully and provide complete
+and comprehensive data. All fields below are mandatory.
+</p>
+
+<form action="<?php echo $PHP_SELF; ?>" method="POST">
+
+<H3>1. Project Full Name</H3>
+
+
+<p>
+You should start with specifying the name of your project.
+The "Full Name" is descriptive, and has no arbitrary restrictions (except
+a 40 character limit).
+</p>
+
+
+Full Name:
+<BR>
+<INPUT size="40" maxlength="40" type=text name="full_name" value="<?php echo $full_name; ?>">
+
+<H3>2. Project Purpose and Summarization</H3>
+<P>
+<B></B>
+<P>
+<b>
+Please provide detailed, accurate description of your project and
+what SourceForge resources and in which way you plan to use. This
+description will be the basis for the approval or rejection of
+your project's hosting on SourceForge, and later, to ensure that
+you are using the services in the intended way. This description
+will not be used as a public description of your project. It must
+be written in English.
+</b>
+<P>
+<font size="-1">
+<TEXTAREA name="purpose" wrap="virtual" cols="70" rows="10">
+<?php echo $purpose; ?>
+</TEXTAREA>
+</font>
+
+<h3>3. License</h3>
+
+<P><B><I>If you are applying for a website-only project, please
+select "website-only" from the choices below and proceed.</I></B>
+
+<P>SourceForge was created to advance Open Source software development.
+To keep things simple, we are relying on the outstanding work
+of the <A href="http://www.opensource.org">Open Source Initiative</A>
+for our licensing choices.
+
+<P>We realize, however that there may be other licenses out there
+that may better fit your needs. If you wish to use a license that is
+not OSI Certified, please let us know why you wish to use another
+license.
+
+<P>Choosing a license is a serious decision. Please take some time
+to read the text (and our explanations) of several licenses before
+making a choice about your project.
+
+<P>You may change the license for your project at a
+later date, so long as you have a legal capability to do so, your file
+release clearly relates this change, and your filemap categorization is
+updated appropriately. <i>Please note that license changes are not
+retroactive (i.e. do not apply to products already released under
+OpenSource license).</i>
+
+<P>SourceForge is not responsible for legal discrepencies regarding
+your license.
+
+<P><B>Licenses</B>
+
+<UL>
+<LI><A href="http://www.opensource.org/licenses/gpl-license.html" target="_blank">GNU General Public License (GPL)</A>
+<LI><A href="http://www.opensource.org/licenses/lgpl-license.html" target="_blank">GNU Library Public License (LGPL)</A>
+<LI><A href="http://www.opensource.org/licenses/bsd-license.html" target="_blank">BSD License</A>
+<LI><A href="http://www.opensource.org/licenses/mit-license.html" target="_blank">MIT License</A>
+<LI><A href="http://www.opensource.org/licenses/artistic-license.html" target="_blank">Artistic License</A>
+<LI><A href="http://www.opensource.org/licenses/mozilla1.0.html" target="_blank">Mozilla Public License 1.0 (MPL)</A>
+<LI><A href="http://www.opensource.org/licenses/qtpl.html" target="_blank">Q Public License (QPL)</A>
+<LI><A href="http://www.opensource.org/licenses/ibmpl.html" target="_blank">IBM Public License 1.0</A>
+<LI><A href="http://www.opensource.org/licenses/mitrepl.html" target="_blank">MITRE Collaborative Virtual Workspace License (CVW License)</A>
+<LI><A href="http://www.opensource.org/licenses/ricohpl.html" target="_blank">Ricoh Source Code Public License 1.0</A>
+<LI><A href="http://www.opensource.org/licenses/pythonpl.html" target="_blank">Python License</A>
+<LI><A href="http://www.opensource.org/licenses/zlib-license.html" target="_blank">zlib/libpng License</A>
+<LI><A href="http://www.opensource.org/licenses/apachepl.html" target="_blank">Apache Software License</A>
+<LI><A href="http://www.opensource.org/licenses/vovidapl.html" target="_blank">Vovida Software License 1.0</A>
+<LI><A href="http://www.opensource.org/licenses/sisslpl.html" target="_blank">Sun Internet Standards Source License (SISSL)</A>
+<LI><A href="http://www.opensource.org/licenses/intel-open-source-license.html" target="_blank">Intel Open Source License</A>
+<LI><A href="http://www.opensource.org/licenses/mozilla1.1.html" target="_blank">Mozilla Public License 1.1 (MPL 1.1)</A>
+<LI><A href="http://www.opensource.org/licenses/jabberpl.html" target="_blank">Jabber Open Source License</A>
+<LI><A href="http://www.opensource.org/licenses/nokia.html" target="_blank">Nokia Open Source License</A>
+<LI><A href="http://www.opensource.org/licenses/sleepycat.html" target="_blank">Sleepycat License</A>
+<LI><A href="http://www.opensource.org/licenses/nethack.html" target="_blank">Nethack General Public License</A>
+<LI><A href="http://oss.software.ibm.com/developerworks/opensource/license-cpl.html" target="_blank">IBM Common Public License</A>
+<LI><A href="http://www.opensource.apple.com/apsl/" target="_blank">Apple Public Source License</A>
+<LI><A href="http://www.sourceforge.net/register/publicdomain.txt" target="_blank">Public Domain</A>
+<LI>Website Only
+<LI>Other/Proprietary License
+
+</UL>
+
+<P><B>License for This Project</B>
+
+<B>Your License:</B><BR>
+<?php
+
+// create SELECT based on $LICENSE array in common/include/vars.php
+//
+ echo '<SELECT NAME="license">';
+ echo '<OPTION value="">(select)'."\n";
+ while (list($k,$v) = each($LICENSE)) {
+ print "<OPTION value=\"$k\"";
+ if ($license == $k) {
+ print " SELECTED";
+ }
+ print ">$v\n";
+ }
+ echo '</SELECT>';
+
+?>
+<P>
+If you selected "other", please provide an explanation along
+with a description of your license. Realize that other licenses may
+not be approved. Also, it may take additional time to make a decision
+for such project, since we will need to check that license is compatible
+with the OpenSource definition.
+<BR>
+<TEXTAREA name="license_other" wrap=virtual cols=60 rows=5>
+<?php echo $license_other; ?>
+</TEXTAREA>
+<P>
+
+
+<h3>4. Project Public Description</h3>
+<p>
+This is the description of your project which will be shown on
+the Project Summary page, in search results, etc. It should not
+be as comprehensive and formal as Project Purpose description
+(step 2), so feel free to use concise and catchy wording. Maximum
+length is 255 chars.
+</p>
+<font size="-1">
+<TEXTAREA name="description" wrap="virtual" cols="70" rows="5">
+<?php echo $description; ?>
+</TEXTAREA>
+</font>
+
+<H3>5. Project Unix Name</H3>
+<p>
+In addition to full project name, you will need to choose short,
+"Unix" name for your project.
+</p>
+
+<P> The "Unix Name" has several restrictions because it is
+used in so many places around the site. They are:
+
+<UL>
+<LI>Cannot match the unix name of any other project
+<LI>Must be between 3 and 15 characters in length
+<LI>Must be in lower case
+<LI>Can only contain characters, numbers, and dashes
+<LI>Must be a valid unix username
+<LI>Cannot match one of our reserved domains
+<LI>Unix name will never change for this project
+</UL>
+
+<P>Your unix name is important, however, because it will be used for
+many things, including:
+
+<UL>
+<LI>A web site at <tt>unixname.<?php echo $GLOBALS['sys_default_domain']; ?></tt>
+<LI>A CVS Repository root of <tt>/cvsroot/unixname</tt> at <tt>cvs.unixname.<?php echo $GLOBALS['sys_default_domain']; ?></tt>
+<LI>Shell access to <tt>unixname.<?php echo $GLOBALS['sys_default_domain']; ?></tt>
+<LI>Search engines throughout the site
+</UL>
+
+<P>Unix Name:
+<BR>
+<input type=text maxlength="15" SIZE="15" name="unix_name" value="<?php echo $unix_name; ?>">
+
+<div align="center">
+<input type=submit name="submit" value="I AGREE"> <INPUT type=submit name="i_disagree" value="I DISAGREE">
+</div>
+
+</form>
+
+<?php
+
+site_footer(array());
+
+?>
+
Added: trunk/gforge_base/evolvisforge/gforge/www/stats/lastlogins.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/stats/lastlogins.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/stats/lastlogins.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,54 @@
+<?php
+/**
+ *
+ * Page to view latest logins to the site
+ *
+ * WARNING: this should probably be moved to /stats/ for consistency
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+require_once('pre.php');
+
+session_require(array('group'=>'1','admin_flags'=>'A'));
+
+$res_logins = db_query("SELECT session.user_id AS user_id,"
+ . "session.ip_addr AS ip_addr,"
+ . "session.time AS time,"
+ . "users.user_name AS user_name FROM session,users "
+ . "WHERE session.user_id=users.user_id AND "
+ . "session.user_id>0 AND session.time>0 ORDER BY session.time DESC",50);
+
+if (!$res_logins || db_numrows($res_logins) < 1) {
+ exit_error("No records found","Database error: ".db_error());
+}
+
+$HTML->header(array('title'=>"Last Logins"));
+
+print '<h3>Most Recent Opened Sessions</h3>';
+
+$title=array();
+$title[]='Date';
+$title[]='Username';
+$title[]='Source IP';
+
+echo html_build_list_table_top($title);
+
+while ($row_logins = db_fetch_array($res_logins)) {
+ print '<TR>';
+ print '<TD>'.date($sys_datefmt, $row_logins['time']).'</TD>';
+ print '<TD>'.$row_logins['user_name'].'</TD>';
+ print '<TD>'.$row_logins['ip_addr'].'</TD>';
+ print '</TR>';
+}
+
+print '</table>';
+
+$HTML->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/testsecurity.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/testsecurity.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/testsecurity.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,62 @@
+<?php
+
+require_once('pre.php');
+
+$HTML->header(array('title'=>'Security Test'));
+
+$group_id=1;
+
+$grp =& group_get_object($group_id);
+$perm =& $grp->getPermission( session_get_user() );
+
+echo '<BR>Is admin: '.$perm->isAdmin();
+echo '<BR>Is DocEditor: '.$perm->isDocEditor();
+echo '<BR>Is ForumAdmin: '.$perm->isForumAdmin();
+echo '<BR>Is PMadmin: '.$perm->isPMAdmin();
+echo '<BR>Is ArtifactAdmin: '.$perm->isArtifactAdmin();
+echo '<BR>Is release: '.$perm->isReleaseTechnician();
+
+echo '<BR>user_ismember(): '.user_ismember($group_id);
+echo '<BR>user_ismember(A): '.user_ismember($group_id,'A');
+echo '<BR>user_ismember(B1): '.user_ismember($group_id,'B1');
+echo '<BR>user_ismember(B2): '.user_ismember($group_id,'B2');
+echo '<BR>user_ismember(S1): '.user_ismember($group_id,'S1');
+echo '<BR>user_ismember(S2): '.user_ismember($group_id,'S2');
+echo '<BR>user_ismember(C1): '.user_ismember($group_id,'C1');
+echo '<BR>user_ismember(C2): '.user_ismember($group_id,'C2');
+echo '<BR>user_ismember(P1): '.user_ismember($group_id,'P1');
+echo '<BR>user_ismember(P2): '.user_ismember($group_id,'P2');
+echo '<BR>user_ismember(F2): '.user_ismember($group_id,'F2');
+echo '<BR>user_ismember(D1): '.user_ismember($group_id,'D1');
+
+
+echo '<P>Group2<P>';
+
+$group_id=2;
+
+$grp =& group_get_object($group_id);
+$perm =& $grp->getPermission( session_get_user() );
+
+echo '<BR>Is admin: '.$perm->isAdmin();
+echo '<BR>Is DocEditor: '.$perm->isDocEditor();
+echo '<BR>Is ForumAdmin: '.$perm->isForumAdmin();
+echo '<BR>Is PMadmin: '.$perm->isPMAdmin();
+echo '<BR>Is ArtifactAdmin: '.$perm->isArtifactAdmin();
+echo '<BR>Is release: '.$perm->isReleaseTechnician();
+
+echo '<BR>user_ismember(): '.user_ismember($group_id);
+echo '<BR>user_ismember(A): '.user_ismember($group_id,'A');
+echo '<BR>user_ismember(B1): '.user_ismember($group_id,'B1');
+echo '<BR>user_ismember(B2): '.user_ismember($group_id,'B2');
+echo '<BR>user_ismember(S1): '.user_ismember($group_id,'S1');
+echo '<BR>user_ismember(S2): '.user_ismember($group_id,'S2');
+echo '<BR>user_ismember(C1): '.user_ismember($group_id,'C1');
+echo '<BR>user_ismember(C2): '.user_ismember($group_id,'C2');
+echo '<BR>user_ismember(P1): '.user_ismember($group_id,'P1');
+echo '<BR>user_ismember(P2): '.user_ismember($group_id,'P2');
+echo '<BR>user_ismember(F2): '.user_ismember($group_id,'F2');
+echo '<BR>user_ismember(D1): '.user_ismember($group_id,'D1');
+
+$HTML->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/themes/ultralite/Theme.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/themes/ultralite/Theme.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/themes/ultralite/Theme.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,309 @@
+<?php
+/**
+ *
+ * UltraLite Web Theme
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: Theme.class,v 1.3 2001/05/22 16:06:38 pfalcon Exp $
+ *
+ */
+
+
+
+/*
+
+
+ Ultralight Theme class, extends basic Layout.class
+
+ Tim Perdue, December 18, 2000
+
+
+*/
+
+
+class Theme extends Layout {
+
+ var $theme_id;
+ var $long_name;
+ var $dir_name;
+
+ var $COLOR_HTMLBOX_TITLE = '#737b9c';
+
+ function Theme() {
+ // Parent constructor
+ $this->Layout();
+
+ //Define deifferences from defaults for this theme
+ $this->COLOR_HTMLBOX_TITLE = '#6C7198'; //GRAY';
+ $this->COLOR_HTMLBOX_BACK = '#EEEEEE';
+ $this->COLOR_LTBACK1 = '#EEEEEE';
+ $this->COLOR_CONTENT_BACK='WHITE';
+
+ $this->FONT_CONTENT = 'Lucida';
+ $this->FONT_HTMLBOX_TITLE = 'Lucida';
+
+ $this->FONTCOLOR_HTMLBOX_TITLE = '#FFFFFF';
+ $this->FONTCOLOR_CONTENT = '#000000';
+
+ }
+
+ function box1_top($title,$echoout=1,$bgcolor='') {
+ if (!$bgcolor) {
+ $bgcolor=$this->COLOR_HTMLBOX_BACK;
+ }
+// $return = '
+// <TABLE cellspacing="0" cellpadding="1" width="100%" border="0" bgcolor="'
+// .$this->COLOR_HTMLBOX_TITLE.'"><TR><TD>';
+
+ $return .= '<TABLE cellspacing="1" cellpadding="2" width="100%" border="0" bgcolor="'.$bgcolor.'">'.
+ '<TR BGCOLOR="'.$this->COLOR_HTMLBOX_TITLE.'" align="center">'.
+ '<TD colspan=2><SPAN class=titlebar>'.$title.'</SPAN></TD></TR>'.
+ '<TR align=left>
+ <TD colspan=2>';
+ if ($echoout) {
+ print $return;
+ } else {
+ return $return;
+ }
+ }
+
+ function box1_middle($title,$bgcolor='') {
+ if (!$bgcolor) {
+ $bgcolor=$this->COLOR_HTMLBOX_BACK;
+ }
+ return '
+ </TD>
+ </TR>
+ <TR BGCOLOR="'.$this->COLOR_HTMLBOX_TITLE.'" align="center">
+ <TD colspan=2><SPAN class=titlebar>'.$title.'</SPAN></TD>
+ </TR>
+ <TR align=left bgcolor="'.$bgcolor.'">
+ <TD colspan=2>';
+ }
+
+ function box1_bottom($echoout=1) {
+ $return = '
+ </TD>
+ </TR>
+ </TABLE><P>';
+//</TD></TR></TABLE><P>';
+ if ($echoout) {
+ print $return;
+ } else {
+ return $return;
+ }
+ }
+
+ // ############################
+
+ function header($params) {
+ global $Language;
+
+ $this->generic_header_start($params);
+
+ //themable someday?
+ $site_fonts='verdana,arial,helvetica,sans-serif';
+
+ ?>
+ <style type="text/css">
+ <!--
+ .titlebar {text-decoration:none; color:<?php echo $thie->FONTCOLOR_HTMLBOX_TITLE; ?>; font-family: <?php echo $thie->FONT_HTMLBOX_TITLE; ?>,Lucida; font-weight: bold; font-size:<?php echo $this->FONTSIZE_HTMLBOX_TITLE; ?>}
+ .title {text-decoration:none; color:#000000; font-family: Helvetica; font-weight: bold; font-size:20px}
+ .normal {text-decoration:none; color:#000000; font-family: Helvetica; font-weight: light; font-size:12px}
+
+ BODY { background-color: <?php echo $this->COLOR_CONTENT_BACK; ?>; font-family: <?php echo $this->FONT_CONTENT; ?>,<?php echo $site_fonts; ?>; font-size:<?php echo $this->FONTSIZE; ?>; }
+
+ A { text-decoration: none; color #6666FF; }
+ A:visited { text-decoration: none; color: #6666AA; }
+ A:link { text-decoration: none; color: #6666AA; }
+ A:active { text-decoration: none; color: #6666AA; }
+ A:hover { text-decoration: none; color: #FF6666 }
+ OL,UL,P,BODY,TD,TR,TH,FORM,SPAN { font-family: <?php echo $this->FONT_CONTENT; ?>,arial,helvetica,sans-serif;color: #333333; }
+ H1,H2,H3,H4,H5,H6 { font-family: <?php echo $this->FONT_CONTENT; ?>,arial,helvetica,sans-serif }
+ PRE,TT { font-family: courier,sans-serif }
+
+ SPAN.center { text-align: center }
+ SPAN.boxspace { font-size: 2pt; }
+
+ A.maintitlebar { color: #FFFFFF }
+ A.maintitlebar:visited { color: #FFFFFF }
+
+ A.sortbutton { color: #FFFFFF; text-decoration: underline; }
+ A.sortbutton:visited { color: #FFFFFF; text-decoration: underline; }
+
+ A.menus { color: #000000; text-decoration: underline; }
+ A.menus:visited { color: #000000; text-decoration: underline; }
+
+ .tabs { color: #000000; }
+ .tabs:visited { color: #000000; }
+ .tabs:hover { color:#FF0000; }
+ .tabselect { color: #000000; font-weight: bold; }
+ .tabselect:visited { font-weight: bold;}
+ .tabselect:hover { color:#FF0000; font-weight: bold; }
+
+ SPAN.alignright { text-align: right }
+ SPAN.maintitlebar { font-size: small; color: #FFFFFF }
+ SPAN.titlebar { text-align: center; font-size: small; color: #FFFFFF; font-weight: bold }
+ SPAN.develtitle { text-align: center; font-size: small; color: #000000; font-weight: bold }
+
+ SPAN.osdn {font-size: x-small; font-family: verdana,arial,helvetica,sans-serif;}
+ SPAN.search {font-size: x-small; font-family: verdana,arial,helvetica,sans-serif;}
+ SPAN.slogan {font-size: large; font-weight: bold; font-family: verdana,arial,helvetica,sans-serif;}
+ SPAN.footer {font-size: x-small; font-family: verdana,arial,helvetica,sans-serif;}
+
+ TD.featurebox { font-size: small; }
+
+ -->
+ </style>
+
+ <?php
+ $this->generic_header_end($params);
+ echo '<BODY bgcolor="'. $this->COLOR_CONTENT_BACK.'" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0">';
+ osdn_print_navbar();
+?>
+ <!-- top title table -->
+<TABLE width="100%" border=0 cellspacing=0 cellpadding=0 bgcolor="<?php echo $this->COLOR_LTBACK1; ?>" valign="center">
+ <TR><TD COLSPAN=3 BGCOLOR="<?php echo $this->COLOR_LTBACK1; ?>"><?php echo html_blankimage(4,4); ?></TD></TR>
+
+ <TR>
+
+ <TD COLSPAN=3 valign="top" ALIGN=TOP bgcolor="<?php echo $this->COLOR_LTBACK1; ?>">
+ <A href="/"><?php
+echo html_image('/images/sflogo2-steel.png','143','70',array('vspace'=>'0','align'=>'left'));
+//echo html_image($this->imgroot . "sflogo-hammer1.jpg","136","79",array());
+ ?></A>
+ <B>
+ <?php
+ if (!user_isloggedin()) {
+ print '<A href="/account/login.php">[Login]</A> |
+ <A href="/account/register.php">[New User]</A>';
+ } else {
+ print '<A href="/account/logout.php">[Logout]</A>
+ | <A href="/my/">[My Page]</A>
+ | <A HREF="/account/">[Account Prefs]</A>';
+ }
+
+//vars needed for search functionality
+global $forum_id,$group_id,$is_bug_page;
+
+ print ' | <A href="/softwaremap/">[Software Map]</A>
+ | <A href="/docs/site/">[Docs]</A>';
+// | <A HREF="/search/?is_bug_page='.$is_bug_page.'&group_id='.$group_id.'&forum_id='.$forum_id.'">[Search]</A></B>';
+
+ if (!session_issecure()) {
+ print '<IMG src="http://www2.valinux.com/clear.gif?id=105" width=1 height=1 alt="Counter">';
+ } else {
+ print '<IMG src="https://www2.valinux.com/clear.gif?id=105" width=1 height=1 alt="Counter">';
+ }
+
+ echo menu_show_search_box(true);
+
+ ?>
+
+ </TD>
+ </TR>
+
+<!-- TABS ROW -->
+
+
+
+<!-- END TABS ROW -->
+ <TR><TD COLSPAN=3 BGCOLOR="WHITE"><?php echo html_blankimage(4,4); ?></TD></TR>
+ <TR>
+ <TD WIDTH=10 BGCOLOR="WHITE">
+
+ </TD>
+
+ <TD BGCOLOR="WHITE">
+
+ <?php
+
+ if ($params['titlevals']) {
+ $title = $Language->getText($params['pagename'],'title',$params['titlevals']);
+ } else {
+ $title = $Language->getText($params['pagename'],'title');
+ }
+
+ if ($params['sectionvals']) {
+ $section = $Language->getText($params['pagename'],'section',$params['sectionvals']);
+ } else {
+ $section = $Language->getText($params['pagename'],'section');
+ }
+
+ if ($section) {
+ print "<b>$section</b>\n";
+ }
+
+ if ($title) {
+ print "<h2>$title</h2>\n";
+ }
+
+ }
+
+
+
+ // ############################
+
+ function footer($params) {
+
+ ?>
+ </TD>
+ <TD WIDTH=10 BGCOLOR="WHITE">
+
+ </TD>
+ </TR>
+ <TR><TD COLSPAN=3 BGCOLOR="WHITE"><?php echo html_blankimage(4,4); ?></TD></TR>
+</TABLE>
+
+<!-- end themed page footer -->
+ <?php
+ $this->generic_footer($params);
+ }
+
+ function menuhtml_top($title) {
+ /*
+ Use only for the top most menu
+ */
+ ?>
+ <table cellspacing="0" cellpadding="3" width="100%" border="0" bgcolor="<?php echo $this->COLOR_TITLEBAR_BACK; ?>">
+ <tr bgcolor="<?php echo $this->COLOR_HTMLBOX_TITLE; ?>">
+ <td align="center">
+ <?php html_blankimage(1,135); ?><BR>
+ <span class="titlebar"><font color="#ffffff"><?php print $title; ?></font></span></td>
+ </tr>
+ <tr align="left" BGCOLOR="<?php echo $this->COLOR_LTBACK1; ?>"><td>
+ <?php
+ }
+
+ function menuhtml_bottom() {
+ /*
+ End the table
+ */
+ print '
+
+ </TD>
+ </TR></TABLE>
+';
+ }
+
+ function menu_entry($link, $title) {
+ print "\t".'<font face="arial, helvetica" size="2"><A class="menus" href="'.$link.'">'.$title.'</A></font><br>';
+ }
+/*
+ function tab_entry($url='http://localhost/', $icon='/images/ic/home16b.png', $title='Home', $selected=0) {
+ print '
+ <A ';
+ if ($selected) {
+ print 'class=tabs ';
+ }
+ print 'href="'. $url .'">';
+ html_image($icon,'24','24',array('alt'=>"$title",'border'=>($selected?'1':'0')));
+ print '</A>';
+ }
+
+*/
+}
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/top/topusers.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/top/topusers.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/top/topusers.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,101 @@
+<?php
+/**
+ *
+ * SourceForge Top-Statistics: Highest-Ranked Users
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+// Results per page
+$LIMIT = 50;
+
+require_once('pre.php');
+
+$yesterday = time()-60*60*24;
+$yd_month = date('Ym', $yesterday);
+$yd_day = date('d', $yesterday);
+
+$res_top = db_query("
+ SELECT user_metric.ranking,users.user_name,users.realname,
+ user_metric.metric,user_metric_history.ranking AS old_ranking
+ FROM users,user_metric LEFT JOIN user_metric_history
+ ON (user_metric.user_id=user_metric_history.user_id
+ AND user_metric_history.month='$yd_month'
+ AND user_metric_history.day='$yd_day')
+ WHERE users.user_id=user_metric.user_id
+ ORDER BY ranking ASC
+", $LIMIT, $offset);
+
+
+if (!$res_top || db_numrows($res_top)<1) {
+ exit_error(
+ 'Information not available',
+ 'Information about highest ranked users is not available. '
+ .db_error()
+ );
+}
+
+$HTML->header(array('title'=>'Highest Ranked Users'));
+
+print '<h1>Highest Ranked Users</h1>
+<BR><I>(Updated Daily)</I>
+
+<P><A href="/top/">[View Other Top Categories]</A>
+
+<P><TABLE width="100%" cellpadding=0 cellspacing=0 border=0>
+<TR valign="top">
+<TD><B>Rank</B></TD>
+<TD><B>User Name<BR> </B></TD>
+<TD><B>Real Name<BR> </B></TD>
+<TD align="right"><B>Rating</B></TD>
+<TD align="right"><B>Last Rank</B></TD>
+<TD align="right"><B>Change</B> </TD></TR>
+';
+
+while ($row_top = db_fetch_array($res_top)) {
+ $i++;
+ print '<TR BGCOLOR="'. html_get_alt_row_color($i) .'"><TD> '.$row_top['ranking']
+ .'</TD><TD><A href="/users/'. $row_top['user_name'] .'/">'
+ .$row_top['user_name'].'</A></td>'
+ .'<td>'.$row_top['realname'].'</td>'
+ .'</TD><TD align="right">'.sprintf('%.2f', $row_top['metric'])
+ .' </TD><TD align="right">'.$row_top['old_ranking']
+ .' </TD>'
+ .'<TD align="right">';
+
+ // calculate change
+ $diff = $row_top["old_ranking"] - $row_top["ranking"];
+ if (!$row_top["old_ranking"] || !$row_top["ranking"]) {
+ print "N/A";
+ }
+ else if ($diff == 0) {
+ print "Same";
+ }
+ else if ($diff > 0) {
+ print "<FONT color=\"#009900\">Up $diff</FONT>";
+ }
+ else if ($diff < 0) {
+ print "<FONT color=\"#CC0000\">Down ".(0-$diff)."</FONT>";
+ }
+
+ print ' </TD></TR>
+';
+}
+
+print '</TABLE>';
+
+print ' <table width="100%">
+ <TR BGCOLOR="'.$HTML->COLOR_LTBACK2.'">
+ <TD>'.(($offset>=$LIMIT)?'<A HREF="topusers.php?&offset='.($offset-50).'"><B><-- More</B></A>':' ').'</TD>
+ <TD ALIGN="RIGHT"><A HREF="topusers.php?offset='.($offset+50).'"><B>More --></B></A></TD></TR>
+ </table>
+';
+
+$HTML->footer(array());
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tos/privacy_generic.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tos/privacy_generic.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tos/privacy_generic.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,30 @@
+<?php
+/**
+ *
+ * Generic Privacy Policy
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: privacy_generic.php,v 1.1 2001/06/19 18:56:09 jbyers Exp $
+ *
+ */
+
+require_once('pre.php');
+
+$HTML->header(array(title=>'Privacy Policy'));
+?>
+
+<p>
+<h2>Privacy Policy</h2>
+</p>
+
+<p>
+Insert privacy policy statement here.
+
+<?php
+$HTML->footer(array());
+
+?>
+
Added: trunk/gforge_base/evolvisforge/gforge/www/tos/tos_generic.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tos/tos_generic.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tos/tos_generic.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,25 @@
+<?php
+/**
+ *
+ * Generic Terms of Service text
+ *
+ * This should be pure HTML content, as it is included in several
+ * other pages.
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id: tos_generic.php,v 1.1 2001/06/19 18:56:09 jbyers Exp $
+ *
+ */
+?>
+
+<p>
+<h2>Terms of Service Agreement</h2>
+</p>
+
+<p>
+Insert terms of service statement here.
+
+
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/add.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/add.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/add.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,100 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+$ath->header(array ('title'=>'Submit','pagename'=>'tracker_add','sectionvals'=>array($ath->getName())));
+
+ echo '
+ <P>';
+ /*
+ Show the free-form text submitted by the project admin
+ */
+ echo $ath->getSubmitInstructions();
+
+ echo '<P>
+ <FORM ACTION="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'" METHOD="POST" enctype="multipart/form-data">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="postadd">
+ <TABLE>
+ <TR><TD VALIGN="TOP" COLSPAN="2"><B>For Project:</B><BR>'.$group->getPublicName().'</TD></TR>
+ <TR><TD VALIGN="TOP"><B>Category: <A href="javascript:help_window(\'/help/tracker.php?helpname=category\')"><B>(?)</B></A></B><BR>';
+
+ echo $ath->categoryBox('category_id');
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&add_cat=1">(admin)</A>';
+ ?>
+ </TD><TD><B>Group: <A href="javascript:help_window('/help/tracker.php?helpname=group')"><b>(?)</b></a></B><BR>
+ <?php
+ echo $ath->artifactGroupBox('artifact_group_id');
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&add_group=1">(admin)</A>';
+ ?>
+ </TD></TR>
+ <?php
+ if ($ath->userIsAdmin()) {
+ echo '<TR><TD><B>Assigned To: <A href="javascript:help_window(\'/help/tracker.php?helpname=assignee\')"><b>(?)</b></a></B><BR>';
+ echo $ath->technicianBox ('assigned_to');
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&update_users=1">(admin)</A>';
+
+ echo '</TD><TD><B>Priority: <A href="javascript:help_window(\'/help/tracker.php?helpname=priority\')"><b>(?)</b></a></B><BR>';
+ echo build_priority_select_box('priority');
+ echo '</TD></TR>';
+ }
+ ?>
+ <TR><TD COLSPAN="2"><B>Summary: <A href="javascript:help_window('/help/tracker.php?helpname=summary')"><b>(?)</b></a></B><BR>
+ <INPUT TYPE="TEXT" NAME="summary" SIZE="35" MAXLENGTH="40">
+ </TD></TR>
+
+ <TR><TD COLSPAN="2">
+ <B>Detailed Description:</B>
+ <P>
+ <TEXTAREA NAME="details" ROWS="30" COLS="55" WRAP="HARD"></TEXTAREA>
+ </TD></TR>
+
+ <TR><TD COLSPAN="2">
+ <?php
+ if (!user_isloggedin()) {
+ echo '
+ <h3><FONT COLOR="RED">Please <A HREF="/account/login.php?return_to='. urlencode($REQUEST_URI) .'">log in!</A></FONT></h3><BR>
+ If you <B>cannot</B> login, then enter your email address here:<P>
+ <INPUT TYPE="TEXT" NAME="user_email" SIZE="30" MAXLENGTH="35">
+ ';
+
+ }
+ ?>
+ <P>
+ <H3><FONT COLOR=RED>DO NOT enter passwords or other confidential information!</FONT></H3>
+ <P>
+ </TD></TR>
+
+ <TR><TD COLSPAN=2>
+ <B>Check to Upload & Attach File:</B> <input type="checkbox" name="add_file" VALUE="1">
+ <A href="javascript:help_window('/help/tracker.php?helpname=comment')"><b>(?)</b></a><BR>
+ <P>
+ <input type="file" name="input_file" size="30">
+ <P>
+ <B>File Description:</B><BR>
+ <input type="text" name="file_description" size="40" maxlength="255">
+ <P>
+ </TD><TR>
+
+ <TR><TD COLSPAN=2>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="SUBMIT">
+ </FORM>
+ <P>
+ </TD></TR>
+
+ </TABLE>
+
+ <?php
+
+ $ath->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/admin/index.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/admin/index.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/admin/index.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,797 @@
+<?php
+//
+// SourceForge: Breaking Down the Barriers to Open Source Development
+// Copyright 1999-2000 (c) The SourceForge Crew
+// http://sourceforge.net
+//
+// $Id$
+
+require_once('pre.php');
+require_once('common/tracker/Artifact.class');
+require_once('common/tracker/ArtifactFile.class');
+require_once('www/tracker/include/ArtifactFileHtml.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('www/tracker/include/ArtifactTypeHtml.class');
+require_once('www/tracker/include/ArtifactHtml.class');
+require_once('common/tracker/ArtifactGroup.class');
+require_once('common/tracker/ArtifactCategory.class');
+require_once('common/tracker/ArtifactCanned.class');
+require_once('common/tracker/ArtifactResolution.class');
+
+if ($group_id && $atid) {
+//
+//
+// UPDATING A PARTICULAR ARTIFACT TYPE
+//
+//
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+ }
+
+ $perm =& $group->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
+ exit_permission_denied();
+ }
+
+ //
+ // Create the ArtifactType object
+ //
+ $ath = new ArtifactTypeHtml($group,$atid);
+ if (!$ath || !is_object($ath)) {
+ exit_error('Error','ArtifactType could not be created');
+ }
+ if ($ath->isError()) {
+ exit_error('Error',$ath->getErrorMessage());
+ }
+
+ if ($post_changes) {
+//
+//
+// Update the database
+//
+//
+ if ($add_cat) {
+
+ $ac = new ArtifactCategory($ath);
+ if (!$ac || !is_object($ac)) {
+ $feedback .= 'Unable to create ArtifactCategory Object';
+// } elseif ($ac->isError()) {
+// $feedback .= $ac->getErrorMessage();
+ } else {
+ if (!$ac->create($name,$assign_to)) {
+ $feedback .= ' Error inserting: '.$ac->getErrorMessage();
+ $ac->clearError();
+ } else {
+ $feedback .= ' Category Inserted ';
+ }
+ }
+
+ } elseif ($add_group) {
+
+ $ag = new ArtifactGroup($ath);
+ if (!$ag || !is_object($ag)) {
+ $feedback .= 'Unable to create ArtifactGroup Object';
+// } elseif ($ag->isError()) {
+// $feedback .= $ag->getErrorMessage();
+ } else {
+ if (!$ag->create($name)) {
+ $feedback .= ' Error inserting: '.$ag->getErrorMessage();
+ $ag->clearError();
+ } else {
+ $feedback .= ' Group Inserted ';
+ }
+ }
+
+ } elseif ($add_canned) {
+
+ $acr = new ArtifactCanned($ath);
+ if (!$acr || !is_object($acr)) {
+ $feedback .= 'Unable to create ArtifactCanned Object';
+// } elseif ($acr->isError()) {
+// $feedback .= $acr->getErrorMessage();
+ } else {
+ if (!$acr->create($title,$body)) {
+ $feedback .= ' Error inserting: '.$acr->getErrorMessage();
+ $acr->clearError();
+ } else {
+ $feedback .= ' Canned Response Inserted ';
+ }
+ }
+
+ } elseif ($add_users) {
+
+ //
+ // if "add all" option, get list of group members
+ // who are not already members of this ArtifactType
+ //
+ if ($add_all) {
+ $sql="SELECT u.user_id
+ FROM users u,user_group ug
+ WHERE u.user_id=ug.user_id
+ AND ug.group_id='$group_id'
+ AND NOT EXISTS (SELECT user_id FROM artifact_perm ap
+ WHERE ap.group_artifact_id='$atid'
+ AND ap.user_id=u.user_id);";
+ $addids=util_result_column_to_array(db_query($sql));
+ }
+ $count=count($addids);
+ for ($i=0; $i<$count; $i++) {
+ $ath->addUser($addids[$i]);
+ }
+ if ($ath->isError()) {
+ $feedback .= $ath->getErrorMessage();
+ $ath->clearError();
+ } else {
+ $feedback .= ' User(s) Added ';
+ }
+ //go to the perms page
+ $add_users=false;
+ $update_users=true;
+
+ } elseif ($update_users) {
+
+ //
+ // Handle the 2-D array of user_id/permission level
+ //
+ $count=count($updateids);
+ for ($i=0; $i<$count; $i++) {
+ $ath->updateUser($updateids[$i][0],$updateids[$i][1]);
+ }
+ if ($ath->isError()) {
+ $feedback .= $ath->getErrorMessage();
+ $ath->clearError();
+ } else {
+ $feedback .= ' User(s) Updated ';
+ }
+
+ //
+ // Delete the checked ids
+ //
+ $count=count($deleteids);
+ for ($i=0; $i<$count; $i++) {
+ $ath->deleteUser($deleteids[$i]);
+ }
+ if ($ath->isError()) {
+ $feedback .= $ath->getErrorMessage();
+ $ath->clearError();
+ } else {
+ $feedback .= ' User(s) Deleted ';
+ }
+
+ } elseif ($update_canned) {
+
+ $acr = new ArtifactCanned($ath,$id);
+ if (!$acr || !is_object($acr)) {
+ $feedback .= 'Unable to create ArtifactCanned Object';
+ } elseif ($acr->isError()) {
+ $feedback .= $acr->getErrorMessage();
+ } else {
+ if (!$acr->update($title,$body)) {
+ $feedback .= ' Error updating: '.$acr->getErrorMessage();
+ $acr->clearError();
+ } else {
+ $feedback .= ' Canned Response Updated ';
+ $update_canned=false;
+ $add_canned=true;
+ }
+ }
+
+ } elseif ($update_cat) {
+
+ $ac = new ArtifactCategory($ath,$id);
+ if (!$ac || !is_object($ac)) {
+ $feedback .= 'Unable to create ArtifactCategory Object';
+ } elseif ($ac->isError()) {
+ $feedback .= $ac->getErrorMessage();
+ } else {
+ if (!$ac->update($name,$assign_to)) {
+ $feedback .= ' Error updating: '.$ac->getErrorMessage();
+ $ac->clearError();
+ } else {
+ $feedback .= ' Category Updated ';
+ $update_cat=false;
+ $add_cat=true;
+ }
+ }
+
+ } elseif ($update_group) {
+
+ $ag = new ArtifactGroup($ath,$id);
+ if (!$ag || !is_object($ag)) {
+ $feedback .= 'Unable to create ArtifactGroup Object';
+ } elseif ($ag->isError()) {
+ $feedback .= $ag->getErrorMessage();
+ } else {
+ if (!$ag->update($name)) {
+ $feedback .= ' Error updating: '.$ag->getErrorMessage();
+ $ag->clearError();
+ } else {
+ $feedback .= ' Group Updated ';
+ $update_group=false;
+ $add_group=true;
+ }
+ }
+
+ } elseif ($update_type) {
+
+ if (!$ath->update($name,$description,$is_public,$allow_anon,$email_all,$email_address,
+ $due_period,$status_timeout,$use_resolution,$submit_instructions,$browse_instructions)) {
+ $feedback .= ' Error updating: '.$ath->getErrorMessage();
+ $ath->clearError();
+ } else {
+ $feedback .= ' Tracker Updated ';
+ }
+
+ }
+
+ }
+//
+//
+//
+// FORMS TO ADD/UPDATE DATABASE
+//
+//
+//
+ if ($add_cat) {
+//
+// FORM TO ADD CATEGORIES
+//
+ $ath->adminHeader(array ('title'=>'Add Categories to: '.$ath->getName()));
+
+ echo "<H1>Add Categories to: ". $ath->getName() ."</H1>";
+
+ /*
+ List of possible categories for this ArtifactType
+ */
+ $result=$ath->getCategories();
+ echo "<P>";
+ $rows=db_numrows($result);
+ if ($result && $rows > 0) {
+ $title_arr=array();
+ $title_arr[]='ID';
+ $title_arr[]='Title';
+
+ echo html_build_list_table_top ($title_arr);
+
+ for ($i=0; $i < $rows; $i++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($i) .'">'.
+ '<TD>'.db_result($result, $i, 'id').'</TD>'.
+ '<TD><A HREF="'.$PHP_SELF.'?update_cat=1&id='.
+ db_result($result, $i, 'id').'&group_id='.$group_id.'&atid='. $ath->getID() .'">'.
+ db_result($result, $i, 'category_name').'</A></TD></TR>';
+ }
+ echo '</TABLE>';
+ } else {
+ echo "\n<H1>No categories defined</H1>";
+ }
+ ?>
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="add_cat" VALUE="y">
+ <B>New Category Name:</B><BR>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="" SIZE="15" MAXLENGTH="30"><BR>
+ <P>
+ <B>Auto-Assign To:</B><BR>
+ <?php echo $ath->technicianBox('assign_to'); ?>
+ <P>
+ <B><FONT COLOR="RED">Once you add a category, it cannot be deleted</FONT></B>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+
+ $ath->footer(array());
+
+ } elseif ($add_group) {
+//
+// FORM TO ADD GROUP
+//
+ $ath->adminHeader(array ('title'=>'Add/Change Groups to: '.$ath->getName(),'pagename'=>'tracker_admin_add_group','titlevals'=>array($ath->getName())));
+
+ /*
+ List of possible groups for this ArtifactType
+ */
+ $result=$ath->getGroups();
+ echo "<P>";
+ $rows=db_numrows($result);
+ if ($result && $rows > 0) {
+ $title_arr=array();
+ $title_arr[]='ID';
+ $title_arr[]='Title';
+
+ echo html_build_list_table_top ($title_arr);
+
+ for ($i=0; $i < $rows; $i++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($i) .'">'.
+ '<TD>'.db_result($result, $i, 'id').'</TD>'.
+ '<TD><A HREF="'.$PHP_SELF.'?update_group=1&id='.
+ db_result($result, $i, 'id').'&group_id='.$group_id.'&atid='. $ath->getID() .'">'.
+ db_result($result, $i, 'group_name').'</A></TD></TR>';
+ }
+ echo '</TABLE>';
+ } else {
+ echo "\n<H1>No groups defined</H1>";
+ }
+ ?>
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="add_group" VALUE="y">
+ <B>New group Name:</B><BR>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="" SIZE="15" MAXLENGTH="30"><BR>
+ <P>
+ <B><FONT COLOR="RED">Once you add a group, it cannot be deleted</FONT></B>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+
+ $ath->footer(array());
+
+ } elseif ($add_canned) {
+//
+// FORM TO ADD CANNED RESPONSES
+//
+ $ath->adminHeader(array ('title'=>'Add/Change Canned Responses to: '.$ath->getName()));
+
+ echo "<H1>Add Canned Responses to: ". $ath->getName() ."</H1>";
+
+ /*
+ List of existing canned responses
+ */
+ $result=$ath->getCannedResponses();
+ $rows=db_numrows($result);
+ echo "<P>";
+
+ if ($result && $rows > 0) {
+ //code to show existing responses and link to update page
+ echo '
+ <H2>Existing Responses:</H2>
+ <P>';
+ $title_arr=array();
+ $title_arr[]='ID';
+ $title_arr[]='Title';
+
+ echo html_build_list_table_top ($title_arr);
+
+ for ($i=0; $i < $rows; $i++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($i) .'">'.
+ '<TD>'.db_result($result, $i, 'id').'</TD>'.
+ '<TD><A HREF="'.$PHP_SELF.'?update_canned=1&id='.
+ db_result($result, $i, 'id').'&group_id='.$group_id.'&atid='. $ath->getID() .'">'.
+ db_result($result, $i, 'title').'</A></TD></TR>';
+ }
+ echo '</TABLE>';
+
+ } else {
+ echo "\n<H1>No responses set up in this group</H1>";
+ }
+ ?>
+ <P>
+ Creating useful generic messages can save you a lot of time when
+ handling common artifact requests.
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="add_canned" VALUE="y">
+ <b>Title:</b><BR>
+ <INPUT TYPE="TEXT" NAME="title" VALUE="" SIZE="50" MAXLENGTH="50">
+ <P>
+ <B>Message Body:</B><BR>
+ <TEXTAREA NAME="body" ROWS="30" COLS="65" WRAP="HARD"></TEXTAREA>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+
+ $ath->footer(array());
+
+ } elseif ($update_users) {
+//
+// FORM TO ADD/UPDATE USERS
+//
+
+ $ath->adminHeader(array ('title'=>'Add/Update Users in: '.$ath->getName(),'pagename'=>'tracker_admin_update_users','titlevals'=>array($ath->getName())));
+
+ $sql="SELECT * FROM artifactperm_user_vw WHERE group_artifact_id='". $ath->getID() ."'";
+ $res=db_query($sql);
+
+ if (!$res || db_numrows($res) < 1) {
+ echo '<H2>No Developers Found</H2>';
+ } else {
+ ?>
+ <P>
+ Each tracker that you define has separate user lists and user permissions.
+ <P>
+ Simply add developers to this tracker, then update their permissions.
+ <P>
+ <dt><B>Technicians</B></dt>
+ <dd>can be assigned items</dd>
+
+ <dt><B>Admins</B></dt>
+ <dd>can make changes to items</dd>
+
+ <FORM action="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" method="post">
+ <INPUT TYPE="HIDDEN" NAME="update_users" VALUE="y">
+ <?php
+
+ $arr=array();
+ $arr[]='Delete';
+ $arr[]='User Name';
+ $arr[]='Permission';
+
+ echo html_build_list_table_top($arr);
+
+ $i=0;
+ //
+ // PHP4 allows multi-dimensional arrays to be passed in from form elements
+ //
+ while ($row_dev = db_fetch_array($res)) {
+ print '
+ <INPUT TYPE="HIDDEN" NAME="updateids['.$i.'][0]" VALUE="'.$row_dev['user_id'].'">
+ <TR BGCOLOR="'. html_get_alt_row_color($i) .'">
+ <TD><INPUT TYPE="CHECKBOX" NAME="deleteids[]" VALUE="'.$row_dev['user_id'].'"> Delete</TD>
+
+ <TD>'.$row_dev['realname'].' ( '. $row_dev['user_name'] .' )</TD>
+
+ <TD><FONT size="-1"><SELECT name="updateids['.$i.'][1]">
+ <OPTION value="0"'.(($row_dev['perm_level']==0)?" selected":"").'>-
+ <OPTION value="1"'.(($row_dev['perm_level']==1)?" selected":"").'>Technician
+ <OPTION value="2"'.(($row_dev['perm_level']==2)?" selected":"").'>Tech & Admin
+ <OPTION value="3"'.(($row_dev['perm_level']==3)?" selected":"").'>Admin Only
+ </SELECT></FONT></TD>
+
+ </TR>';
+ $i++;
+ }
+ echo '<TR><TD COLSPAN=3 ALIGN=MIDDLE><INPUT type="submit" name="post_changes" value="Update Developer Permissions">
+ </FORM></TD></TR>';
+ echo '</TABLE>';
+ }
+ ?>
+ <P>
+ <h3>Add These Users:</H3>
+ <P>
+ You can pick and choose users for your tracker, or simply add them all by checking "Add All Users".
+ <P>
+ <CENTER>
+ <FORM action="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" method="post">
+ <INPUT TYPE="HIDDEN" NAME="add_users" VALUE="y">
+ <?php
+ $sql="SELECT u.user_id, u.realname
+ FROM users u,user_group ug
+ WHERE u.user_id=ug.user_id
+ AND ug.group_id='$group_id'
+ AND NOT EXISTS (SELECT user_id FROM artifact_perm ap
+ WHERE ap.group_artifact_id='$atid'
+ AND ap.user_id=u.user_id);";
+
+ $res=db_query($sql);
+ echo db_error();
+ echo html_build_multiple_select_box ($res,'addids[]',array(),8,false);
+ echo '<P>
+ <INPUT type="submit" name="post_changes" value="Add Users"> <INPUT type="checkbox" name="add_all"> Add All Users
+ </FORM>
+ </CENTER>';
+
+ $ath->footer(array());
+
+ } elseif ($update_canned) {
+//
+// FORM TO UPDATE CANNED MESSAGES
+//
+ $ath->adminHeader(array ('title'=>'Update Canned Responses in: '.$ath->getName()));
+
+ echo "<H1>Update Canned Responses ". $ath->getName() ."</H1>";
+
+ $acr = new ArtifactCanned($ath,$id);
+ if (!$acr || !is_object($acr)) {
+ $feedback .= 'Unable to create ArtifactCanned Object';
+ } elseif ($acr->isError()) {
+ $feedback .= $acr->getErrorMessage();
+ } else {
+ ?>
+ <P>
+ Creating useful generic messages can save you a lot of time when
+ handling common requests.
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="update_canned" VALUE="y">
+ <INPUT TYPE="HIDDEN" NAME="id" VALUE="<?php echo $acr->getID(); ?>">
+ <b>Title:</b><BR>
+ <INPUT TYPE="TEXT" NAME="title" VALUE="<?php echo $acr->getTitle(); ?>" SIZE="50" MAXLENGTH="50">
+ <P>
+ <B>Message Body:</B><BR>
+ <TEXTAREA NAME="body" ROWS="30" COLS="65" WRAP="HARD"><?php echo $acr->getBody(); ?></TEXTAREA>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+ }
+ $ath->footer(array());
+
+ } elseif ($update_cat) {
+//
+// FORM TO UPDATE CATEGORIES
+//
+ /*
+ Allow modification of a artifact category
+ */
+ $ath->adminHeader(array('title'=>'Change an Category in: '.$ath->getName()));
+
+ echo '
+ <H1>Modify an Category in: '. $ath->getName() .'</H1>';
+
+ $ac = new ArtifactCategory($ath,$id);
+ if (!$ac || !is_object($ac)) {
+ $feedback .= 'Unable to create ArtifactCategory Object';
+ } elseif ($ac->isError()) {
+ $feedback .= $ac->getErrorMessage();
+ } else {
+ ?>
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="update_cat" VALUE="y">
+ <INPUT TYPE="HIDDEN" NAME="id" VALUE="<?php echo $ac->getID(); ?>">
+ <P>
+ <B>Category Name:</B><BR>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="<?php echo $ac->getName(); ?>">
+ <P>
+ <B>Auto-Assign To:</B><BR>
+ <?php echo $ath->technicianBox('assign_to',$ac->getAssignee()); ?>
+ <P>
+ <B><FONT COLOR="RED">It is not recommended that you change the artifact
+ category name because other things are dependent upon it. When you change
+ the category name, all related items will be changed to the new name.</FONT></B>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+ }
+
+ $ath->footer(array());
+
+ } elseif ($update_group) {
+//
+// FORM TO UPDATE GROUPS
+//
+ /*
+ Allow modification of a artifact group
+ */
+ $ath->adminHeader(array('title'=>'Change a Group in: '.$ath->getName(),'pagename'=>'tracker_admin_update_group','titlevals'=>array($ath->getName())));
+
+ $ag = new ArtifactGroup($ath,$id);
+ if (!$ag || !is_object($ag)) {
+ $feedback .= 'Unable to create ArtifactGroup Object';
+ } elseif ($ag->isError()) {
+ $feedback .= $ag->getErrorMessage();
+ } else {
+ ?>
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="update_group" VALUE="y">
+ <INPUT TYPE="HIDDEN" NAME="id" VALUE="<?php echo $ag->getID(); ?>">
+ <P>
+ <B>Group Name:</B><BR>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="<?php echo $ag->getName(); ?>">
+ <P>
+ <B><FONT COLOR="RED">It is not recommended that you change the artifact
+ group name because other things are dependent upon it. When you change
+ the group name, all related items will be changed to the new name.</FONT></B>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+ }
+
+ $ath->footer(array());
+
+ } elseif ($update_type) {
+//
+// FORM TO UPDATE ARTIFACT TYPES
+//
+ $ath->adminHeader(array ('title'=>'Tracker Administration: '.$ath->getName(),'pagename'=>'tracker_admin_update_type','titlevals'=>array($ath->getName())));
+
+ ?>
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="update_type" VALUE="y">
+ <P>
+ <B>Name:</B> (examples: meeting minutes, test results, RFP Docs)<BR>
+ <?php if ($ath->getDataType()) {
+ echo $ath->getName();
+ } else {
+ ?>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="<?php echo $ath->getName(); ?>">
+ <?php
+ }
+ ?>
+ <P>
+ <B>Description:</B><BR>
+ <?php if ($ath->getDataType()) {
+ echo $ath->getDescription();
+ } else {
+ ?>
+ <INPUT TYPE="TEXT" NAME="description" VALUE="<?php echo $ath->getDescription(); ?>" SIZE="50">
+ <?php
+ }
+ ?>
+ <P>
+ <INPUT TYPE=CHECKBOX NAME="is_public" VALUE="1" <?php echo (($ath->isPublic())?'CHECKED':''); ?>> <B>Publicly Available</B><BR>
+ <INPUT TYPE=CHECKBOX NAME="allow_anon" VALUE="1" <?php echo (($ath->allowsAnon())?'CHECKED':''); ?>> <B>Allow non-logged-in postings</B><BR>
+ <INPUT TYPE=CHECKBOX NAME="use_resolution" VALUE="1" <?php echo (($ath->useResolution())?'CHECKED':''); ?>> <B>Display the "Resolution" box</B>
+ <P>
+ <B>Send email on new submission to address:</B><BR>
+ <INPUT TYPE="TEXT" NAME="email_address" VALUE="<?php echo $ath->getEmailAddress(); ?>">
+ <P>
+ <INPUT TYPE=CHECKBOX NAME="email_all" VALUE="1" <?php echo (($ath->emailAll())?'CHECKED':''); ?>> <B>Send email on all changes</B><BR>
+ <P>
+ <B>Days till considered overdue:</B><BR>
+ <INPUT TYPE="TEXT" NAME="due_period" VALUE="<?php echo ($ath->getDuePeriod() / 86400); ?>">
+ <P>
+ <B>Days till pending tracker items time out:</B><BR>
+ <INPUT TYPE="TEXT" NAME="status_timeout" VALUE="<?php echo($ath->getStatusTimeout() / 86400); ?>">
+ <P>
+ <B>Free form text for the "submit new item" page:</B><BR>
+ <TEXTAREA NAME="submit_instructions" ROWS="10" COLS="55" WRAP="HARD"><?php echo $ath->getSubmitInstructions(); ?></TEXTAREA>
+ <P>
+ <B>Free form text for the "browse items" page:</B><BR>
+ <TEXTAREA NAME="browse_instructions" ROWS="10" COLS="55" WRAP="HARD"><?php echo $ath->getBrowseInstructions(); ?></TEXTAREA>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+
+ $ath->footer(array());
+
+ } else {
+//
+// SHOW LINKS TO FEATURES
+//
+
+ $ath->adminHeader(array ('title'=>'Tracker Administration: '.$ath->getName(),'pagename'=>'tracker_admin','titlevals'=>array($ath->getName())));
+
+ echo '<P>
+ <A HREF="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'&add_cat=1"><B>Add/Update Categories</B></A><BR>
+ Add categories like, \'mail module\',\'gant chart module\',\'cvs\', etc<P>';
+ echo '<P>
+ <A HREF="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'&add_group=1"><B>Add/Update Groups</B></A><BR>
+ Add groups like, \'v1.2\',\'unsupported\',\'unverified\', etc<P>';
+ echo '<P>
+ <A HREF="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'&add_canned=1"><B>Add/Update Canned Responses</B></A><BR>
+ Create/Change generic response messages for the tracker.<P>';
+ echo '<P>
+ <A HREF="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'&update_users=1"><B>Add/Update Users & Permissions</B></A><BR>
+ Add/remove users to/from this tracker.<P>';
+ echo '<P>
+ <A HREF="'.$PHP_SELF.'?group_id='.$group_id.'&atid='.$ath->getID().'&update_type=1"><B>Update preferences</B></A><BR>
+ Set up prefs like expiration times, email addresses, etc.<P>';
+
+ $ath->footer(array());
+ }
+
+} elseif ($group_id) {
+
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+ }
+
+ $perm =& $group->getPermission( session_get_user() );
+
+ if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
+ exit_permission_denied();
+ }
+
+ if ($post_changes) {
+ if ($add_at) {
+ $res=new ArtifactTypeHtml($group);
+ if (!$res->create($name,$description,$is_public,$allow_anon,$email_all,$email_address,
+ $due_period,$use_resolution,$submit_instructions,$browse_instructions)) {
+ $feedback .= $res->getErrorMessage();
+ } else {
+ header ("Location: /tracker/admin/?group_id=$group_id&atid=".$res->getID()."&update_users=1");
+ }
+
+ }
+ }
+
+ $sql="SELECT * FROM artifact_group_list WHERE group_id='$group_id' ORDER BY group_artifact_id";
+
+ //required params for site_project_header();
+ $params['group']=$group_id;
+ $params['toptab']='tracker';
+ $params['pagename']='tracker_admin_choose';
+
+ echo site_project_header($params);
+ echo '<B><A HREF="/tracker/admin/?group_id='.$group_id.'">Admin</A></B><P>';
+
+ $result = db_query ($sql);
+ $rows = db_numrows($result);
+ if (!$result || $rows < 1) {
+ echo "<H1>No Trackers Found</H1>";
+ echo "<P>";
+ } else {
+
+ echo '
+ <P>
+ Choose a data type and you can set up prefs, categories, groups, users, and permissions.
+ <P>';
+
+ /*
+ Put the result set (list of forums for this group) into a column with folders
+ */
+
+ for ($j = 0; $j < $rows; $j++) {
+ echo '
+ <A HREF="/tracker/admin/?atid='.db_result($result, $j, 'group_artifact_id').
+ '&group_id='.$group_id.'">' .
+ html_image("images/ic/index.png","15","13",array("BORDER"=>"0")) . ' '.
+ db_result($result, $j, 'name').'</A><BR>'.
+ db_result($result, $j, 'description').'<P>';
+ }
+ }
+
+ ?>
+ <H3>Create a new tracker</H3>
+ <P>
+ You can use this system to track virtually any kind of data, with each
+ tracker having separate user, group, category, and permission lists. You
+ can also easily move items between trackers when needed.
+ <P>
+ Trackers are referred to as "Artifact Types" and individual pieces of data
+ are "Artifacts". "Bugs" might be an Artifact Type, whiles a bug report would be
+ an Artifact. You can create as many Artifact Types as you want, but remember
+ you need to set up categories, groups, and permission for each type, which
+ can get time-consuming.
+ <P>
+ <FORM ACTION="<?php echo $PHP_SELF.'?group_id='.$group_id; ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="add_at" VALUE="y">
+ <P>
+ <B>Name:</B> (examples: meeting minutes, test results, RFP Docs)<BR>
+ <INPUT TYPE="TEXT" NAME="name" VALUE="">
+ <P>
+ <B>Description:</B><BR>
+ <INPUT TYPE="TEXT" NAME="description" VALUE="" SIZE="50">
+ <P>
+ <INPUT TYPE=CHECKBOX NAME="is_public" VALUE="1"> <B>Publicly Available</B><BR>
+ <INPUT TYPE=CHECKBOX NAME="allow_anon" VALUE="1"> <B>Allow non-logged-in postings</B><BR>
+ <INPUT TYPE=CHECKBOX NAME="use_resolution" VALUE="1"> <B>Display the "Resolution" box</B>
+ <P>
+ <B>Send email on new submission to address:</B><BR>
+ <INPUT TYPE="TEXT" NAME="email_address" VALUE="">
+ <P>
+ <INPUT TYPE=CHECKBOX NAME="email_all" VALUE="1"> <B>Send email on all changes</B><BR>
+ <P>
+ <B>Days till considered overdue:</B><BR>
+ <INPUT TYPE="TEXT" NAME="due_period" VALUE="30">
+ <P>
+ <B>Days till pending tracker items time out:</B><BR>
+ <INPUT TYPE="TEXT" NAME="status_timeout" VALUE="14">
+ <P>
+ <B>Free form text for the "submit new item" page:</B><BR>
+ <TEXTAREA NAME="submit_instructions" ROWS="10" COLS="55" WRAP="HARD"></TEXTAREA>
+ <P>
+ <B>Free form text for the "browse items" page:</B><BR>
+ <TEXTAREA NAME="browse_instructions" ROWS="10" COLS="55" WRAP="HARD"></TEXTAREA>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="post_changes" VALUE="SUBMIT">
+ </FORM>
+ <?php
+
+ echo site_project_footer(array());
+
+} else {
+
+ //browse for group first message
+ exit_no_group();
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/browse.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/browse.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/browse.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,244 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+//
+// make sure this person has permission to view artifacts
+//
+if (!$ath->userCanView()) {
+ exit_permission_denied();
+}
+
+if (user_isloggedin()) {
+ $u =& session_get_user();
+}
+
+if (!$offset || $offset < 0) {
+ $offset=0;
+}
+
+if (!$set) {
+ /*
+ if no set is passed in, see if a preference was set
+ if no preference or not logged in, use open set
+ */
+ if (user_isloggedin()) {
+ $custom_pref=$u->getPreference('art_cust'.$ath->getID());
+ if ($custom_pref) {
+ $pref_arr=explode('|',$custom_pref);
+ $_assigned_to=$pref_arr[0];
+ $_status=$pref_arr[1];
+ $_category=$pref_arr[2];
+ $_group=$pref_arr[3];
+ $order=$pref_arr[4];
+ $sort=$pref_arr[5];
+ $set='custom';
+ } else {
+ //default to open
+ $_assigned_to=0;
+ $_status=1;
+ }
+ } else {
+ //default to open
+ $_assigned_to=0;
+ $_status=1;
+ }
+}
+
+//
+// validate the column names and sort order passed in from user
+// before saving it to prefs
+//
+if ($order=='artifact_id' || $order=='summary' || $order=='open_date' || $order=='close_date' || $order=='assigned_to' || $order=='submitted_by' || $order=='priority') {
+ $_sort_col=$order;
+ if (($sort == 'ASC') || ($sort == 'DESC')) {
+ $_sort_ord=$sort;
+ } else {
+ $_sort_ord='ASC';
+ }
+} else {
+ $_sort_col='artifact_id';
+ $_sort_ord='ASC';
+}
+
+if ($set=='custom') {
+ if (user_isloggedin()) {
+ /*
+ if this custom set is different than the stored one, reset preference
+ */
+ $pref_=$_assigned_to.'|'.$_status.'|'.$_category.'|'.$_group.'|'.$_sort_col.'|'.$_sort_ord;
+ if ($pref_ != $u->getPreference('art_cust'.$ath->getID())) {
+ $u->setPreference('art_cust'.$ath->getID(),$pref_);
+ }
+ }
+}
+
+/*
+ Display items based on the form post - by user or status or both
+*/
+
+//if status selected, add more to where clause
+if ($_status && ($_status != 100)) {
+ //for open tasks, add status=100 to make sure we show all
+ $status_str="AND artifact.status_id='$_status'";
+} else {
+ //no status was chosen, so don't add it to where clause
+ $status_str='';
+}
+
+//if assigned to selected, add to where clause
+if ($_assigned_to) {
+ $assigned_str="AND artifact.assigned_to='$_assigned_to'";
+} else {
+ //no assigned to was chosen, so don't add it to where clause
+ $assigned_str='';
+}
+
+//if category selected, add to where clause
+if ($_category && ($_category != 100)) {
+ $category_str="AND artifact.category_id='$_category'";
+} else {
+ //no assigned to was chosen, so don't add it to where clause
+ $category_str='';
+}
+
+//if artgroup selected, add to where clause
+if ($_group && ($_group != 100)) {
+ $group_str="AND artifact.artifact_group_id='$_group'";
+} else {
+ //no artgroup to was chosen, so don't add it to where clause
+ $group_str='';
+}
+
+//build page title to make bookmarking easier
+//if a user was selected, add the user_name to the title
+//same for status
+$ath->header(array('titlevals'=>array($ath->getName()),'pagename'=>'tracker_browse','atid'=>$ath->getID(),'sectionvals'=>array($group->getPublicName())));
+
+/**
+ *
+ * Build the powerful browsing options pop-up boxes
+ *
+ */
+
+//
+// creating a custom technician box which includes "any" and "unassigned"
+//
+$res_tech= $ath->getTechnicians();
+
+$tech_id_arr=util_result_column_to_array($res_tech,0);
+$tech_id_arr[]='0'; //this will be the 'any' row
+
+$tech_name_arr=util_result_column_to_array($res_tech,1);
+$tech_name_arr[]='Any';
+
+$tech_box=html_build_select_box_from_arrays ($tech_id_arr,$tech_name_arr,'_assigned_to',$_assigned_to,true,'Unassigned');
+
+
+//
+// custom order by arrays to build a pop-up box
+//
+$order_name_arr=array();
+$order_name_arr[]='ID';
+$order_name_arr[]='Priority';
+$order_name_arr[]='Summary';
+$order_name_arr[]='Open Date';
+$order_name_arr[]='Close Date';
+$order_name_arr[]='Submitter';
+$order_name_arr[]='Assignee';
+
+
+$order_arr=array();
+$order_arr[]='artifact_id';
+$order_arr[]='priority';
+$order_arr[]='summary';
+$order_arr[]='open_date';
+$order_arr[]='close_date';
+$order_arr[]='submitted_by';
+$order_arr[]='assigned_to';
+
+//
+// custom sort arrays to build pop-up box
+//
+$sort_name_arr=array();
+$sort_name_arr[]='Ascending';
+$sort_name_arr[]='Descending';
+
+$sort_arr=array();
+$sort_arr[]='ASC';
+$sort_arr[]='DESC';
+
+//
+// Show the new pop-up boxes to select assigned to, status, etc
+//
+
+echo '
+<TABLE WIDTH="10%" BORDER="0">
+ <FORM ACTION="'. $PHP_SELF .'?group_id='.$group_id.'&atid='.$ath->getID().'" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="set" VALUE="custom">
+ <TR>
+ <TD><FONT SIZE="1">Assignee: <A href="javascript:help_window(\'/help/tracker.php?helpname=assignee\')"><B>(?)</B></A><BR>'. $tech_box .'</TD>'.
+ '<TD><FONT SIZE="1">Status: <A href="javascript:help_window(\'/help/tracker.php?helpname=status\')"><B>(?)</B></A><BR>'. $ath->statusBox('_status',$_status,true,'Any') .'</TD>'.
+ '<TD><FONT SIZE="1">Category: <A href="javascript:help_window(\'/help/tracker.php?helpname=category\')"><B>(?)</B></A><BR>'. $ath->categoryBox ('_category',$_category,'Any') .'</TD>'.
+ '<TD><FONT SIZE="1">Group: <A href="javascript:help_window(\'/help/tracker.php?helpname=group\')"><B>(?)</B></A><BR>'. $ath->artifactGroupBox ('_group',$_group,'Any') .'</TD>
+ </TR>
+ <TR>
+ <TD ALIGN="RIGHT"><FONT SIZE="1">Sort By: <A href="javascript:help_window(\'/help/tracker.php?helpname=sort_by\')"><B>(?)</B></A></TD>'.
+ '<TD><FONT SIZE="1">'.
+ html_build_select_box_from_arrays($order_arr,$order_name_arr,'order',$_sort_col,false) .'</TD>'.
+ '<TD><FONT SIZE="1">'.html_build_select_box_from_arrays($sort_arr,$sort_name_arr,'sort',$_sort_ord,false) .'</TD>'.
+ '<TD><FONT SIZE="1"><INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Browse"></TD>
+ </TR>
+ </FORM></TABLE>';
+
+/*
+ Show the free-form text submitted by the project admin
+*/
+echo $ath->getBrowseInstructions();
+
+//
+// now run the query using the criteria chosen above
+//
+$sql="SELECT artifact.priority,artifact.group_artifact_id,artifact.artifact_id,artifact.summary,
+ artifact.open_date AS date,users.user_name AS submitted_by,user2.user_name AS assigned_to
+ FROM artifact,users,users user2
+ WHERE users.user_id=artifact.submitted_by
+ $status_str $assigned_str $category_str $group_str
+ AND user2.user_id=artifact.assigned_to
+ AND group_artifact_id='". $ath->getID() ."'
+ ORDER BY group_artifact_id $_sort_ord, $_sort_col $_sort_ord";
+
+$result=db_query($sql,51,$offset);
+
+if ($result && db_numrows($result) > 0) {
+
+ if ($set=='custom') {
+ $set .= '&_assigned_to='.$_assigned_to.'&_status='.$_status.'&_category='.$_category.'&_group='.$_group.'&order='.$_sort_col.'&sort='.$_sort_ord;
+ }
+
+ $ath->showBrowseList($result,$offset,$set);
+
+ echo '* Denotes Requests > '. ($ath->getDuePeriod()/86400) .' Days Old';
+ show_priority_colors_key();
+
+} else {
+
+ echo '
+ <H1>No Items Match Your Criteria</H1>';
+ echo db_error();
+ //echo "<!-- $sql -->";
+
+}
+
+$ath->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/detail.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/detail.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/detail.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,143 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+echo $ath->header(array ('title'=>'Detail: '.$ah->getID(). ' '.util_unconvert_htmlspecialchars($ah->getSummary()),'pagename'=>'tracker_detail','atid'=>$ath->getID(),'sectionvals'=>array($ath->getName())));
+
+?>
+ <H2>[ #<?php echo $ah->getID(); ?> ] <?php echo util_unconvert_htmlspecialchars($ah->getSummary()); ?></H2>
+
+ <TABLE CELLPADDING="0" WIDTH="100%">
+ <FORM ACTION="<?php echo $PHP_SELF; ?>?group_id=<?php echo $group_id; ?>&atid=<?php echo $ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="monitor">
+ <INPUT TYPE="HIDDEN" NAME="artifact_id" VALUE="<?php echo $ah->getID(); ?>">
+ <TR>
+ <TD COLSPAN=2">
+ <?php
+ if (!user_isloggedin()) {
+ ?>
+ <B>Email:</B>
+ <INPUT TYPE="TEXT" NAME="user_email" SIZE="20" MAXLENGTH="40">
+ <?php
+ }
+ ?>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Monitor"> <A href="javascript:help_window('/help/tracker.php?helpname=monitor')"><B>(?)</B></A>
+ </FORM>
+ </TD>
+ </TR>
+ <TR>
+ <TD><B>Date:</B><BR><?php echo date( $sys_datefmt, $ah->getOpenDate() ); ?></TD>
+ <TD><B>Priority:</B><BR><?php echo $ah->getPriority(); ?></TD>
+ </TR>
+
+ <TR>
+ <TD><B>Submitted By:</B><BR><?php echo $ah->getSubmittedRealName(); ?> (<?php echo $ah->getSubmittedUnixName(); ?>)</TD>
+ <TD><B>Assigned To:</B><BR><?php echo $ah->getAssignedRealName(); ?> (<?php echo $ah->getAssignedUnixName(); ?>)</TD>
+ </TR>
+
+ <TR>
+ <TD><B>Category:</B><BR><?php echo $ah->getCategoryName(); ?></TD>
+ <TD><B>Status:</B><BR><?php echo $ah->getStatusName(); ?></TD>
+ </TR>
+
+ <TR><TD COLSPAN="2"><B>Summary:</B><BR><?php echo util_unconvert_htmlspecialchars($ah->getSummary()); ?></TD></TR>
+
+ <FORM ACTION="<?php echo $PHP_SELF; ?>?group_id=<?php echo $group_id; ?>&atid=<?php echo $ath->getID(); ?>" METHOD="POST">
+
+ <TR><TD COLSPAN="2">
+ <?php echo nl2br( $ah->getDetails() ); ?>
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="postaddcomment">
+ <INPUT TYPE="HIDDEN" NAME="artifact_id" VALUE="<?php echo $ah->getID(); ?>">
+ <P>
+ <B>Add A Comment:</B><BR>
+ <TEXTAREA NAME="details" ROWS="10" COLS="60" WRAP="HARD"></TEXTAREA>
+ </TD></TR>
+
+ <TR><TD COLSPAN="2">
+ <?php
+
+ if (!user_isloggedin()) {
+ ?>
+ <h3><FONT COLOR="RED">Please <A HREF="/account/login.php?return_to=<?php echo urlencode($REQUEST_URI); ?>">log in!</A></FONT></h3><BR>
+ If you <B>cannot</B> login, then enter your email address here:<P>
+ <INPUT TYPE="TEXT" NAME="user_email" SIZE="20" MAXLENGTH="40">
+ <?php
+ }
+ ?>
+ <P>
+ <H3>DO NOT enter passwords or confidential information in your message!</H3>
+ <P>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="SUBMIT">
+ </FORM>
+ </TD></TR>
+
+ <TR><TD COLSPAN="2">
+ <H3>Followups:</H3>
+ <P>
+ <?php
+
+ echo $ah->showMessages();
+
+ ?>
+ </TD></TR>
+
+ <TR><TD COLSPAN=2>
+ <H4>Attached Files:</H4>
+ <?php
+ //
+ // print a list of files attached to this Artifact
+ //
+ $file_list =& $ah->getFiles();
+
+ $count=count($file_list);
+
+ $title_arr=array();
+ $title_arr[]='Name';
+ $title_arr[]='Description';
+ $title_arr[]='Download';
+ echo html_build_list_table_top ($title_arr);
+
+ if ($count > 0) {
+
+ for ($i=0; $i<$count; $i++) {
+ echo '<TR>
+ <TD>'. $file_list[$i]->getName() .'</TD>
+ <TD>'. $file_list[$i]->getDescription() .'</TD>
+ <TD><A HREF="/tracker/download.php?group_id='.$group_id.'&atid='. $ath->getID().'&file_id='.$file_list[$i]->getID().'&aid='. $ah->getID() .'">Download</A></TD>
+ </TR>';
+ }
+
+ } else {
+ echo '<TR><TD COLSPAN=3>No Files Currently Attached</TD></TR>';
+ }
+
+ echo '</TABLE>';
+ ?>
+ </TD></TR>
+
+ <TR>
+ <TD COLSPAN="2">
+ <H3>Changes:</H3>
+ <P>
+ <?php
+
+ echo $ah->showHistory();
+
+ ?>
+ </TD>
+ </TR>
+</TABLE>
+<?php
+
+$ath->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/download.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/download.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/download.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,65 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('squal_pre.php');
+require_once('common/tracker/Artifact.class');
+require_once('common/tracker/ArtifactFile.class');
+//require_once('www/tracker/include/ArtifactFileHtml.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('common/include/Group.class');
+require_once('common/include/Project.class');
+require_once('common/include/Foundry.class');
+
+if (!$group_id) {
+ exit_no_group();
+}
+//
+// get the Group object
+//
+$group =& group_get_object($group_id);
+if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+}
+
+//
+// Create the ArtifactType object
+//
+$ath = new ArtifactType($group,$atid);
+if (!$ath || !is_object($ath)) {
+ exit_error('Error','ArtifactType could not be created');
+}
+if ($ath->isError()) {
+ exit_error('Error',$ath->getErrorMessage());
+}
+
+$ah=new Artifact($ath,$aid);
+if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+} else if ($ah->isError()) {
+ exit_error('ERROR',$ah->getErrorMessage());
+} else {
+ $afh=new ArtifactFile($ah,$file_id);
+ if (!$afh || !is_object($afh)) {
+ exit_error('ERROR','ArtifactFile Could Not Be Created');
+ } else if ($afh->isError()) {
+ exit_error('ERROR',$afh->getErrorMessage());
+ } else {
+ Header ("Content-disposition: filename=".$afh->getName());
+ Header ("Content-type: ".$afh->getType());
+ echo $afh->getData();
+ }
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactFileHtml.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactFileHtml.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactFileHtml.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,52 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('common/tracker/ArtifactFile.class');
+
+class ArtifactFileHtml extends ArtifactFile {
+
+ /**
+ * ArtifactFileHtml() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param $Artifact object
+ * @param $data associative array (all fields from artifact_file_user_vw) OR id from database
+ * @return true/false
+ */
+ function ArtifactFileHtml(&$Artifact, $data=false) {
+ return $this->ArtifactFile($Artifact,$data);
+ }
+
+ function upload($input_file,$input_file_name,$input_file_type,$description) {
+ if (!util_check_fileupload($input_file)) {
+ $this->setError('ArtifactFile: Invalid filename');
+ return false;
+ }
+ $size = @filesize($input_file);
+ if (($size > 20) && ($size < 256000)) {
+ //size is fine
+ $input_data = fread(fopen($input_file, 'r'), $size);
+ //echo $input_data.'|'.$input_file_name.'|'.$input_file.'|'.$input_file_type.'|'.$description;
+ return $this->create($input_file_name,$input_file_type,$size,$input_data,$description);
+ } else {
+ //too big or small
+ $this->setError('ArtifactFile: File must be > 20 bytes and < 256000 bytes in length');
+ return false;
+ }
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactHtml.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactHtml.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactHtml.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,136 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('common/tracker/Artifact.class');
+
+class ArtifactHtml extends Artifact {
+
+ /**
+ * ArtifactHtml() - constructor
+ *
+ * Use this constructor if you are modifying an existing artifact
+ *
+ * @param $ArtifactType object
+ * @param $artifact_id integer (primary key from database)
+ * @return true/false
+ */
+ function ArtifactHtml(&$ArtifactType,$artifact_id=false) {
+ return $this->Artifact($ArtifactType,$artifact_id);
+ }
+
+ function showMessages() {
+ global $sys_datefmt;
+ $result= $this->getMessages();
+ $rows=db_numrows($result);
+
+ if ($rows > 0) {
+ $title_arr=array();
+ $title_arr[]='Message';
+
+ echo html_build_list_table_top ($title_arr);
+
+ for ($i=0; $i < $rows; $i++) {
+ echo '<TR BGCOLOR="'. html_get_alt_row_color($i) .'"><TD><PRE>
+Date: '. date($sys_datefmt,db_result($result, $i, 'adddate')) .'
+Sender: '. db_result($result,$i,'user_name') . '
+'. util_line_wrap ( db_result($result, $i, 'body'),65,"\n"). '</PRE></TD></TR>';
+ }
+ echo '</TABLE>';
+ } else {
+ echo '
+ <H3>No Followups Have Been Posted</H3>';
+ }
+ }
+
+ function showHistory() {
+ global $sys_datefmt,$artifact_cat_arr,$artifact_grp_arr,$artifact_res_arr;
+ $result=$this->getHistory();
+ $rows= db_numrows($result);
+
+ if ($rows > 0) {
+
+ $title_arr=array();
+ $title_arr[]='Field';
+ $title_arr[]='Old Value';
+ $title_arr[]='Date';
+ $title_arr[]='By';
+
+ echo html_build_list_table_top ($title_arr);
+
+ $artifactType =& $this->getArtifactType();
+
+ for ($i=0; $i < $rows; $i++) {
+ $field=db_result($result, $i, 'field_name');
+ echo '
+ <TR BGCOLOR="'. html_get_alt_row_color($i) .'"><TD>'.$field.'</TD><TD>';
+
+ if ($field == 'status_id') {
+
+ echo $artifactType->getStatusName(db_result($result, $i, 'old_value'));
+
+ } else if ($field == 'resolution_id') {
+
+ if (!$artifact_res_arr["_".db_result($result, $i, 'old_value')]) {
+ $artifact_res_arr["_".db_result($result, $i, 'old_value')]
+ = new ArtifactResolution($artifactType,db_result($result, $i, 'old_value'));
+ }
+ echo $artifact_res_arr["_".db_result($result, $i, 'old_value')]->getName();
+
+ } else if ($field == 'category_id') {
+
+ if (!$artifact_cat_arr["_".db_result($result, $i, 'old_value')]) {
+ $artifact_cat_arr["_".db_result($result, $i, 'old_value')]
+ = new ArtifactCategory($artifactType,db_result($result, $i, 'old_value'));
+ }
+ echo $artifact_cat_arr["_".db_result($result, $i, 'old_value')]->getName();
+
+ } else if ($field == 'artifact_group_id') {
+
+ if (!$artifact_grp_arr["_".db_result($result, $i, 'old_value')]) {
+ $artifact_grp_arr["_".db_result($result, $i, 'old_value')]
+ = new ArtifactGroup($artifactType,db_result($result, $i, 'old_value'));
+ }
+ echo $artifact_grp_arr["_".db_result($result, $i, 'old_value')]->getName();
+
+ } else if ($field == 'assigned_to') {
+
+ echo user_getname(db_result($result, $i, 'old_value'));
+
+ } else if ($field == 'close_date') {
+
+ echo date($sys_datefmt,db_result($result, $i, 'old_value'));
+
+ } else {
+
+ echo db_result($result, $i, 'old_value');
+
+ }
+ echo '</TD>'.
+ '<TD>'. date($sys_datefmt,db_result($result, $i, 'entrydate')) .'</TD>'.
+ '<TD>'. db_result($result, $i, 'user_name'). '</TD></TR>';
+ }
+
+ echo '
+ </TABLE>';
+
+ } else {
+ echo '
+ <H3>No Changes Have Been Made to This Item</H3>';
+ }
+
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactTypeHtml.class
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactTypeHtml.class (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/include/ArtifactTypeHtml.class 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,219 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('common/tracker/ArtifactType.class');
+
+class ArtifactTypeHtml extends ArtifactType {
+
+ /**
+ * ArtifactType() - constructor
+ *
+ * @param $Group object
+ * @param $artifact_type_id - the id # assigned to this artifact type in the db
+ */
+ function ArtifactTypeHtml(&$Group,$artifact_type_id=false) {
+ return $this->ArtifactType($Group,$artifact_type_id);
+ }
+
+ function header($params) {
+ global $DOCUMENT_ROOT;
+
+ $group_id= $this->Group->getID();
+
+ //required by new site_project_header
+ $params['group']=$group_id;
+ $params['toptab']='tracker';
+ $params['tabtext']=$this->getName();
+
+ site_project_header($params);
+
+ echo '<B><A HREF="/tracker/?func=add&group_id='.$group_id.'&atid='. $this->getID() .'">Submit New</A>';
+ echo ' | <A HREF="/tracker/?func=browse&group_id='.$group_id.'&atid='. $this->getID() .'">Browse</A>';
+ if (user_isloggedin()) {
+ echo ' | <A HREF="/tracker/reporting/?group_id='.$group_id.'&atid='. $this->getID() .'">Reporting</A>';
+ }
+ echo ' | <A HREF="/tracker/admin/?group_id='.$group_id.'">Admin</A>';
+
+ echo '</B><P>';
+ //echo '<HR NoShade SIZE="1" SIZE="90%">';
+ }
+
+ function footer($params) {
+ site_project_footer($params);
+ }
+
+ function adminHeader($params) {
+ echo $this->header($params);
+ $group_id= $this->Group->getID();
+ echo '<B>Admin Functions: <A HREF="/tracker/admin/?group_id='.$group_id.'">Add/Browse Artifact Types</A>';
+ echo ' | <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $this->getID() .'">Edit/Update Options in: '. $this->getName() .'</A></B>';
+ }
+
+ function categoryBox ($name='category_id',$checked='xzxz',$text_100='None') {
+ return html_build_select_box ($this->getCategories(),$name,$checked,true,$text_100);
+ }
+
+ function artifactGroupBox ($name='artifact_group_id',$checked='xzxz',$text_100='None') {
+ return html_build_select_box ($this->getGroups(),$name,$checked,true,$text_100);
+ }
+
+ function technicianBox ($name='assigned_to',$checked='xzxz',$show_100=true,$text_100='None') {
+ return html_build_select_box ($this->getTechnicians(),$name,$checked,$show_100,$text_100);
+ }
+
+ function cannedResponseBox ($name='canned_response',$checked='xzxz') {
+ return html_build_select_box ($this->getCannedResponses(),$name,$checked);
+ }
+
+ function statusBox ($name='status_id',$checked='xzxz',$show_100=false,$text_100='None') {
+ return html_build_select_box($this->getStatuses(),$name,$checked,$show_100,$text_100);
+ }
+
+ function resolutionBox ($name='resolution_id',$checked='xzxz',$show_100=false,$text_100='None') {
+ return html_build_select_box($this->getResolutions(),$name,$checked,$show_100,$text_100);
+ }
+
+ function showBrowseList ($result,$offset,$set='open') {
+ global $sys_datefmt,$PHP_SELF;
+ $group_id=$this->Group->getID();
+
+ $title_arr=array();
+ $title_arr[]='Request ID';
+ $title_arr[]='Summary';
+ $title_arr[]='Date';
+ $title_arr[]='Assigned To';
+ $title_arr[]='Submitted By';
+
+ $IS_ADMIN=$this->userIsAdmin();
+
+
+ if ($IS_ADMIN) {
+ echo '
+ <FORM NAME="artifactList" ACTION="'. $PHP_SELF .'?group_id='.$group_id.'&atid='.$this->getID().'" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="massupdate">';
+ }
+
+ echo html_build_list_table_top ($title_arr);
+
+ $then=(time()-$this->getDuePeriod());
+ $rows=db_numrows($result);
+ for ($i=0; $i < $rows; $i++) {
+ echo '
+ <TR BGCOLOR="'. get_priority_color(db_result($result, $i, 'priority')) .'">'.
+ '<TD NOWRAP>'.
+ ($IS_ADMIN?'<INPUT TYPE="CHECKBOX" NAME="artifact_id_list[]" VALUE="'.
+ db_result($result, $i, 'artifact_id') .'"> ':'').
+ db_result($result, $i, 'artifact_id') .
+ '</TD>'.
+ '<TD><A HREF="'.$PHP_SELF.'?func=detail&aid='.
+ db_result($result, $i, 'artifact_id').
+ '&group_id='. $group_id .'&atid='.
+ $this->getID().'">'.
+ db_result($result, $i, 'summary').
+ '</A></TD>'.
+ '<TD>'. (($set != 'closed' && db_result($result, $i, 'date') < $then)?'<B>* ':' ') . date($sys_datefmt,db_result($result, $i, 'date')) .'</TD>'.
+ '<TD>'. make_user_link ( db_result($result, $i, 'assigned_to') ) .'</TD>'.
+ '<TD>'. make_user_link ( db_result($result, $i, 'submitted_by') ) .'</TD></TR>';
+ }
+
+ /*
+ Show extra rows for <-- Prev / Next -->
+ */
+ if (($offset > 0) || ($rows >= 50)) {
+ echo '
+ <TR><TD COLSPAN="2">';
+ if ($offset > 0) {
+ echo '<A HREF="'.$PHP_SELF.'?func=browse&group_id='.$group_id.'&atid='.$this->getID().'&set='.$set.'&offset='.($offset-50).'"><B><-- Previous 50</B></A>';
+ } else {
+ echo ' ';
+ }
+ echo '</TD><TD> </TD><TD COLSPAN="2">';
+
+ if ($rows >= 50) {
+ echo '<A HREF="'.$PHP_SELF.'?func=browse&group_id='.$group_id.'&atid='.$this->getID().'&set='.$set.'&offset='.($offset+50).'"><B>Next 50 --></B></A>';
+ } else {
+ echo ' ';
+ }
+ echo '</TD></TR>';
+ }
+
+ /*
+ Mass Update Code
+ */
+ if ($IS_ADMIN) {
+ echo '<script language="JavaScript">
+ <!--
+ function checkAll(val) {
+ al=document.artifactList;
+ len = al.elements.length;
+ var i=0;
+ for( i=0 ; i<len ; i++) {
+ if (al.elements[i].name==\'artifact_id_list[]\') {
+ al.elements[i].checked=val;
+ }
+ }
+ }
+ //-->
+ </script>
+ <TR><TD COLSPAN="5">
+<font size=1>
+<a href="javascript:checkAll(1)">Check All</a>
+-
+ <a href="javascript:checkAll(0)">Clear All</a>
+</font>
+<P>
+
+ <FONT COLOR="#FF0000"><B>Admin:</B></FONT> If you wish to apply changes to all items selected above, use these controls to change their properties and click once on "Mass Update".
+ <TABLE WIDTH="100%" BORDER="0">
+
+ <TR>
+ <TD><B>Category: <A href="javascript:help_window(\'/help/tracker.php?helpname=category\')"><b>(?)</b></a></B><BR>'. $this->categoryBox ('category_id','xzxz','No Change') .'</TD>
+ <TD><B>Group: <A href="javascript:help_window(\'/help/tracker.php?helpname=group\')"><b>(?)</b></a></B><BR>'. $this->artifactGroupBox ('artifact_group_id','xzxz','No Change') .'</TD>
+ </TR>
+
+ <TR>
+ <TD><B>Priority: <A href="javascript:help_window(\'/help/tracker.php?helpname=priority\')"><b>(?)</b></a></B><BR>';
+ echo build_priority_select_box ('priority', '5', true);
+ echo '</TD><TD>';
+ if ($this->useResolution()) {
+ echo '
+ <B>Resolution: <A href="javascript:help_window(\'/help/tracker.php?helpname=resolution\')"><b>(?)</b></a></B><BR>';
+ echo $this->resolutionBox('resolution_id','xzxz',true,'No Change');
+ } else {
+ echo '
+ <INPUT TYPE="HIDDEN" NAME="resolution_id" VALUE="100">';
+ }
+
+ echo '</TD>
+ </TR>
+
+ <TR>
+ <TD><B>Assigned To: <A href="javascript:help_window(\'/help/tracker.php?helpname=assignee\')"><b>(?)</b></a></B><BR>'. $this->technicianBox ('assigned_to','xzxz',true,'No Change') .'</TD>
+ <TD><B>Status: <A href="javascript:help_window(\'/help/tracker.php?helpname=status\')"><b>(?)</b></a></B><BR>'. $this->statusBox ('status_id','xzxz',true,'No Change') .'</TD>
+ </TR>
+
+ <TR><TD COLSPAN="2"><B>Canned Response: <A href="javascript:help_window(\'/help/tracker.php?helpname=canned_response\')"><b>(?)</b></a></B><BR>'. $this->cannedResponseBox ('canned_response') .'</TD></TR>
+
+ <TR><TD COLSPAN="3" ALIGN="MIDDLE"><INPUT TYPE="SUBMIT" name="submit" VALUE="Mass Update"></TD></TR>
+
+ </TABLE>
+ </FORM>
+ </TD></TR>';
+ }
+ echo '</TABLE>';
+ }
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/index.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/index.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/index.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,345 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+require_once('pre.php');
+require_once('common/tracker/Artifact.class');
+require_once('common/tracker/ArtifactFile.class');
+require_once('www/tracker/include/ArtifactFileHtml.class');
+require_once('common/tracker/ArtifactType.class');
+require_once('www/tracker/include/ArtifactTypeHtml.class');
+require_once('www/tracker/include/ArtifactHtml.class');
+require_once('common/tracker/ArtifactGroup.class');
+require_once('common/tracker/ArtifactCategory.class');
+require_once('common/tracker/ArtifactCanned.class');
+require_once('common/tracker/ArtifactResolution.class');
+
+if ($group_id && $atid) {
+
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+ }
+
+ //
+ // Create the ArtifactType object
+ //
+ $ath = new ArtifactTypeHtml($group,$atid);
+ if (!$ath || !is_object($ath)) {
+ exit_error('Error','ArtifactType could not be created');
+ }
+ if ($ath->isError()) {
+ exit_error('Error',$ath->getErrorMessage());
+ }
+
+ switch ($func) {
+
+ case 'add' : {
+ include '../tracker/add.php';
+ break;
+ }
+ case 'postadd' : {
+ /*
+
+ Create a new Artifact
+
+ */
+ $ah=new ArtifactHtml($ath);
+ if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+ } else {
+ if (empty($user_email)) {
+ $user_email=false;
+ } else {
+ if (!validate_email($user_email)) {
+ exit_error('ERROR', 'Invalid email address');
+ }
+ }
+ if (!$ah->create($category_id,$artifact_group_id,$summary,$details,$assigned_to,$priority, $user_email)) {
+ exit_error('ERROR',$ah->getErrorMessage());
+ } else {
+ //
+ // Attach file to this Artifact.
+ //
+ if ($add_file) {
+ $afh=new ArtifactFileHtml($ah);
+ if (!$afh || !is_object($afh)) {
+ $feedback .= 'Could Not Create File Object';
+// } elseif ($afh->isError()) {
+// $feedback .= $afh->getErrorMessage();
+ } else {
+ if (!$afh->upload($input_file,$input_file_name,$input_file_type,$file_description)) {
+ $feedback .= ' Could Not Attach File to Item: '.$afh->getErrorMessage();
+ }
+ }
+ }
+ $feedback .= ' Item Successfully Created ';
+ include '../tracker/browse.php';
+ }
+ }
+ break;
+ }
+ case 'massupdate' : {
+ $count=count($artifact_id_list);
+
+ $artifact_type_id=$ath->getID();
+
+ for ($i=0; $i < $count; $i++) {
+ $ah=new Artifact($ath,$artifact_id_list[$i]);
+ if (!$ah || !is_object($ah)) {
+ $feedback .= ' ID: '.$artifact_id_list[$i].'::Artifact Could Not Be Created';
+ } else if ($ah->isError()) {
+ $feedback .= ' ID: '.$artifact_id_list[$i].'::'.$ah->getErrorMessage();
+ } else {
+
+ $_priority=(($priority != 100) ? $priority : $ah->getPriority());
+ $_status_id=(($status_id != 100) ? $status_id : $ah->getStatusID());
+ $_category_id=(($category_id != 100) ? $category_id : $ah->getCategoryID());
+ $_artifact_group_id=(($artifact_group_id != 100) ? $artifact_group_id : $ah->getArtifactGroupID());
+ $_resolution_id=(($resolution_id != 100) ? $resolution_id : $ah->getResolutionID());
+ $_assigned_to=(($assigned_to != 100) ? $assigned_to : $ah->getAssignedTo());
+ $_summary=addslashes($ah->getSummary());
+
+ if (!$ah->update($_priority,$_status_id,$_category_id,$_artifact_group_id,$_resolution_id,$_assigned_to,$_summary,$canned_response,'',$artifact_type_id)) {
+ $was_error=true;
+ $feedback .= ' ID: '.$artifact_id_list[$i].'::'.$ah->getErrorMessage();
+ }
+
+ }
+ unset($ah);
+ }
+ if (!$was_error) {
+ $feedback = 'Updated Successfully ';
+ }
+ include '../tracker/browse.php';
+ break;
+ }
+ case 'postmod' : {
+ /*
+ Modify an Artifact
+ */
+ $ah=new ArtifactHtml($ath,$artifact_id);
+ if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+ } else if ($ah->isError()) {
+ exit_error('ERROR',$ah->getErrorMessage());
+ } else {
+ if (!$ah->update($priority,$status_id,$category_id,$artifact_group_id,$resolution_id,
+ $assigned_to,$summary,$canned_response,$details,$new_artfact_type_id)) {
+ $feedback = 'Tracker Item: '.$ah->getErrorMessage();
+ $ah->clearError();
+ $was_error=true;
+ }
+
+ //
+ // Attach file to this Artifact.
+ //
+ if ($add_file) {
+ $afh=new ArtifactFileHtml($ah);
+ if (!$afh || !is_object($afh)) {
+ $feedback .= 'Could Not Create File Object';
+// } elseif ($afh->isError()) {
+// $feedback .= $afh->getErrorMessage();
+ } else {
+ if (!util_check_fileupload($input_file)) {
+ exit_error("Error","Invalid filename");
+ }
+ if (!$afh->upload($input_file,$input_file_name,$input_file_type,$file_description)) {
+ $feedback .= ' <BR>File Upload: '.$afh->getErrorMessage();
+ $was_error=true;
+ } else {
+ $feedback .= ' <BR>File Upload: Successful ';
+ }
+ }
+ }
+
+ //
+ // Delete list of files from this artifact
+ //
+ if ($delete_file) {
+ $count=count($delete_file);
+ for ($i=0; $i<$count; $i++) {
+ $afh=new ArtifactFileHtml($ah,$delete_file[$i]);
+ if (!$afh || !is_object($afh)) {
+ $feedback .= 'Could Not Create File Object::'.$delete_file[$i];
+ } elseif ($afh->isError()) {
+ $feedback .= $afh->getErrorMessage().'::'.$delete_file[$i];
+ } else {
+ if (!$afh->delete()) {
+ $feedback .= ' <BR>File Delete: '.$afh->getErrorMessage();
+ $was_error=true;
+ } else {
+ $feedback .= ' <BR>File Delete: Successful ';
+ }
+ }
+ }
+ }
+ //
+ // Show just one feedback entry if no errors
+ //
+ if (!$was_error) {
+ $feedback = 'Successfully Updated';
+ }
+ include '../tracker/browse.php';
+ }
+ break;
+ }
+ case 'postaddcomment' : {
+ /*
+ Attach a comment to an artifact
+
+ Used by non-admins
+ */
+ $ah=new ArtifactHtml($ath,$artifact_id);
+ if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+ } else if ($ah->isError()) {
+ exit_error('ERROR',$ah->getErrorMessage());
+ } else {
+ if ($ah->addMessage($details,$user_email,true)) {
+ $feedback='Comment Added';
+ include '../tracker/browse.php';
+ } else {
+ //some kind of error in creation
+ exit_error('ERROR',$feedback);
+ }
+ }
+ break;
+ }
+ case 'monitor' : {
+ $ah=new ArtifactHtml($ath,$artifact_id);
+ if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+ } else if ($ah->isError()) {
+ exit_error('ERROR',$ah->getErrorMessage());
+ } else {
+ $ah->setMonitor($user_email);
+ $feedback=$ah->getErrorMessage();
+ include '../tracker/browse.php';
+ }
+ break;
+ }
+ case 'browse' : {
+ include '../tracker/browse.php';
+ break;
+ }
+ case 'download' : {
+ $CACHE_ON=0;
+ Header("Redirect: /tracker/download.php?group_id=$group_id&atid=$atid&aid=$aid&file_id=$file_id");
+ break;
+ }
+ case 'detail' : {
+ //
+ // users can modify their own tickets if they submitted them
+ // even if they are not artifact admins
+ //
+ $ah=new ArtifactHtml($ath,$aid);
+ if (!$ah || !is_object($ah)) {
+ exit_error('ERROR','Artifact Could Not Be Created');
+ } else if ($ah->isError()) {
+ exit_error('ERROR',$ah->getErrorMessage());
+ } else {
+ if ($ath->userIsAdmin() || (user_isloggedin() && ($ah->getSubmittedBy() == user_getid()))) {
+ include '../tracker/mod.php';
+ } else {
+ include '../tracker/detail.php';
+ }
+ }
+ break;
+ }
+ default : {
+ include '../tracker/browse.php';
+ break;
+ }
+ }
+
+} elseif ($group_id) {
+ //
+ // get the Group object
+ //
+ $group =& group_get_object($group_id);
+ if (!$group || !is_object($group) || $group->isError()) {
+ exit_no_group();
+ }
+
+ $perm =& $group->getPermission( session_get_user() );
+
+ //
+ // get a list of artifact types they have defined
+ //
+ if (user_isloggedin() && $perm->isMember()) {
+ $public_flag='0,1';
+ } else {
+ $public_flag='1';
+ }
+
+ $sql="SELECT agl.*,aca.count,aca.open_count
+ FROM artifact_group_list agl
+ LEFT JOIN artifact_counts_agg aca USING (group_artifact_id)
+ WHERE agl.group_id='$group_id'
+ AND agl.is_public IN ($public_flag)
+ ORDER BY group_artifact_id ASC";
+
+ //required params for site_project_header();
+ $params['group']=$group_id;
+ $params['toptab']='tracker';
+ $params['pagename']='tracker';
+ $params['sectionvals']=array(group_getname($group_id));
+
+ echo site_project_header($params);
+ echo '<B><A HREF="/tracker/reporting/?group_id='.$group_id.'">Reporting</A> | '
+ .'<A HREF="/tracker/admin/?group_id='.$group_id.'">Admin</A>'
+ .'</B><P>';
+
+ $result = db_query ($sql);
+ $rows = db_numrows($result);
+ if (!$result || $rows < 1) {
+ echo "<H1>No Accessible Trackers Found</H1>";
+ echo "<P>
+ <B>No trackers have been set up, or you cannot view them.<P><FONT COLOR=RED>The Admin for this project ".
+ "will have to set up data types using the <A HREF=\"/tracker/admin/?group_id=$group_id\">admin page</A></FONT></B>";
+ } else {
+
+ echo '
+ <P>
+ Choose a tracker and you can browse/edit/add items to it.
+ <P>';
+
+ /*
+ Put the result set (list of forums for this group) into a column with folders
+ */
+
+ for ($j = 0; $j < $rows; $j++) {
+ echo '
+ <A HREF="/tracker/?atid='.db_result($result, $j, 'group_artifact_id').
+ '&group_id='.$group_id.'&func=browse">' .
+ html_image("images/ic/index.png","15","13",array("BORDER"=>"0")) . ' '.
+ db_result($result, $j, 'name').'</A>
+ ( <B>'. db_result($result, $j, 'open_count') .' open / '. db_result($result, $j, 'count') .' total</B> )<BR>'.
+ db_result($result, $j, 'description').'<P>';
+
+ }
+ }
+
+ echo site_project_footer(array());
+
+} else {
+
+ exit_no_group();
+
+}
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/mod.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/mod.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/mod.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,227 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version $Id$
+ *
+ */
+
+
+$ath->header(array ('title'=>'Modify: '.$ah->getID(). ' - ' . $ah->getSummary(),'pagename'=>'tracker','atid'=>$ath->getID(),'sectionvals'=>array($group->getPublicName()) ));
+
+?>
+ <H2>[ #<?php echo $ah->getID(); ?> ] <?php echo $ah->getSummary(); ?></H2>
+
+ <TABLE WIDTH="100%">
+ <FORM ACTION="<?php echo $PHP_SELF; ?>?group_id=<?php echo $group_id; ?>&atid=<?php echo $ath->getID(); ?>" METHOD="POST">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="monitor">
+ <INPUT TYPE="HIDDEN" NAME="artifact_id" VALUE="<?php echo $ah->getID(); ?>">
+ <TR>
+ <TD COLSPAN=2">
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Monitor"> <A href="javascript:help_window('/help/tracker.php?helpname=monitor')"><B>(?)</B></A>
+ </FORM>
+ </TD>
+ </TR>
+
+ <FORM ACTION="<?php echo $PHP_SELF; ?>?group_id=<?php echo $group_id; ?>&atid=<?php echo $ath->getID(); ?>" METHOD="POST" enctype="multipart/form-data">
+ <INPUT TYPE="HIDDEN" NAME="func" VALUE="postmod">
+ <INPUT TYPE="HIDDEN" NAME="artifact_id" VALUE="<?php echo $ah->getID(); ?>">
+
+ <TR>
+ <TD><B>Submitted By:</B><BR><?php echo $ah->getSubmittedRealName(); ?> (<tt><?php echo $ah->getSubmittedUnixName(); ?></tt>)</TD>
+ <TD><B>Date Submitted:</B><BR>
+ <?php
+ echo date($sys_datefmt, $ah->getOpenDate() );
+
+ $close_date = $ah->getCloseDate();
+ if ($ah->getStatusID()==2 && $close_date > 1) {
+ echo '<BR><B>Date Closed:</B><BR>'
+ .date($sys_datefmt, $close_date);
+ }
+ ?>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD><B>Data Type: <A href="javascript:help_window('/help/tracker.php?helpname=data_type')"><B>(?)</B></A></B><BR>
+ <?php
+
+//
+// kinda messy - but works for now
+// need to get list of data types this person can admin
+//
+ if ($ath->userIsAdmin()) {
+ $res=$group->getArtifactTypes();
+ } else {
+ $sql="SELECT agl.group_artifact_id,agl.name
+ FROM artifact_group_list agl,artifact_perm ap
+ WHERE agl.group_artifact_id=ap.group_artifact_id
+ AND ap.user_id='". user_getid() ."'
+ AND ap.perm_level > 1
+ AND agl.group_id='$group_id'";
+ $res=db_query($sql);
+ }
+ echo html_build_select_box ($res,'new_artfact_type_id',$ath->getID(),false);
+
+ ?>
+ </TD>
+ <TD>
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Submit Changes">
+ </TD>
+ </TR>
+
+ <TR>
+ <TD><B>Category: <A href="javascript:help_window('/help/tracker.php?helpname=category')"><b>(?)</b></a></B><BR>
+ <?php
+
+ echo $ath->categoryBox('category_id', $ah->getCategoryID() );
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&add_cat=1">(admin)</A>';
+
+ ?>
+ </TD>
+ <TD><B>Group: <A href="javascript:help_window('/help/tracker.php?helpname=group')"><b>(?)</b></a></B><BR>
+ <?php
+
+ echo $ath->artifactGroupBox('artifact_group_id', $ah->getArtifactGroupID() );
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&add_group=1">(admin)</A>';
+
+ ?>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD><B>Assigned To: <A href="javascript:help_window('/help/tracker.php?helpname=assignee')"><b>(?)</b></a></B><BR>
+ <?php
+
+ echo $ath->technicianBox('assigned_to', $ah->getAssignedTo() );
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&update_users=1">(admin)</A>';
+ ?>
+ </TD><TD>
+ <B>Priority: <A href="javascript:help_window('/help/tracker.php?helpname=priority')"><b>(?)</b></a></B><BR>
+ <?php
+ /*
+ Priority of this request
+ */
+ build_priority_select_box('priority',$ah->getPriority());
+ ?>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD>
+ <B>Status: <A href="javascript:help_window('/help/tracker.php?helpname=status')"><b>(?)</b></a></B><BR>
+ <?php
+
+ echo $ath->statusBox ('status_id', $ah->getStatusID() );
+
+ ?>
+ </TD>
+ <TD>
+ <?php
+ if ($ath->useResolution()) {
+ echo '
+ <B>Resolution: <A href="javascript:help_window(\'/help/tracker.php?helpname=resolution\')"><b>(?)</b></a></B><BR>';
+ echo $ath->resolutionBox('resolution_id',$ah->getResolutionID());
+ } else {
+ echo '
+ <INPUT TYPE="HIDDEN" NAME="resolution_id" VALUE="100">';
+ }
+ ?>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD COLSPAN="2"><B>Summary: <A href="javascript:help_window('/help/tracker.php?helpname=summary')"><b>(?)</b></a></B><BR>
+ <INPUT TYPE="TEXT" NAME="summary" SIZE="45" VALUE="<?php
+ echo $ah->getSummary();
+ ?>" MAXLENGTH="60">
+ </TD>
+ </TR>
+
+ <TR><TD COLSPAN="2">
+ <?php echo nl2br($ah->getDetails()); ?>
+ </TD></TR>
+
+ <TR><TD COLSPAN="2">
+ <B>Use Canned Response: <A href="javascript:help_window('/help/tracker.php?helpname=canned_response')"><b>(?)</b></a></B><BR>
+ <?php
+ echo $ath->cannedResponseBox('canned_response');
+ echo ' <A HREF="/tracker/admin/?group_id='.$group_id.'&atid='. $ath->getID() .'&add_canned=1">(admin)</A>';
+ ?>
+ <P>
+ <B>OR Attach A Comment: <A href="javascript:help_window('/help/tracker.php?helpname=comment')"><b>(?)</b></a></B><BR>
+ <TEXTAREA NAME="details" ROWS="7" COLS="60" WRAP="HARD"></TEXTAREA>
+ <P>
+ <H3>Followups:</H3>
+ <P>
+ <?php
+ echo $ah->showMessages();
+ ?>
+ </TD></TR>
+
+ <TR><TD COLSPAN=2>
+ <B>Check to Upload & Attach File:</B> <input type="checkbox" name="add_file" VALUE="1">
+ <A href="javascript:help_window('/help/tracker.php?helpname=attach_file')"><b>(?)</b></a><BR>
+ <P>
+ <input type="file" name="input_file" size="30">
+ <P>
+ <B>File Description:</B><BR>
+ <input type="text" name="file_description" size="40" maxlength="255">
+ <P>
+ <H4>Existing Files:</H4>
+ <?php
+ //
+ // print a list of files attached to this Artifact
+ //
+ $file_list =& $ah->getFiles();
+
+ $count=count($file_list);
+
+ $title_arr=array();
+ $title_arr[]='Delete';
+ $title_arr[]='Name';
+ $title_arr[]='Description';
+ $title_arr[]='Download';
+ echo html_build_list_table_top ($title_arr);
+
+ if ($count > 0) {
+
+ for ($i=0; $i<$count; $i++) {
+ echo '<TR><TD><INPUT TYPE="CHECKBOX" NAME="delete_file[]" VALUE="'. $file_list[$i]->getID() .'"> Delete</TD>'.
+ '<TD>'. $file_list[$i]->getName() .'</TD>
+ <TD>'. $file_list[$i]->getDescription() .'</TD>
+ <TD><A HREF="/tracker/download.php?group_id='.$group_id.'&atid='. $ath->getID() .'&file_id='.$file_list[$i]->getID().'&aid='. $ah->getID() .'">Download</A></TD></TR>';
+ }
+
+ } else {
+ echo '<TR><TD COLSPAN=3>No Files Currently Attached</TD></TR>';
+ }
+
+ ?>
+ </TABLE>
+ </TD><TR>
+
+ <TR><TD COLSPAN="2">
+ <H4>Change Log:</H4>
+ <?php
+ echo $ah->showHistory();
+ ?>
+ </TD></TR>
+
+ <TR><TD COLSPAN="2" ALIGN="MIDDLE">
+ <INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="Submit Changes">
+ </FORM>
+ </TD></TR>
+
+ </TABLE>
+
+<?php
+
+$ath->footer(array());
+
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/reporting/index.php
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/reporting/index.php (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/reporting/index.php 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,305 @@
+<?php
+/**
+ *
+ * SourceForge Generic Tracker facility
+ *
+ * SourceForge: Breaking Down the Barriers to Open Source Development
+ * Copyright 1999-2001 (c) VA Linux Systems
+ * http://sourceforge.net
+ *
+ * @version index.php,v 1.1 2001/11/01 19:19:19 lo-lan-do Exp
+ *
+ */
+
+
+require_once('pre.php');
+require_once('www/project/stats/project_stats_utils.php');
+require_once('tool_reports.php');
+
+$page_title="Artifact Reporting System";
+//$bar_colors=array("red","blue");
+$bar_colors=array("#F76D6D","#6D6DF7");
+
+$group =& group_get_object($group_id);
+exit_assert_object($group, 'Group');
+
+$perm =& $group->getPermission( session_get_user() );
+exit_assert_object($perm, 'Permission');
+
+function reporting_header($group_id) {
+ global $atid;
+
+ reports_header(
+ $group_id,
+ array('aging','tech','category','group','resolution'),
+ array('Aging Report','Distribution by Technician','Distribution by Category','Distribution by Group','Distribution by Resolution'),
+ '<b>Artifact Type: </b>'
+ .html_build_select_box($GLOBALS['group']->getArtifactTypes(),'atid',$atid,false)
+ .'<br><br>'
+ );
+}
+
+function quick_report($group_id,$title,$subtitle1,$sql1,$subtitle2,$sql2) {
+ global $bar_colors;
+
+ echo site_project_header(array("title"=>$title,'group'=>$group_id,'pagename'=>'tracker_reporting'));
+ reporting_header($group_id);
+ echo "\n<H1>$title</H1>";
+
+ reports_quick_graph($subtitle1,$sql1,$sql2,$bar_colors);
+
+ echo site_project_footer(array());
+}
+
+
+if ($perm->isMember()) {
+
+ include_once('www/include/HTML_Graphs.php');
+
+ if ($what) {
+
+ $period_clause=period2sql($period,$span,"open_date");
+
+ if ($what=="aging") {
+
+ site_project_header(array ("title"=>"Aging Report",'group'=>$group_id,'pagename'=>'tracker_reporting'));
+ reporting_header($group_id);
+ echo "\n<H1>Aging Report</H1>";
+
+ $time_now=time();
+// echo $time_now."<P>";
+
+ if (!$period || $period=="lifespan") {
+ $period="month";
+ $span=12;
+ }
+
+ if (!$span) $span=1;
+ $sub_duration=period2seconds($period, 1);
+
+ for ($counter=1; $counter<=$span; $counter++) {
+
+ $start=($time_now-($counter*$sub_duration));
+ $end=($time_now-(($counter-1)*$sub_duration));
+
+ $sql=" SELECT avg((close_date-open_date)/(24*60*60))
+ FROM artifact
+ WHERE close_date > 0
+ AND (open_date >= '$start' AND open_date <= '$end')
+ AND resolution_id <> '2'
+ AND group_artifact_id='$atid'";
+
+ $result = db_query($sql);
+
+ $names[$counter-1]=date("Y-m-d",($start))." to ".date("Y-m-d",($end));
+ $values[$counter-1]=((int)(db_result($result, 0,0)*1000))/1000;
+ }
+
+ GraphIt(
+ $names, $values,
+ "Average Turnaround Time For Closed Items (days)"
+ );
+
+ echo "<P>";
+
+ for ($counter=1; $counter<=$span; $counter++) {
+
+ $start=($time_now-($counter*$sub_duration));
+ $end=($time_now-(($counter-1)*$sub_duration));
+
+ $sql=" SELECT count(*)
+ FROM artifact
+ WHERE open_date >= '$start'
+ AND open_date <= '$end'
+ AND resolution_id <> '2'
+ AND group_artifact_id='$atid'";
+
+ $result = db_query($sql);
+
+ $names[$counter-1]=date("Y-m-d",($start))." to ".date("Y-m-d",($end));
+ $values[$counter-1]=db_result($result, 0,0);
+ }
+
+ GraphIt($names, $values, "Number of Items Submitted");
+
+ echo "<P>";
+
+ for ($counter=1; $counter<=$span; $counter++) {
+
+ $start=($time_now-($counter*$sub_duration));
+ $end=($time_now-(($counter-1)*$sub_duration));
+
+ $sql=" SELECT count(*)
+ FROM artifact
+ WHERE open_date <= '$end'
+ AND (close_date >= '$end' OR close_date < 1 OR close_date is null)
+ AND resolution_id <> '2'
+ AND group_artifact_id='$atid'";
+
+ $result = db_query($sql);
+
+ $names[$counter-1]=date("Y-m-d",($end));
+ $values[$counter-1]=db_result($result, 0,0);
+ }
+
+ GraphIt($names, $values, "Number of Items Still Open");
+
+ echo "<P>";
+
+ site_project_footer(array());
+
+ } else if ($what=="category") {
+
+ // Open
+ $sql1="
+ SELECT artifact_category.category_name AS Category,
+ count(*) AS Count
+ FROM artifact_category,artifact
+ WHERE artifact_category.id=artifact.category_id
+ AND artifact.status_id = '1'
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Category";
+
+ // All
+ $sql2="
+ SELECT artifact_category.category_name AS Category,
+ count(*) AS Count
+ FROM artifact_category,artifact
+ WHERE artifact_category.id=artifact.category_id
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Category";
+
+ quick_report(
+ $group_id,
+ "Distribution By Category",
+ "Open Items By Category",$sql1,
+ "All Items By Category",$sql2
+ );
+
+ } else if ($what=="tech") {
+
+ // Open
+ $sql1="
+ SELECT users.user_name AS Technician, count(*) AS Count
+ FROM users,artifact
+ WHERE users.user_id=artifact.assigned_to
+ AND artifact.status_id = '1'
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Technician";
+
+ // All
+ $sql2="
+ SELECT users.user_name AS Technician, count(*) AS Count
+ FROM users,artifact
+ WHERE users.user_id=artifact.assigned_to
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Technician";
+
+ quick_report(
+ $group_id,
+ "Distribution By Technician",
+ "Open Items By Technician",$sql1,
+ "All Items By Technician",$sql2
+ );
+
+ } else if ($what=="group") {
+
+ // Open
+ $sql1="
+ SELECT artifact_group.group_name AS Group_Name,
+ count(*) AS Count FROM artifact_group,artifact
+ WHERE artifact_group.id=artifact.artifact_group_id
+ AND artifact.status_id = '1'
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Group_Name";
+
+ // All
+ $sql2="
+ SELECT artifact_group.group_name AS Group_Name,
+ count(*) AS Count FROM artifact_group,artifact
+ WHERE artifact_group.id=artifact.artifact_group_id
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Group_Name";
+
+ quick_report(
+ $group_id,
+ "Distribution By Artifact Group",
+ "Open By Artifact Group",$sql1,
+ "All Items By Artifact Group",$sql2
+ );
+
+ } else if ($what=="resolution") {
+
+ // Open
+ $sql1="
+ SELECT artifact_resolution.resolution_name AS Resolution,
+ count(*) AS Count
+ FROM artifact_resolution,artifact
+ WHERE artifact_resolution.id=artifact.resolution_id
+ AND artifact.status_id = '1'
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Resolution";
+
+ // All
+ $sql2="
+ SELECT artifact_resolution.resolution_name AS Resolution,
+ count(*) AS Count
+ FROM artifact_resolution,artifact
+ WHERE artifact_resolution.id=artifact.resolution_id
+ AND artifact.resolution_id <> '2'
+ AND artifact.group_artifact_id='$atid'
+ $period_clause
+ GROUP BY Resolution";
+
+ quick_report(
+ $group_id,
+ "Distribution By Resolution",
+ "Open Items By Resolution",$sql1,
+ "All Items By Resolution",$sql2
+ );
+
+ } else {
+ exit_missing_param();
+ }
+
+ } else {
+ /*
+ Show main page
+ */
+
+ //required params for site_project_header();
+ $params['group'] = $group_id;
+ $params['toptab'] = 'tracker';
+ $params['title'] = $page_title;
+ $params['pagename'] = 'tracker_reporting';
+
+ echo site_project_header($params);
+
+ reporting_header($group_id);
+
+ echo site_project_footer($params);
+
+ }
+
+} else {
+
+ // Cannot show reports
+
+ exit_permission_denied();
+
+}
+?>
Added: trunk/gforge_base/evolvisforge/gforge/www/tracker/tracker-er-diagram.sda
===================================================================
--- trunk/gforge_base/evolvisforge/gforge/www/tracker/tracker-er-diagram.sda (rev 0)
+++ trunk/gforge_base/evolvisforge/gforge/www/tracker/tracker-er-diagram.sda 2010-02-25 13:21:30 UTC (rev 405)
@@ -0,0 +1,285 @@
+ÐÏࡱá ; þÿ C þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿ
+
+ ! " # $ % & ' ( ) * + , þÿÿÿ. / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B þÿÿÿD E þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR o o t E n t r y ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ þÿÿÿþÿÿÿþÿÿÿ
+
+ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿ
+ ÿÿÿÿ .½
ÑÐ )ä°± Drawing
+ StarDraw 5.0 8ÿÿÿfðÿÿþY ó( SfxDocumentInfo g11<Á» ¿11$¿ g11Dû¿ Info 0 Info 1 Info 2 Info 3 g11À < TASK,0,1
+ 1,0,100,1, þÿ à
òùOh« +'³Ù0 ø h
+ t
+ ¤ ° ¼ È Ô à ì 4 @ ;ô @ zàôXÀ@ VÿfÀ@ ufì°XÀ »» ÿÿ ¯ XOutdevItemPool 1 èèéêëìíîïðñòóôõö÷øùúûüý
+ è)èéêëìíîïðñùúûüýþ
+
+&'()*+,-./06789:;UVWXYZ[\] ècèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst ètèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef ¡ d î ì j 0 £ ¹'è @ q X X º'é , @ ÿÿÿÿ X »'ê . @ ß 2 X X X ¼'ë @ ÿÿÿÿ X ½'ì @ µ ÿÿÿÿ Arrowÿÿÿÿ
+ Arrowÿÿÿÿ d È d X X XS ¾'í ª @ k ÿÿÿÿ Arrowÿÿÿÿ d È d Arrowÿÿÿÿ } ú ú ú } X X X_ ¿'î . @ ¥ , ¼ È X X X À'ï . @ ß , È ú X X X Á'ð @ X X Â'ñ @ . X òò
+ @ H óó
+ @ ^ ôô
+ @ t õõ
+ @ öö
+ @ ÷÷
+ @ ¶ øø
+ @ Ì ´'ú @ î X X µ'û @ n ÿÿÿÿ ¸¸ÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿÌÌ ÿÿÿÿ ÿÿÿÿÿÿ Gray 20%ÿÿÿÿ ÌÌÌÌÌÌX X X2 XD XV ¶'ü 6 @ À ÿÿÿÿ ÿÿÿÿÿÿ 2 2 d d X ·'ý ( @ ô ÿÿÿÿ X ¸'þ " @ " ÿÿÿÿ BMv v ( @ @ SD Ä @ x^íSI
+Ã0ô¯s½å\èzéü ÿ
+ª46Z
Bn8xÇ)1²Ì³.<è§B+ï ̨ޢÏ40:prf
+·í|q±ìüâÊ]~½+Háë~|ðWíF¼ðúúMñbÀö þâPÙ@úaüoÌCÄØ[½È¡z¼6~U{Ûß<ª½Õ?¥ ü{¿rü=+Îý÷ô|´¨ý¿.©MåÛxò³åG¦
+Ü«±X ÿÿ
+ @ <
+ @ R
+ @ h
+ @ ~
+ @
+ @ ª
+ @ À
+ @ Ö
+ @ ì
+ @
+
+ @
+
+
+
+ @ .
+
+ @ D
+
+ @ Z
+
+
+
+ @ p
+
+ @
+
+ @
+
+ @ ²
+
+ @ È
+
+ @ Þ
+
+ @ ô
+
+ @
+
+ @
+ @ 6 (
+ @ L (
+ @ b (
+ @ x (
+ @ (
+ @ ¤ (
+ @ º (
+ @ Ð (
+ @ æ (
+ @ ü (!
+ @ ("
+ @ ( (#
+ @ > $$
+ @ T %%
+ @ j &&
+ @ ''
+ @ ((
+ @ ¬ ))
+ @ Â ;(+ @ â X X ,, @
+ ÿÿÿÿ X -- " @ <
+ , È X X .. " @ j
+ , È X X //
+ @
+ 00
+ @
+ 11
+ @ ´
+ 22
+ @ Ê
+ 33
+ @ à
+ 44
+ @ ö
+ 55
+ @ 66
+ @ " II @ @ ô X JJ . @ r ¸g A% \) X X X KK @ X (L
+ @ ³ MM
+ @ É NN
+ @ ß OO
+ @ õ PP
+ @ QQ @ ' X RR
+ @ A SS
+ @ W TT
+ @ m UU
+ @ VV @ X WW
+ @ ¹ XX
+ @ Ï YY
+ @ å ZZ
+ @ û [[
+ @ \\
+ @ ' ]]
+ @ = ^^
+ @ S __
+ @ i ``
+ @ aa
+ @ bb
+ @ « cc
+ @ Á dd
+ @ × ee
+ @ í gg @ X hh
+ @ # ii
+ @ 9 jj
+ @ O kk
+ @ e ll
+ @ { mm
+ @ nn
+ @ § oo
+ @ ½ pp
+ @ Ó qq
+ @ é rr
+ @ ÿ ss
+ @ tt
+ @ + uu
+ @ A vv
+ @ W ww
+ @ m xx
+ @ yy
+ @ ùù b @ ë è¹' í¾' ïÀ' X X X X& X, X2 X8 t @ k ú´' ûµ' ûµ' ûµ' ú´' ûµ' X X X& X, X8 XD XV ** < @ » X X X X X& 77 < @ X X X X X& HH @ £+' £+' ¦' §'
+ ¦' §' ¦' §' X X X X, X2 X8 XJ X\ Xn ff º @ ] QQ VV JJ KK QQ VV JJ KK JJ KK JJ II QQ VV QQ VV X X X& XD XV Xh Xt X zz @ gg X 8 p ª Ö 6 p ª Ò ñ 3 I _ u µ A · å û ' = S i « Á × í / E [ q ³ É ß õ ! 7 M c y ¥ » Ñ ç ý ) ? U k © Õ
+ 1
+ G
+ ]
+ s
+
+
+ µ
+ Ë
+ á
+ = \ r ´ Ê ê , B b x ¤ º Ð æ ü
+ (
+ >
+ T
+ j
+
+
+ ¬
+ Ì
+ â
+ ø
+ $ : P f | ¨ ¾ Ô ê , B X Æ F Ö v <
+ P ½ % EditEngineItemPool ¤ w ¯¡¢£¤¥¦§¨©ª«¬±²³ ³ ¡¢£¤¥¦§¨©ª«¬®¯°²³´ ´ ¡¢£¤¥¦§©ª«¬®¯°±²³´µ 6 f 0 <8 g* > @ Ã0
+ " , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ " X , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ " È È , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+ Z d " |ü°° , StarBats N ÿ - àü` ` , StarBats N ÿ K " ¨ý , StarBats N ÿ - ¨ýÀÀ , StarBats N ÿ K " ¨ýpp , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýÐ Ð , StarBats N ÿ - " ¨ý%% , StarBats N ÿ - " ¨ý0*0* , StarBats N ÿ -
+ r , StarBats ÿ - r èè , StarBats ÿ - r ÐÐ , StarBats ÿ - r ¸¸ , StarBats ÿ - r , StarBats ÿ - r , StarBats ÿ - r pp , StarBats ÿ - r XX , StarBats ÿ - r @@ , StarBats ÿ - r (#(# , StarBats ÿ - " ¨ýXX , StarBats i ÿ - " ¨ý°° , StarBats i ÿ - " ¨ý , StarBats i ÿ - " ¨ý` ` , StarBats i ÿ - " ¨ý¸¸ , StarBats i ÿ - " ¨ý , StarBats i ÿ - " ¨ýhh , StarBats i ÿ - " ¨ýÀÀ , StarBats i ÿ - " ¨ý , StarBats i ÿ - X X, XJ Xh XT Xr 6'
+ @ ñ0 @ 1 X X > @ ]1 xd d d x þYü d d üd x X X' <( @ 1 X
+( µ @ *3 StarBats ° !"- StarBats !"- StarBats !r- StarBats X !"- StarBats X !"- StarBats !"- StarBats !r- X XG X X¹ Xò X+ Xd @' i @ 4 # d d d d d Xd d È d d ,d d |üd ° @d d àüd ` ¸d d ¨ýd hd d ¨ýd À d d ¨ýd p Èd d ¨ýd xd d ¨ýd Ð
+ (#d d ¨ýd % Ø'd d ¨ýd 0* d d ¨ýd X
+ d d d þY d d ¨ýd X X X! X4 XG XZ Xm X X X¦ X¹ XÌ Xß Xò X X A'¡ @ 15 d d d d d d ¤d Ò d d ôd d d d ,d d È d
+ d d d X X X& X2 X> XJ XV Xb 1'¢ @ r5 d È X +'£ ( @ 5 X X X '¤
+ @ À5 !'¥ @ â5 X '¦ 6 @ 6 times Ñ? helvetica X X '§ Î @ Ê6 Nd
+ 4d
+ d
+ öd
+ {d
+ îd
+ F'§d
+ hd
+ Ûd
+
+ Ád
+ d
+ id
+
+ íd
+ ýd
+ X X X" X, X6 X@ XJ XT X^ Xh Xr X| X X ?(¨
+ @ 7 '© @ 87 X X 'ª @ [7 X '« @ z7 X '¬ @ 7 X X ' @ Á7 X '® @ à7 X %'¯
+ @ ú7 S'°
+ @ 8 "'±
+ @ &8 '²
+ @ <8 X n â Ã 8 Î ó ' = c ¥ ½ Ü û # B a w £ µ P A= g*
+ " ¨ýXX , StarBats N ÿ - " ¨ý°° , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ý` ` , StarBats N ÿ - " ¨ý¸¸ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýhh , StarBats N ÿ - " ¨ýÀÀ , StarBats N ÿ - " ¨ý , StarBats N ÿ - " ¨ýpp , StarBats N ÿ -
+( StarBats ° !"- !'¥ '¦ helvetica '§ §d
+ . 6 q ü 2 î + K Standard Standard ¾é # è¹' éº' ê»' ë¼' ì½' í¾' î¿' ïÀ' ðÁ' ñÂ' ú´' ûµ' ü¶' ý·' þ¸' +;( ,, -- .. g*
+( @' ¡A' ¢1' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Object with arrow Standard Object with arrow ¿é è¹' ê»' ë¼' ì½' î¿' ïÀ' ðÁ' Object with shadow Standard Object with shadow Àé +;( ,, -- .. Object without fill Standard Object without fill Áé ú´' Text Standard Text Âé è¹' ú´' Text body Standard Text body Ãé è¹' ú´' §' Text body justfied Standard Text body justfied Äé è¹' ú´' £+' First line indent Standard First line indent Åé è¹' ú´' g* @' Title Standard Title Æé è¹' ú´' §' Title1 Standard Title1 Çé è¹' ú´' ûµ' +;( ,, -- .. £+' §' Title2 Standard Title2 Èé ê»' ûµ' +;( ,, -- .. g* @' ¡A' £+' §' Heading Standard Heading Éé è¹' ú´' ¡A' §' Heading1 Standard Heading1 Êé è¹' ú´' ¡A' §' ©' Heading2 Standard Heading2 Ëé è¹' ú´' ¡A' §' ©' ¬' Dimension Line Standard Dimension Line Ìé è¹' ì½' í¾' î¿' ïÀ' ú´' §' Home~LT~Gliederung 1 Home~LT~Gliederung 1þ¯ÿß Ïé è¹' ú´' g* @' ¡A' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Gliederung 2 Home~LT~Gliederung 1 Home~LT~Gliederung 2þ¯ÿß Ðé @' ¡A' §' Home~LT~Gliederung 3 Home~LT~Gliederung 2 Home~LT~Gliederung 3þ¯ÿß Ñé @' ¡A' §' Home~LT~Gliederung 4 Home~LT~Gliederung 3 Home~LT~Gliederung 4þ¯ÿß Òé @' ¡A' §'
+ Home~LT~Gliederung 5 Home~LT~Gliederung 4 Home~LT~Gliederung 5þ¯ÿß Óé @' ¡A' §'
+ Home~LT~Gliederung 6 Home~LT~Gliederung 5 Home~LT~Gliederung 6þ¯ÿß Ôé @' ¡A' §'
+ Home~LT~Gliederung 7 Home~LT~Gliederung 6 Home~LT~Gliederung 7þ¯ÿß Õé @' ¡A' §'
+ Home~LT~Gliederung 8 Home~LT~Gliederung 7 Home~LT~Gliederung 8þ¯ÿß Öé @'
+ ¡A' §'
+ Home~LT~Gliederung 9 Home~LT~Gliederung 8 Home~LT~Gliederung 9þ¯ÿß ×é @' ¡A' §'
+
+ Home~LT~Titel
+ Home~LT~Titelþ¯ÿß Íé è¹' ú´' QQ g* £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Untertitel Home~LT~Untertitelþ¯ÿß Ýé è¹' ú´' QQ g* @' £+' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Notizen Home~LT~Notizenþ¯ÿß Úé è¹' ú´' ¥!' ¦' §' ©' ª' «' ¬' ' ®' Home~LT~Hintergrundobjekte Home~LT~Hintergrundobjekteþ¯ÿß Øé +;( ,, -- .. Home~LT~Hintergrund Home~LT~Hintergrundþ¯ÿß Ùé è¹' ú´' Title Title @ Íé Subtitle Subtitle @ Ýé Background objects Background objects @ Øé
+ Background
+ Background @ Ùé Notes Notes @ Úé Outline 1 Outline 1 @ Ïé Outline 2 Outline 1 Outline 2 @ Ðé Outline 3 Outline 2 Outline 3 @ Ñé Outline 4 Outline 3 Outline 4 @ Òé Outline 5 Outline 4 Outline 5 @ Óé Outline 6 Outline 5 Outline 6 @ Ôé Outline 7 Outline 6 Outline 7 @ Õé Outline 8 Outline 7 Outline 8 @ Öé Outline 9 Outline 8 Outline 9 @ ×é t Ð P ê D â P ä 8 > ¤
+ p Ö < ¢ n ô
+ f ° Ò ú 6 b ® á
+ G
+ z
+
+ à
+ DrMd n% _% JoeMn 0 g110 ¿11$¿ ¿11 ÿÿ O ö DrLy LAYER_LAYOUT DrLy
+ LAYER_BCKGRND DrLy LAYER_BACKGRNDOBJ DrLy LAYER_CONTROLS DrLy ! LAYER_MEASURELINES DrMP À & JoeM Çl VT Ð Ð Ð Ð DrML DrOb < SVDr & ø Ð ( A& DrOb < SVDr & 3D Ð Í[ A& DrOb < SVDr & ø . ( L DrOb < SVDr & 3D . Í[ L DrXX gg f Home~LT~Gliederung ÿ DrMP 8 ¶ JoeM VT Çl { y DrML DrOb SVDr & { y ½Q 0j ' Home~LT~Hintergrundþ¯ { y ½Q 0j DrXX gg N Home~LT~Gliederung ÿ DrMP ý JoeM VT Çl Ð Ð Ð Ð DrML DrOb Þ SVDr & º ç
+ 8 '0 !
+ Home~LT~Titelþ¯ º ç
+ 8 '0 d xV4B1 O õ Click to move the slide
+ Home~LT~Titelþ¯ <(
+( @'
+ DrOb é SVDr & Ü Ç3 G "] # Home~LT~Notizenþ¯ Ü Ç3 G "] m xV4B1 X õ Click to edit the notes format Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrPg ä b JoeM Çl VT Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrXX Handoutsgg F Home~LT~Gliederung ÿ DrPg è n JoeM VT Çl { y DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb Ç SVDr & Â
+ J Standard q Â
+ J R xV4B1 = õ groups Standard
+( @' ¦ §
+ DrOb Ì SVDr & C é 5
+ q Standard v C é 5
+ q W xV4B1 B õ Users Standard <(
+( @' ¦ §
+ DrOb Ú SVDr &
+ °
+ 8 Standard
+ °
+ 8 e xV4B1 P õ artifact_group_list Standard <(
+( @' ¦ § DrOb Ï SVDr & ÿ0 É
+ ñ: Q Standard y ÿ0 É
+ ñ: Q Z xV4B1 E õ Artifact Standard <(
+( @' ¦ § DrOb Ô SVDr & ª y W- Standard ~ ª y W- _ xV4B1 J õ
+ Artifact_perm Standard <(
+( @' ¦
+ §
+ DrOb Ø SVDr & ª â W- j Standard ª â W- j c xV4B1 N õ Artifact_category Standard <(
+( @' ¦ § DrOb Õ SVDr & ª d W- ì Standard ª d W- ì ` xV4B1 K õ Artifact_group Standard <(
+( @' ¦ § DrOb Ö SVDr & ª ´ W- < Standard ª ´ W- < a xV4B1 L õ Artifact_status Standard <(
+( @' ¦ § DrOb × SVDr & VA Ã N K Standard VA Ã N K b xV4B1 M õ Artifact_history Standard <(
+( @' ¦ § DrOb Ô SVDr & VA ^
+ N æ Standard ~ VA ^
+ N æ _ xV4B1 J õ
+ Artifact_file Standard <(
+( @' ¦
+ §
+ DrOb × SVDr & BA à N h Standard VA à N h b xV4B1 M õ Artifact_message Standard <(
+( @' ¦ § DrOb SVDr & # ë ç Standard ÿÿÿÿ ¡
+
+ ô DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & ¬ à1 î Standard ÿÿÿÿ ¡ ô ÿ0
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & ¬ E ! Õ Standard ÿÿÿÿ ¡ ô ª &
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & ¬ Ü ! Õ Standard ÿÿÿÿ ¡ ô ª ½ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & ¬ ! Standard ÿÿÿÿ ¡ ô ª ¨ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & ¬ ! Ù Standard ÿÿÿÿ ¡ ô ª ø DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & T Ü ! Standard ÿÿÿÿ ¡ 5
+ - ª ½ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & : & 7B î Standard ÿÿÿÿ ¡ ñ:
+ VA DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & : Á 7B î Standard ÿÿÿÿ ¡ ñ:
+ VA ¢
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & : , 7B Standard ÿÿÿÿ ¡ ñ:
+ VA $ DrCn $ DrCn $
+ ; PF ÿÿ DrOb × SVDr & VA I N Ñ Standard VA I N Ñ b xV4B1 M õ Artifact_monitor Standard <(
+( @' ¦ § DrOb SVDr & : , 7B n Standard ÿÿÿÿ ¡ ñ:
+ VA DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & T L à1 î Standard ÿÿÿÿ ¡ 5
+ - ÿ0
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & v, E à1 î Standard ÿÿÿÿ ¡ W- &
+ ÿ0
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & v, , à1 Standard ÿÿÿÿ ¡ W- ¨ ÿ0
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & v, , à1 Ù Standard ÿÿÿÿ ¡ W- ø ÿ0
+ DrCn $ DrCn $ ; PF ÿÿ DrOb SVDr & T L 7B n Standard ÿÿÿÿ ¡ 5
+ - VA DrCn $ DrCn $ ; PF ÿÿ DrXX gg F Home~LT~Gliederung ÿ DrPg { JoeM VT Çl Ð Ð Ð Ð DrML 8 DrMD , ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrOb < SVDr & º ç
+ 8 '0 DrOb Ý SVDr & Ü Ç3 G #] # Home~LT~Notizenþ¯ Ü Ç3 G #] a xV4B1 L õ Click to add notes Home~LT~Notizenþ¯ <(
+( @' DrXX gg V Home~LT~Gliederung ÿ DrXX B þÿÿGeneric Printer SGENPRT PostScript D VT $m áí ² VT $m d ,,lpr -P zonker default_queue SGENPRT DrVw P SVDr
+ SVDr : SVDr ö ö þ þ ö ö SVDrA Layout : SVDr è è þ þ SVDr Ü # SVDr SVDr# SVDr0 SVDr1 SVDr3 SVDr4 SVDr@ SVDr SVDrD SVDrP SVDrQ Â ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDrHL DrHL DrHL 8ÿÿÿfðÿÿþY ó(
+ R o o t E n t r y ÿÿÿÿÿÿÿÿ .½
ÑÐ )ä°± À C o m p O b j ÿÿÿÿ = O l e
+ ÿÿÿÿÿÿÿÿÿÿÿÿ p e r s i s t e l e m e n t s " ÿÿÿÿ S f x D o c u m e n t I n f o ÿÿÿÿÿÿÿÿ u S f x W i n d o w s ÿÿÿÿ ÿÿÿÿ S f x S t y l e S h e e t s ÿÿÿÿÿÿÿÿÿÿÿÿ YL S u m m a r y I n f o r m a t i o n ( ÿÿÿÿÿÿÿÿ ( S t a r D r a w D o c u m e n t 3 $ ÿÿÿÿÿÿÿÿÿÿÿÿ - °+ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿ
\ No newline at end of file
More information about the evolvis-commits
mailing list