Apache Shindig
Copyright 2009 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

-----------------------------------------------------------

This product includes software (Gadget Server, Gadget Container)
originally developed by Google Inc. (http://code.google.com/) and licensed
to the ASF as initial contribution for Shindig.

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This product includes other softwares depending to the implementations, 
refer to the other NOTICE files in the sub directories.
