Engine v2014.1 Release Notes

Rustici Software, LLC- September 2014

Notable New Features

Tin Can Recipes

Tin Can Recipes are a new way to make sense of your Tin Can statements based on open specifications. We have implemented three recipes in this version and have built a framework to allow customers to build their own recipes for the Engine. We are including a Video Recipe, a Results Summary Recipe and a CMI Interactions Recipe in the 2014.1 release with more to come. The recipe data is available via a REST API in the new release so you can use the data to build your own custom reports using a variety of client libraries.

Modern Player (Beta)

SCORM Engine now includes a customizable, responsive modern SCORM player option. The modern player removes HTML framesets and multiple pages and adds a single page styled with Twitter Bootstrap themes. There will be more changes on the horizon for this modern player so we're keeping the classic player as the default setting for now. You can launch your content using the new modern player through a special launch parameter.

Other Fixes and Improvements

2014.1.0.730 (2014-09-29)

Fixes for upgrade tool

2014.1.0.713 (2014-09-25)

Release Notes - ScormEngine - Version 2014.1.0.713

###Bug

###Improvement

2014.1.0.599 (2014-09-15)

Release Notes - ScormEngine - Version 2014.1.0.599

###Bug

###Improvement

###New Feature

SCORM Engine Integration Overview

Welcome

Thanks for purchasing the SCORM Engine. We're eager to get started and to help you use the SCORM Engine to its full potential. This document will provide you with a road map to the integration process. It is not intended to be a comprehensive document listing every bit of functionality that the SCORM Engine provides, that would kill too many trees. Rather, this document will orient you to the integration process, set expectations and provide you with the key information needed to complete your integration.

If at any time you find yourself wishing that you had more information, or that the SCORM Engine could do something more, or that the integration could be handled differently, please ask. Chances are that the answer is "Yes! The SCORM Engine is built for that and here's how to do it". You've purchased a very flexible piece of software that can handle most anything that's thrown at it, and if it can't, we'll find a way to make it.

Working Together

So far, you've probably been working with Chris and TJ to gain some familiarity with the SCORM Engine and have concluded that the SCORM Engine is the right solution for you. Together you've been through demonstrations, some technical discussions and have executed a contract for licensing. Now it's time to hand things over to the technical folks to work their magic.

We have a team of developers that handle SCORM Engine integrations. We will assign one of them to this project to act as your integration consultant. The integration consultant is there to walk you through the process step-by-step. The consultant will handle all of the necessary SCORM Engine customizations and guide you through the changes that need to be made in your LMS. Our integrators are quite knowledgeable and are there to answer any questions you may have during the entire integration phase.

During integration, we use a tool called Basecamp for project management. Basecamp provides a simple interface for exchanging messages, transferring files, tracking to-do lists and setting milestones. We strongly encourage the use of Basecamp for all electronic communication (you'll even notice our implementers logging summaries of phone calls in there). Basecamp provides you and us with a single place to go to find the latest deliverables, see notes from prior conversations and refresh our memories as to why things are implemented the way they are. We have found this tool to be invaluable to both our implementers and our clients. You will receive a welcome message via email with your log in information to Basecamp. We can add as many users as needed to the system, so if you have additional people who will be participating in this project or just want visibility into its progress, we'll be happy to give them access.

Our expectation is that the integration consultant will be working very closely and very intensely with your developers over the next few weeks. There is a rough project schedule listed below that represents the typical timeline for SCORM Engine integrations (this work can go considerably faster for simple integrations). There is work to be done both on our side and on yours. If this schedule doesn't match your expectations or if the resources on your side aren't fully available during this time period, please let us know so we can schedule accordingly.

SCORM Engine Integration Timeline

Week 1: Kickoff Meeting. Identify unique requirements. Generate integration layer. Initial deploy of Console to client environment.

Week 2: Importing and Launching SCORM courseware.

Week 3: Rollup results. Coding for unique requirements.

Week 4: Skinning the player. Final tweaks. Testing and cleanup.

We have carefully architected the SCORM Engine to isolate our code from your code and vice versa. We maintain this barrier to ensure that changes to one system don't require additional integration work and don't adversely affect the other system. Similarly we find it best to maintain a similar boundary in the work that our integration consultants do and the work that your developers do. We are very reluctant to make changes or affect your code in any way. Your developers are the experts in your code and they are the ones that should be trusted to modify your system. We will work side by side with them, guide them and advise them as much as needed, but at the end of they day, they will be responsible for maintaining your system and they need to fully understand everything that is in there. Likewise, we do not expect your developers to become experts in our system overnight. We will gladly handle the the customizations and configurations needed in the SCORM Engine. If you prefer, we can also set your developers up with a simple development environment where they can make changes to the integration code. We are also happy to help your developers learn the innards of the SCORM Engine's source code should they be so motivated, but we don't want this learning curve to stand in your way.

The Kickoff Meeting

The first step in the integration process is a kickoff meeting with all involved parties. This is our chance to make introductions, work out some logistics and get the ball rolling. This is very much a working meeting from which we hope to take away most, if not all, of the information we need to generate your custom SCORM Engine integration.

The biggest part of the kickoff meeting is a tour of your LMS. We need you to show us around and give us a feel for how your LMS works. During the tour we will be looking for any unique requirements you have that might necessitate an advanced integration or other tweaks to the SCORM Engine. We've seen more than a few LMS's in our days so we will probably be very quick to understand yours.

We don't need to see everything your system has to offer, the main thing we need to figure out is how the entities in your system map to the entities in the SCORM Engine. Specifically, all LMS's have two entities that we will need to relate to, "packages" and "registrations".

If something just clicked and you see how these concepts map directly to your system, great! If not, don't worry, our consultants excel at comprehending your system and identifying the appropriate touch points.

During the tour, it will help to look at these areas of your LMS:

The LMS tour will segue into a look at your database schema. In the database schema, we are looking for two things, unique identifiers for a "package" and unique identifiers for a "registration". Every LMS has these concepts, but they can be called by different names and structured in different ways. These identifiers are the primary input our integration consultant needs to generate the first deliverable.

Information about the platform(s) we will be working with is the final piece of information we need from the kickoff meeting. Would you like a Java or .Net version of the Engine? Which database platforms do you need to support? SQL Server, Oracle, MySQL, PostgreSQL?

If there's time (and energy) during the kickoff meeting, we might get into topics that answer questions for later in the integration process. Specifically, the SCORM Engine needs to directly exchange two pieces of information with your system. First, the SCORM Engine needs ask your LMS for some information about each user (first name, last name and unique identifier). Second, the SCORM Engine needs to tell your LMS about the results of training it has delivered to a learner (we call this process "rollup"). We need to figure out the best way to perform this communication with your LMS. The SCORM Engine is quite flexible and can be used in any number of communication protocols, such as:

Kickoff Meeting Checklist

  1. Introductions made and contact information exchanged

  2. LMS tour

  3. Unique identifier for package established

  4. Unique identifier for registration established

  5. Code and database plaftform(s) established

  6. Communication protocol established (Optional - often discussed later)

The Setup Phase

After the kickoff meeting, we're going to give you some homework to do while we go off and generate the foundation of the integration.

Your homework is to get the SCORM Engine up and running in your development environment. The SCORM Engine itself isn't very usable without an LMS, so to get you started, we ship a simple SCORM Engine Console. The SCORM Engine Console is nothing more than a simple interface to the SCORM Engine that allows you to import and launch courses along with some debugging and system health tools. It will allow you to get everything set up and running in your environment before the integration with your LMS is completed. Once the integration code has been generated, the SCORM Engine Console provides us with a way to deploy and test the integration code before it is tied into your system. See /2-integrationwithconsole.html#scorm-engine-console-overview to get started.

While you are deploying the SCORM Engine, our integration consultant will be busy generating a customized integration for your LMS. This integration will be tailored to the unique identifiers and supported platform(s) we identified during the kickoff meeting. See SCORM Engine Integration Architecture for more information about the technical aspects of this generated integration.

The Integration Phase

Now it's time to start hooking the two systems together. Our integration consultant will deliver a generated integration to you and instructions for how to deploy it using the SCORM Engine Console. The Console will then be running with your specific code to let us simulate actions your LMS will eventually initiate after integration is completed.

There are three primary touch points where we need to integrate our systems, "import", "launch" and "rollup". This document will cover these touch points at a high level.

Key Integration Points

Import

We typically begin the integration process with the import mechanism. The goal of this part of the integration is to ensure that your LMS has an interface to upload and import SCORM conformant courses. Your LMS may already have an existing interface for importing external courses. If so, it is usually best to make slight modifications to the existing interface rather than attempting to create an entirely new interface, but that will vary from system to system.

There are three main outcomes that need to be met for the import integration to succeed:

  1. File upload and deployment - SCORM, AICC and Tin Can packaged courses are delivered as a set of files (often in a zip package). These files need to be uploaded to your LMS server and deployed to the appropriate locations for serving. The deployment process can be manual or automated, but there needs to be some form of administrative interface to enable it.

  2. Invoking the SCORM Engine's import routines - The SCORM Engine has some routines that need to be invoked to discover the course and properly populate the SCORM Engine's tables with data about the course.

  3. Package entity flagging - There needs to be some mechanism for flagging the package entity in your system as being a course that should launch with the SCORM Engine.

The SCORM Engine comes with some reusable interfaces that will handle the first two items above. These interfaces can be easily dropped into your existing interfaces. Alternatively, if these interfaces aren't an ideal fit, we can show you how to create your interface to invoke the SCORM Engine import methods through either web service calls or through direct API calls.

When thinking about the import mechanism, you will also want to think about package versioning. Package versioning controls how you handle updates to courses. We can help you select from several built in schemes for dealing with versioning that the SCORM Engine offers. These schemes should allow us to mirror the versioning functionality that your LMS currently uses or they can be completely transparent to the LMS and only applicable inside the SCORM Engine.

The SCORM Engine offers over 60 customized settings for controlling how each courses is delivered to the user. We call these the "package properties". The ability to manipulate each course's package properties is essential to ensuring broad courseware compatiblity. The SCORM Engine offers a reusable interface for editing package properties (we recommend using this interface instead of your own as we are constantly adding new properties). After a course is imported, we need to make sure that your LMS provides administrators with a way of accessing these property settings.

Launch

Launching a course in the SCORM Engine is a simple matter of redirecting the user's browser to an appropriate URL with some query string parameters appended. These launch parameters tell the SCORM Engine which course to launch, which registration identifier to associate the tracking data with and what "mode" to launch the course in. The format of these parameters is specific to your integration, however since the SCORM Engine Console is configured for your integration, it can provide examples of how to construct the launch settings.

When building the launch mechanism, we will want to consider the different modes in which content can be launched and how they map to the functionality in your LMS. For example, your LMS might provide a way to preview content or a way to review completed content. The SCORM Engine can handle these and other launch modes once they have been mapped to the functionality in your LMS.

Also during launch development, we will want to consider registration "instances". An instance is to a registration as a version is to a package. We will need to examine your LMS's policies around re-taking courses to see how they map to the SCORM Engine's registration instance schemes and then select the scheme most appropriate for your situation. Registration instances are closely related to package versions as often, new versions of packages will trigger new instances of registrations.

Rollup and Reporting

The final major integration point is rollup and registration. This is where we take all of the detailed data stored by the SCORM Engine for a particular registration, consolidate it down to the data that is relevant to your LMS and push the data into your system. The first step in the rollup integration process is determing what data you actually care about. Usually, most LMS's will want to know high level data about the course such as its status, score and the amount of time the learner spent in the course. The SCORM Engine can provide this and much more. The key is to figure out what your LMS needs to operate and getting that data in the right place. We will want to look at things such as the data that is displayed to the student, the data that is available to administrators via reports and the data points that trigger actions in the system (such as moving a course to the transcript or taking it off the learner's to-do list, etc). There will also be some business rules to flesh out, such as if a course is completed and failed, can the user retake it?

Once we have the required data identified, we then need to figure out the best way to technically get it into your system. Every time new data is saved to the SCORM Engine (this happens constantly while the course is being delivered), it triggers a process called "rollup". We can configure this rollup process to take any action we need it to. For instance, we can have it write data directly into your LMS's tables, we can have it call a web service or we can make an API call into your system. The critical data that the learner sees and that triggers actions in your LMS is pushed to your system via the SCORM Engine whenever there is new data. If your system requires more detailed data for reporting, it can either be pushed with the summary data, or pulled on demand by a later process.

Further Integration Considerations

There are a few other things that need to be considered when completing a basic integration.

Learner information - The SCORM standards require that the SCORM Engine make some information about the learner available to the content. Specifically, we will need to figure out how to retrieve the learner's name and a unique identifer for the user from your system.

Database deployment - The SCORM Engine requires a database to operate. It can run on its own database, or within the context of your existing database. How this deployment is handled is largely a matter of style and your personal preference.

Code integration - Similar to the database, the SCORM Engine can be tightly integrated into your code base to be compiled together, or it can be run as a stand alone compiled application (potentially on its own server). How code is integrated and deployed is also largely a matter of your existing setup and procedures.

Skinning - The SCORM Engine is fully skinnable and can be customized to match whatever aesthetic scheme you desire.

Advanced Integration - There is much more that the SCORM Engine can do and many more ways in which it can be tightly integrated into your LMS. An integration may want to explore other areas like distributed content delivery, tight authentication, integrated error logging, partitioned databases, advanced importing or offline delivery (using our offline player software developer kits (SDKs), which are sold separately). Your integration consultant will happily talk you through these areas.

Localization - The SCORM Engine is capable of rendering the player and the SCORM Engine Package Properties Editor in a variety of languages. By default, localization is automatically based on the browser's configured language. However, if your LMS has its own means of establishing the user's locale, the SCORM Engine can base its language off that instead.

Testing Phase

Once the integration is completed, it is of course important that we validate and test it. The best way to test the integration is simply to run a few sample courses through the cycle of importing, launching, and reporting. It is generally not necessary to test every combination and permutation of course type because the subtle errors that might be generated by course variations happen in the SCORM Engine itself and don't vary between integrations.

Going Forth

Material Completion

Once you are able to import and deliver and rollup data from courses (even just a couple of examples that we provide), you have achieved what we refer to as "material completion". This a relevant milestone from both a process perspective and a contractual one. From this point forward, we have found that your requests are often better managed via our support portal (see below for information). Our project managers will confirm with you that you are comfortable importing content and that you can access the support portal as needed.

It is important to understand that moving from the "implementation phase" to the "support phase" has no impact whatsoever on the level of support or access to our people. It is merely a change in process that helps us take better care of you.

Certification

Historically, ADL has offered a certification program that formally certifies or declares products to be SCORM conformant. The SCORM Engine has been certified for every version of SCORM, but unfortunately this certification does not transfer to your product. To be formally certified by ADL, you must put your LMS through the certification process. If you decide to pursue the certification process, we will be happy to walk you through it.

"Powered By" Logo Use

We want to make sure that you're getting the most out of SCORM Engine. Some of our customers prefer to tuck their use of our products away, and others want to scream from the mountaintop that they're using the best SCORM conformance software available. For the screamers, we've created a way for you to do just that. Visit our "Powered By" page for more info.

Support Process

We are always here for you, even after your integration is complete and your application is deployed. We have a dedicated support staff. If something goes awry after your integration is completed, please email us at support@scorm.com or visit our support portal. This will open up a support ticket and ensure you the fastest response. Our integration consultants rotate between many projects, including development of our products, and may not always be available to answer your questions directly once the integration is complete. Our support staff has unfettered access to all of our consultants and developers and can quickly put you in touch with the best person to resolve your problem.

For more details on the support process and our support portal, visit this document.

Troubleshooting

Nobody's perfect, we all make mistakes and things don't always go as expected. When problems arise, the SCORM Engine provides a few mechanisms for getting additional diagnostic information.

The most common problem our customers face is content behaving in unexpected ways. In almost every instance, this problem stems from a misunderstanding of the SCORM standard on the part of the content author, but we want to hear about these problems anyway so that we can ensure the SCORM Engine does everything it can to accommodate these varying interpretations of the standards. To diagnose SCORM content problems, the SCORM Engine maintains a very detailed debug log that tracks all of the SCORM calls made by the content as well as the internal SCORM logic that the SCORM Engine executed. This debug log can be accessed by clicking anywhere in the SCORM Engine's interface (the frames with the blue background in our default skin, or the frames that contain the table of contents or navigational elements). Then press the question mark (?) key five times. This should cause the debug window to pop up. If there doesn't seem to be much information in the log, check the package properties for the course in question. The package properties have a few settings that control how much debug information is recorded, make sure that all of the properties are set to record information. More details about accessing the client-side debug log can be found in our support portal.

For deeper problems that affect the operation of the SCORM Engine itself, we have a detailed server-side log that can be accessed.

Rustici Software offers another tool that can be invaluable in diagnosing content problems. SCORM Cloud is a hosted version of the SCORM Engine (free trial accounts are available) that is designed to help you quickly evaluate and debug courseware. SCORM Cloud always contains the latest updates and patches to the SCORM Engine. If content is not behaving as expected in your LMS, it is often useful to run the content through SCORM Cloud as well to see if the problem is with your LMS and integration in particular or if it is a more general problem with the content or SCORM Engine.

Our clients will often instruct content vendors to validate content on SCORM Cloud before attempting to import it into their LMS. This step can save countless hours of troubleshooting and messaging back and forth. We provide this free service for this very reason and we encourage you to take advantage of it.

Updates and Patches

We are constantly developing and improving the SCORM Engine. Our release schedule is largely dictated by the evolution of the standards, but we typically target about one major release per year. In the interim, we will periodically issue patches to fix significant errors or to deal with significant standards issues. These updates are available to any customer that is current with their licensing fees. Our support representatives will notify customers of new releases and we will post announcements to our knowledge base as well. Patches are typically only applied as necessary to avoid overly burdensome update processes. Updates are generally straightforward to apply, but our consultants are available to you as needed.

Synchronized Code Bases

We maintain a current copy of the integration code specific to your LMS in an internal source control system. This system allows us instant access to your specific code base if we need to reference it to help troubleshoot an issue or upgrade your system. If you make any changes to your integration, please send them our way so we can keep our copy up to date. Also, if you need to make any changes to the source code of the core SCORM Engine, please let us know so that we can try to work your requirements into a release and keep you on the standard maintenance path.

SCORM Engine Integration Milestones and Timeline

Dev Environment (Java: Tomcat, Apache, etc., .NET: IIS, SQL Server, etc.)

  1. Install SCORM Engine (WAR files in place), prepare console (DBMS, app server, filesystem) environment
    • Apply DDL
    • Build integration layer and deploy to ScormEngineInterface
  2. Import Content (console upload/import control)
  3. Launch Content
    • Implement GetLearnerInformation
    • Test preview and tracked (i.e., with registration=[serialized external registration ID]) in launch URL
  4. Track
    • SCORM/AICC
      • Implement RollupRegistration
    • Tin Can (TBD, Recipes)
  5. Custom UI
    • Finalize import workflow (e.g., import web services, ScormEngineManager)
    • Anything else not covered by ScormEngineInterface/defaultui (e.g., stylesheet URL for player)
  6. QA via integrating application
    • Import and validate
    • Launch and validate
    • Track and validate

Prod Environment

  1. Ensure infrastructure (Java/.NET resources) are in place
  2. Install Engine as above
  3. Optional QA sequence
  4. Project is complete; material completion call

And here's the timeline in graphical form to achieve these milestones:

timeline

SCORM Engine Console Overview

Welcome to Engine!

As an Engine customer, you'll have access to our development staff during the initial integration process and for as long as you maintain a current license. You'll also have access to tools that we hope will assist you for as long as you run Engine.

This document is geared toward what you'll see after the integration kickoff call, but the technologies covered will be available to you in your Engine installation for the duration of your use of the software.

As of the latest major release of Engine, we now offer a console to Engine. From the console, you can:

By the time you're done reading this document and following its prescriptions, we want you to be able to use the console to import and launch content in a fully functional Engine integration. First, we take you through an overview of the Engine console. Then we tell you how to get yours up and running as you embark on the actual process of integration.

As you read and complete each step of this second portion of this document, you can track your own progress in the console dashboard. First you'll start seeing green lights in the self-test health check up. Ultimately, you'll be able to import and launch content.

Have fun!

(And be sure to let us know what could make this process better and more fun if you don't...)

Engine Console: How It Should Look

Pictured here is a screenshot of the Engine console dashboard running against a very basic integration for a sample customer called Vanilla:

Engine Console

Import and Launch

You can see that we've imported into this instance of Engine one of our golf sample courses. Console also provides a breakdown of the number of courses by learning standard imported into your instance of Engine

Detail of Recent Packages and Statistics

User Count

We have included a simple to use method to collect user counts for the number of users within the SCORM Engine tables. Many of our licenses require an annual report of the number of users and this tool should help you easily locate that user count. You can enter dates to only report the users within a certain timeframe. Note that for multi-tenant integrations you will need to run this method for each tenant and then report the aggregate number to Rustici Software each license anniversary.

User Count

Integration Details

Under Integration Details at the bottom, you can see the version of the Engine software. You can also see that we've specified an external package key of CourseId, an external registration key of CourseId and UserName, and no external configuration keys. Finally, you can see how your launch URLs will look.

Snapshot of Integration Details

Web Server Configuration

The final section on the console dashboard is for the SCORM Engine Settings values relevant to successful operation of Engine. We display configuration settings as key/value pairs.

Snapshot of IIS Configuration File

How You Can Have a Console of Your Very Own

In order to get to this point, we had to complete the basic integration process, which involved three steps:

  1. running the Engine database script
  2. making some basic changes to the Engine web server configuration file
  3. implementing core overrides in the main integration file

.NET users have a slight advantage in that the comprehensive environment available in Visual Studio allows for console to be played directly in debugging mode right from Visual Studio rather than having to navigate to its URL via a web browser. If you want to access console directly, however, it's also available at /ScormEngineInterface/tools/console/.

Configuring Your Database for Use with Engine

As part of our delivery, we include a SQL file containing data definition language (DDL) statements (e.g., CREATE TABLE, etc.) for the Engine data model.

You'll need to execute this collection of SQL statements in the DBMS (e.g., SQL Server, MySQL, Oracle, PostgreSQL) you're using with Engine. In our Vanilla example, we're using SQL Server. You'll find the SQL for your DBMS in the Database folder in your Engine folder. Each DBMS has its own subfolder.

You should only need to run this SQL once for each instance of Engine.

Configuring Your Web Server for Use with Engine

We include a web server configuration file specific to Engine: SCORMEngineSettings.config. You'll need to update this configuration file to get both Engine and the console working.

This first round of settings will be in the <appSettings> block of SCORMEngineSettings.config.

Controlling Access to Console

Console is your gateway to Engine. It includes both information and controls that you probably don't want the entire world to see, so we protect it with an authentication mechanism that uses a combination of a configuration key and a cookie.

The very first time you try to access console, it will look like this:

Console Authentication Screen

That password is governed by the ConsolePassword entry in your config. In the appSettings block, you'll want an entry like this:

<add key="ConsolePassword" value="YourChosenPassword"/>

After you've authenticated successfully, console will set a cookie, and you will be able to bypass the login prompt and get straight to the dashboard.

If you ever want to disable access via a given browser that has previously authenticated, you'll need to delete the SECONSOLE cookie.

Getting Engine Talking to Your Database

In SCORMEngineSettings.config, we need to specify the connection details for the database set up in step 1. We'll need to adjust the entries for DataPersistenceEngine and DatabaseConnectionString. In our example, we use these values:

<!-- Data Persistence -->
<add key="DataPersistenceEngine" value="sqlserver"/>
<add key="DatabaseConnectionString" value="server=localhost;uid=sa;pwd=notarealpassword;database=se2011.1.0"/>

DataPersistenceEngine just specifies the DBMS being used (i.e., sqlserver, mysql, oracle, or db2). The DatabaseConnectionString needs the basics for a database connection: a hostname, a user ID, a password, and the name of the database where Engine will live (and where you should've run the DDL statements referenced earlier in this document).

We are using SQL Server's sa user in our example. If you have a database user that you'll be using for Engine, just make sure it's in the connection string.

Once you've completed this step, you should be able to play the Engine Console in Visual Studio and see a green passed in the Database Connection test on the dashboard.

Making the Web Server and the Filesystem Get Along

In order to get import working, you'll need to make sure the web server has somewhere on the filesystem to put content files. There are four values you'll want to set in order for Engine to be able to import successfully:

In the case of the two filepaths, these need to be writable by the web server.

Here's how this section of the appSettings block looks in SCORMEngineSettings.config for our Vanilla integration:

<!-- Upload Import Control -->
<add key="WebPathToContentRoot" value="/ScormEngineInterface/tools/test-courses"/>
<add key="FilePathToContentRoot" value="C:\Documents and Settings\DevUser\Desktop\SCORM Engine Integration Template\ScormEngineInterface\tools\test-courses"/>
<add key="FilePathToUploadedZippedPackage" value="C:\Documents and Settings\DevUser\Desktop\SCORM Engine Integration Template\ScormEngineInterface\tools\test-courses\uploads"/>
<add key="UrlToUploadResources" value="/ScormEngineInterface/scripts/EngineUtils/UploadImportControl/"/>

Once you've got these values set up in your configuration file with permissions to the directories such that the web server can write to them, you should have another passed test in the console dashboard.

Implementing the Integration Layer

As part of our delivery, we ship you 4 files that constitute your integration layer:

We should have delivered you versions of each of the external files with the keys already populated, but you will always be able to see their status in console.

And you'll have stubs of the core override functions in your main integration file, but you will need to complete implementation of these overrides in order to have a complete integration between your LMS and Engine.

When Worlds Collide: The Engine Override Functions

The core override functions go in our main integration file, VanillaIntegration.cs:

As mentioned above, we provide stubs for each of these functions upon delivery of your integration code (including only definitions for the ones that matter for your integration; you might not need GetExternalPackageIdFromExternalRegId(), for instance), but you'll likely need to customize them. For instance, if you're tracking learning in your LMS, you'll need the logic for storing that tracking information in your non-Engine LMS database to be included in your rollup override(s).

Your First Import

As a part of your Engine delivery, you'll find an example import file (import.aspx) in /ScormEngineInterface/tools/console. This is how console will allow you to test your imports, but you can also model your integrated import process on it. It uses an upload/import control we provide that is available for you to use to integrate imports however you like.

Here is how the import screen will look in console (and if you use our default upload/import control in your final integration):

Console's Upload/Import Control

When you import, you might already have your external package ID available. If so, you can just pass that in to the import process. In console, if you've got a package ID already, you add it to the query string on import.aspx. E.g.,

import.aspx?package=CourseId|123

Then reload import.aspx. After you reload, when you submit the import form it will be able to grab the package ID from the query string and complete the import.

If you don't have your external package ID at the time of import, and instead prefer that the import process generate one for you, we provide an overridable method called AddExternalPackage(). In this method, you can grab the title and description and whatever else you might need from the manifest and store them to your host system while also generating the package ID.

We provide you with sample code for this method. If you're not using it, we typically leave the code commented out and throw an exception to remind you that you need to pass in the package ID during the import process.

Updating Content

Engine comes with content versioning built in, so you can update a package in place without creating multiple parallel instances of your content. If you click Update Package under a course title in console dashboard, you'll see a screen like this:

Upload/Import Control: Update Screen

You'll notice there are only three options now. It doesn't really make sense to create a package from scratch if you're in the process of updating a pre-existing package.

Your First Launch: Preview

After you've successfully imported a course, even if you haven't completed your core overrides for tracking learning, you're ready to test a preview launch.

To test a preview launch, click on the title of an imported course. You'll see a link for “Preview.” Click it, and you should be able to launch the course without worrying about learner information or rollup.

Detail of How to Launch Content in Preview Mode

If you've gotten this far, you're in very good shape. It's sort of a metaphorical passed.

Your Second Launch: Tracking

After you've completed your GetLearnerInformation() and rollup override(s), you should be ready to test launching again, this time with Engine tracking learning.

To test a tracked launch, click the “New Registration” link beneath the title of one of your imported courses in the console dashboard. Now you should be able to track learning, which will include launch history and the ability to relaunch the content corresponding to this registration.

Detail Indicating How to Initiate a Tracked Launch

Beyond Console: Two Integrations Enter, One Integration Leaves

We provide Engine console to give you a snapshot of the functionality of your Engine setup and to serve as a sort of integration assistant. Getting it set up is almost like completing pre-integration.

At this point, all that likely remains for you to have a multi-standard-conformant LMS is to integrate the upload/import controls as tightly as you'd like with your LMS and to ensure that your production environment is configured successfully (assuming that you set up Engine in a development environment to begin with).

If you started with console running in a dev environment, you'll still be able to run it in your production environment since it will run anywhere a successful ScormEngineInterface installation lives.

Getting Started with Java Edition

So You Want to Integrate SCORM Engine for Java

Welcome to SCORM Engine!

As a SCORM Engine customer, you'll have access to our development staff during the initial integration process and for as long as you maintain a current license to use the software. You'll also have access to tools that we hope will assist you for as long as you run SCORM Engine.

This document is geared toward what you'll see after the integration kickoff call, but the technologies covered will be available to you in your SCORM Engine installation for the duration of your use of the software.

To assist you with the integration, we offer a console to SCORM Engine. From the console, you can:

By the time you’re done reading this document and following its prescriptions, we want you to be able to use the console to import and launch content in a fully functional SCORM Engine integration. First, we take you through an overview of the SCORM Engine console. Then we tell you how to get yours up and running as you embark on the actual process of integration.

Have fun!

(And be sure to let us know what could make this process better and more fun if you don’t...)

SCORM Engine Console: How It Should Look

Pictured here is a screenshot of the SCORM Engine console dashboard running against a very basic integration for a sample customer called Vanilla:

image alt text

Import and Launch

We have a few sample courses imported into this instance of Engine (which also show up in aggregate in the Statistics box over to the right).

image alt textimage alt text

User Count

At any time you can run a report to see the total number of users of the SCORM Engine software. Some SCORM Engine license fees are based on the number of users of the SCORM Engine software, so this is a really helpful tool if you fall into that group. You can add a date range to see the total number of users over the course of a specific time period. image alt text

Integration Details

Under Integration Details at the bottom, you can see the version of the SCORM Engine software, and the primary integration class in use. You can also see that we've specified an external package key of CourseId, an external registration key of CourseId and Username, and no external configuration keys. Finally, you can see how your launch URLs will look.

image alt text

Web Server Configuration

The final section on the console dashboard is for the SCORM Engine Settings Values relevant to the successful operation of SCORM Engine. We display configuration settings as key/value pairs.

image alt text

How You Can Have a Console of Your Very Own

In order to get to this point, we had to complete the basic integration process, which involved three steps:

  1. running the SCORM Engine database script

  2. making some basic changes to the SCORM Engine web application properties file

  3. implementing core overrides in the main integration file

Once the basic steps are done, you can access console via your SCORM Engine URL at .

Configuring Your Database for Use with SCORM Engine

As part of our delivery, we include a SQL file containing data definition language (DDL) statements (e.g., CREATE TABLE, etc.) for the SCORM Engine data model.

You’ll need to execute this collection of SQL statements in the DBMS (e.g., SQL Server, MySQL, Oracle, PostgreSQL) you’re using with SCORM Engine. In our Vanilla example, we’re using SQL Server. You’ll find the SQL for your DBMS in the Database folder in your SCORM Engine folder. Each DBMS has its own subfolder.

You should only need to run this SQL once for each instance of SCORM Engine.

Configuring Your Web Server for Use with SCORM Engine

We include a web server configuration file specific to SCORM Engine in both our releases. You’ll need to update this configuration file—SCORMEngineSettings.properties—to get both SCORM Engine and the console working.

In these examples, we assume you’re using Tomcat as your application server, but if you ever have any questions, just ask!

All of these settings will be in the block of SCORMEngineSettings.properties.

Controlling Access to Console

Console is your gateway to SCORM Engine. It includes both information and controls that you probably don’t want the entire world to see, so we protect it with an authentication mechanism that uses a combination of a configuration key and a cookie.

The very first time you try to access console, it will look like this:

image alt text

That password is governed by the ConsolePassword entry in your properties file. In order to authenticate to console successfully, you’ll need an entry like this:

passw0rd

After you’ve authenticated successfully, console will set a cookie, and you will be able to bypass the login prompt and get straight to the dashboard.

If you ever want to disable access via a given browser that has previously authenticated, you’ll need to delete the SECONSOLE cookie.

Getting SCORM Engine Talking to Your Database

In SCORMEngineSettings.properties, we need to adjust the entries for DataPersistenceEngine and DatabaseConnectionString. In our example, we use these values:

jdbc/ScormEngineDB mysql

DataPersistenceEngine just specifies the DBMS being used (i.e., sqlserver, mysql, oracle, or db2). The DatabaseConnectionString needs to specify a JNDI name for a data source, which will actually be configured separately in Tomcat’s conf/context.xml file, which we supply an example of in your integration deliverable.

Once you’ve completed this step, you should be able to play the SCORM Engine Console in Visual Studio and see a green passed in the Database Connection test on the dashboard.

Making the Web Server and the Filesystem Get Along

In order to get import working, you’ll need to make sure the web server has somewhere on the filesystem to put content files. There are four values you’ll want to set in order for SCORM Engine to be able to import successfully:

In the case of the two filepaths, these need to be writable by the web server.

Here’s how this section of the appSettings block looks in SCORMEngineSettings.properties for our Vanilla integration:

/courses /Library/WebServer/Documents/courses /Library/WebServer/Documents/courses/uploads

Once you’ve got these values set up in your configuraiton file with permissions to the directories such that the web server can write to them, you should have another passed test in the console dashboard.

Implementing the Integration Layer

As part of our delivery, we ship you four files that constitute your integration layer:

We should have delivered you versions of each of the external files with the keys already populated, but you will always be able to see their status in console.

And you’ll have stubs of the core override functions in your main integration file, but you will need to complete implementation of these overrides in order to have a complete integration between your LMS and SCORM Engine.

When Worlds Collide: The SCORM Engine Override Functions

The core override functions go in our main integration file, VanillaIntegration.java:

As mentioned above, we provide stubs for each of these functions upon delivery of your integration code (including only definitions for the ones that matter for your integration; you might not need GetExternalPackageIdFromExternalRegId(), for instance), but you’ll likely need to customize them. For instance, if you’re tracking learning in your LMS, you’ll need the logic for storing that tracking information in your non-SCORM Engine LMS database to be included in your rollup override(s).

Your First Import

As a part of your SCORM Engine delivery, you’ll find an example import file (import.jsp) in /ScormEngineInterface/tools/console. This is how console will allow you to test your imports, but you can also model your integrated import process on it. It uses an upload/import form we provide that is available for you to use as a sample to integrate imports however you like.

Here is how the import screen will look in console (and if you use our default import form in your final integration):

image alt text

When you import, you might already have your external package ID available. If so, you can just pass that in to the import process. In console, if you’ve got a package ID already, you add it to the query string on import.jsp. E.g.,

import.jsp?package=CourseId|123

Then reload import.jsp. After you reload, when you submit the import form it will be able to grab the package ID from the query string and complete the import.

If you don’t have your external package ID at the time of import, and instead prefer that the import process generate one for you, we provide an overridable method called AddExternalPackage(). In this method, you can grab the title and description and whatever else you might need from the manifest and store them to your host system while also generating the package ID.

We provide you with sample code for this method. If you’re not using it, we typically leave the code commented out and throw an exception to remind you that you need to pass in the package ID during the import process.

SCORM Engine comes with content versioning built in, so you can update a package in place without creating multiple parallel instances of your content.

Your First Launch: Preview

After you’ve successfully imported a course, even if you haven’t completed your core overrides for tracking learning, you’re ready to test a preview launch.

To test a preview launch, click on the title of an imported course. You’ll see a link for "Preview." Click it, and you should be able to launch the course without worrying about learner information or rollup.

image alt text

If you’ve gotten this far, you’re in very good shape. It’s sort of a metaphorical passed.

Your Second Launch: Tracking

After you’ve completed your GetLearnerInformation() and rollup override(s), you should be ready to test launching again, this time with SCORM Engine tracking learning.

To test a tracked launch, click the "New Registration" link beneath the title of one of your imported courses in the console dashboard. Now you should be able to track learning, which will include launch history and the ability to relaunch the content corresponding to this registration.

image alt text

Beyond Console: Two Integrations Enter, One Integration Leaves

We provide SCORM Engine console to give you a snapshot of the functionality of your SCORM Engine setup and to serve as a sort of integration assistant. Getting it set up is almost like completing pre-integration.

At this point, all that likely remains for you to have a SCORM-conformant LMS is to integrate the upload/import form as tightly as you’d like with your LMS and to ensure that your production environment is configured successfully (assuming that you set up SCORM Engine in a development environment to begin with).

If you started with console running in a dev environment, you’ll still be able to run it in your production environment since it will run anywhere a successful ScormEngineInterface installation lives.

Getting Started with .NET Edition

Creating Your SCORM Engine IIS Web Application

In the Internet Information Services app in Windows, you’ll want to create a new virtual directory for ScormEngineInterface which we commonly name simply "ScormEngineInterface".

Letting Your DBMS (e.g., SQL Server) Know about SCORM Engine

In order to run SCORM Engine, we have to execute some data definition language (DDL) statements in SQL to make sure that the tables our application needs are in your database. To do this, launch Microsoft SQL Server Management Studio (MSSMS). In the SQLSERVER directory, open the files 1-2013.2_SQLSERVER_SCORMENGINE.sql and 2-2013.2_SQLSERVER_VANILLAINTEGRATION.sql. If you already know which database your SCORM Engine tables and data will live, select it. Then execute the two files in sequence.

If you’re using one of the other DBMSes supported by SCORM Engine (MySQL, Oracle, or PostgreSQL), use the relevant tool and execute the same SQL in the corresponding directory for your DBMS.

Teaching IIS to Speak SCORM Engine

Even though you’ve already set up your SCORM Engine IIS web application, you still need to update the configuration that will be used by IIS so that it can play nicely with SCORM Engine.

At a minimum, you’ll need to update the following values in SCORMEngineSettings.config to reflect your local environment.

Upload/Import

Database Connectivity

Console

Testing Your SCORM Engine Installation

Once you’ve gotten this far, you should be able to navigate to the SCORM Engine console directly in your ScormEngineInterface. E.g., something like this:

[yoursite]/ScormEngineInterface/tools/console/

Provided you’ve got your database connection configured correctly, you should be prompted to log in. After you’ve used your ConsolePassword to log in, you should see the dashboard of your console. If both the database and filesystem tests are passing, you’re ready to try importing content!

Try importing a Tin Can package. If the import works, return to the console dashboard and try launching it in preview mode. If preview mode works, try launching it with an actual registration. If that works, return to the console dashboard and see if you see corresponding statements in your Statement Viewer. If you do, then you’re ready to be driven by SCORM Engine! Now it’s time to work on your integration...

Upgrading Engine

Introduction

The upgrade process for Engine is more involved than usual because of some substantial schema changes implemented in 2014.1.x to improve performance. For your convenience, we have built a tool to enact these schema changes.

This document is intended as a reference only. If you want to upgrade, please contact us at support@scorm.com so we can arrange for you to have the help of one of our dedicated support engineers who will talk through this process with you, answer any questions you may have, and address any of your concerns.

Step 1: Update your database

Step 1a: Back up your database

Before you run our upgrade tool or run scripts on Engine's tables, please back up the database that contains them. Rustici Software is not responsible for any lost data caused by attempting to upgrade Engine without having a backup in place.

Step 1b: Update your database

What you will have to do will depend on what version of Engine you are upgrading from, and on whether or not you have Tin Can data.

Upgrading from Engine Version 2011.1 or Earlier

Upgrading from Engine 2012.x, if you have no Tin Can data

Upgrading from Engine 2012.x, if you have Tin Can Data

Upgrading from Engine 2013.x

Step 1c: Run the Upgrade Tool

The upgrade tool will analyze your schema and perform the necessary operations to convert your data to the current schema. Running the program requires slightly different steps, depending on whether you are on Java or .NET.

You will need to supply a connection string to the database that has permissions to run SQL ALTER commands and create tables.

General .NET instructions

An executable, EngineUpgrade.exe, is included in the ScormEngineInterface/bin folder of your distribution. Navigate to that folder on the command line.

Running the upgrade is simply a matter of supplying your connection information to the program in the form of command-line arguments. The full command is EngineUpgrade.exe persistenceEngine connectionString schemaPrefix, where:

Note: For legal reasons, the MySQL connector for .NET cannot be distributed with the rest of Engine, and is therefore not present in the folder with the upgrade tool. If you need to connect to a MySQL database, you will need to download the connector (version 6.3) yourself. You can find it here: http://dev.mysql.com/downloads/connector/net/6.3.html. Once downloaded, copy the library into the folder with the rest of the binaries.

General Java instructions

You will find everything you need in the Upgrade folder of your distribution. That folder will contain a command-line script (upgrade.sh on Unix; upgrade.bat on Windows) that can be used to run the upgrade. The script must be run from that folder.

On Unix, run sh engineupgrade.sh pathToJdbcConnector persistenceEngine connectionString [schemaPrefix].

On Windows, run engineupgrade.bat pathToJdbcConnector persistenceEngine connectionString [schemaPrefix].

Both platforms have four command-line arguments:

Step 2: Update the application files

Updating Your Integration Layer

Occasionally, we may remove integration methods that have proven to be problematic or change their signature. Some customers may have overrides for these deleted or overridden methods, and so we have taken extra precautions to make sure that Engine will not run if it detects an outdated integration layer override, in order to make customers aware of the potential problem. We also occasionally have to make changes to Engine's public APIs that are used by the integration layer.

Our recommendation is that you provide us with your integration layer and external key classes at the start of the upgrade. This will give us an opportunity to evaluate the changes and prepare you to rebuild your integration assembly against the new RusticiSoftware.ScormEngine.dll assembly, or integration JAR file against the new scplogic.jar file.

If you don't do this, you will most likely see some errors and/or warnings. Some examples of these are as follows:

If you run into any errors or warnings while building or using your integration with the new version of Engine, just let us know and we'll be happy to help you update the code.

Updating Your SCORM Engine configuration File

The "ScormEngineScriptsUrl" setting in the SCORMEngineSettings configuration file was optional in previous versions of Engine, but is now required. It should point to the "scripts" folder inside your ScormEngineInterface application folder.

Example for .NET Engine:

<!-- SCORMEngineSettings.config -->
<add key="ScormEngineUrl" value="/ScormEngineInterface"/>
<add key="ScormEngineScriptsUrl" value="/ScormEngineInterface/scripts"/>

Example for Java Engine:

<!-- SCORMEngineSettings.properties -->
<entry key="ScormEngineUrl">/ScormEngineInterface</entry>
<entry key="ScormEngineScriptsUrl">/ScormEngineInterface/scripts</entry>

Minor Engine Upgrades

Between major releases of the SCORM Engine we may make point releases that fix bugs and add small pieces of functionality that are needed by our clients. When you update your SCORM Engine implementation to one of these point releases we recommend that you follow these instructions so that we can continue to support you easily.

If you have any questions about these instructions, or you think they are not optimal for your deployment scenario, then please contact us and we will help you through the upgrade process.

The SCORM Engine interface is a web application that is customized for our clients by adding a custom Client Integration dll to its bin folder and configuring its web config settings through the SCORMEngineSettings.config file. We test our configurations with all files at the same code level so we encourage you to think of the files in the SCORM Engine directory as a single unit, despite the fact we may be providing a patch that only affects a handful of JavaScript files. Some updates may include database scripts for schema or stored procedure changes but we will explicitly call out if/when that is necessary. The standard upgrade instructions depend on your deployment scenario:

Updating Your SCORM Engine for Java

Updating the SCORM Engine application for your Java platform should primarily consist of redeploying the included WAR files. If you have made custom UI changes to your environment you will need to unpack the WAR files, merge your changes, and recreate your WAR files. Information on what changes you may need to make to accommodate your custom UI changes can be found below in the .NET section.

Updating Your SCORM Engine for .NET

SCORM Engine 2010.1 and higher

Single SCORM Engine Web Application, default user interface

In the most common deployment scenario where the SCORM Engine is deployed separately to the Client LMS as a single web application, and the Client LMS uses the standard UI files located in ScormEngineInterfaceDir/defaultui. You'll essentially need to completely replace the SCORM Engine application while keeping your own integration DLL and configuration file. Follow these steps (assuming the SCORMEngineInterface web app is located at ScormEngineInterfaceDir, and your integration DLL is named ClientIntegration.dll):

Single SCORM Engine Web Application, custom user interface.

In this deployment the Client LMS has its own set of SCORM Engine UI files, usually based on the /defaultui files, in a separate web application. It is rare that we will have made changes to the UI files in a point release. If we have then we will indicate the changes so that the client can merge these changes into their modified UI. Additionally:

Single Central SCORM Engine, multiple Remote SCORM Engines

In this deployment there is a single SCORM Engine co-located with the database and one or more remote SCORM Engines co-located with the course content.

Step 3: Custom UI Updates

If you using a custom UI, meaning something other than scormengine/defaultui/deliver.aspx (or jsp), you will need to make the following additions to to take advantage of the new IE Compatibility Mode package property. If this step is skipped, your player will continue to function but it will continue to use the hard-coded META tag, if any.

Deliver.aspx or jsp

<html>
  <head>
    <!-- Remove the following <meta> tag: -->
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
    <!-- Add this tag instead: -->
    <%=Data.InternetExplorerCompatibilityMetaTag %>

Intermediate.aspx or jsp

<html>
  <head>
    <!-- Add this tag: -->
    <%=Data.InternetExplorerCompatibilityMetaTag %>

Tin Can Integration Walkthrough

##Concepts##

Security and the Tin Can API

Each statement that comes into the Tin Can web service is evaluated for access rights before proceeding. The first thing that's determined is the "Asserter". The Asserter is essentially a combination of an Actor and a set of permissions. The Actor here is the person/system that is acting as the authority for the Tin Can statement being processed. When statements are being written, this Actor actually shows up as the authoritative source in the statement.

Tin Can security is fully customizable through new SCORM Engine Integration methods. If using basic authentication you will likely want to implement:

Actor TinCanGetAuthorityFromBasicAuth(TCAPIContext context, String username, String password);

The default implementation will only accept one username/password which has full authority. This username/password is defined by your SCORMEngineSettings.config entry named "TinCanRootAccount". This config entry has both the name and password separated by a colon. Ex: "joeadmin:mypass".

If using OAuth we already have a good default implementation so you probably won’t override this, at least initially..

What a particular user can do is defined by the Integration method TinCanGetPermissions(). We have defaults for the root user, a person(actor) and an application(actor). However, by overriding this integration method you can have fine-grained control to all permissions.

###Auth###

Authentication can be handled in Tin Can via Basic Auth or OAuth and is a necessity if you wish to handle Tin Can Statements from an activity not launched by your LMS. Going forward it's expected LMSs will want to track learning happening in places they were never able to track before. An example might be a learner's interactions with a forum inside the LMS. In order to record those interactions as statements in the LRS you will need to have some authentication set up. Integration methods are provided to allow you to tie both of these concepts into your existing system. An example scenario would be allowing a user's Single Sign On credentials to authenticate against your system, through the integration method. This will allow them to use those same credentials for LRS access as they use for other parts of the system. Additionally, you may want to provide special accounts to Activity Providers (like the forum software) so that you can always verify who is making the statement.

###Permissions###

You'll want to consider what permission level each individual account should have. The default permissions level allows customization across two primary areas:

Additionally, there is a Root permissions level. This level is what you'll want to use for third party applications you want to have the ability to both read and write any statements to or from the LMS. While it's unlikely you'll apply this permissions level to many, if any, third parties we've made the option available for your own systems.

###Reporting###

Understanding how you want to handle reporting on Tin Can data requires you to understand how you want to use Tin Can. For our customers that will be only using Tin Can content created as traditional courses launched by an LMS you don't need to do anything special. We will aggregate the data from those statements and send it to you via the same RollupRegistration Method we always have. The caveat with this approach is that this approach will focus entirely on the result object within the statement. This means we'll report on completion, success, score, and time as reflected in the result object and we will not depend on the verb for any meaning.

For people looking to record results data for Tin Can content not launched by the LMS you'll want to copy the statements out to a separate location via our TinCanStatementsStored Integration Method for in depth analysis.

To facilitate querying for Tin Can data, we have included some Recipes within Engine to help you pull data for some common data sets including Video, Results Summary and CMI Interactions.

###Content Auth###

When we talk about Content Authorization and its relationship to Tin Can we're actually talking about the Tin Can addendum launch spec. The short version is that some Activity Providers may be launched, or initiated, by an LMS but end up taking place outside of the browser where handling content authorization for the content's resources becomes tricky. The easiest example would be a course that launched in a browser, detected it was on a mobile device, and then redirected to a mobile app. The mobile app needs to download the various resources inside the package such as images and videos. For most LMSs these resources are protected by a cookie, or some other authorization scheme, and the authorization mechanic is available to the browser. Once we've left the confines of the browser we have no way to pass cookies to something like a mobile application, and we wouldn't want to.

What we do pass, however, is the endpoint and credentials for accessing the LRS. With that data, and the full implementation of the spec referenced above, we're able to use the Tin Can endpoint as a way to proxy content files to the mobile application. This means that your content is still protected by your authentication scheme but can be made available to people with valid LRS credentials while they take your course.

###Multi-Tenant###

There are 4 integration methods that need to be considered and possibly overriden in order to make multi-tenant setups work correctly, and they are also listed in the Key Integration Methods section: TinCanUseMultipleEndpoints, TinCanBuildContext,TinCanPostProcessContext, TinCanGetMultiTenantContexts.

Internally, Engine uses an AppId property on the TCAPIContext object as a way to track tenancy amongst the various Tin Can tables. Externally and in the integration layer, you'll use your implementation of the ubiquitous ExternalConfiguration object to represent the data your system uses to determine individual tenants. When launching content from Engine, the external configuration is passed in on the query string. However, this functionality is not part of the Tin Can spec, so we cannot expect activity providers to pass the tenant info in a query string when communicating with the LRS. Therefore, in order to make multi-tenant setups work correctly with Tin Can you'll want to use a different Tin Can API endpoint for each of your tenants. Engine is prepared to parse out any value that appears between the Tin Can API and the method name being called and present that to the Integration layer as a way to distinguish which tenant is accessing the system and creating the correct external configuration object.

An example might be:

http://example.com/ScormEngine/TCAPI/examplecompany/statements

When accessing the resource above, "examplecompany" will be passed to TinCanPostProcessContext where the Integration layer should convert the string "examplecompany" to both a unique value that can be used internally to fill the appId variable in the context object as well as a valid ExternalConfiguration object. This value can then be used in all other integration methods where tenancy will be important.

A note on the use of TinCanBuildContext and TinCanPostProcessContext: Both methods are called when a Tin Can request is first received, and both are meant to instantiate or complete the instantiation of a set of the objects necessary for the request to be completed (e.g. Data Store(s)). However, TinCanBuildContext method takes an ExternalConfiguration parameter, while TinCanPostProcessContext method attempts to get any external information from the string parameter passed under the name "extraEndpointInfo". As such, in a single-tenant scenario, the TinCanBuildContext method will likely be responsible for most of the instantiation, while TinCanPostProcessContext will perform some cleanup and validation. However, when we are dealing with multiple tenants, both methods will need to be able to create the full context, since the tenant information can come in either or both of the methods. In fact, there are later times when TinCanBuildContext is called, and for it to function properly, it must assume that the ExternalConfiguration being passed in was correctly populated. The only place to do this when endpoints represent tenants is in the TinCanPostProcessContext method.

Some optional Tin Can extensions, such as the /results API, will require implementation of the integration method TinCanGetMultiTenantContexts. TinCanPostProcessContext can be used to construct this list of contexts, using the list of Tin Can API endpoints. This will be used to perform background processing using all of the possible ExternalConfiguration Obejcts your system depends on to inspect and transform the data for each of your customers/connection strings.

##Config##

In order to use Tin Can successfully in Engine, you’ll need to do a few things:

You can read the lengthy comment for this value in the SCORMEngineSettings.config that came with your Engine release for more information. More than likely, you can copy the default from the new config into your existing config and uncomment it, and it should work. That should be enough to get you up and running with Tin Can in console. If your setup is multi-tenant and you want an endpoint per, say, ClientId, then we might have a little more work to do.

Another interesting behavior to note is the way Engine creates Tin Can Activity IDs while generating statements for courses created in another learning standard like SCORM. Starting in version 2014.1, the generated ID will contain a SHA-1 hash of either the package contents or just the manifest file when all of the contents cannot be obtained through directory browsing (e.g. online content). By default, this hash will be transformed into a urn of the following format: urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66. However, by setting the following config to true, your activity ID can be formatted as a url, with the base of the url coming from the SystemHomepageUrl setting:

Note that in the past, the generated Activity ID would be different each time a package was imported into Engine (even if the same package was imported multiple times). With this new approach, each package is likely to have only one corresponding ActivityID regardless of how many times it's imported. This is more in the spirit of what it means to be a Tin Can Activity.

##Key Integration Methods

    public TCAPIContext TinCanBuildContext(TinCanVersion version, ExternalConfiguration cfg, boolean isLaunchLink) throws Exception {
      MyExternalConfiguration myConfig = (MyExternalConfiguration)cfg);
      TCAPIContext ctx = super.TinCanBuildContext(version, cfg, isLaunchLink);
      ctx.setAppId(myConfig.TenantID);
      ctx.setSandbox(false);
      ctx.setOriginalAppId(myConfig.TenantID);
      return ctx;
    }
    public TCAPIContext TinCanPostProcessContext(TCAPIContext ctx, Map requestParameters, String extraEndpointInfo) throws Exception{
        String tenantID = extraEndpointInfo;
        MyExternalConfiguration myConfig = (MyExternalConfiguration)ctx.getExternalConfiguration();
        myConfig.TenantID = tenantID;
        //For multi-tenant, a changed Tenant ID means we should probably re-create all of the objects necessary to complete this request (e.g. Data Store)
        ctx.TinCanImplementation = TCAPI.CreateImplementation(ctx.RequestVersion, myConfig);
        ctx.setAppId(myConfig.TenantID);
        ctx.setSandbox(false);
        ctx.setOriginalAppId(myConfig.TenantID);
        return ctx;
    }

Recipes

Recipes offer a methodology for doing relational reporting on Tin Can statements stored in your Engine LRS.

First, there must be a well described collection of statements, such as those that exist in Profiles in our Registry. (Alternatively, there could be a well described implicit scenario, such as results summary data from SCORM.)

Second, there must be a listener in Engine with associated tables.

Engine ships with three Recipes implemented: results summary, interactions, and video.

Read more about the concept of Recipes here.

Read more about the Recipes API in Engine here.

##Settings

In order to use Recipes, you must set the following:

Tin Can Statement Forwarding

Statement Forwarding provides the means to automatically forward statements sent from one LRS to another. Applications include:

##Settings

Properties relevant to Statement Forwarding:

##Integration

For security, generate unique credentials for source and target Learning Record Stores

In order to configure statement forwarding, call ScormEngineManager::AddTinCanForwardingPath(ExternalConfiguration, StatementForwardingPair) to add paths for forwarding between a source and destination LRS. StatementForwardingPair is a construct containing the following members

Member Type Description
SourceUrl string Contains the endpoint url/query for the source LRS.
SourceCredentials Credentials Contains the credentials for accessing the source LRS
DestinationUrl string Contains the endpoint url for the destination LRS.
DestinationCredentials Credentials Credentials for the destination LRS.
Id string Unique ID for this statement forwarding pair.

The call will return the unique ID for the statement forwarding. Save this ID for future management of this statement forwarding pair and passing to ScormEngineManager::UpdateTinCanForwardingPath() and ScormEngineManager::DeleteTinCanForwardingPath().

SCORM Engine Integration Architecture

Background

The SCORM Engine integrates with hundreds of different LMS's worldwide. It provides a piece of vital functionality to these systems and needs to be tightly integrated to provide both a seamless user experience and a robust technical implementation.

While a tight integration is vital to the long term success of an LMS powered by the SCORM Engine, it is also important that these systems not be so interwoven that they cannot be maintained separately. Much of the value that Rustici Software provides its clients stems from our ability to maintain and improve the SCORM Engine as the standards evolve and new interpretations of them emerge. Similarly our clients must be able to evolve and improve their LMS's without being encumbered by the SCORM Engine or relying on Rustici Software to make code changes. Thus the SCORM Engine and the host LMS need to be remain logically separate systems. From a technical perspective, we say that the SCORM Engine needs to be loosely coupled with the host LMS.

While many LMS's are quite similar in their basic structure and concepts, each has its own set of functionality that makes it unique. Different sets of business rules, innovative features and even subtle quirks can all affect how SCORM content should best be delivered in a particular LMS. Thus, the SCORM Engine needs to be highly customizable and configurable to handle whatever is thrown at it.

So, the SCORM Engine needs to be tightly integrated, loosely coupled and highly customizable. Those three goals are often at odds with one another. It took some innovative design work to craft an architecture for the SCORM Engine that meets these requirements, but the effort has paid off. The "integration layer" architecture described in this document has enabled us to integrate the SCORM Engine with dozens of different LMS systems without ever having to make a major change to the core SCORM Engine code.

The Integration Layer

The integration layer is the interface between the SCORM Engine and the system with which it is integrating (the "host LMS"). It is also the boundary between the two systems, acting as a buffer to keep the core systems separate.

(This document will refer to the "system with which the SCORM Engine is integrating" as the "host LMS". We use this term for convenience, but note that while most integrations are with an LMS, the SCORM Engine has been integrated with a number of systems not directly related to learning.)

Integration Layer

Loosely Coupled

The diagram above depicts the conceptual architecture of the SCORM Engine integrated with an LMS through the integration layer. Notice that the SCORM Engine does not directly communicate with the host LMS. Instead, all communication is routed through the integration layer. The common interface of the integration layer provides a level of indirection that isolates the host LMS from changes in the SCORM Engine and vice versa.

The integration layer is different for every integration of the SCORM Engine. The integration layer is also the only thing that is different for each integration of the SCORM Engine. The integration layer can be thought of as the "stuff we change" or the "stuff you are allowed to touch" when integrating.

Tightly Integrated

Notice that there is a very tight integration between the SCORM Engine and the integration layer. The integration layer is essentially a component of the SCORM Engine that can be swapped out for each integration. The interface between the integration layer and the host LMS can be very tight or very loose. The integration layer can communicate very loosely with the host LMS via web services (or even URL redirections). Or, the integration layer can invoke an LMS-provided API for a tighter integration. The integration layer can even make direct calls into the host LMS's database to achieve an extremely tight integration. All of these solutions are perfectly viable and it is up to the client to decide how tight a particular integration should be.

Highly Customizable

The integration layer is also where we can customize and configure the SCORM Engine. For anything that ever has been, or conceivably could be, customized in the SCORM Engine, there is an integration function that lets the SCORM Engine "ask" the integration how the action should be performed. For instance, before displaying the user interface, the SCORM Engine will ask the integration layer "which skin should I show?". Or, before writing a log message, the SCORM Engine will ask "where should I write this message to?". There are well over 100 integration functions that let us precisely customize the SCORM Engine for a particular host LMS.

How It Works

The core of the integration layer is an abstract class called the integration interface. The integration interface defines all the operations the SCORM Engine needs to perform which might vary based on the particular integration. For each integration, we create a unique class that implements all the methods defined in the integration interface. The method implementations in this subclass are specific to the host LMS and implement the functionality the client needs. At runtime, the SCORM Engine uses a factory class to instantiate the appropriate integration implementation.

UML Diagram

The UML diagram above depicts the class hierarchy for the integration classes. The boxes represent classes and the arrow indicate inheritance. At the top, is the abstract IntegrationInterface class. This class is where all of the integration methods are defined (but not implemented). At the bottom, there is are many concrete implementations of the the IntegrationInterface. Each client has their own unique implementation with all of the required methods implemented.

In the middle, there is a DefaultIntegration class. The purpose of this intermediate class is to provide default implementations of the many methods in the IntegrationInterface that usually do not change from client to client. There are over 100 integration methods defined in the IntegrationInterface. Of these, only about a dozen are required to change from client to client. The rest of the methods are there to allow things to change between clients, but in most cases there is a default implementation that is perfectly acceptable. For example, in most cases, it is perfectly acceptable to log error messages to the standard event log. On the other hand, some LMS's have their own built in event tracking system, in which case it would be appropriate to override the default logging mechanism.

Data Relations

One of the core principles of the SCORM Engine integration design is that the host LMS should not need to know anything of the internals of the SCORM Engine. This separation helps to maintain the loose coupling between systems. Yet, many of the integration functions require that the systems communicate about a specific package or a specific registration. Rather than requiring the host LMS to know of the SCORM Engine's internal identifiers, the SCORM Engine defines a set of external identifier classes that allow the host LMS to use its existing identifiers no matter their structure and type.

Data Relations

Every LMS uses a different set of identifiers (each with different data types) to represent packages and registrations. Some use integers, some use strings, some use GUIDs, some use a combination of all of these and more). Some LMS's refer to packages as courses, others as lessons or tasks or items or classes. The integration layer defines an abstract way to represent these complex and varying objects in a consistent manner through the ExternalPackageId and ExternalRegistrationId classes.

When we create an integration we generate a concrete implementation of the ExternalPackageId and ExternalRegistrationId that is unique to the host LMS. These integration objects will have a set of properties that mirrors the keys used by the host LMS for the identified package and registration entities. These objects give the host LMS the ability to communicate with the integration layer in its own language.

Methods With ExternalId Args

These classes are each instances of the abstract ExternalId class which defines serialization methods for these classes. The serialization common to all external identifier objects allows LMS's to manipulate their identifiers as strings at times instead of instantiating actual ExternalId objects.

The relationships between the SCORM Engine's internal concepts and package and registration with the host LMS's associated concepts is also reflected in the database. In keeping with the goal of tight integration with loose coupling, we allow two of the SCORM Engine's database tables to be modified during the integration. Both the ScormPackage table and the ScormRegistration table will have additional foreign key fields added to them to reflect their relationships with tables in the host LMS (tight integration). The other SCORM Engine tables remain untouched (loose coupling).

SCORM Engine database tables before integration

SCORM Engine database tables before integration

SCORM Engine database tables after integration

SCORM Engine database tables after integration

External Configuration

There is one more integration object that follows the same pattern of composition as the external package id and external registration id. The external configuration object is a "tunnel" for passing information from the host LMS to the integration layer. The external configuration object is perhaps best explained with an example.

Take the SCORM Engine integration function LogError that was previously mentioned. This function is invoked by the SCORM Engine in the event of an unexpected runtime error so that diagnostic information about the error can be recorded for later analysis. Say Client X has service level agreements (SLAs) with a few select customers that imposes financial penalties for any system downtime. Because of these SLAs, Client X wants all of its support and development staff to be immediately notified by cell phone, pager, email, text message, singing telegram and carrier pigeon whenever an error affects a client with an SLA (note, we do not endorse inhumane treatment of pigeons). For all other clients, there's no need to interrupt anybody's sleep, so the error should just be recorded to a system log for later analysis.

To implement the LogError function in the integration layer, we need to have some information about the current client available to us to know what actions to take. This need poses a problem because it is the SCORM Engine that invokes the LogError function, not the host LMS. The SCORM Engine only knows about packages and registrations, not LMS client SLAs. To expand this problem out further to all clients and all integration functions. There are innumerable data points upon which the integration functions might rely to make decisions. The SCORM Engine can't possibly be aware of all of these options, so another solution is needed.

Enter the external configuration object. When the host LMS passes control to the SCORM Engine, it has the opportunity to pass along an external configuration object. Just like the other external ids (external package and external registration), the external configuration may contain any arbitrary set of properties. In other words, it can contain whatever information the integration layer might need. Anytime the SCORM Engine calls an integration function (i.e., anytime it might be calling back to the host LMS), it passes that same external configuration object to the integration layer. In this way, the external configuration object is like a tunnel that allows the host LMS to pass information through the SCORM Engine to the integration layer.

In our example above, the integration would define a property called IsSLACustomer in the ClientXExternalConfiguration class. Then, when launching the course, the host LMS would set this flag appropriately before handing control over to the SCORM Engine. The SCORM Engine would then save this configuration information and pass it to the integration layer every time an integration call is made. The integration function can then examine this flag and take the appropriate course of action in the event of an error.

SCORM Engine 2014.1 :: Recommended Requirements

The SCORM Engine is designed to be deployed in a wide variety of configurations. Listed below are the basic requirements for using the SCORM Engine.


SCORM Engine Scalability

Introduction

Clients often ask us "How many users can the SCORM Engine can support?" Our answer usually falls somewhere between “a lot” and “it depends”. Both are true, but not very helpful. This document will shed some more light on the empirical data we have about the scalability of the SCORM Engine as well as the results of some measured stress testing we recently performed.

Why is this such a hard question?

There are many factors that affect the load on the server when delivering online training through the SCORM Engine. All of them can greatly impact scalability.

Deployment Variability

The SCORM Engine is designed to be tightly integrated into external LMS systems, every one of which is different. Most significantly, the LMS’s we have integrated with use just about every application stack on the market. The SCORM Engine is deployed on Windows servers, Linux servers and even the occasional Mac server. It runs on top of SQL Server, Oracle, MySql or Postgres. These environments are sometimes replicated, sometimes clustered, sometimes load balanced and all of them have different authentication and security requirements.

Integration Variability

The SCORM Engine has a very flexible interface with which it ties into a client’s LMS. How this interface is used and configured can have a significant impact in the server side load. For instance, the amount of data that is communicated and shared across systems will have a measurable impact on performance. The method in which this data is transmitted also comes into play; do the systems communicate via SOAP requests, through direct API calls, through access to a shared database or something else?

Course Variability

SCORM offers allows for a lot of flexibility in how courses are put together. There is a big difference in the amount of data that the SCORM Engine must track for a single SCO course verses a course with one hundred SCOs. Within each SCO, there can also be a huge variation in the amount of data that the SCO chooses to record and track. Some SCOs do nothing more than indicate that they are starting and completing while others will track the learners’ progress in detail (including things like how they answer questions and how they are progressing on various learning objectives). How courses use SCORM 2004 sequencing and how large the actual courseware files are will also impact performance.

Usage Variability

Different communities of practice will experience different usage patterns of their LMS. Some communities will have users that take all their training in clumps while others will have users who only access the system in short bursts. Some systems are mostly accessed during business hours while others are active twenty-four hours a day. Systems that support supplemental material in a classroom may have many users all start a course simultaneously, while more asynchronous systems will have users starting and stopping throughout the day.

Empirical Evidence

Empirically we know that the SCORM Engine can scale quite well. Several of our clients operate very large LMS instances in which the SCORM Engine performs admirably. One client in particular tracks over 1.5 million users and routinely processes over 50,000 course completions in a day. Other clients serve entire military branches from server farms distributed throughout the globe. Of course there have been occasional hiccups, but by and large the SCORM Engine handles these loads quite well.

Architecturally we designed the SCORM Engine for scalability from the start. One of the more significant architectural decisions we made was to push the SCORM sequencer down to the browser. Interpreting the SCORM 2004 sequencing rules can require a fair amount of processing. In a conventional SCORM player, in between every SCO, data must be sent to the server, undergo extensive processing and then be returned back to the client. In the SCORM Engine, all of this processing happens locally in the browser, eliminating a significant load on the server as the course is delivered. Typically the bulk of the server-side load happens when a course is launched as all of the required course data is retrieved from the database and sent to the browser. During course execution, incremental progress data is periodically sent to the server resulting in relative small hits to the server as this data is persisted to the database.

Stress Testing Results

In February of 2008, we conducted a performance test to get benchmark numbers reflecting the scalability of the SCORM Engine as represented by the number of concurrent users accessing the system. The intent of this test was to establish a benchmark of scalability on a simple representative system which can be used to roughly infer the performance of a more comprehensive system. As mentioned above, there are a number of variables that contribute to the scalability of a production system, any one of which can create a bottleneck or stress a system. We highly recommend adequate stress testing in a mirrored environment prior to deployment.

Methodology

To simulate user activity within the SCORM Engine, we began by selecting four diverse courses to use in our testing. The courses included:

We then captured the client-server HTTP interactions of a typical user progressing through each course. This data was massaged into a script that would accurately simulate many users hitting the system and updating their own individual training records.

Our test was set up on a dedicated server farm consisting of a single central LMS server and two clients from which the user requests were made using The Grinder load testing software. The LMS server has the following specifications:

Processor: Intel Pentium D 3.00 GHz

RAM: 2 GB

Disk: 130 GB

Operating System: Windows Server 2003 Enterprise Edition, Service Pack 1

Web Server: IIS v6.0 with ASP.NET 1.1.4322

Database: SQL Server 2005

SCORM Engine: Alpha version of 2008.1, configured to persist data every 10 seconds and rollup minimal data to an external system

The two client machines have similar specifications. If you’re not a numbers person, you can think of it this way, these were the cheapest servers we could buy from Dell in the summer of 2007, with Microsoft software typical of the day. All machines were directly connected to one another on a gigabit switch.

Simulating concurrent users proved to be trickier than expected due to the need to stagger the start of each user simulated user’s progress through the course. Our solution was to start the desired number of users at randomly spaced intervals over a period of 20 minutes. Since some users would complete their course in less than 20 minutes, each user was set to start the course again after completing it. After allowing 20 minutes to get up to full load, we measured system performance over the course of 10 minutes to get an accurate feel for how the system performed under load.

During that 10 minute period, we monitored the following metrics:

Note that we did not monitor bandwidth utilization. The reason for this decision is that typically the bandwidth consumed by the SCORM Engine pales in comparison to the bandwidth used by the actual training material. Thus we did not think bandwidth relevant to a discussion on the scalability of the SCORM Engine; however it could play a significant role in the scalability of a production LMS system.

Results

Our intent was to run these tests and continually increment the number of concurrent users until either a resource was constrained or the average server response time exceeded one second. Both events seemed to happen around the same time at about 1000 concurrent users.

image alt text

As you can see in the results above, processor utilization seems to be the constraining resource in this system configuration. There is a linear relationship to processor utilization and the number of concurrent users until the processor utilization is maxed out at around 90%. RAM utilization increases only slightly with load. Failure begins to occur as the processor becomes overwhelmed and HTTP requests begin to get stacked up in a queue waiting for the processor to become available.

We also analyzed the server load as users progress through a course. The logarithmic trend line in the graph below clearly shows the initial front end load (seen by the spike in the first request) followed by a relatively steady load as the course progresses.

image alt text

Conclusions

A single server of modest horsepower can handle a concurrent user load of approximately 1000 users. Making some assumptions, we can get a rough idea of how many total system users this represents. Assume that a user will take a SCORM course once a week (probably an optimistic assumption). Assume that each SCORM course lasts one hour and that all training is evenly distributed during a 12 hour window each day. That means that each system user consumes one hour out of 60 available every week (assuming a 5 day week). If 1000 users can access the server at any given moment, we roughly have 60,000 available hours. Since each user consumes roughly one hour, theoretically this server could support an LMS with 60,000 registered users. Obviously these calculations are rough and don’t allow for spikes in usage, but they at least provide an estimate from which to begin.

Update - July 2009

In version 2009.1 of the SCORM Engine we made a change to significantly improve scalability. Specifically, we removed the UpdateRunTimeFromXML stored procedure. This stored procedure handled the updating of all run-time progress data in one large database call. This increases the efficiency of each run-time update by reducing the number of individual database calls. Under light load, this procedure is rather efficient. Under very heavy load, this procedure was found to cause resource contention, leading to slower performance and even deadlocks. What was designed as a performance optimization actually turned into a performance bottleneck, thus we have removed this stored procedure from the SCORM Engine. This change can usually be retrofitted into prior versions of the SCORM Engine by making a simple configuration change. Please contact us if you would like help changing your system.

SCORM Engine Settings

The SCORM Engine contains a number of configuration settings. These settings contain logistical information about how the SCORM Engine is deployed and they control how the SCORM Engine behaves. The SCORM Engine settings do not need to be changed frequently. They are typically only accessed during integration with another system and during deployment to new servers. If non-static values for any of these settings are needed, their values can be altered through the integration layer instead of being statically stored in the configuration file. The settings control the operation of Engine.

Working with the SCORM Engine Settings

The method for accessing and changing the SCORM Engine settings varies depending on the platform you are running (.NET or Java).

.NET

In a .NET installation of the SCORM Engine, the settings are contained in a file called "SCORMEngineSettings.config". This file is located at the root of the SCORM Engine installation, in the "ScormEngineInterface" directory.

image alt text

The "ScormEngineSettings.config" file is a standard ASP.Net Configuration file. It is included by reference in the "web.config" file in the ScormEngineInterface directory. The settings for Engine can be stored in any valid and accessible ASP.Net configuration location.

image alt text

The "ScormEngineSettings.config" file is a standard XML file that can be edited in any text editor or XML editor.

image alt text

Alternatively, recent version of IIS include an "Edit Cofiguration" button on the ASP.NET tab of the applications properties. This button brings up a GUI for editing application settings individually.

image alt text

IIS doesn't automatically detect changes made to the "ScormEngineSettings.config" file. In order to get the changes you make to be detected by IIS, you need to either: restart IIS or make a small change to your "web.config" file (in the ScormEngineInterface directory) and resave them. IIS will pick up a change to the web.config file automatically. An easy way to get the changes picked up is to open the "web.config" file, type a character, delete the character and then re-save.

Java

In a Java installation of the SCORM Engine, the settings are contained in a file called "SCORMEngineSettings.properties". This file should be deployed to a location in the web applications' class path.

image alt text

The "SCORMEngineSettings.properties" file is a standard Java configuration file. This file is a standard XML file that can be edited in any text editor or XML editor.

image alt text

Depending on your Java Application Server, you may need to cycle the application in order for configuration changes to be picked up.

Settings Groups

The SCORM Engine settings can be broken up into eight groups:

  1. Integration class

  2. Data persistence

  3. URLs

  4. Upload import control

  5. Registration instance and package versioning

  6. Optional SCORM Engine features

  7. Debug settings

  8. Central / remote architecture

Integration Class

These two settings determine which class the integration factory will load. This class should be the concrete implementation of the integration interface that is designed to work with the current LMS (the integration layer).

LogicIntegrationAssemblyName - The .NET assembly in which the integration class resides. The assembly name is the name of the DLL containing the code and often corresponds to the namespace of the class in which the integration class resides. This setting is not required for Java.

Example: "RusticiSoftware.ScormEngine.VanillaIntegration"

LogicIntegrationClassName - The fully qualified name of the actual integration class to load. Usually, this is the assembly name concatenated with with the class name.

Example: "RusticiSoftware.ScormEngine.VanillaIntegration.VanillaIntegration"

Data Persistence

The data persistence settings control how the SCORM Engine accesses the database.

DataPersistenceEngine - The SCORM Engine supports many different data persistence options. This setting controls which of the supported options the SCORM Engine will use. The options are listed in the table below.

Value Description
"compactsqlserver" Connect to a Microsoft SQL Server CE database. (.NET Only)
"db2" Connect to a IBM DB2 database. (.NET Only)
"db2_zos" Connect to a IBM DB2 for z/OS (Mainframe). (.NET Only)
"mysql" Connect to a MySQL database.
"odbc" Connect to any database that supports an ODBC interface. (.NET Only)
"oracle" Connect to an Oracle database
"oracle-not_optimized" Connect to an Oracle database without using the bulk persistence stored procedure. [DEPRECATED in v2009.1 - use the "oracle" setting instead]
"ole" Connect to any database that supports an OLE interface. (.NET Only)
"plugin" Use a custom devloped data persistence mechanism.
"sqlite" Connect to a SQLite database. (.NET Only)
"sqlserver" Connect to a Microsoft SQL Server database.
"sqlserver-not_optimized" Connect to a Microsoft SQL Server database without using the bulk persistence stored procedure. [DEPRECATED in v2009.1 - use the "sqlserver" setting instead]

DatabaseConnectionString - The connection string that the SCORM Engine will use to connect to the database. The value for this setting varied based on the platform you are running.

In .NET, the value is an actual connection string. The format of the connection string will vary depending on the data persistence engine selected. Some examples of connection strings on various platforms are included in the table below.

Data Persistence Engine Example .NET Connection String
SQL Server "server=localhost;uid=sa;pwd=password;database=ScormEngine"
MySQL "Host=localhost:3006;UserName=root;Password=password;Database=ScormEngine;"
Oracle "Data Source=oracledb.local;User Id=ScormEngine;Password=password;Integrated Security=no"
IBM DB2 "Provider=IBMDADB2;Data Source=ScormEngine;UID=ScormEngineUser;PWD=password"

In Java installations, this parameter is optional. If not value is provided, the SCORM Engine will use a pre-defined data source named "jdbc/ScormEngine". If you would like the SCORM Engine to use another named data source, simply include it's name as the value of this setting.

Advanced Data Persistence Settings

These settings are all optional and are only used used in advanced scenarios to accomodate varied data persistence options. The data persistence engine setting is essentially a shortcut to specify various combinations of pre-define data peristence classes and should be used instead of these settings unless an uncommon scenario is encountered.

DataPersistenceAssemblyName (optional) - When using the "plugin" data persistence engine, this settings specifies the name of the assembly from which to load the data persistence plug-in class. This setting is not required for Java.

Example: "RusticiSoftware.ScormContentPlayer.Logic"

DataPersistencePersistClassName (optional) - When using the "plugin" data persistence engine, this setting specifies the name of the class within the DataPersistenceAssembly that handles persisting data to the database. This class contains the actual SQL (or other commands) for manipluating SCORM Engine data within the database.

Example: "RusticiSoftware.ScormContentPlayer.Logic.SqlPersistImplementation"

DataPersistenceRetrieveClassName (optional)- When using the "plugin" data persistence engine, this setting specifies the name of the class within the DataPersistenceAssembly that handles retrieving data from the database. This class contains the actual SQL (or other commands) for manipluating SCORM Engine data within the database.

Example: "RusticiSoftware.ScormContentPlayer.Logic.SqlRetrieveImplementation"

DataHelperAssemblyName (optional)- When using the "plugin" data persistence engine, this settings specifies the name of the assembly from which to load the data helper plug-in class. This setting is not required for Java.

Example: "RusticiSoftware.ScormContentPlayer.DataHelp"

DataHelperClassName (optional) - When using the "plugin" data persistence engine, this setting specifies the name of the class within the DataHelperAssembly that handles connecting to and interacting with the database. This class contains generic helper functions that abstract the process of connecting to an querying a specific database.

Example: "RusticiSoftware.ScormContentPlayer.DataHelp.JdbcDataHelper"

DataPersistenceUseStoredProcsIfAvailable (optional, default="true") - This setting modifies the behavior of the SQL Server and Oracle data persistence engines to use stored procedures or regular SQL when performing some functions. In general, this setting should not be modified. Possible values: "true" or "false".

UseGuidAsObjectId - This setting allows the SCORM Engine to toggle between using integers and GUIDs as primary keys in its tables. Possible values: "true" or "false".

DBMaxStringLength - This optional setting sets the maximum string length to allow through to be persisted in the database. This applies to all strings passed to the database, including text fields.

DatabaseTimeout - Value used by the default integration implementation specifying the timeout threshold for database operations. In seconds.

DatabaseSchema - String value used by the default integration implementation specifying the schema name that should be prepended to table names.

URLs

The URLs specified in the SCORM Engine settings contain information about where the SCORM Engine was deployed and where it should make requests to. These settings allow for a lot of flexibility in how the SCORM Engine is deployed, in most situations however, they will all point to the single directory in which the SCORM Engine is deployed.

Unless otherwise specified, the URLs can either be fully qualified (ex: "http://www.mylmsserver.com/ScormEngine/pagename.aspx") or, relative to the root of the web server on which the SCORM Engine is deployed (ex: "/ScormEngine/pagename.aspx").

Note: For simplicity, the file extension has been omitted from the page names included below. The file extension will either be ".aspx" for .NET deployments or ".jsp" for Java deployments.

Note: As of v2009.1 of the SCORM Engine, URLs that specify a directory have the option of including or not including the trailing slash ("/").

ScormEngineUrl - When doing a basic installation of the SCORM Engine, this is the only URL setting that must be included. It is simple a URL to the root location of the SCORM Engine on the web server. If this setting is used, the rest of the URL settings can be omitted.

Example: "/ScormEngineInterface"

ScormEngineFilesystemRoot - When using the optional offline/mobile SCORM Engine add-on you will need to define this location.

Example: "c:\inetpub\wwwroot\scormengine"

RemoteRequestProcessorUrl - URL to the "ProcessAiccRequest" file. This URL should be in the same domain that content is launched in. In a standard deployment, this setting should contain the same value as the "CentralAiccRequestProcesorUrl" setting, or it can be omitted. In a cross domain, central/remote deployment, this setting should point to the "ProcessAiccRequest" page in the SCORM Engine instance deployed to the content server. The URL should either be fully qualified, or relative to the location from which the content is lanched.

Example: "/ScormEngineInterface/ProcessAiccRequest.aspx"

CentralAiccRequestProcessorUrl - URL to the "ProcessAiccRequest" file. This URL should be in the same domain that LMS resides in. In a standard deployment, this setting should contain the same value as the "RemoteAiccRequestProcesorUrl" setting. In a cross domain, central/remote deployment, this setting should point to the "ProcessAiccRequest" page in the SCORM Engine instance deployed to the LMS server and the URL should be fully qualified.

Example: "/ScormEngineInterface/ProcessAiccRequest.aspx"

ScormResultProcessorUrl - URL to the "RecordResults" file. This URL should be in the same domain that the content resides in.

Example: "/ScormEngineInterface/RecordResults.aspx"

CentralWebServiceUrl - URL to the "RuntimeDataExchange.asmx" file. This setting is only needed for cross domain, central/remote deployments. This URL should be an fully qualified URL to the "RuntimeDataExchange.asmx" file on LMS server. Currently this functionality is only available in the .NET implementation of the SCORM Engine.

Example: "http://www.lmsserver.com/ScormEngineInterface/RuntimeDataExchange.asmx"

ImportWebServiceUrl - URL to the "ImportService.asmx" file. This setting only applies to deployments using the SCORM Engine's import controls on a server other than the LMS server. This URL should be an fully qualified URL to the "RuntimeDataExchange.asmx" file on LMS server. Currently this functionality is only available in the .NET implementation of the SCORM Engine.

Example: "http://www.lmsserver.com/ScormEngineInterface/ImportService.asmx"

UrlToCentralLaunchPage - URL to the "defaultui/launch" page. This setting no longer used by Engine by default. When creating a custom skin for Engine during integration, it may be helpful to change this setting to point to the launch page in the directory containing your skin (vs the "defaultui" directory) in order to test the functionality of your skin.

Example: "/ScormEngineInterface/defaultui/launch.aspx"

RemoteLaunchPageUrl - URL to the directory containing the "deliver" page. This directory can vary when using custom skins of the SCORM Engine. When using a cross domain, central/remote deployment, this setting should be a fully qualified URL pointing to the server from which the content will be served.

Example: "/ScormEngineInterface/defaultui/"

ScormEngineScriptsUrl - URL to the directory containing the "launch" page. This directory can vary when using custom skins of the SCORM Engine. When using a cross domain, central/remote deployment, this setting should be a fully qualified URL pointing to the server from which the content will be served.

Example: "/ScormEngineInterface/scripts"

RedirectOnExitUrl - URL to which the SCORM Engine should redirect the user after the user exits the SCORM Engine. This URL should point to a location in the host LMS.

Example: "/ScormEngineInterface/tools/console/"


StylesheetUrl - URL to the stylesheet used by the current SCORM Engine skin.

Example: "/ScormEngineInterface/defaultui/defaultstyles.css"

UrlToLaunchHistoryControlResources - URL to the directory that must be deployed with the launch history report web control. This directory contains the resources the user interface of the launch history report needs to display properly. Only applicable to applications using the launch history report web control.

Example: "/ScormEngineInterface/scripts/EngineUtils/LaunchHistoryControlResources"

EngineUtilsHelperUrl - URL to the "EngineUtilsHelper" aspx or jsp (depending on your platform) that is used for displaying, Properties Editor, the Registration Report, and other ajax-enabled functionalites. This URL is optional and is only necessary if your EngineUtilsHelper file is not in the folder represented by the "ScormEngineUrl" setting.

Example: "/ScormEngineInterface/EngineUtilsHelper.aspx"

Upload Import Control

These settings are used by the web control that provides an interface for uploading content and importing it into the SCORM Engine. If this web control is not used by the LMS integrated with the SCORM Engine, then these settings are not required.

WebPathToContentroot - HTTP path to the directory in which uploaded courses should be stored. This directory should map to the directory specified in "FilePathToContentRoot".

Example: "/courses/"

FilePathToContentRoot - File path to the directory in which uploaded courses should be stored. This directory should contain the files served by the path specified in "WebPathToContentroot". Individual courses will be placed in subdirectories within this directory.

Example: "C:\inetpub\wwwroot\courses"

FilePathToUploadedZippedPackage - Courses are uploaded as zip files. This setting specifies a temporary directory that zipped courses are uploaded to prior to their extraction into the directory specified in "FilePathToContentRoot". After extraction, zip files are deleted from this directory.

Example: "C:\inetpub\wwwroot\courses\uploads"

UrlToUploadResources - URL to the "UploadImportControl" directory that must be deployed with the upload import web control. This directory contains resources the user interface of the upload control needs to function properly.

Example: "/ScormEngineInterface/scripts/EngineUtils/UploadImportControl/"

UrlToLetsiRtwsEndpoint - URL to the LETSI RTWS endpoint which will be appended in an initial browser request for a LETSI RTWS enabled package as the LETSI_RTWS_URL. Only necessary if using the RTWS functionality.

Registration Instance and Package Versioning

These settings control how and when a new versions of packages and registrations are created. A version of a registration is called an "instance".

CreateRegistrationIfNeeded - When the SCORM Engine is launched with an external registration id that does not already exist, this setting controls whether a new registration is created for that id (setting="true") or if an error is thrown (setting="false"). This setting should be set to "false" only when SCORM Engine registrations are pre-created by the LMS via SCORM Engine API calls. Possible values: "true" or "false".

WhenToRestartRegistration - Controls the logic that is used to determine if a new instance of a registration should be created on launch.

<table>
  <tr>
    <td>Setting Value</td>
    <td>Behavior</td>
  </tr>
  <tr>
    <td>"1"</td>
    <td>Never create new registration instances. Always relaunch the registration using the existing set of tracking data.</td>
  </tr>
  <tr>
    <td>"2"</td>
    <td>Create a new registration instance if there is a newer version of the package being delivered and the current registration instance is completed.</td>
  </tr>
  <tr>
    <td>"3"</td>
    <td>Create a new registration instance whenever there is a newer version of the package being delivered.</td>
  </tr>
  <tr>
    <td>"4"</td>
    <td>Create a new registration instance whenever the user launches a registration that has previously been completed.</td>
  </tr>
  <tr>
    <td>"5"</td>
    <td>Create a new registration instance whenever the user launches a registration that has previously been satisfied.</td>
  </tr>
  <tr>
    <td>"6"</td>
    <td>Create a new registration instance if there is a newer version of the package being delivered and the current registration instance is satisfied.</td>
  </tr>
</table>

IsPackageVersioningEnabled -When the SCORM Engine's import routines are called with an external package id that already exists, this setting controls whether a new package version is created or whether an error is thrown. Possible values: "true" (create new package versions) or "false" (throw an error).

SystemHomepageUrl - Get the absolute URL of the cannonical, permanant, homepage for this system. Ideally this really is the homepage a user would use to access the system, but this must be cannonical and permanant, that is: it is a single URL the system can be identified by. Used by Tin Can when creating Actors from users in the system.

Optional SCORM Engine Features

These settings control the behavior of some optional SCORM Engine features that might not apply to all installations.

2004Enabled - Tells the SCORM Engine whether this installation has the capability to deliver SCORM 2004 content. This setting does not actually affect the SCORM Engine's ability to deliver SCORM 2004 content, instead it just tells the SCORM Engine whether or not to issue a warning message when the user attempts to import SCORM 2004 content. Possible values: "true" (SCORM 2004 support is enabled) or "false" (SCORM 2004 support is not enabled).

SSPEnabled- Tells the SCORM Engine whether this installation has the capability to deliver SSP content. This setting does not actually affect the SCORM Engine's ability to deliver SSP content, instead it just tells the SCORM Engine whether or not to issue a warning message when the user attempts to import SSP content. Possible values: "true" (SSP support is enabled) or "false" (SSP support is not enabled).

SSPSizeAllocation - When using SSP, this setting determines the maximum amount of storage that a given course can request for a given registration. This setting is an integer that specifies a number of bytes.

Example: "1048576" (corresponds to 1 MB of storage)

UseCompressedJavascript - The SCORM Engine sends a lot of JavaScript code to the user's browser to implement all of the required SCORM functionality. To speed up the loading process, by default, this code is compressed and consolidated. This setting controls whether the compressed version of the code is delivered to the browser (the best setting for production environments) or whether the raw, uncompressed code is delivered to the browser (useful for development and debugging). Possible values: "true" (deliver compressed code) or "false" (deliver raw code)

AiccSessionIdExternalConfigExclusions - If the AICC Url, with SID included, is too long, this parameter can be used to exclude non-essential external configuration parameters from serialization.

AiccUseLegacySidFormatForExistingRegs - The SCORM Engine is now using GUIDs for the AICC session ID (backed by the ScormAiccSession table). However, for continuity, we need existing registrations to continue to use the long tilde-delimited format. This parameter provides the ability to override that logic and force even existing registrations to use the GUID format.

EnableExternalIdEncryption - Value that determines if external IDs should be encrypted by default.

IntegrationEncryptionPassword - String used to generate the encryption key for securing URLs passed between the web services integration and the SCORM Engine. This should be set to a long random string.

SMTP_Host - Host name of the SMTP server used for email functionality. Used by the PENS system.

SMTP_Port - Port number of the SMTP server used for email functionality. Used by the PENS system.

SMTP_User - User name used for authentication of the SMTP server used for email functionality. Used by the PENS system.

SMTP_Password - User password used for authentication of the SMTP server used for email functionality. Used by the PENS system.

SMTP_UseSecureConnection - Whether to use a secure connection when communicating with the SMTP server used for email functionality. Used by the PENS system.

Pens_Mail_Receipt_From - The address that the PENS email receipts will be from.

Pens_Mail_Alert_From - The address that the PENS email alerts will be from.

Pens_Process_Sync - Whether PENS request should be processed synchronously (recommended for troubleshooting only).

Pens_ByPass_SSL_Validation - If set to true, PENS will ignore SSL certificate validation failures. Recommended for testing purposes only.

RtwsSessionTimeoutHours - Timeout of LETSI RTWS session in hours. RTWS servers may leave sessions enables indefinitely and should leave them enabled for at least 24 hours.

TinCanRootAccount - ​ This is a colon-delimited name and password like "admin:mypass" which can be used to authenticate against the TCAPI with administrator rights. This parameter is required to use the built-in console's Tin Can statement viewer.

ConsolePassword - Password to gain access to the /tools/console/ page which contains some SCORM Engine diagnostic tools and hooks to the Tin Can Statement viewer.

Debug Settings

These settings control the amount of debugging information that is recorded by the SCORM Engine. There isn't much of a performance penalty for recording this information, so we recommend that these settings typically be left at their default values to assist with troubleshooting. In this context, "audit" means recording basic debug information about what happend and when. "Detailed" means recording the precise details of how each action was executed. In order for the "detailed" information to be properly recorded, the "audit" level information must also be captured.

KeepAuditLog - Determines whether server-side debug information is captured at the audit level. This log tracks which server-side pages where requested and when. Possible values: "true" (record information) or "false" (don't record information).

KeepDetailLog - Determines whether server-side debug information is captured at the detailed level. This log tracks the execution of server-side pages. Possible values: "true" (record information) or "false" (don't record information).

KeepSoapLog - When used a cross domain, central/remote architecture, this setting determines if the exact contents of SOAP web services calls between the central and remote instances are logged. Possible values: "true" (record information") or "false" (don't record information).

DebugControlAudit - Determines whether client-side information about the overall execution of the SCORM Engine is recorded at the audit level. "Control" information tracks what was launched when as well as the communication with the server. Possible values: "true" (record information) or "false" (don't record information).

DebugControlDetailed - Determines whether client-side information about the overall execution of the SCORM Engine is recorded at the detailed level. Possible values: "true" (record information) or "false" (don't record information).

DebugRteAudit - Determines whether SCORM runtime calls from SCOs are logged are recorded to the client-side debug log at the audit level. Possible values: "true" (record information) or "false" (don't record information).

DebugRteDetailed- Determines whether SCORM runtime calls from SCOs are logged are recorded to the client-side debug log at the detailed level. Possible values: "true" (record information) or "false" (don't record information).

DebugSequencingAudit - Determines whether the execution of the SCORM sequencing logic is recorded to the client-side debug log as the audit level. Possible values: "true" (record information) or "false" (don't record information).

DebugSequencingDetailed - Determines whether the execution of the SCORM sequencing logic is recorded to the client-side debug log as the detailed level. Possible values: "true" (record information) or "false" (don't record information).

DebugSequencingSimple - Determines whether the execution of the SCORM sequencing logic is recorded to the client-side debug log in the "simple" format when available. Possible values: "true" (record information) or "false" (don't record information). When true and enabled, this setting will disable DebugSequencingAudit and DebugSequencingDetailed.

DebugLookAheadAudit - The SCORM Engine executes "look ahead" runs of the SCORM sequencer whenever pertinent data is changed in order to determine whether or not to enable/disable/show/hide the various navigational controls available to the user. This setting determines if these executions are recorded to the client-side debug log at the audit level. Possible values: "true" (record information) or "false" (don't record information).

DebugLookAheadDetailed - Determines whether the execution of the look ahead SCORM sequencing is recorded to the client-side debug log as the detailed level. Possible values: "true" (record information) or "false" (don't record information).

DebugIncludeTimestamps -Determines whether or not the client-side debug logs should include time stamps indicating when audit-level events occur. Possible values: "true" (record time stamps) or "false" (don't record time stamps).

Logging - Both the .Net and Java implementations of the SCORM Engine include the capability to integrate with a server-side logging framework. The SCORM Engine uses Apache's log4net and log4j to store rolling logs of server-side activity on the file system. These logging systems have many settings that are stored in the web.config file in .Net and the log4j.properties file in Java. Refer to the appropriate logging system's website for information on configuring these systems. (Note that to use the log4net system, the "NETWORK SERVICE" user will need to have read/write permissions to the logging directory.)

Central / Remote Architecture

These settings apply to the use of the cross domain, central/remote architecture.

UseCrossDomainWebServices - Determines whether or not the cross domain, central/remote architecture is in use. If this setting is set to "true", requests to persist data will be forwarded to the location specified in the URLs specified in the CentralAiccRequestProcessorUrl and CentralWebServiceUrl settings. If this setting is set to "false", requests will be directly processed. Possible values: "true" or "false".

WebServiceRetries - If using web services, this setting determines the maximum number of times the remote instance will attempt to contact the central instance in the event of an error. Once the maximum number of retries has been reached, the remote instance will assume that communiation with the central instance has been lost and notify the user that an error has occured. This value is specified as an integer.

Example: "3"

WebServiceRetryInterval - If the remote instance needs to retry its communication with the central instance, this setting determines how long the remote instance will wait before resending the request. This value is specified in milliseconds. When using a central/remote architecture, the maximum time that could be spent retrying requests (calculated as WebServicesRetries * WebServiceRetryInterval) should be significnatly less than the default CommCommitFrequecy package property to prevent the remote server from being overloaded in the event of a failure of the central server. This maximum time value also needs to be less than the ASP.NET / JSP page timeout value.

Example: "5000" (corresponds to 5 seconds)

UseImportWebServices - Determines whether or not import controls should use web services to invoke import on a central server. Possible values: "true" or "false"

Package Properties

Property Name Description Data Type Applies to AICC Applies to SCORM 1.1 Applies to SCORM 1.2 Applies to SCORM 2004 2nd Edition Applies to SCORM 2004 3rd Edition Applies to SCORM 2004 4th Edition XML Path (Xpath) Database Column Name
Show Finish Button "This element determines if the SCORM Player should display the “Return to LMS” button to the learner. If the “Show Navigation Bar” parameter is “no” then this element has no effect. " Yes/No X X X X X X //HSTMConfiguration/controls/showFinishButton show_finish_button
Show Help "This element determines if the SCORM Player should display the help button to the learner. If the “Show Navigation Bar” parameter is “no” then this element has no effect. " Yes/No X X X X X X //HSTMConfiguration/controls/showHelp show_help
Show Progress Bar "This element determines if the SCORM Player should display the progress bar to the learner. If the “Show Navigation Bar” parameter is “no” then this element has no effect. " Yes/No X //HSTMConfiguration/controls/showProgressBar show_progress_bar
Use Measure Progress Bar "This element determines if the progress bar is generated from the root activity’s rolled up progress measure or if it is derived from the number of SCOs that have been completed. This only has effect in SCORM 2004 4th edition and later courses (where progress measure is rolled up) and when Show Progress Bar is set to ""yes""." Yes/No X //HSTMConfiguration/controls/useMeasureProgressBar use_measure_progress_bar
Show Course Structure This element determines if the SCORM Player should make the course structure available to the learner. Yes/No X X X X X X //HSTMConfiguration/controls/showCourseStructure show_course_structure
Course Structure Starts Open "If the course structure is available to the learner this element determines if the SCORM Player should begin with the course structure shown or hidden. The user can always show/hide the course structure if it is available. If the Show Course Structure parameter is “no” this element has no effect. " Yes/No X X X X X X //HSTMConfiguration/controls/courseStructureStartsOpen course_structure_starts_open
Show Navigation Bar This element determines if the SCORM Player should make the navigation bar available to the learner. Yes/No X X X X X X //HSTMConfiguration/controls/showNavBar show_nav_bar
Show Title Bar This element determines if the SCORM Player should make the title bar available to the learner. Yes/No X X X X X X //HSTMConfiguration/controls/showTitleBar show_titlebar
Enable Previous/Next "This element determines if the SCORM Player should display the previous and next buttons to the learner. If the “Show Navigation Bar” parameter is “no” then this element has no effect. " Yes/No X X X //HSTMConfiguration/controls/enableFlowNav enable_flow_nav
Enable Choice Navigation "This element determines if the SCORM Player will allow the learner to navigate a course by clicking on links in the course structure. If the Show Course Structure parameter is “no” this element has no effect. " Yes/No X X X //HSTMConfiguration/controls/enableChoiceNav enable_choice_nav
Structure Status Display This element defines how icons are displayed to indicate success and completion status. Status Display Type X X X X X X //HSTMConfiguration/controls/statusDisplay status_display
Show Close SCO Button "This element determines if the SCORM Player should display the “Close Item” button to the learner. If the “Show Navigation Bar” parameter is “no” then this element has no effect. " Yes/No X X X X X X //HSTMConfiguration/controls/showCloseItem show_close_item
Disable Root Activity "This element disables the root activity from being selectable thus preventing learner from being able to reset attempt data for the entire course." Yes/No X X X X X X //HSTMConfiguration/controls/forceDisabledRootChoice force_disable_root_choice
Width for content (desired) Represents the width (in pixels) the the content author would like to have available for the SCO. The SCORM Player will make a best effort to accommodate this setting based on the browser's capabilities. Positive Integer X X X X X X //HSTMConfiguration/appearance/displayStage/desired/width desired_width
Height for content (desired) Represents the height (in pixels) the the content author would like to have available for the SCO. The SCORM Player will make a best effort to accommodate this setting based on the browser's capabilities. Positive Integer X X X X X X //HSTMConfiguration/appearance/displayStage/desired/height desired_height
Full Screen (desired) "This element determines if the SCORM Player should launch the content using the full screen feature of the browser (when available). If this parameter is set to true the content MUST include an obvious method for the user to exit the content. " Yes/No X X X X X X //HSTMConfiguration/appearance/displayStage/desired/fullscreen desired_fullscreen
Width for contnt (required) Represents the width (in pixels) the the content must have to operate correctly. Use this setting with caution. Positive Integer X X X X X X //HSTMConfiguration/appearance/displayStage/required/width required_width
Height for content (required) Represents the width (in pixels) the the content must have to operate correctly. Use this setting with caution. Positive Integer X X X X X X //HSTMConfiguration/appearance/displayStage/required/height required_height
Full Screen (required) "This element determines if the SCORM Player should launch the content using the full screen feature of the browser (when available). If this parameter is set to true the content MUST include an obvious method for the user to exit the content. " Yes/No X X X X X X //HSTMConfiguration/appearance/displayStage/required/fullscreen required_fullscreen
Course Structure Width The width of the course structure in the SCORM Player. Positive Integer X X X X X X //HSTMConfiguration/appearance/courseStructureWidth course_structure_width
SCO Launch Type This element determines how the SCORM Player should launch individual SCOs (in a frameset or in a new window). Launch Type X X X X X X //HSTMConfiguration/behavior/launch/sco sco_launch_type
Player Launch Type This element determines how the SCORM Player itself should be launched by the LMS (in a frameset or in a new window). Launch Type X X X X X X //HSTMConfiguration/behavior/launch/player player_launch_type
Wrap SCO Window with API "When a SCO is launched in a new window some poorly implemented SCORM content can have trouble finding the SCORM API. This parameter will wrap an empty frameset around the SCO window which presents an API that relays calls back to the real SCORM Player API. " Yes/No X X X X X //HSTMConfiguration/behavior/launch/wrapScoWindowWithApi wrap_sco_window_with_api
Intermediate SCO Course Satisfied Normal Exit Action "These settings control what action the SCORM Player will take when a SCO exits. Some possible actions include going to the next SCO displaying a message and exiting the course (see description of the Exit Type data type for more detail). There are three factors the SCORM Player looks at when determining the action to take when a SCO exits the position of the SCO in the course (is it in the middle or is it the last SCO) the state of the SCO/Course (satisfied [completed or passed] or not satisfied [incomplete failed not initialized]) and the SCORM exit type specified by the SCO (suspend normal timeout logout). These parameters allow you to adjust the SCORM Player’s behavior in each of these possible scenarios. Note that these parameters only take affect when the content originates an exit action by calling LMSFinish before the user initiates an exit action by using a navigational control in the SCORM Player." Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/satisfied/normal int_sat_normal_action
Intermediate SCO Course Satisfied Suspend Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/satisfied/suspend int_sat_suspend_action
Intermediate SCO Course Satisfied Timeout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/satisfied/timeout int_sat_timeout_action
Intermediate SCO Course Satisfied Logout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/satisfied/logout int_sat_logout_action
Intermediate SCO Course Not Satisfied Normal Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/notSatisfied/normal int_not_normal_action
Intermediate SCO Course Not Satisfied Suspend Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/notSatisfied/suspend int_not_suspend_action
Intermediate SCO Course Not Satisfied Timeout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/notSatisfied/timeout int_not_timeout_action
Intermediate SCO Course Not Satisfied Logout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/intermediateSco/notSatisfied/logout int_not_logout_action
Final SCO Course Satisfied Normal Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/satisfied/normal final_sat_normal_action
Final SCO Course Satisfied Suspend Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/satisfied/suspend final_sat_suspend_action
Final SCO Course Satisfied Timeout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/satisfied/timeout final_sat_timeout_action
Final SCO Course Satisfied Logout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/satisfied/logout final_sat_logout_action
Final SCO Course Not Satisfied Normal Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/notSatisfied/normal final_not_normal_action
Final SCO Course Not Satisfied Suspend Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/notSatisfied/suspend final_not_suspend_action
Final SCO Course Not Satisfied Timeout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/notSatisfied/timeout final_not_timeout_action
Final SCO Course Not Satisfied Logout Exit Action see above Exit Type X X X //HSTMConfiguration/behavior/exitActions/finalSco/notSatisfied/logout final_not_logout_action
Disable Right Click "Determines if the SCORM Player should prevent the user from right-clicking in the SCORM Player windows. This setting can be useful for high-stakes assessments or other situations where you wish to prevent the user from looking at the internal structure of the content or data in the player. Note – this setting only affects the SCORM Player windows (the course structure title bar and nav bar) it does not affect your content. " Yes/No X X X X X X //HSTMConfiguration/behavior/disableRightClick prevent_right_click
Prevent Window Resize Determines if the SCORM Player window can be resized by the learner. Yes/No X X X X X X //HSTMConfiguration/behavior/preventWindowResize prevent_window_resize
Score Rollup Mode Determines how scores are rolled up to the course level. Score Rollup Type X X X //HSTMConfiguration/behavior/scoreRollupMode score_rollup_mode
Number of Scoring Objects "If the Score Rollup Mode is “fixed average” this parameter indicates how many SCOs should be reporting a score. " Positive Integer X X X //HSTMConfiguration/behavior/numberOfScoringObjects number_of_scoring_objects
Status Rollup Mode Determines how completion status is rolled up to the course level. Status Rollup Type X X X //HSTMConfiguration/behavior/statusRollupMode status_rollup_mode
Threshold Score For Completion "If the Status Rollup Mode is “complete when threshold score is met” this parameter indicates what the threshold score for completion is. This value is a decimal between 0-1 (multiply it by 100 to equate it to a percentage. " Decimal [0.00 - 1/.00] X X X //HSTMConfiguration/behavior/tresholdScoreForCompletion threshold_score_for_completion
Apply Rollup Status To Success Status "Indicates that the status rollup rules should also apply to the success status not just the completion status." Yes/No X X //HSTMConfiguration/behavior/applyRollupStatusToSuccess apply_status_to_success
First SCO is Pretest "This parameter indicates that if the first SCO achieves a lesson status of passed then the rest of the SCOs in the course will be marked complete. " Yes/No X X //HSTMConfiguration/behavior/firstScoIsPretest first_sco_is_pretest
Finish Causes Immediate Commit This parameter is provided to deal with a few single-SCO configurations which make it difficult to capture the exit effectively. You may want to try setting this to true if a single SCO course is not recording completions successfully. Yes/No X X X X X X //HSTMConfiguration/behavior/finishCausesImmediateCommit finish_causes_immediate_commit
Debug Control Audit Determines whether high-level logging should be done within the Control subsystem on the client. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/controlAudit debug_control_audit
Debug Control Detailed Determines whether detailed log messages from the Control subsystem should be recorded on the client Yes/No X X X X X X //HSTMConfiguration/behavior/debug/controlDetailed debug_control_detailed
Debug Runtime Audit Determines whether high-level logging should be done within the Runtime subsystem on the client. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/runtimeAudit debug_rte_audit
Debug Runtime Detailed Determines whether detailed log messages from the Control Runtime should be recorded on the client. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/runtimeDetailed debug_rte_detailed
Debug Sequencing Audit Determines whether high-level logging should be done within the Sequencing subsystem on the client. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/sequencingAudit debug_sequencing_audit
Debug Sequencing Detailed Determines whether detailed log messages from the Sequencing subsystem should be recorded on the client. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/sequencingDetailed debug_sequencing_detailed
Debug Show Simple Sequencing Logs "Determines whether sequencing message should be stored in the ""simple"" format instead of the more technical standard format." Yes/No X //HSTMConfiguration/behavior/debug/sequencingSimple debug_sequencing_simple
Debug Lookahead Audit Determines whether high-level logging should be done within the Sequencing-Lookahead subsystem on the client. Yes/No X X X //HSTMConfiguration/behavior/debug/lookaheadAudit debug_lookahead_audit
Debug Lookahead Detailed Determines whether detailed log messages from the Sequencing-Lookahead subsystem should be recorded on the client. Yes/No X X X //HSTMConfiguration/behavior/debug/lookaheadDetailed debug_lookahead_detailed
Debug Include Timestamps Determines whether timestamps should be recorded within the client-side log. Yes/No X X X X X X //HSTMConfiguration/behavior/debug/includeTimestamps debug_include_timestamps
Maximum Failed Attempts The maximum number of attempts to try a runtime data update to the central server before declaring failure. Positive Integer X X X X X //HSTMConfiguration/behavior/communications/maxFailedSubmissions comm_max_failed_submissions
Commit Frequency "How often in milliseconds to push runtime data updates back to the central server. (Note that some events cause immediate updates as well) " Positive Integer X X X X X //HSTMConfiguration/behavior/communications/commitFrequency comm_commit_frequency
Invalid Menu Item Action Determines how the SCORM Player should graphically represent menu items when their selection is invalid. Invalid Menu Item Action Type X X X X X X //HSTMConfiguration/behavior/invalidMenuItemAction invalid_menu_item_action
Always Flow To First Sco "If true the SCORM Engine will always load the first SCO in a course upon initial launch regardless of whether sequencing rules dictate this behavior. " Yes/No X X X X X //HSTMConfiguration/behavior/alwaysFlowToFirstSco always_flow_to_first_sco
Logout Causes Player Exit "When the cmi.exit data model element is set to “logout” this parameter determines whether the SCORM Engine returns to the LMS or simply closes the SCO. " Yes/No X X X //HSTMConfiguration/behavior/logoutCausesPlayerExit logout_causes_player_exit
Reset Run-time Data Timing Defines when to reset Runtime Data. Reset RunTimData Time Type X X X X X X //HSTMConfiguration/behavior/resetRtTiming reset_rt_timing
Mastery Score Overrides Lesson Status "If the mastery score indicates that a SCO is or is not complete but the lesson status indicates the opposite should the score override the status? " Yes/No X //HSTMConfiguration/behavior/scoreOverridesStatus score_overrides_status
Look-Ahead Sequencer Mode Enables/disables the lookahead sequencer. Look Ahead Sequencer Mode Type X X X X //HSTMConfiguration/behavior/lookaheadSequencerMode lookahead_sequencer_mode
Enable Validation of SCORM Interaction Results Determines whether the interaction responses are validated for expected SCORM format. Use this setting when you want to include descriptive text in addition to the single number/character allowed by SCORM 1.2. This affects both the user response and the correct response. Yes/No X X X X X //HSTMConfiguration/behavior/validateInteractionTypes validate_interaction_responses
Raw Score Can Act as Scaled Score "In SCORM 2004 content if a SCO sets a raw score but not a scaled score should the raw score count as the normative score for the SCO?" Yes/No X X X //HSTMConfiguration/behavior/scaleRawScore scale_raw_score
Rollup Empty Set To Unknown "In SCORM 2004 2nd Edition and 3rd Edition this setting will determine whether or not a cluster that has no children contributing to rollup should be marked as unknown or incomplete/not satisfied to resolve an ambigutiy in the specification." Yes/No X X //HSTMConfiguration/behavior/rollupEmptySetToUnknown rollup_empty_set_to_unknown
Use Quick Lookahead Sequencer "In Scorm 2004 4th edition content use the quick lookahead sequencer." Yes/No X //HSTMConfiguration/behavior/useQuickLookaheadSequencer use_quick_lookahead_seq
Rollup at SCO Unload Invokes rollup at the time of SCO unload for SCOs that do not follow the standard by calling Terminate. Yes/No X X X X X //HSTMConfiguration/behavior/rollupRuntimeAtScoUnload rollup_runtime_at_sco_unload
Override Objective and Completion Set By Content to True "Causes the engine to treat the course as if all SCOs have ""objectivesetbycontent"" and ""completionsetbycontent"" set to true." Yes/No X X X //HSTMConfiguration/behavior/forceObjectiveCompletionSetByContent force_obj_compl_set_by_content
Invoke Rollup At Suspend All Causes Rollup to occur when a Suspend All is initiated. Yes/No X X //HSTMConfiguration/behavior/invokeRollupAtSuspendAll invoke_rollup_at_suspendall
Completion Status of Failed Success Status Determines the completion status to return when the satisfaction is failed. Completion Status Type X X X //HSTMConfiguration/behavior/completionStatOfFailedSuccessStat compl_stat_of_failed_suc_stat
Satisfaction Causes Completion "Sets the completion status to ""completed"" when as activity is satisfied." Yes/No X X X //HSTMConfiguration/behavior/satisfiedCausesCompletion satisfied_causes_completion
Make Student Preferences Global to Course "When a student sets a learner preference tthis determines whether to make that setting global to all SCOs." Yes/No X X X X X //HSTMConfiguration/behavior/makeStudentPrefsGlobalToCourse student_prefs_global_to_course
Capture History Indicates that this course should record the learner's progress to make data available for the attempt history report. Yes/No X X X X X //HSTMConfiguration/behavior/captureHistory capture_history
Capture Detailed History Indicates that this course should record the learner's progress in detail to make data available for the attempt history report. Yes/No X X X X X //HSTMConfiguration/behavior/captureHistoryDetailed capture_history_detailed
Allow Complete Lesson Status To Change Determines if the lesson status marked complete in SCORM 1.2 can be changed again to something other then complete. Yes/No X X //HSTMConfiguration/behavior/allowCompleteStatusChange allow_complete_status_change
Time Limit "Given in minutes. If this is set to some positive number over zero a time limit for total time spent in the course will be enforced and the user will be automatically exited from the course after the time limit." Positive Integer X X X X X //HSTMConfiguration/behavior/timeLimit time_limit
IE Compatibility Mode "Determines which META tag if any should be used in the player to force a particular rendering mode for IE. Since content can be hosted within a SCORM Engien frameset the content itself inherits this rendering mode." IE Compatibity Mode X X X X X X //HSTMConfiguration/behavior/ieCompatibilityMode ie_compatibility_mode
Is Available Offline When using the optional offline/mobile player this option determines whether the package shows up in the catalog listing of offline packages Yes/No X X X X X //HSTMConfiguration/behavior/isAvailableOffline is_available_offline

Data Types

Yes/No

|The "yes/no” data type can have two values: “yes” represents the affirmative and “no” represents the negative. | yes= 1 no = 2 |


Positive Integer

The “positive integer” data type is a string that represents an integer greater than or equal to zero. | |


Launch Type

The “launch type” data type represents methods by which new windows can be launched. The possible values are: numbers 1 through 5


Exit Type

The “exit type” data type represents actions the SCORM Player can take after a SCO exits. The possible values are: numbers 1 through 5


Status Display Type

The “status display” data type represents the various ways in which the SCORM Player can display the status of SCOs to the user. The possible values are: numbers 1 through 5


Score Rollup Type

The score rollup data type represents the various ways in which the SCORM Player can rollup scores to the course level. The possible values are: numbers 1 through 6


Status Rollup Type

The status rollup data type represents the various ways in which the SCORM Player can rollup status to the course level. The possible values are: numbers 1-6


Invalid Menu Item Action Type

Represents the various ways to handle menu item options that are not valid


Reset Runtime Data Time Type

Represents when to reset runtime data


Lookahead Sequencer Mode Type

Represents the modes of the lookahead sequencer


Completion Status Type

Represents the completion status values


IE Compatiblity Mode

SCORM Engine Launch Parameters

When launching the SCORM Engine, there a several parameters that can be passed to it via the querystring. These parameters tell the SCORM Engine which course to load, how to track the learner's progress and how the course should behave.

Parameter Name Possible Values (should be URL encoded)
"configuration" A serialized external configuration object
"registration" A serialized external registration id
"package" A serialized external package id
"manifestDirPath" A valid file path or HTTP path
"webPath" A value HTTP path to a directory
"tracking" "true" or "false"
"forceReview" "true" or "false"
"regForCredit" "true" or "false"
"cc" CultureCode to choose a delivery language. (e.g., 'en', 'fr'. Note, this functionality is not turned on by default.)
"startSco" An Item Identifier that identifies a SCO in the manifest.

Configuration

The "configuration" parameter contains a serialized version of the specific integration's external configuration object. This parameter is always required to be present, but usually does not have to contain a value. The external configuration object is used to vary the behavior of the SCORM Engine in the integration layer. Passing in a string representation of this object at launch, will cause an instance of the specific integration's external configuration object to be instantiated and passed into the integration layer whenever an integration function is called.

Registration

The "registration" parameter contains a identifier that should be associated with the SCORM tracking information for this course launch. This is the "external registration id". The format of the registration parameter should be a serialized version of the specific integration's external registration id object. If the external registration id specified in this parameter does not already exist in the SCORM Engine, then by default a new registration will be created (although this behavior can vary based on the integration layer and the "CreateRegistrationIfNeeded" SCORM Engine setting). If the specified external registration id does exist, then that registration will be resumed and the tracking data from any previous attempts will be restored.

Package

The "package" parameter contains an external package id identifying a package that has already been imported into the SCORM Engine. If no "registration" parameter is passed in, then the package identified in this parameter will be launched in a preview mode with no tracking. If a "registration" parameter is passed in and a new registration needs to be created because the external registration id does not exist, then the package identified by this parameter will be associated with the newly created registration. If the "registration" parameter is passed in and there is an existing registration, then the "package" parameter is ignored.

Registration Parameter Package Parameter Action
Not Included Included Package is launched in preview mode
Included, no matching registration exists Included New registration is created with specified package
Included, matching registration does exist Included Existing registation is launched, package parameter is ignored. If the registration id does exist, the package parameter is not required.

ManifestDirPath and WebPath

The "manifestDirpath" and "webPath" parameters are used in conjunction with one another. They enable the SCORM Engine to launch a course that has not yet been imported. The course's manifest is parsed on the fly and the course is launched in a preview mode with no tracking. The "manifestDirPath" parameter should contain either a file path (accessible to the server on which SCORM Engine is deployed) or an HTTP location of the course's descriptor file (usually the imsmanifest.xml file). When launching a course that has not yet been imported, you also need to pass in the "webPath" parameter to tell the SCORM Engine where the course resides. The "webPath" parameter is an HTTP path to the root of the course (usually the directory where the manifest resides).

Tracking

The "tracking" parameter provides a way to launch a registration without saving any of the tracking data associated with the course. When the "tracking" parameter is provided set to "false", the SCORM Engine will still accept all of the SCORM data sent to it by the content, but it will only persist it for the duration of the session. When the learner exits the course, all of the new data is discarded and the original state is preserved. This mode is useful for allowing learner's to review content that has already been completed to ensure that the record of their completion is not overwritten. If not included, the default value for this paramter is "true".

ForceReview

When set to "true", the "forceReview" parameter ensures that the data model element for mode ("cmi.mode" or "cmi.core.lesson_mode") is always set to "review". This setting is often used in conjunction with the "tracking" setting to provide learners an opportunity to review a course after it has been completed. If not included, the default value for this paramter is "false".

RegForCredit

The "regForCredit" parameter is used when the SCORM Engine creates a new registration upon launch. If the "regForCredit" parameter is passed in and set to "false", the SCORM Engine will create a new regisration with the data model element for credit ("cmi.credit" or "cmi.core.credit") set to "no credit". This setting is useful for lanching courses that should be tracked but that don't "count" for anything. If not included, the default value for this paramter is "true".

CC

The "cc" parameter can be used by a client integration to force the delivery language to a particular culture code, e.g., 'en', 'fr', via the launch string. The following table lists the languages we support.

Language ISO 639-1 Code
Arabic ar
Chinese (simplified) zh-cn
Chinese (traditional) zh-tw
Danish da
Dutch nl
English en
Finnish fi
French fr
German de
Hungarian hu
Italian it
Japanese ja
Norwegian no
Portuguese pt
Russian ru
Spanish es
Swedish sv

StartSCO

If provided, this parameter identifies a SCO that the SCORM Engine should launch first. If not provided, the SCORM Engine will either launch the first SCO (for new registrations) or the SCO from which the learner suspended a previous attempt (for previously attempted registrations). Note that these default SCOs can be altered by SCORM 2004 sequencing rules in the content. The format of this parameter is a string representing the Item identifier associated with the SCO to be launched in the manifest. Note that if the manifest contains SCORM 2004 sequencing rules, it might not always be possible to launch the specified SCO (if for instance it's prerequisites are not met). In this case, the learner will be prompted with a message to make another selection.

Serializing and Encoding

All values must be properly escaped (or "URL Encoded") when they are included in the query string. It is important not to double encode the values. All common programming languages include a library function for properly escaping values to be placed in a querystring. For static values that do not change, it can be helpful to use a tool to perform the one time encoding.

When passing an external package id, external registration id or external configuration id to the SCORM Engine these objects must be represented in their serialized state. The number, type and name of the properties contained in each of these of these objects in unique to each integration. Often, there is just one property, in which case the serialized version of the object is just the value for that property. However, in cases where there is more than one property, the serialized form of the object is a series of name value pairs separated by delimiters. By default, the delimiter that is between the name and value is a pipe character ("|") and the delimiter between a set of names and values is an exclamation mark character ("!"). Note that these defaults will vary based on the version of the SCORM Engine and can be different for each integration.

For example, if an external registration id is composed of two fields, userName and courseId, then a serialized external registration id might look like this:

userName|joeuser!courseId|42That value indicates an external registration id with a value for userName of "joeuser" and a vale for courseId of "42". When passing the serialized value into the SCORM Engine, the entire serialized value needs to be URL Encoded. Note that "!" does not need to be escaped and that the escaped represenation of "|" is "%7c". Once escaped, the above example would look like:

userName%7cjoeuser!courseId%7c42Engine's console can simplify the process of creating serialized and escaped object values. When creating new registrations, Engine's console will display the proper launch URL. Since Engine is configured to use your specific integration, it is easy to simply copy and paste values into your code.

image alt text

Common Configurations

Launch a registration "normally"

Parameter Name Value to pass in
"configuration" A serialized external configuration object if used by your integration.
"registration" A serialized external registration id
"package" A serialized external package id
"manifestDirPath" Not included
"webPath" Not included
"tracking" Not included
"forceReview" Not included
"regForCredit" Not included

Launch a completed registration in review mode with no changes to the tracking data

Parameter Name Value to pass in
"configuration" A serialized external configuration object if used by your integration.
"registration" A serialized external registration id
"package" Not included
"manifestDirPath" Not included
"webPath" Not included
"tracking" "false"
"forceReview" "true"
"regForCredit" Not included

Launch an imported course in preview mode with no tracking

Parameter Name Value to pass in
"configuration" A serialized external configuration object if used by your integration.
"registration" Not included
"package" A serialized external package id
"manifestDirPath" Not included
"webPath" Not included
"tracking" Not included (only relevant if a registration is passed in)
"forceReview" Not included
"regForCredit" Not included

Launch a course that does not "count" for credit, but should still be tracked

Parameter Name Value to pass in
"configuration" A serialized external configuration object if used by your integration.
"registration" A serialized external registration id
"package" A serialized external package id
"manifestDirPath" Not included
"webPath" Not included
"tracking" Not included
"forceReview" Not included
"regForCredit" "false"

Launch a course directly from a manifest that has not yet been imported

Parameter Name Value to pass in
"configuration" A serialized external configuration object if used by your integration.
"registration" Not included
"package" Not included
"manifestDirPath" File path to manifest
"webPath" Web path to course directory
"tracking" Not included
"forceReview" Not included
"regForCredit" Not included

Mode and Credit

The SCORM runtime data model contains two elements that indicate the context in which a course was launched. This context is affected by the parameters that are passed into the SCORM Engine on launch. The "mode" data model element indicates that the course was launched either in a "normal", "review" or "browse" mode. The "credit" data model element indicates whether or not the course is being taken for credit.

Mode:

Credit:

Tin Can Recipes

Included Recipes

Video

The Video recipe scans for statements matching the proper category and aggregates the data from these statements to a queryable table. The data can be retrieved by a series of pre-defined queries and parameters via a REST API.

View Video Recipe API Docs

Result Summary

The Result Summary recipe scans all statements that contain result information (completion, score, etc...) and aggregates the data so it can be filterd by actor/learner or activity/object. The data can be retrieved by a series of pre-defined queries and parameters via a REST API.

View Result Summary Recipe API Docs

Interactions

The Interactions recipe scans all statements that contain interaction information (cmi.interaction activity type) and aggregates the data so it can be filterd by actor/learner or activity/object. The data can be retrieved by a series of pre-defined queries and parameters via a REST API.

View Interactions Recipe API Docs

Logging

A note to upgrading customers

Midway through 2013.2, logging in ScormEngine changed, and is still in the process of changing. Your old logging configuration settings in your ScormEngineSettings file will no longer have any effect; they have been replaced by platform specific configuration files (see below). In addition, use of the LogDetail, LogAudit, and LogError configuration methods are officially deprecated. The overrides will still function in 2014.1, but they will be removed by the next major release of SCORM Engine.

You are in no way compelled to use our logging framework for your own logging messages (e.g., in your integration layer), but you can use it if you want to. Example code will be given for each platform.

.NET

In .NET Scorm Engine, logging is handled exclusively through log4net, an open-source logging library bundled with SCORM Engine. A sensible default configuration for log4net is provided in our web.config templates, but this configuration can be edited or replaced at will. If the configuration is missing, SCORM Engine will still run, but nothing will be logged.

If you are not using our web.config templates and you wish to use log4net, you will need to add a few modifiecations to your web.config file. First, if you do not have a configSections tag already, you will need to add it as a child of the root configuration element. Then, under the configSections tag, you will need to add:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>

In addition, you will need to add a log4net element as a child of the root element. You can copy the example from our templates, or you can consult the log4net documentation.

The default log4net configuration included in our web.config templates will log only those messages with a log level of WARNING or higher. These messages will be written to a rolling log file under C:\\logs\scormengine-log.txt. They will also be written to the ASP.NET trace, with categories corresponding to their log level.

If you desire to use log4net for logging messages in your integration layer, you will need to add the following code:

  1. Add using log4net; to your integration layer's "using" declarations.
  2. Declare a static logger variable in your integration layer, e.g., private static readonly ILog Logger = LogManager.GetLogger(typeof(MyIntegrationLayer)).
  3. At any point in your integration layer where you would like to add logging, call the appropriate logging method (Debug, Info, Warn, Error, or Fatal) to add a logging message at that level. The following example logs calls to RollupRegistration: Logger.Info("RollupRegistration called").

For more information on using log4net, consult the log4net documentation.

Java

In Java ScormEngine, most logging is handled primarily through SLF4J, an open-source interface to several other logging libraries.

SLF4J can be used in combination with many other logging frameworks. In order to enable a particular framework, you must download the appropriate SLF4J adapter from [the SLF4J project website](http://www.slf4j.org/download.html and place it in the classpath for your web application. That said, SCORM Engine already ships with logback, an open-source logging library, and its SLF4J adapter so that logging will work "right out of the box."

We also ship with a default logback configuration file, which is deployed when the WAR is deployed. The file, logback.xml, is located in the WEB-INF/classes directory of your deployed application. That said, we do not recommend you edit this configuration, lest your changes get overwritten when you upgrade Engine. Instead, we recommend you take advantage of the fact that logback.xml is logback's last choice for a configuration file. If you place a logback.groovy or logback-test.xml file in your web application classpath, logback will load that configuration instead. For more information on logback's configuration file format, see the tutorial on the logback project website.

There is unfortunately some legacy code that still uses the built-in java.util.logging library; these messages can be configured in whichever way they are usually configured for your application (e.g., the logging.properties file for Tomcat). These logging usages are scheduled for removal in the next major release of SCORM Engine.

If you desire to use SLF4J/logback for your own integration layer, you will need to add the following code:

  1. Add the following two import statements at the top of your integration layer: import org.slf4j.Logger;, and import org.slf4j.LoggerFactory;.
  2. Declare a static logger variable in your integration layer, e.g., private static final Logger _logger = LoggerFactory.getLogger("com.example.ExampleIntegration");
  3. At any point in your integration layer where you would like to add logging, call the appropriate logging method (trace, debug, info, warn, or error) to add a logging message at that level. The following example logs calls to RollupRegistration: _logger.info("RollupRegistration called").

For more information on using logback effectively, consult the logback manual.

#Rustici Software SCORM Engine Third-Party Licenses

SCORM Engine is distributed with a number of freely redistributable libraries under various licenses. A summary of which product uses which type of license appears in the table below. The text of each license appears after that, followed by the text of the copyright notices of each product (if applicable), in alphabetical order. (Notices are generally included only for works under the Apache license version 2.0.)

.NET-Only Third-Party Dependencies

Library Purpose Source License
AjaxPro AJAX calls during package import/upload http://ajaxpro.codeplex.com/ MIT
Amazon.SimpleDb SimpleDb Data Provider Discontinued Apache v2.0
BouncyCastle.Crypto Encryption support http://www.bouncycastle.org/ MIT
DevDefined.Oauth Oautho support https://code.google.com/p/devdefined-tools/wiki/OAuth MIT
Enyim.Caching Memcached interface and support https://github.com/enyim/EnyimMemcached Apache
Json.NET JSON Parsing/Serialization library http://james.newtonking.com/json MIT
log4net Server-side logging http://logging.apache.org/log4net/ Apache License v2.0
Logos.Utility.GuidUtility UUID generation https://github.com/LogosBible/Logos.Utility MIT
Microsoft Anti-XSS Cross-site-scripting protection http://msdn.microsoft.com/en-us/security/aa973814.aspx Microsoft Public License
Mono.Security Npgsql dependency http://npgsql.projects.pgfoundry.org/index.html LGPL
MySql.Data MySql Data Provider http://dev.mysql.com/downloads/connector/net/1.0.html GPLv2
Npgsql .NET PostgreSQL Driver http://npgsql.projects.pgfoundry.org/index.html ISC
Nunit Unit testing framework http://www.nunit.org/index.php?p=license&r=2.6.3 Zlib
SharpZipLib Zip file format support http://icsharpcode.github.io/SharpZipLib/ GPLv3 with Classpath Exception
ThreeSharp Amazon S3 interface support http://threesharp.codeplex.com/ Apache License v2.0

Java-Only Third-Party Dependencies

Library Purpose Source License
Amazon SimpleDb Library Simple DB Interface Discontinued Apache v2.0
Antlr Axis2 Dependency http://axis.apache.org/axis2/java/core/ BSD
Axiom Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Axis2 Web Services Framework http://axis.apache.org/axis2/java/core/ Apache v2.0
Byte Code Engineering Libary (BCEL) Analyze/create/manipulate class files http://commons.apache.org/proper/commons-bcel/ Apache v1.1
BouncyCastle (bcpkix, bcprov) Encryption support http://www.bouncycastle.org/java.html MIT
Commons CLI Axis2 Dependency http://commons.apache.org/proper/commons-cli/ Apache v2.0
Apache Commons Codec Axis2 Dependency http://commons.apache.org/proper/commons-codec/ Apache v2.0
Commons-dbcp DB Connection pooling http://commons.apache.org/ Apache v2.0
Commons FileUpload Browser and File I/O http://commons.apache.org/proper/commons-fileupload/ Apache v2.0
Commons HttpClient Accessing Resources via HTTP http://hc.apache.org/httpclient-3.x/ Apache v2.0
Commons IO Browser and File I/O http://commons.apache.org/proper/commons-io/ Apache v2.0
Commons-lang Miscellaneous utilities http://commons.apache.org/ Apache v2.0
The Logging Component Server-side logging http://commons.apache.org/proper/commons-logging/ Apache v2.0
Commons-pool DB Connection pooling http://commons.apache.org/ Apache v2.0
CS2J Translation from .NET to Java http://www.cs2j.com MIT
geronimo-annotation Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
geronimo-jaxws Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
geronimo-jta Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
geronimo-saaj Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
geronimo-stax-api Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
geronimo-ws-metadata Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
HttpCore HTTP Transport Components https://hc.apache.org/httpcomponents-core-ga/ Apache v2.0
Jackson JSON Parsing/Serialization https://github.com/FasterXML/jackson Apache v2.0
J A L O P Y Code Beautifier http://jalopy.sourceforge.net Jalopy BSD License
Java Activation Framework Axis2 Dependency http://axis.apache.org/axis2/java/core/ CDDL
JavaMail CS2J Dependency, Axis 2 Dependency https://java.net/projects/javamail/pages/Home CDDL
Jaxb Axis2 Dependency http://axis.apache.org/axis2/java/core/ CDDL
Jaxen Axis2 Dependency http://axis.apache.org/axis2/java/core/ Werken License
jaxws-tools Axis2 Dependency http://axis.apache.org/axis2/java/core/ CDDL
Jettison Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
jets3t Amazon AWS interface http://www.jets3t.org/ Apache v2.0
jibx Axis2 Dependency http://axis.apache.org/axis2/java/core/ Sosnoski License
Joda-Time Java date and time API http://www.joda.org/joda-time/ Apache v2.0
jsr173 XML Streaming https://sjsxp.java.net/ CDDL
jsr311 Axis2 Dependency http://axis.apache.org/axis2/java/core/ CDDL
juli Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
JSTL Tag Library Support http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html Apache v2.0
JUnit JUnit Tests http://junit.org/ Eclipse Public License - v 1.0
Log4J Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Logback Server-side logging http://logback.qos.ch/ LGPL
mail Axis2 Dependency http://axis.apache.org/axis2/java/core/ CDDL
Memcached Cloud Memcached support http://www.danga.com/memcached/ BSD
mex Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Neethi Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Oauth jars Oauth Support https://code.google.com/p/oauth/ Apache v2.0
regexp Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Reform Cross-site-scripting protection https://code.google.com/p/reform/ MIT
SLF4J Server-side logging http://www.slf4j.org/ MIT
spy-memcached Memcached interface https://code.google.com/p/spymemcached/ MIT
standard.jar JSTL Dependency http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html Apache v2.0
Tomcat (jsp-api, servlet-api) JSP Servlet page help https://tomcat.apache.org/ Apache v2.0
tribes Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Woden Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
WSDL4J Axis2 Dependency http://axis.apache.org/axis2/java/core/ Common Public License
Wstx Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
Xalan (xalan.jar, serailizer.jar) XML Manipulation http://xalan.apache.org/index.html Apache v2.0
Xerces XALAN Dependency http://xerces.apache.org/index.html Apache v2.0
xml-resolver Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
xmlbeans Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0
XmlSchema Axis2 Dependency http://axis.apache.org/axis2/java/core/ Apache v2.0

JavaScript Third-Party Dependencies (All versions of Engine)

Library Purpose Source License
Bootstrap Console User Interface http://getbootstrap.com/ Apache License v2.0
jQuery Client-side JavaScript framework http://jquery.com MIT
jQuery Cookie Plugin Client-side cookie support https://github.com/carhartl/jquery-cookie MIT
jQuery HoverIntent Plugin Tooltip support http://cherne.net/brian/resources/jquery.hoverIntent.html MIT
Json2 JSON Browser compatibility https://github.com/douglascrockford/JSON-js Public Domain
jsProgressBarHandler Progress bar support http://www.bram.us/projects/js_bramus/jsprogressbarhandler/ Creative Commons Attribution 2.5
Moment.js Datetime support http://momentjs.com/ MIT
Prototype.js AJAX Framework http://prototypejs.org/ MIT
Sarissa Client-side XML support http://dev.abiss.gr/sarissa Apache License v2.0
Skeleton (tabs.js) Tabs in User Interfaces www.getskeleton.com MIT
Stacktrace.js Exception logging http://stacktracejs.com/ Public Domain
SwfObject SwfUpload Plugin http://code.google.com/p/swfobject/ MIT
SwfUpload Upload progress bar http://code.google.com/p/swfupload/ MIT
wz_tooltip.js Tooltip support http://www.walterzorn.de/en/tooltip/tooltip_e.htm LGPL

Apache License Version 2.0

                              Apache License
                        Version 2.0, January 2004
                     http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

   "License" shall mean the terms and conditions for use, reproduction,
   and distribution as defined by Sections 1 through 9 of this document.

   "Licensor" shall mean the copyright owner or entity authorized by
   the copyright owner that is granting the License.

   "Legal Entity" shall mean the union of the acting entity and all
   other entities that control, are controlled by, or are under common
   control with that entity. For the purposes of this definition,
   "control" means (i) the power, direct or indirect, to cause the
   direction or management of such entity, whether by contract or
   otherwise, or (ii) ownership of fifty percent (50%) or more of the
   outstanding shares, or (iii) beneficial ownership of such entity.

   "You" (or "Your") shall mean an individual or Legal Entity
   exercising permissions granted by this License.

   "Source" form shall mean the preferred form for making modifications,
   including but not limited to software source code, documentation
   source, and configuration files.

   "Object" form shall mean any form resulting from mechanical
   transformation or translation of a Source form, including but
   not limited to compiled object code, generated documentation,
   and conversions to other media types.

   "Work" shall mean the work of authorship, whether in Source or
   Object form, made available under the License, as indicated by a
   copyright notice that is included in or attached to the work
   (an example is provided in the Appendix below).

   "Derivative Works" shall mean any work, whether in Source or Object
   form, that is based on (or derived from) the Work and for which the
   editorial revisions, annotations, elaborations, or other modifications
   represent, as a whole, an original work of authorship. For the purposes
   of this License, Derivative Works shall not include works that remain
   separable from, or merely link (or bind by name) to the interfaces of,
   the Work and Derivative Works thereof.

   "Contribution" shall mean any work of authorship, including
   the original version of the Work and any modifications or additions
   to that Work or Derivative Works thereof, that is intentionally
   submitted to Licensor for inclusion in the Work by the copyright owner
   or by an individual or Legal Entity authorized to submit on behalf of
   the copyright owner. For the purposes of this definition, "submitted"
   means any form of electronic, verbal, or written communication sent
   to the Licensor or its representatives, including but not limited to
   communication on electronic mailing lists, source code control systems,
   and issue tracking systems that are managed by, or on behalf of, the
   Licensor for the purpose of discussing and improving the Work, but
   excluding communication that is conspicuously marked or otherwise
   designated in writing by the copyright owner as "Not a Contribution."

   "Contributor" shall mean Licensor and any individual or Legal Entity
   on behalf of whom a Contribution has been received by Licensor and
   subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   copyright license to reproduce, prepare Derivative Works of,
   publicly display, publicly perform, sublicense, and distribute the
   Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   (except as stated in this section) patent license to make, have made,
   use, offer to sell, sell, import, and otherwise transfer the Work,
   where such license applies only to those patent claims licensable
   by such Contributor that are necessarily infringed by their
   Contribution(s) alone or by combination of their Contribution(s)
   with the Work to which such Contribution(s) was submitted. If You
   institute patent litigation against any entity (including a
   cross-claim or counterclaim in a lawsuit) alleging that the Work
   or a Contribution incorporated within the Work constitutes direct
   or contributory patent infringement, then any patent licenses
   granted to You under this License for that Work shall terminate
   as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
   Work or Derivative Works thereof in any medium, with or without
   modifications, and in Source or Object form, provided that You
   meet the following conditions:

   (a) You must give any other recipients of the Work or
       Derivative Works a copy of this License; and

   (b) You must cause any modified files to carry prominent notices
       stating that You changed the files; and

   (c) You must retain, in the Source form of any Derivative Works
       that You distribute, all copyright, patent, trademark, and
       attribution notices from the Source form of the Work,
       excluding those notices that do not pertain to any part of
       the Derivative Works; and

   (d) If the Work includes a "NOTICE" text file as part of its
       distribution, then any Derivative Works that You distribute must
       include a readable copy of the attribution notices contained
       within such NOTICE file, excluding those notices that do not
       pertain to any part of the Derivative Works, in at least one
       of the following places: within a NOTICE text file distributed
       as part of the Derivative Works; within the Source form or
       documentation, if provided along with the Derivative Works; or,
       within a display generated by the Derivative Works, if and
       wherever such third-party notices normally appear. The contents
       of the NOTICE file are for informational purposes only and
       do not modify the License. You may add Your own attribution
       notices within Derivative Works that You distribute, alongside
       or as an addendum to the NOTICE text from the Work, provided
       that such additional attribution notices cannot be construed
       as modifying the License.

   You may add Your own copyright statement to Your modifications and
   may provide additional or different license terms and conditions
   for use, reproduction, or distribution of Your modifications, or
   for any such Derivative Works as a whole, provided Your use,
   reproduction, and distribution of the Work otherwise complies with
   the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
   any Contribution intentionally submitted for inclusion in the Work
   by You to the Licensor shall be under the terms and conditions of
   this License, without any additional terms or conditions.
   Notwithstanding the above, nothing herein shall supersede or modify
   the terms of any separate license agreement you may have executed
   with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
   names, trademarks, service marks, or product names of the Licensor,
   except as required for reasonable and customary use in describing the
   origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
   agreed to in writing, Licensor provides the Work (and each
   Contributor provides its Contributions) on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   implied, including, without limitation, any warranties or conditions
   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   PARTICULAR PURPOSE. You are solely responsible for determining the
   appropriateness of using or redistributing the Work and assume any
   risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
   whether in tort (including negligence), contract, or otherwise,
   unless required by applicable law (such as deliberate and grossly
   negligent acts) or agreed to in writing, shall any Contributor be
   liable to You for damages, including any direct, indirect, special,
   incidental, or consequential damages of any character arising as a
   result of this License or out of the use or inability to use the
   Work (including but not limited to damages for loss of goodwill,
   work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses), even if such Contributor
   has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
   the Work or Derivative Works thereof, You may choose to offer,
   and charge a fee for, acceptance of support, warranty, indemnity,
   or other liability obligations and/or rights consistent with this
   License. However, in accepting such obligations, You may act only
   on Your own behalf and on Your sole responsibility, not on behalf
   of any other Contributor, and only if You agree to indemnify,
   defend, and hold each Contributor harmless for any liability
   incurred by, or claims asserted against, such Contributor by reason
   of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

   To apply the Apache License to your work, attach the following
   boilerplate notice, with the fields enclosed by brackets "[]"
   replaced with your own identifying information. (Don't include
   the brackets!)  The text should be enclosed in the appropriate
   comment syntax for the file format. We also recommend that a
   file or class name and description of purpose be included on the
   same "printed page" as the copyright notice for easier
   identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

BSD License

Copyright (c) <year>, <author>
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this list of conditions
      and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, this list of
      conditions and the following disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of the author nor the names of its contributors may be used to endorse or
      promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS 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 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Common Development and Distribution License

COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0

1. Definitions.

   1.1. Contributor. means each individual or entity that creates or
   contributes to the creation of Modifications.

   1.2. Contributor Version. means the combination of the Original Software,
   prior Modifications used by a Contributor (if any), and the Modifications
   made by that particular Contributor.

   1.3. Covered Software. means (a) the Original Software, or (b)
   Modifications, or (c) the combination of files containing Original
   Software with files containing Modifications, in each case including
   portions thereof.

   1.4. Executable. means the Covered Software in any form other than Source
   Code.

   1.5. Initial Developer. means the individual or entity that first makes
   Original Software available under this License.

   1.6. Larger Work. means a work which combines Covered Software or
   portions thereof with code not governed by the terms of this License.

   1.7. License. means this document.

   1.8. Licensable. means having the right to grant, to the maximum extent
   possible, whether at the time of the initial grant or subsequently
   acquired, any and all of the rights conveyed herein.

   1.9. Modifications. means the Source Code and Executable form of any of
   the following:

        A. Any file that results from an addition to, deletion from or
        modification of the contents of a file containing Original Software
        or previous Modifications;

        B. Any new file that contains any part of the Original Software or
        previous Modification; or

        C. Any new file that is contributed or otherwise made available
        under the terms of this License.

   1.10. Original Software. means the Source Code and Executable form of
   computer software code that is originally released under this License.

   1.11. Patent Claims. means any patent claim(s), now owned or hereafter
   acquired, including without limitation, method, process, and apparatus
   claims, in any patent Licensable by grantor.

   1.12. Source Code. means (a) the common form of computer software code in
   which modifications are made and (b) associated documentation included in
   or with such code.

   1.13. You. (or .Your.) means an individual or a legal entity exercising
   rights under, and complying with all of the terms of, this License. For
   legal entities, .You. includes any entity which controls, is controlled
   by, or is under common control with You. For purposes of this definition,
   .control. means (a) the power, direct or indirect, to cause the direction
   or management of such entity, whether by contract or otherwise, or (b)
   ownership of more than fifty percent (50%) of the outstanding shares or
   beneficial ownership of such entity.

2. License Grants.

      2.1. The Initial Developer Grant.

      Conditioned upon Your compliance with Section 3.1 below and subject to
      third party intellectual property claims, the Initial Developer hereby
      grants You a world-wide, royalty-free, non-exclusive license:

         (a) under intellectual property rights (other than patent or
         (trademark) Licensable by Initial Developer, to use, reproduce,
         (modify, display, perform, sublicense and distribute the Original
         (Software (or portions thereof), with or without Modifications,
         (and/or as part of a Larger Work; and

         (b) under Patent Claims infringed by the making, using or selling
         (of Original Software, to make, have made, use, practice, sell, and
         (offer for sale, and/or otherwise dispose of the Original Software
         ((or portions thereof).

        (c) The licenses granted in Sections 2.1(a) and (b) are effective on
        (the date Initial Developer first distributes or otherwise makes the
        (Original Software available to a third party under the terms of
        (this License.

        (d) Notwithstanding Section 2.1(b) above, no patent license is
        (granted: (1) for code that You delete from the Original Software,
        (or (2) for infringements caused by: (i) the modification of the
        (Original Software, or (ii) the combination of the Original Software
        (with other software or devices.

    2.2. Contributor Grant.

    Conditioned upon Your compliance with Section 3.1 below and subject to
    third party intellectual property claims, each Contributor hereby grants
    You a world-wide, royalty-free, non-exclusive license:

        (a) under intellectual property rights (other than patent or
        (trademark) Licensable by Contributor to use, reproduce, modify,
        (display, perform, sublicense and distribute the Modifications
        (created by such Contributor (or portions thereof), either on an
        (unmodified basis, with other Modifications, as Covered Software
        (and/or as part of a Larger Work; and

        (b) under Patent Claims infringed by the making, using, or selling
        (of Modifications made by that Contributor either alone and/or in
        (combination with its Contributor Version (or portions of such
        (combination), to make, use, sell, offer for sale, have made, and/or
        (otherwise dispose of: (1) Modifications made by that Contributor
        ((or portions thereof); and (2) the combination of Modifications
        (made by that Contributor with its Contributor Version (or portions
        (of such combination).

        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective
        (on the date Contributor first distributes or otherwise makes the
        (Modifications available to a third party.

        (d) Notwithstanding Section 2.2(b) above, no patent license is
        (granted: (1) for any code that Contributor has deleted from the
        (Contributor Version; (2) for infringements caused by: (i) third
        (party modifications of Contributor Version, or (ii) the combination
        (of Modifications made by that Contributor with other software
        ((except as part of the Contributor Version) or other devices; or
        ((3) under Patent Claims infringed by Covered Software in the
        (absence of Modifications made by that Contributor.

3. Distribution Obligations.

      3.1. Availability of Source Code. Any Covered Software that You
      distribute or otherwise make available in Executable form must also be
      made available in Source Code form and that Source Code form must be
      distributed only under the terms of this License. You must include a
      copy of this License with every copy of the Source Code form of the
      Covered Software You distribute or otherwise make available. You must
      inform recipients of any such Covered Software in Executable form as
      to how they can obtain such Covered Software in Source Code form in a
      reasonable manner on or through a medium customarily used for software
      exchange.

      3.2. Modifications. The Modifications that You create or to which You
      contribute are governed by the terms of this License. You represent
      that You believe Your Modifications are Your original creation(s)
      and/or You have sufficient rights to grant the rights conveyed by this
      License.

      3.3. Required Notices. You must include a notice in each of Your
      Modifications that identifies You as the Contributor of the
      Modification. You may not remove or alter any copyright, patent or
      trademark notices contained within the Covered Software, or any
      notices of licensing or any descriptive text giving attribution to any
      Contributor or the Initial Developer.

      3.4. Application of Additional Terms. You may not offer or impose any
      terms on any Covered Software in Source Code form that alters or
      restricts the applicable version of this License or the recipients.
      rights hereunder. You may choose to offer, and to charge a fee for,
      warranty, support, indemnity or liability obligations to one or more
      recipients of Covered Software. However, you may do so only on Your
      own behalf, and not on behalf of the Initial Developer or any
      Contributor. You must make it absolutely clear that any such warranty,
      support, indemnity or liability obligation is offered by You alone,
      and You hereby agree to indemnify the Initial Developer and every
      Contributor for any liability incurred by the Initial Developer or
      such Contributor as a result of warranty, support, indemnity or
      liability terms You offer.

      3.5. Distribution of Executable Versions. You may distribute the
      Executable form of the Covered Software under the terms of this
      License or under the terms of a license of Your choice, which may
      contain terms different from this License, provided that You are in
      compliance with the terms of this License and that the license for the
      Executable form does not attempt to limit or alter the recipient.s
      rights in the Source Code form from the rights set forth in this
      License. If You distribute the Covered Software in Executable form
      under a different license, You must make it absolutely clear that any
      terms which differ from this License are offered by You alone, not by
      the Initial Developer or Contributor. You hereby agree to indemnify
      the Initial Developer and every Contributor for any liability incurred
      by the Initial Developer or such Contributor as a result of any such
      terms You offer.

      3.6. Larger Works. You may create a Larger Work by combining Covered
      Software with other code not governed by the terms of this License and
      distribute the Larger Work as a single product. In such a case, You
      must make sure the requirements of this License are fulfilled for the
      Covered Software.

4. Versions of the License.

      4.1. New Versions. Sun Microsystems, Inc. is the initial license
      steward and may publish revised and/or new versions of this License
      from time to time. Each version will be given a distinguishing version
      number. Except as provided in Section 4.3, no one other than the
      license steward has the right to modify this License.

      4.2. Effect of New Versions. You may always continue to use,
      distribute or otherwise make the Covered Software available under the
      terms of the version of the License under which You originally
      received the Covered Software. If the Initial Developer includes a
      notice in the Original Software prohibiting it from being distributed
      or otherwise made available under any subsequent version of the
      License, You must distribute and make the Covered Software available
      under the terms of the version of the License under which You
      originally received the Covered Software. Otherwise, You may also
      choose to use, distribute or otherwise make the Covered Software
      available under the terms of any subsequent version of the License
      published by the license steward.

      4.3. Modified Versions. When You are an Initial Developer and You want
      to create a new license for Your Original Software, You may create and
      use a modified version of this License if You: (a) rename the license
      and remove any references to the name of the license steward (except
      to note that the license differs from this License); and (b) otherwise
      make it clear that the license contains terms which differ from this
      License.

5. DISCLAIMER OF WARRANTY.

   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS,
   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
   WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF
   DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
   THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE
   IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT,
   YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST
   OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
   WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY
   COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

6. TERMINATION.

      6.1. This License and the rights granted hereunder will terminate
      automatically if You fail to comply with terms herein and fail to cure
      such breach within 30 days of becoming aware of the breach. Provisions
      which, by their nature, must remain in effect beyond the termination
      of this License shall survive.

      6.2. If You assert a patent infringement claim (excluding declaratory
      judgment actions) against Initial Developer or a Contributor (the
      Initial Developer or Contributor against whom You assert such claim is
      referred to as .Participant.) alleging that the Participant Software
      (meaning the Contributor Version where the Participant is a
      Contributor or the Original Software where the Participant is the
      Initial Developer) directly or indirectly infringes any patent, then
      any and all rights granted directly or indirectly to You by such
      Participant, the Initial Developer (if the Initial Developer is not
      the Participant) and all Contributors under Sections 2.1 and/or 2.2 of
      this License shall, upon 60 days notice from Participant terminate
      prospectively and automatically at the expiration of such 60 day
      notice period, unless if within such 60 day period You withdraw Your
      claim with respect to the Participant Software against such
      Participant either unilaterally or pursuant to a written agreement
      with Participant.

      6.3. In the event of termination under Sections 6.1 or 6.2 above, all
      end user licenses that have been validly granted by You or any
      distributor hereunder prior to termination (excluding licenses granted
      to You by any distributor) shall survive termination.

7. LIMITATION OF LIABILITY.

   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
   NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER,
   ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY
   SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY
   INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER
   INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF
   GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL
   OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
   INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY
   SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM
   SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH
   LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION
   OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION
   MAY NOT APPLY TO YOU.

8. U.S. GOVERNMENT END USERS.

   The Covered Software is a .commercial item,. as that term is defined in
   48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software.
   (as that term is defined at 48 C.F.R. ∫ 252.227-7014(a)(1)) and
   .commercial computer software documentation. as such terms are used in 48
   C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48
   C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End
   Users acquire Covered Software with only those rights set forth herein.
   This U.S. Government Rights clause is in lieu of, and supersedes, any
   other FAR, DFAR, or other clause or provision that addresses Government
   rights in computer software under this License.

9. MISCELLANEOUS.

   This License represents the complete agreement concerning subject matter
   hereof. If any provision of this License is held to be unenforceable,
   such provision shall be reformed only to the extent necessary to make it
   enforceable. This License shall be governed by the law of the
   jurisdiction specified in a notice contained within the Original Software
   (except to the extent applicable law, if any, provides otherwise),
   excluding such jurisdiction.s conflict-of-law provisions. Any litigation
   relating to this License shall be subject to the jurisdiction of the
   courts located in the jurisdiction and venue specified in a notice
   contained within the Original Software, with the losing party responsible
   for costs, including, without limitation, court costs and reasonable
   attorneys. fees and expenses. The application of the United Nations
   Convention on Contracts for the International Sale of Goods is expressly
   excluded. Any law or regulation which provides that the language of a
   contract shall be construed against the drafter shall not apply to this
   License. You agree that You alone are responsible for compliance with the
   United States export administration regulations (and the export control
   laws and regulation of any other countries) when You use, distribute or
   otherwise make available any Covered Software.

10. RESPONSIBILITY FOR CLAIMS.

   As between Initial Developer and the Contributors, each party is
   responsible for claims and damages arising, directly or indirectly, out
   of its utilization of rights under this License and You agree to work
   with Initial Developer and Contributors to distribute such responsibility
   on an equitable basis. Nothing herein is intended or shall be deemed to
   constitute any admission of liability.

   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
   LICENSE (CDDL)

   The code released under the CDDL shall be governed by the laws of the
   State of California (excluding conflict-of-law provisions). Any
   litigation relating to this License shall be subject to the jurisdiction
   of the Federal Courts of the Northern District of California and the
   state courts of the State of California, with venue lying in Santa Clara
   County, California.

Common Public License

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and
documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates' from a
Contributor if it was added to the Program by such Contributor itself or anyone
acting on such Contributor's behalf. Contributions do not include additions to
the Program which: (i) are separate modules of software distributed in
conjunction with the Program under their own license agreement, and (ii) are not
derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly perform,
distribute and sublicense the Contribution of such Contributor, if any, and such
derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
Patents to make, use, sell, offer to sell, import and otherwise transfer the
Contribution of such Contributor, if any, in source code and object code form.
This patent license shall apply to the combination of the Contribution and the
Program if, at the time the Contribution is added by the Contributor, such
addition of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other combinations
which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses
to its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other intellectual
property rights of any other entity. Each Contributor disclaims any liability to
Recipient for claims brought by any other entity based on infringement of
intellectual property rights or otherwise. As a condition to exercising the
rights and licenses granted hereunder, each Recipient hereby assumes sole
responsibility to secure any other intellectual property rights needed, if any.
For example, if a third party patent license is required to allow Recipient to
distribute the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright license set
forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its
own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and
conditions, express and implied, including warranties or conditions of title and
non-infringement, and implied warranties or conditions of merchantability and
fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and consequential
damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered
by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable manner on or
through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the
Program.

Each Contributor must identify itself as the originator of its Contribution, if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore, if
a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses, damages
and costs (collectively "Losses") arising from claims, lawsuits and other legal
actions brought by a third party against the Indemnified Contributor to the
extent caused by the acts or omissions of such Commercial Contributor in
connection with its distribution of the Program in a commercial product
offering. The obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In order
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
Contributor in writing of such claim, and b) allow the Commercial Contributor to
control, and cooperate with the Commercial Contributor in, the defense and any
related settlement negotiations. The Indemnified Contributor may participate in
any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If that
Commercial Contributor then makes performance claims, or offers warranties
related to Product X, those performance claims and warranties are such
Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a court
requires any other Contributor to pay any damages as a result, the Commercial
Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
Recipient is solely responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its exercise of
rights under this Agreement, including but not limited to the risks and costs of
program errors, compliance with applicable laws, damage to or loss of data,
programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable
law, it shall not affect the validity or enforceability of the remainder of the
terms of this Agreement, and without further action by the parties hereto, such
provision shall be reformed to the minimum extent necessary to make such
provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to
a patent applicable to software (including a cross-claim or counterclaim in a
lawsuit), then any patent licenses granted by that Contributor to such Recipient
under this Agreement shall terminate as of the date such litigation is filed. In
addition, if Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
itself (excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted under
Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue and
survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to time.
No one other than the Agreement Steward has the right to modify this Agreement.
IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
as the Agreement Steward to a suitable separate entity. Each new version of the
Agreement will be given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the Agreement
under which it was received. In addition, after a new version of the Agreement
is published, Contributor may elect to distribute the Program (including its
Contributions) under the new version. Except as expressly stated in Sections
2(a) and 2(b) above, Recipient receives no rights or licenses to the
intellectual property of any Contributor under this Agreement, whether
expressly, by implication, estoppel or otherwise. All rights in the Program not
expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.

Creative Commons Attribution License

Creative Commons

Creative Commons Legal Code Attribution-NonCommercial-ShareAlike 2.5

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT
RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.
CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND
DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. License

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS
PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR
OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS
LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

"Collective Work" means a work, such as a periodical issue, anthology or
encyclopedia, in which the Work in its entirety in unmodified form, along with a
number of other contributions, constituting separate and independent works in
themselves, are assembled into a collective whole. A work that constitutes a
Collective Work will not be considered a Derivative Work (as defined below) for
the purposes of this License. "Derivative Work" means a work based upon the Work
or upon the Work and other pre-existing works, such as a translation, musical
arrangement, dramatization, fictionalization, motion picture version, sound
recording, art reproduction, abridgment, condensation, or any other form in
which the Work may be recast, transformed, or adapted, except that a work that
constitutes a Collective Work will not be considered a Derivative Work for the
purpose of this License. For the avoidance of doubt, where the Work is a musical
composition or sound recording, the synchronization of the Work in timed-
relation with a moving image ("synching") will be considered a Derivative Work
for the purpose of this License. "Licensor" means the individual or entity that
offers the Work under the terms of this License. "Original Author" means the
individual or entity who created the Work. "Work" means the copyrightable work
of authorship offered under the terms of this License. "You" means an individual
or entity exercising rights under this License who has not previously violated
the terms of this License with respect to the Work, or who has received express
permission from the Licensor to exercise rights under this License despite a
previous violation. "License Elements" means the following high-level license
attributes as selected by Licensor and indicated in the title of this License:
Attribution, Noncommercial, ShareAlike. 2. Fair Use Rights. Nothing in this
license is intended to reduce, limit, or restrict any rights arising from fair
use, first sale or other limitations on the exclusive rights of the copyright
owner under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of this License, Licensor
hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
duration of the applicable copyright) license to exercise the rights in the Work
as stated below:

to reproduce the Work, to incorporate the Work into one or more Collective
Works, and to reproduce the Work as incorporated in the Collective Works; to
create and reproduce Derivative Works; to distribute copies or phonorecords of,
display publicly, perform publicly, and perform publicly by means of a digital
audio transmission the Work including as incorporated in Collective Works; to
distribute copies or phonorecords of, display publicly, perform publicly, and
perform publicly by means of a digital audio transmission Derivative Works; The
above rights may be exercised in all media and formats whether now known or
hereafter devised. The above rights include the right to make such modifications
as are technically necessary to exercise the rights in other media and formats.
All rights not expressly granted by Licensor are hereby reserved, including but
not limited to the rights set forth in Sections 4(e) and 4(f).

4. Restrictions.The license granted in Section 3 above is expressly made subject
to and limited by the following restrictions:

You may distribute, publicly display, publicly perform, or publicly digitally
perform the Work only under the terms of this License, and You must include a
copy of, or the Uniform Resource Identifier for, this License with every copy or
phonorecord of the Work You distribute, publicly display, publicly perform, or
publicly digitally perform. You may not offer or impose any terms on the Work
that alter or restrict the terms of this License or the recipients' exercise of
the rights granted hereunder. You may not sublicense the Work. You must keep
intact all notices that refer to this License and to the disclaimer of
warranties. You may not distribute, publicly display, publicly perform, or
publicly digitally perform the Work with any technological measures that control
access or use of the Work in a manner inconsistent with the terms of this
License Agreement. The above applies to the Work as incorporated in a Collective
Work, but this does not require the Collective Work apart from the Work itself
to be made subject to the terms of this License. If You create a Collective
Work, upon notice from any Licensor You must, to the extent practicable, remove
from the Collective Work any credit as required by clause 4(d), as requested. If
You create a Derivative Work, upon notice from any Licensor You must, to the
extent practicable, remove from the Derivative Work any credit as required by
clause 4(d), as requested. You may distribute, publicly display, publicly
perform, or publicly digitally perform a Derivative Work only under the terms of
this License, a later version of this License with the same License Elements as
this License, or a Creative Commons iCommons license that contains the same
License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.5
Japan). You must include a copy of, or the Uniform Resource Identifier for, this
License or other license specified in the previous sentence with every copy or
phonorecord of each Derivative Work You distribute, publicly display, publicly
perform, or publicly digitally perform. You may not offer or impose any terms on
the Derivative Works that alter or restrict the terms of this License or the
recipients' exercise of the rights granted hereunder, and You must keep intact
all notices that refer to this License and to the disclaimer of warranties. You
may not distribute, publicly display, publicly perform, or publicly digitally
perform the Derivative Work with any technological measures that control access
or use of the Work in a manner inconsistent with the terms of this License
Agreement. The above applies to the Derivative Work as incorporated in a
Collective Work, but this does not require the Collective Work apart from the
Derivative Work itself to be made subject to the terms of this License. You may
not exercise any of the rights granted to You in Section 3 above in any manner
that is primarily intended for or directed toward commercial advantage or
private monetary compensation. The exchange of the Work for other copyrighted
works by means of digital file-sharing or otherwise shall not be considered to
be intended for or directed toward commercial advantage or private monetary
compensation, provided there is no payment of any monetary compensation in
connection with the exchange of copyrighted works. If you distribute, publicly
display, publicly perform, or publicly digitally perform the Work or any
Derivative Works or Collective Works, You must keep intact all copyright notices
for the Work and provide, reasonable to the medium or means You are utilizing:
(i) the name of the Original Author (or pseudonym, if applicable) if supplied,
and/or (ii) if the Original Author and/or Licensor designate another party or
parties (e.g. a sponsor institute, publishing entity, journal) for attribution
in Licensor's copyright notice, terms of service or by other reasonable means,
the name of such party or parties; the title of the Work if supplied; to the
extent reasonably practicable, the Uniform Resource Identifier, if any, that
Licensor specifies to be associated with the Work, unless such URI does not
refer to the copyright notice or licensing information for the Work; and in the
case of a Derivative Work, a credit identifying the use of the Work in the
Derivative Work (e.g., "French translation of the Work by Original Author," or
"Screenplay based on original Work by Original Author"). Such credit may be
implemented in any reasonable manner; provided, however, that in the case of a
Derivative Work or Collective Work, at a minimum such credit will appear where
any other comparable authorship credit appears and in a manner at least as
prominent as such other comparable authorship credit. For the avoidance of
doubt, where the Work is a musical composition:

Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive
right to collect, whether individually or via a performance rights society (e.g.
ASCAP, BMI, SESAC), royalties for the public performance or public digital
performance (e.g. webcast) of the Work if that performance is primarily intended
for or directed toward commercial advantage or private monetary compensation.
Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right
to collect, whether individually or via a music rights agency or designated
agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the
Work ("cover version") and distribute, subject to the compulsory license created
by 17 USC Section 115 of the US Copyright Act (or the equivalent in other
jurisdictions), if Your distribution of such cover version is primarily intended
for or directed toward commercial advantage or private monetary compensation.
Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the
Work is a sound recording, Licensor reserves the exclusive right to collect,
whether individually or via a performance-rights society (e.g. SoundExchange),
royalties for the public digital performance (e.g. webcast) of the Work, subject
to the compulsory license created by 17 USC Section 114 of the US Copyright Act
(or the equivalent in other jurisdictions), if Your public digital performance
is primarily intended for or directed toward commercial advantage or private
monetary compensation. 5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING
THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT
LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR
PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY,
OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME
JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH
EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN
NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS
LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

7. Termination

This License and the rights granted hereunder will terminate automatically upon
any breach by You of the terms of this License. Individuals or entities who have
received Derivative Works or Collective Works from You under this License,
however, will not have their licenses terminated provided such individuals or
entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7,
and 8 will survive any termination of this License. Subject to the above terms
and conditions, the license granted here is perpetual (for the duration of the
applicable copyright in the Work). Notwithstanding the above, Licensor reserves
the right to release the Work under different license terms or to stop
distributing the Work at any time; provided, however that any such election will
not serve to withdraw this License (or any other license that has been, or is
required to be, granted under the terms of this License), and this License will
continue in full force and effect unless terminated as stated above. 8.
Miscellaneous

Each time You distribute or publicly digitally perform the Work or a Collective
Work, the Licensor offers to the recipient a license to the Work on the same
terms and conditions as the license granted to You under this License. Each time
You distribute or publicly digitally perform a Derivative Work, Licensor offers
to the recipient a license to the original Work on the same terms and conditions
as the license granted to You under this License. If any provision of this
License is invalid or unenforceable under applicable law, it shall not affect
the validity or enforceability of the remainder of the terms of this License,
and without further action by the parties to this agreement, such provision
shall be reformed to the minimum extent necessary to make such provision valid
and enforceable. No term or provision of this License shall be deemed waived and
no breach consented to unless such waiver or consent shall be in writing and
signed by the party to be charged with such waiver or consent. This License
constitutes the entire agreement between the parties with respect to the Work
licensed here. There are no understandings, agreements or representations with
respect to the Work not specified here. Licensor shall not be bound by any
additional provisions that may appear in any communication from You. This
License may not be modified without the mutual written agreement of the Licensor
and You. Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be liable to
You or any party on any legal theory for any damages whatsoever, including
without limitation any general, special, incidental or consequential damages
arising in connection to this license. Notwithstanding the foregoing two (2)
sentences, if Creative Commons has expressly identified itself as the Licensor
hereunder, it shall have all rights and obligations of Licensor.

Except for the limited purpose of indicating to the public that the Work is
licensed under the CCPL, neither party will use the trademark "Creative Commons"
or any related trademark or logo of Creative Commons without the prior written
consent of Creative Commons. Any permitted use will be in compliance with
Creative Commons' then-current trademark usage guidelines, as may be published
on its website or otherwise made available upon request from time to time.

Creative Commons may be contacted at http://creativecommons.org/.

Eclipse Public License - v 1.0

    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

GNU GPLv3

                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

GNU GPLv3

                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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 3 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, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

GNU GPL Classpath Exception

Linking this library statically or dynamically with other modules is making a combined work
based on this library. Thus, the terms and conditions of the GNU General Public License cover
the whole combination.

As a special exception, the copyright holders of this library give you permission to link this
library with independent modules to produce an executable, regardless of the license terms of
these independent modules, and to copy and distribute the resulting executable under terms of
your choice, provided that you also meet, for each linked independent module, the terms and
conditions of the license of that module. An independent module is a module which is not derived
from or based on this library. If you modify this library, you may extend this exception to
your version of the library, but you are not obligated to do so. If you do not wish to do so,
delete this exception statement from your version.

GNU LGPL

          GNU LESSER GENERAL PUBLIC LICENSE
               Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

                Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

          GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

             END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!

ISC License

Copyright (c) Year(s), Company or Person's Name <E-mail address>

Permission to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted, provided that the above copyright notice and this permission
notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED
HEREUNDER IS ON AN "AS IS" BASIS, AND THE NPGSQL DEVELOPMENT TEAM HAS NO OBLIGATIONS TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

The Jalopy BSD License

Copyright (c) 2001-2004, Marco Hunsicker. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

Neither the name of the Jalopy Group nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 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 THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

MIT License

The MIT License (MIT)

Copyright (c) <year> <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Microsoft Public License

Microsoft Public License (Ms-PL)

This license governs use of the accompanying software. If you use the
software, you accept this license. If you do not accept the license, do
not use the software.

1. Definitions

The terms "reproduce," "reproduction," "derivative works," and
"distribution" have the same meaning here as under U.S. copyright law.

A "contribution" is the original software, or any additions or changes to
the software.

A "contributor" is any person that distributes its contribution under this
license.

"Licensed patents" are a contributor's patent claims that read directly on
its contribution.

2. Grant of Rights

(A) Copyright Grant- Subject to the terms of this license, including the
license conditions and limitations in section 3, each contributor grants
you a non-exclusive, worldwide, royalty-free copyright license to
reproduce its contribution, prepare derivative works of its contribution,
and distribute its contribution or any derivative works that you create.

(B) Patent Grant- Subject to the terms of this license, including the
license conditions and limitations in section 3, each contributor grants
you a non-exclusive, worldwide, royalty-free license under its licensed
patents to make, have made, use, sell, offer for sale, import, and/or
otherwise dispose of its contribution in the software or derivative works
of the contribution in the software.

3. Conditions and Limitations

(A) No Trademark License- This license does not grant you rights to use
any contributors' name, logo, or trademarks.

(B) If you bring a patent claim against any contributor over patents that
you claim are infringed by the software, your patent license from such
contributor to the software ends automatically.

(C) If you distribute any portion of the software, you must retain all
copyright, patent, trademark, and attribution notices that are present in
the software.

(D) If you distribute any portion of the software in source code form,
you may do so only under this license by including a complete copy of this
license with your distribution. If you distribute any portion of the
software in compiled or object code form, you may only do so under a
license that complies with this license.

(E) The software is licensed "as-is." You bear the risk of using it. The
contributors give no express warranties, guarantees or conditions. You may
have additional consumer rights under your local laws which this license
cannot change. To the extent permitted under your local laws, the
contributors exclude the implied warranties of merchantability, fitness
for a particular purpose and non-infringement.

Oracle Technology Network License

Oracle Technology Network Development and Distribution License Terms

Export Controls on the Programs Selecting the "Accept License Agreement" button
is a confirmation of your agreement that you comply, now and during the trial
term, with each of the following statements:

-You are not a citizen, national, or resident of, and are not under control of,
the government of Cuba, Iran, Sudan, Libya, North Korea, Syria, nor any country
to which the United States has prohibited export.
-You will not download or otherwise export or re-export the Programs, directly
or indirectly, to the above mentioned countries nor to citizens, nationals or
residents of those countries.
-You are not listed on the United States Department of Treasury lists of
Specially Designated Nationals, Specially Designated Terrorists, and Specially
Designated Narcotic Traffickers, nor are you listed on the United States
Department of Commerce Table of Denial Orders.

You will not download or otherwise export or re-export the Programs, directly or
indirectly, to persons on the above mentioned lists.


You will not use the Programs for, and will not allow the Programs to be used
for, any purposes prohibited by United States law, including, without
limitation, for the development, design, manufacture or production of nuclear,
chemical or biological weapons of mass destruction.


EXPORT RESTRICTIONS You agree that U.S. export control laws and other applicable
export and import laws govern your use of the programs, including technical
data; additional information can be found on Oracle®'s Global Trade Compliance
web site (http://www.oracle.com/products/export).


You agree that neither the programs nor any direct product thereof will be
exported, directly, or indirectly, in violation of these laws, or will be used
for any purpose prohibited by these laws including, without limitation, nuclear,
chemical, or biological weapons proliferation.


Oracle Employees: Under no circumstances are Oracle Employees authorized to
download software for the purpose of distributing it to customers. Oracle
products are available to employees for internal use or demonstration purposes
only. In keeping with Oracle's trade compliance obligations under U.S. and
applicable multilateral law, failure to comply with this policy could result in
disciplinary action up to and including termination.

Note: You are bound by the Oracle Technology Network ("OTN") License Agreement
terms. The OTN License Agreement terms also apply to all updates you receive
under your Technology Track subscription.

The OTN License Agreement terms below supercede any shrinkwrap license on the
OTN Technology Track software CDs and previous OTN License terms (including the
Oracle Program License as modified by the OTN Program Use Certificate).


Oracle Technology Network Development and Distribution License Agreement

"We," "us," and "our" refers to Oracle America, Inc., for and on behalf of
itself and its subsidiaries and affiliates under common control. "You" and
"your" refers to the individual or entity that wishes to use the programs from
Oracle. "Programs" refers to the software product you wish to download and use
and program documentation. "License" refers to your right to use the programs
under the terms of this agreement. This agreement is governed by the substantive
and procedural laws of California. You and Oracle agree to submit to the
exclusive jurisdiction of, and venue in, the courts of San Francisco, San Mateo,
or Santa Clara counties in California in any dispute arising out of or relating
to this agreement.

We are willing to license the programs to you only upon the condition that you
accept all of the terms contained in this agreement. Read the terms carefully
and select the "Accept" button at the bottom of the page to confirm your
acceptance. If you are not willing to be bound by these terms, select the "Do
Not Accept" button and the registration process will not continue.

License Rights We grant you a nonexclusive, nontransferable limited license to
use the programs: (a) for purposes of developing, testing, prototyping and
running applications you have developed for your own internal data processing
operations; (b) to distribute the programs with applications you have developed
to your customers provided that each such licensee agrees to license terms
consistent with the terms of this Agreement, you do not charge your end users
any additional fees for the use of the programs, and your end users may only use
the programs to run your applications for their own business operations; and (c)
to use the programs to provide third party demonstrations and training. You are
not permitted to use the programs for any purpose other than as permitted under
this Agreement. If you want to use the programs for any purpose other than as
expressly permitted under this agreement you must contact us, or an Oracle
reseller, to obtain the appropriate license. We may audit your use and
distribution of the programs. Program documentation is either shipped with the
programs, or documentation may accessed online at
http://www.oracle.com/technetwork/indexes/documentation/index.html.

Ownership and Restrictions We retain all ownership and intellectual property
rights in the programs. You may make a sufficient number of copies of the
programs for the licensed use and one copy of the programs for backup purposes.

You may not: - use the programs for any purpose other than as provided above; -
distribute the programs unless accompanied with your applications; - charge your
end users for use of the programs; - remove or modify any program markings or
any notice of our proprietary rights; - use the programs to provide third party
training on the content and/or functionality of the programs, except for
training your licensed users; - assign this agreement or give the programs,
program access or an interest in the programs to any individual or entity except
as provided under this agreement; - cause or permit reverse engineering (unless
required by law for interoperability), disassembly or decompilation of the
programs; - disclose results of any program benchmark tests without our prior
consent.

Program Distribution We grant you a nonexclusive, nontransferable right to copy
and distribute the programs to your end users provided that you do not charge
your end users for use of the programs and provided your end users may only use
the programs to run your applications for their business operations. Prior to
distributing the programs you shall require your end users to execute an
agreement binding them to terms consistent with those contained in this section
and the sections of this agreement entitled "License Rights," "Ownership and
Restrictions," "Export," "Disclaimer of Warranties and Exclusive Remedies," "No
Technical Support," "End of Agreement," "Relationship Between the Parties," and
"Open Source." You must also include a provision stating that your end users
shall have no right to distribute the programs, and a provision specifying us as
a third party beneficiary of the agreement. You are responsible for obtaining
these agreements with your end users.

You agree to: (a) defend and indemnify us against all claims and damages caused
by your distribution of the programs in breach of this agreements and/or failure
to include the required contractual provisions in your end user agreement as
stated above; (b) keep executed end user agreements and records of end user
information including name, address, date of distribution and identity of
programs distributed; (c) allow us to inspect your end user agreements and
records upon request; and, (d) enforce the terms of your end user agreements so
as to effect a timely cure of any end user breach, and to notify us of any
breach of the terms.

Export You agree that U.S. export control laws and other applicable export and
import laws govern your use of the programs, including technical data;
additional information can be found on Oracle's Global Trade Compliance web site
located at http://www.oracle.com/products/export/index.html?content.html. You
agree that neither the programs nor any direct product thereof will be exported,
directly, or indirectly, in violation of these laws, or will be used for any
purpose prohibited by these laws including, without limitation, nuclear,
chemical, or biological weapons proliferation.

Disclaimer of Warranty and Exclusive Remedies

THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. WE FURTHER
DISCLAIM ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING WITHOUT LIMITATION, ANY
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
NONINFRINGEMENT.

IN NO EVENT SHALL WE BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE
OR CONSEQUENTIAL DAMAGES, OR DAMAGES FOR LOSS OF PROFITS, REVENUE, DATA OR DATA
USE, INCURRED BY YOU OR ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR
TORT, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. OUR
ENTIRE LIABILITY FOR DAMAGES HEREUNDER SHALL IN NO EVENT EXCEED ONE THOUSAND
DOLLARS (U.S. $1,000).

No Technical Support Our technical support organization will not provide
technical support, phone support, or updates to you for the programs licensed
under this agreement.

Restricted Rights If you distribute a license to the United States government,
the programs, including documentation, shall be considered commercial computer
software and you will place a legend, in addition to applicable copyright
notices, on the documentation, and on the media label, substantially similar to
the following:

NOTICE OF RESTRICTED RIGHTS

"Programs delivered subject to the DOD FAR Supplement are 'commercial computer
software' and use, duplication, and disclosure of the programs, including
documentation, shall be subject to the licensing restrictions set forth in the
applicable Oracle license agreement. Otherwise, programs delivered subject to
the Federal Acquisition Regulations are 'restricted computer software' and use,
duplication, and disclosure of the programs, including documentation, shall be
subject to the restrictions in FAR 52.227-19, Commercial Computer
Software-Restricted Rights (June 1987). Oracle America, Inc., 500 Oracle
Parkway, Redwood City, CA 94065."

End of Agreement You may terminate this agreement by destroying all copies of
the programs. We have the right to terminate your right to use the programs if
you fail to comply with any of the terms of this agreement, in which case you
shall destroy all copies of the programs.

Relationship Between the Parties The relationship between you and us is that of
licensee/licensor. Neither party will represent that it has any authority to
assume or create any obligation, express or implied, on behalf of the other
party, nor to represent the other party as agent, employee, franchisee, or in
any other capacity. Nothing in this agreement shall be construed to limit either
party's right to independently develop or distribute software that is
functionally similar to the other party's products, so long as proprietary
information of the other party is not included in such software.

Open Source "Open Source" software - software available without charge for use,
modification and distribution - is often licensed under terms that require the
user to make the user's modifications to the Open Source software or any
software that the user 'combines' with the Open Source software freely available
in source code form. If you use Open Source software in conjunction with the
programs, you must ensure that your use does not: (i) create, or purport to
create, obligations of us with respect to the Oracle programs; or (ii) grant, or
purport to grant, to any third party any rights to or immunities under our
intellectual property or proprietary rights in the Oracle programs. For example,
you may not develop a software program using an Oracle program and an Open
Source program where such use results in a program file(s) that contains code
from both the Oracle program and the Open Source program (including without
limitation libraries) if the Open Source program is licensed under a license
that requires any "modifications" be made freely available. You also may not
combine the Oracle program with programs licensed under the GNU General Public
License ("GPL") in any manner that could cause, or could be interpreted or
asserted to cause, the Oracle program or any modifications thereto to become
subject to the terms of the GPL.

Entire Agreement You agree that this agreement is the complete agreement for the
programs and licenses, and this agreement supersedes all prior or
contemporaneous agreements or representations. If any term of this agreement is
found to be invalid or unenforceable, the remaining provisions will remain
effective.

Last updated: 01/24/09

Should you have any questions concerning this License Agreement, or if you
desire to contact Oracle for any reason, please write: Oracle America, Inc. 500
Oracle Parkway, Redwood City, CA 94065

Oracle may contact you to ask if you had a satisfactory experience installing
and using this OTN software download.

Sosnoski License

Copyright (c) 2003-2007, Dennis M. Sosnoski
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
 * Neither the name of JiBX nor the names of its contributors may be used
   to endorse or promote products derived from this software without specific
   prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 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 THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Werken License

 Copyright 2003-2006 The Werken Company. All Rights Reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

  * Neither the name of the Jaxen Project nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS 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 THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

ZLib License

Copyright (c) <''year''> <''copyright holders''>

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

   1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.

   2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

   3. This notice may not be removed or altered from any source
   distribution.

Notice: Axis2

=========================================================================
==  NOTICE file corresponding to the section 4 d of                    ==
==  the Apache License, Version 2.0,                                   ==
==  in this case for the Apache Axis2 distribution.                    ==
=========================================================================

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
Portions Copyright 2006 International Business Machines Corp.
Portions Copyright 2005-2007 WSO2, Inc.

This product also includes schemas and specification developed by:
- the W3C consortium (http://www.w3c.org)

This product also includes WS-* schemas developed by International
Business Machines Corporation, Microsoft Corporation, BEA Systems,
TIBCO Software, SAP AG, Sonic Software, and VeriSign

This product also includes a WSDL developed by salesforce.com
- Copyright 1999-2006 salesforce.com, inc.

Portions of the included xmlbeans library were originally based on the following:
- software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

Please read the different LICENSE files present in the lib directory of
this distribution.

Notice: Commons-Dbcp

Apache Commons DBCP
Copyright 2001-2010 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Commons-fileupload

Apache Jakarta Commons FileUpload
Copyright 2002-2006 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Commons-io

Apache Commons IO
Copyright 2002-2012 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Commons-lang

Apache Commons Lang
Copyright 2001-2008 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Commons-pool

Apache Commons Pool
Copyright 2001-2012 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Joda-Time

=============================================================================
= NOTICE file corresponding to section 4d of the Apache License Version 2.0 =
=============================================================================
This product includes software developed by Joda.org (http://www.joda.org/).

Notice: Log4Net

Apache log4net
Copyright 2002-2008 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Logback

Logback LICENSE
---------------

Logback: the reliable, generic, fast and flexible logging framework.
Copyright (C) 1999-2012, QOS.ch. All rights reserved.

This program and the accompanying materials are dual-licensed under
either the terms of the Eclipse Public License v1.0 as published by
the Eclipse Foundation

  or (per the licensee's choosing)

under the terms of the GNU Lesser General Public License version 2.1
as published by the Free Software Foundation.

Notice: mex

=========================================================================
==  NOTICE file corresponding to the section 4 d of                    ==
==  the Apache License, Version 2.0,                                   ==
==  in this case for the Apache Axis2 distribution.                    ==
=========================================================================

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
Portions Copyright 2006 International Business Machines Corp.
Portions Copyright 2005-2007 WSO2, Inc.

This product also includes schemas and specification developed by:
- the W3C consortium (http://www.w3c.org)

This product also includes WS-* schemas developed by International
Business Machines Corporation, Microsoft Corporation, BEA Systems,
TIBCO Software, SAP AG, Sonic Software, and VeriSign

This product also includes a WSDL developed by salesforce.com
- Copyright 1999-2006 salesforce.com, inc.

Portions of the included xmlbeans library were originally based on the following:
- software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

Please read the different LICENSE files present in the lib directory of
this distribution.

Notice: Standard JSTL

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Notice: Xalan

======================================================================================
==  NOTICE file corresponding to the section 4d of the Apache License, Version 2.0, ==
==  in this case for the Apache Xalan distribution.                                 ==
======================================================================================

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Portions of this software was originally based on the following:

 - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
 - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
 - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
 - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the
   Apache Software Foundation and was originally developed at Hewlett Packard Company.

Notice: Xerces

=========================================================================
==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
==  Version 2.0, in this case for the Apache Xerces Java distribution. ==
=========================================================================

Apache Xerces Java
Copyright 1999-2007 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Portions of this software were originally based on the following:
 - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
 - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
 - voluntary contributions made by Paul Eng on behalf of the
   Apache Software Foundation that were originally developed at iClick, Inc.,
   software copyright (c) 1999.