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


  
  This distribution contains third party resources requiring the following notices:

    
  For 
    jquery.js
  

        jQuery JavaScript Library v1.3.2
        http://jquery.com/
        
        Copyright (c) 2009 John Resig
        Dual licensed under the MIT and GPL licenses.
        http://docs.jquery.com/License
        
        Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
        Revision: 6246

    
  For 
    jquery.js
  

        jQuery JavaScript Library v1.6.4
        http://jquery.com/
        
        Copyright 2011, John Resig
        Dual licensed under the MIT or GPL Version 2 licenses.
        http://jquery.org/license
        
        Includes Sizzle.js
        http://sizzlejs.com/
        Copyright 2011, The Dojo Foundation
        Released under the MIT, BSD, and GPL Licenses.
        
        Date: Mon Sep 12 18:54:48 2011 -0400

    
  For 
    jquery.md5.js
  

        jQuery MD5 Plugin 1.2.1
        https://github.com/blueimp/jQuery-MD5
        
        Copyright 2010, Sebastian Tschan
        https://blueimp.net
        
        Licensed under the MIT license:
        http://creativecommons.org/licenses/MIT/
        
        Based on
        A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
        Digest Algorithm, as defined in RFC 1321.
        Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
        Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
        Distributed under the BSD License
        See http://pajhome.org.uk/crypt/md5 for more info.

    
  For 
    jquery.colorhelpers.js
  

        Plugin for jQuery for working with colors.
        
        Version 1.1.
        
        Inspiration from jQuery color animation plugin by John Resig.
        
        Released under the MIT license by Ole Laursen, October 2009.
