# Eclipse runtime configuration file
# This file contains a number of key/value pairs that are merged into the 
# System properties on system startup.  The values control the way the 
# runtime is structured and runs.

# Note:  Only platform:/base/ and file: URLs are supported.  In general the 
# URLs given may include a version number (e.g., .../location_1.2.3).  
# If a version is not specified, the system binds
# to the location which matches exactly or to the versioned location with the
# latest version number.  If a version number is given then only exact matches
# are considered.

# The URL for the runtime entry point.  The default value is
# platform:/base/plugins/org.eclipse.osgi 
#osgi.framework=platform:/base/plugins/org.eclipse.osgi

# The classpath for the framework found at the osgi.framework location.  This 
# comma-separated list contains either URLs or simple element names.  Simple
# names are assumed to be relative to the framework's install directory.  
# Typically this value need not be set as it is initialized by the framework itself.
# Version match searching is not done for URLs listed here.
#osgi.frameworkClassPath =

# The comma-separated list of locations to search for the splash screen file (splash.bmp).
# For each list element a subdirectory structure based on the pattern nl/<locale> is searched.
# The system binds to the first matching file.  There is no default value.
#osgi.splashPath=

# The location of the splash screen file.  If this value is set at system startup it is used 
# in favour of the osgi.splashPath searching outlined above.  If the value is not set 
# the searching is done and this key is bound to the result of the search.
#osgi.splashLocation =

# The comma-separated list of bundles which are automatically installed and optionally started
# once the system is up and running.  Each entry if of the form
#     <URL | simple bundle location>[@ [<startlevel>] [":start"]]
# If the startlevel is omitted then the framework will use the default start level for the bundle.
# If the "start" tag is added then the bundle will be marked as started after being installed.
# Simple bundle locations are interepreted as relative to the framework's parent directory.
# The startlevel indicates the OSGi start level at which the bundle should run.
osgi.bundles=\
	org.eclipse.core.jobs,\
	org.eclipse.ecf,\
	org.eclipse.ecf.filetransfer,\
	org.eclipse.ecf.identity,\
	org.eclipse.ecf.provider.filetransfer,\
	org.eclipse.equinox.app@start,\
	org.eclipse.equinox.common,\
	org.eclipse.equinox.frameworkadmin,\
	org.eclipse.equinox.frameworkadmin.equinox@start,\
	org.eclipse.equinox.p2.artifact.repository,\
	org.eclipse.equinox.p2.console,\
	org.eclipse.equinox.p2.core,\
	org.eclipse.equinox.p2.director,\
	org.eclipse.equinox.p2.director.app,\
	org.eclipse.equinox.p2.download,\
	org.eclipse.equinox.p2.engine,\
	org.eclipse.equinox.p2.jarprocessor,\
	org.eclipse.equinox.p2.metadata,\
	org.eclipse.equinox.p2.metadata.repository,\
	org.eclipse.equinox.p2.operations,\
	org.eclipse.equinox.p2.touchpoint.eclipse,\
	org.eclipse.equinox.p2.touchpoint.natives,\
	org.eclipse.equinox.registry,\
	org.eclipse.equinox.simpleconfigurator,\
	org.eclipse.equinox.simpleconfigurator.manipulator@start,\
	org.eclipse.osgi.services,\
	org.sat4j.core,\
	org.sat4j.pb

org.eclipse.update.reconcile=false

# The product to run.  A given Eclipse configuration may contain many products.
# The product identified will supply the branding (window icons, title bar text) etc 
# as well as define the default application to run.  
#eclipse.product=

# The application to run.  The value specified here is the id of the application extension
# the runtime will find, instantiate and execute once the system is up.  Note that typically 
# the identified eclipse.product defines the default application to run.
#eclipse.application=

# The build identifier
eclipse.buildId=@build@

# End of file marker - must be here
eof=eof