stepheneb-jnlp 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +12 -0
- data/Manifest.txt +1 -0
- data/README.txt +26 -31
- data/Rakefile +19 -4
- data/config/hoe.rb +2 -2
- data/lib/jnlp/jnlp.rb +38 -36
- data/lib/jnlp/otrunk.rb +9 -9
- data/lib/jnlp/version.rb +28 -7
- data/lib/jnlp.rb +5 -0
- data/website/index.html +63 -11
- metadata +1 -1
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 0.0.4 2009-03-30
|
2
|
+
|
3
|
+
* added MavenJnlp class for encapsulating jnlp resources served
|
4
|
+
by a MavenJnlp Java Web Start server.
|
5
|
+
|
6
|
+
* specified a dependency on hpricot v 0.6.164, so far v0.7
|
7
|
+
doesn't support JRUby
|
8
|
+
|
9
|
+
== 0.0.3 2009-02
|
10
|
+
|
11
|
+
* extended OTrunk capability and integration with JRuby
|
12
|
+
|
1
13
|
== 0.0.1 2008-04-14
|
2
14
|
|
3
15
|
* 1 major enhancement:
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -1,48 +1,43 @@
|
|
1
|
-
|
1
|
+
== jnlp
|
2
2
|
|
3
|
-
|
3
|
+
A gem for encapsulating the content and resources referenced by Java Web Start jnlps
|
4
4
|
|
5
|
-
|
5
|
+
Complete rdoc available here: http://rubywebstart.rubyforge.org/jnlp/Jnlp/Jnlp.html
|
6
6
|
|
7
|
-
|
7
|
+
For more information about the structure of Java Web Start see:
|
8
8
|
|
9
|
-
|
9
|
+
http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/contents.html
|
10
10
|
|
11
|
-
|
11
|
+
To create a new Jnlp call Jnlp#new with a string that contains either a local path or a url.
|
12
12
|
|
13
|
-
|
13
|
+
Examples:
|
14
14
|
|
15
|
-
|
15
|
+
Creating a new Jnlp object from a local Java Web Start jnlp file.
|
16
16
|
|
17
|
-
|
17
|
+
j = Jnlp::Jnlp.new("authoring.jnlp")
|
18
18
|
|
19
|
-
|
19
|
+
Creating a new Jnlp object from a Java Web Start jnlp referenced with a url.
|
20
20
|
|
21
|
-
|
21
|
+
j = Jnlp::Jnlp.new("jnlp.concord.org/dev/org/concord/maven-jnlp/otrunk-sensor/otrunk-sensor.jnlp")
|
22
22
|
|
23
|
-
|
23
|
+
Once the Jnlp object is created you can call Jnlp#cache_resources to create a local cache of all the jar and nativelib resources.
|
24
24
|
|
25
|
-
|
25
|
+
The structure of the cache directory and the naming using for the jar and nativelib files is the same as that used by the Java Web Start Download Servlet, see:
|
26
26
|
|
27
|
-
|
27
|
+
http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/downloadservletguide.html
|
28
28
|
|
29
|
-
|
29
|
+
== Building the gem
|
30
30
|
|
31
|
-
|
32
|
-
a copy of this software and associated documentation files (the
|
33
|
-
'Software'), to deal in the Software without restriction, including
|
34
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
35
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
36
|
-
permit persons to whom the Software is furnished to do so, subject to
|
37
|
-
the following conditions:
|
31
|
+
=== First patch Hoe
|
38
32
|
|
39
|
-
|
40
|
-
|
33
|
+
Hoe versions 1.11.0 and 1.11.1 do not work with JRuby.
|
34
|
+
|
35
|
+
To build the gem you will need to apply this patch to Hoe:
|
36
|
+
0001-install_gem-nows-works-with-jruby-also.patch[http://gist.github.com/raw/87670/7bd12ecff3e27dd0a1a1d750b61d4efece372374/0001-install_gem-nows-works-with-jruby-also.patch]
|
37
|
+
|
38
|
+
=== The source code
|
39
|
+
|
40
|
+
The source code for the jnlp gem is on github[http://github.com/stepheneb/jnlp/tree/master].
|
41
|
+
|
42
|
+
git clone git://github.com/stepheneb/jnlp.git
|
41
43
|
|
42
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
43
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
44
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
45
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
46
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
47
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
48
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,4 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'hoe'
|
3
|
+
|
4
|
+
require './lib/jnlp.rb'
|
5
|
+
|
6
|
+
Hoe.new('jnlp', Jnlp::VERSION) do |p|
|
7
|
+
p.rubyforge_name = 'rubywebstart' # if different than lowercase project name
|
8
|
+
p.author = 'Stephen Bannasch'
|
9
|
+
p.email = 'stephen.bannasch@gmail.com'
|
10
|
+
p.url = 'http://rubywebstart.rubyforge.org/jnlp/rdoc/'
|
11
|
+
p.summary = "Ruby tools for working with Java Web Start JNLPs."
|
12
|
+
p.description = "For manipulation of Java Web Start Jnlps and the resources they reference."
|
13
|
+
p.extra_deps << ['hpricot','=0.6.164']
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => :spec
|
17
|
+
Spec::Rake::SpecTask.new do |t|
|
18
|
+
t.spec_files = FileList["spec/**/*_spec.rb"]
|
19
|
+
end
|
data/config/hoe.rb
CHANGED
@@ -4,7 +4,7 @@ AUTHOR = 'Stephen Bannasch' # can also be an array of Authors
|
|
4
4
|
EMAIL = "stephen.bannasch@gmail.com"
|
5
5
|
DESCRIPTION = "For manipulation of Java Web Start Jnlps and the resources they reference."
|
6
6
|
GEM_NAME = 'jnlp' # what ppl will type to install your gem
|
7
|
-
RUBYFORGE_PROJECT = '
|
7
|
+
RUBYFORGE_PROJECT = 'rubywebstart' # The unix name for your project
|
8
8
|
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
9
|
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
10
|
|
@@ -53,8 +53,8 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
53
53
|
p.description = DESCRIPTION
|
54
54
|
p.summary = DESCRIPTION
|
55
55
|
p.url = HOMEPATH
|
56
|
+
p.remote_rdoc_dir = 'jnlp' # Release to root
|
56
57
|
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
57
|
-
p.test_globs = ["test/**/test_*.rb"]
|
58
58
|
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
59
59
|
|
60
60
|
# == Optional
|
data/lib/jnlp/jnlp.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# :title: Jnlp::Jnlp RDoc
|
3
3
|
#
|
4
4
|
# to regenerate and display this rdoc:
|
5
|
-
# rdoc -U -SN jnlp.rb otrunk.rb ; open doc/index.html
|
5
|
+
# rdoc -U -SN jnlp.rb otrunk.rb maven_jnlp.rb; open doc/index.html
|
6
6
|
#
|
7
7
|
require 'rubygems'
|
8
8
|
require 'open-uri'
|
@@ -13,9 +13,9 @@ require 'date'
|
|
13
13
|
|
14
14
|
if RUBY_PLATFORM =~ /java/
|
15
15
|
include Java
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
java_import java.util.jar.JarInputStream unless defined? JarInputStream
|
17
|
+
java_import java.io.FileInputStream unless defined? FileInputStream
|
18
|
+
java_import java.net.URL unless defined? URL
|
19
19
|
end
|
20
20
|
|
21
21
|
unless Net::HTTP::Get.new('/')['User-Agent'] # unless a 'User-Agent' is already defined add one
|
@@ -189,6 +189,13 @@ module Jnlp #:nodoc:
|
|
189
189
|
#
|
190
190
|
# "net/sf/sail/webstart-proxy/jetty-proxy/jetty-proxy.jar"
|
191
191
|
#
|
192
|
+
attr_reader :main
|
193
|
+
#
|
194
|
+
# Contains a boolean that repesents whether the main_class for this
|
195
|
+
# jnlp is contained within this jar.
|
196
|
+
# This attribute is optional in a jnlp and if present should
|
197
|
+
# only be present and set to true on one jar resource in a jnlp.
|
198
|
+
#
|
192
199
|
attr_reader :href
|
193
200
|
#
|
194
201
|
# Contains the url reference to the resource
|
@@ -213,6 +220,14 @@ module Jnlp #:nodoc:
|
|
213
220
|
#
|
214
221
|
# "httpclient__V0.1.0-20071212.220020-17.jar"
|
215
222
|
#
|
223
|
+
attr_reader :suffix
|
224
|
+
#
|
225
|
+
# Contains the suffix of the resource
|
226
|
+
#
|
227
|
+
# Example:
|
228
|
+
#
|
229
|
+
# "__V0.1.0.jar"
|
230
|
+
#
|
216
231
|
attr_reader :filename
|
217
232
|
#
|
218
233
|
# Contains the filename of the gzipped pack200 version of the resource
|
@@ -221,6 +236,14 @@ module Jnlp #:nodoc:
|
|
221
236
|
#
|
222
237
|
# "httpclient__V0.1.0-20071212.220020-17.jar.pack.gz"
|
223
238
|
#
|
239
|
+
attr_reader :filename_pack
|
240
|
+
#
|
241
|
+
# Contains the filename of the pack200 version of the resource
|
242
|
+
#
|
243
|
+
# Example:
|
244
|
+
#
|
245
|
+
# "httpclient__V0.1.0-20071212.220020-17.jar.pack"
|
246
|
+
#
|
224
247
|
attr_reader :filename_pack_gz
|
225
248
|
#
|
226
249
|
# Contains the size of the resource
|
@@ -332,6 +355,7 @@ module Jnlp #:nodoc:
|
|
332
355
|
def initialize(res, codebase, os)
|
333
356
|
@resource = res
|
334
357
|
@kind = res.name
|
358
|
+
@main = res['main'] && res['main'] == 'true'
|
335
359
|
@href = res['href']
|
336
360
|
@href_path = File.dirname(@href)
|
337
361
|
if @href_path == '.'
|
@@ -471,7 +495,7 @@ module Jnlp #:nodoc:
|
|
471
495
|
#
|
472
496
|
# == Jnlp
|
473
497
|
#
|
474
|
-
# A
|
498
|
+
# A gem for encapsulating the content and resources referenced by Java Web Start jnlps
|
475
499
|
#
|
476
500
|
# For more information about the structure of Java Web Start see:
|
477
501
|
# * http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/contents.html
|
@@ -562,37 +586,8 @@ module Jnlp #:nodoc:
|
|
562
586
|
#
|
563
587
|
# Note:
|
564
588
|
#
|
565
|
-
# The
|
566
|
-
#
|
567
|
-
# You can get a version that does work here:
|
568
|
-
#
|
569
|
-
# http://www.telscenter.org/confluence/download/attachments/20236/hpricot-0.6.159-java.gem
|
570
|
-
#
|
571
|
-
# After you download it -- install it like this:
|
572
|
-
#
|
573
|
-
# jruby -S gem install pkg/hpricot-0.6.159-jruby.gem
|
574
|
-
#
|
575
|
-
# FYI: If you need to build it yourself (Nick Sieger's patch still applies
|
576
|
-
# cleanly to the current trunk revision: 161 of Hpricot):
|
577
|
-
#
|
578
|
-
# svn co https://code.whytheluckystiff.net/svn/hpricot/trunk hpricot
|
579
|
-
# cd hpricot
|
580
|
-
# curl http://caldersphere.net/hpricot-0.6.157-jruby-trunk.patch > hpricot-0.6.157-jruby-trunk.patch
|
581
|
-
# patch -p0 -i hpricot-0.6.157-jruby-trunk.patch
|
582
|
-
# jruby -S rake package_jruby
|
583
|
-
#
|
584
|
-
# You'll find the gem here:
|
585
|
-
#
|
586
|
-
# pkg/hpricot-0.6.159-jruby.gem
|
587
|
-
#
|
588
|
-
# If you want to run the tests (there is only one failing test in JRuby Hpricot, C Hpricot has two different failures):
|
589
|
-
#
|
590
|
-
# jruby -S rake hpricot_java
|
591
|
-
# jruby -S rake test
|
592
|
-
#
|
593
|
-
# I reported all this on why's tracker for hpricot:
|
594
|
-
#
|
595
|
-
# https://code.whytheluckystiff.net/hpricot/ticket/131#comment:1
|
589
|
+
# The jnlp gem has a dependency on hpricot version 0.6.164.
|
590
|
+
# The most recent version of hpricot, version 0.7.0 does not yet work with JRuby.
|
596
591
|
#
|
597
592
|
class Jnlp
|
598
593
|
#
|
@@ -846,6 +841,7 @@ module Jnlp #:nodoc:
|
|
846
841
|
@title = (info/"title").inner_html
|
847
842
|
@vendor = (info/"vendor").inner_html
|
848
843
|
@homepage = (info/"homepage").empty? ? '' : (info/"homepage").attr('href')
|
844
|
+
@description = (info/"description").empty? ? '' : (info/"description").inner_html
|
849
845
|
icon = (info/"icon")
|
850
846
|
@icon = Icon.new(icon) unless icon.empty?
|
851
847
|
@offline_allowed = (info/"offline-allowed") ? true : false
|
@@ -956,6 +952,9 @@ module Jnlp #:nodoc:
|
|
956
952
|
cp_jars = @jars.collect {|j| j.local_path}
|
957
953
|
cp_nativelibs = @nativelibs.collect {|n| n.local_path}
|
958
954
|
resources = cp_jars + cp_nativelibs
|
955
|
+
#
|
956
|
+
# FIXME: this should probably be more discriminatory
|
957
|
+
#
|
959
958
|
if options[:remove_jruby]
|
960
959
|
resources = resources.reject {|r| r =~ /\/jruby\//}
|
961
960
|
end
|
@@ -1037,6 +1036,9 @@ module Jnlp #:nodoc:
|
|
1037
1036
|
#
|
1038
1037
|
# This will add all the jars for this jnlp to the effective
|
1039
1038
|
# classpath for this Java process.
|
1039
|
+
#
|
1040
|
+
# *If* you are already running in JRuby *AND* the jnlp references a
|
1041
|
+
# JRuby resource the JRuby resource will not be required.
|
1040
1042
|
#
|
1041
1043
|
def require_resources
|
1042
1044
|
if RUBY_PLATFORM =~ /java/
|
data/lib/jnlp/otrunk.rb
CHANGED
@@ -11,12 +11,12 @@ require 'net/http'
|
|
11
11
|
require 'date'
|
12
12
|
|
13
13
|
if RUBY_PLATFORM =~ /java/
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
java_import java.util.jar.JarInputStream unless defined? JarInputStream
|
15
|
+
java_import java.io.FileInputStream unless defined? FileInputStream
|
16
|
+
java_import java.net.URL unless defined? URL
|
17
|
+
java_import java.util.Collection unless defined? Collection
|
18
|
+
java_import java.util.List unless defined? List
|
19
|
+
java_import java.util.ArrayList unless defined? ArrayList
|
20
20
|
#
|
21
21
|
# Used to refer to Java classes in the java.io package.
|
22
22
|
# Some of the class names in the java.io package have the
|
@@ -87,9 +87,9 @@ module Jnlp #:nodoc:
|
|
87
87
|
#
|
88
88
|
require "#{File.expand_path(File.dirname(__FILE__))}/jnlp.rb"
|
89
89
|
#
|
90
|
-
# Jnlp::Otrunk is a subclass of Jnlp::Jnlp that adds SAIL
|
91
|
-
#
|
92
|
-
#
|
90
|
+
# Jnlp::Otrunk is a subclass of Jnlp::Jnlp that adds SAIL-Otrunk[https://confluence.concord.org/display/CSP/OTrunk]
|
91
|
+
# specific methods for execution.of the jnlp locally without
|
92
|
+
# using Java Web Start.
|
93
93
|
#
|
94
94
|
# It assumes a default main-class of:
|
95
95
|
#
|
data/lib/jnlp/version.rb
CHANGED
@@ -1,9 +1,30 @@
|
|
1
1
|
module Jnlp #:nodoc:
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
VERSION = '0.0.5'
|
3
|
+
#
|
4
|
+
# Let's see if this patch:
|
5
|
+
#
|
6
|
+
# http://rubyforge.org/tracker/index.php?func=detail&aid=24392&group_id=126&atid=577
|
7
|
+
#
|
8
|
+
# makes it into RubyGems -- it has been applied.
|
9
|
+
# Will probably be part of 1.3.2.
|
10
|
+
#
|
11
|
+
# then I can start using this form again:
|
12
|
+
#
|
13
|
+
# module VERSION
|
14
|
+
# MAJOR = 0
|
15
|
+
# MINOR = 0
|
16
|
+
# TINY = 4
|
17
|
+
#
|
18
|
+
# STRING = [MAJOR, MINOR, TINY].join('.')
|
19
|
+
#
|
20
|
+
# class << self
|
21
|
+
# def to_s
|
22
|
+
# STRING
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# def ==(arg)
|
26
|
+
# STRING == arg
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end
|
9
30
|
end
|
data/lib/jnlp.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
gem 'hpricot', '=0.6.164'
|
7
|
+
|
4
8
|
module Jnlp
|
5
9
|
require 'jnlp/jnlp.rb'
|
6
10
|
require 'jnlp/otrunk.rb'
|
11
|
+
require 'jnlp/maven_jnlp.rb'
|
7
12
|
require 'jnlp/version.rb'
|
8
13
|
end
|
data/website/index.html
CHANGED
@@ -1,11 +1,63 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
7
|
+
<title>
|
8
|
+
jnlp
|
9
|
+
</title>
|
10
|
+
<script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
|
11
|
+
<style>
|
12
|
+
|
13
|
+
</style>
|
14
|
+
<script type="text/javascript">
|
15
|
+
window.onload = function() {
|
16
|
+
settings = {
|
17
|
+
tl: { radius: 10 },
|
18
|
+
tr: { radius: 10 },
|
19
|
+
bl: { radius: 10 },
|
20
|
+
br: { radius: 10 },
|
21
|
+
antiAlias: true,
|
22
|
+
autoPad: true,
|
23
|
+
validTags: ["div"]
|
24
|
+
}
|
25
|
+
var versionBox = new curvyCorners(settings, document.getElementById("version"));
|
26
|
+
versionBox.applyCornersToAll();
|
27
|
+
}
|
28
|
+
</script>
|
29
|
+
</head>
|
30
|
+
<body>
|
31
|
+
<div id="main">
|
32
|
+
|
33
|
+
<h1>jnlp</h1>
|
34
|
+
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/jnlp"; return false'>
|
35
|
+
<p>Get Version</p>
|
36
|
+
<a href="http://rubyforge.org/projects/jnlp" class="numbers">0.0.3</a>
|
37
|
+
</div>
|
38
|
+
<h1>&#x2192; ‘jnlp’</h1>
|
39
|
+
<h2>What</h2>
|
40
|
+
<h2>Installing</h2>
|
41
|
+
<p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">jnlp</span></pre></p>
|
42
|
+
<h2>The basics</h2>
|
43
|
+
<h2>Demonstration of usage</h2>
|
44
|
+
<h2>Forum</h2>
|
45
|
+
<p><a href="http://groups.google.com/group/jnlp">http://groups.google.com/group/jnlp</a></p>
|
46
|
+
<p><span class="caps">TODO</span> – create Google Group – jnlp</p>
|
47
|
+
<h2>How to submit patches</h2>
|
48
|
+
<p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people’s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
|
49
|
+
<p>The trunk repository is <code>svn://rubyforge.org/var/svn/jnlp/trunk</code> for anonymous access.</p>
|
50
|
+
<h2>License</h2>
|
51
|
+
<p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
|
52
|
+
<h2>Contact</h2>
|
53
|
+
<p>Comments are welcome. Send an email to <a href="mailto:FIXME"><span class="caps">FIXME</span> full name</a> email via the <a href="http://groups.google.com/group/jnlp">forum</a></p>
|
54
|
+
<p class="coda">
|
55
|
+
<a href="FIXME email">FIXME full name</a>, 12th May 2008<br>
|
56
|
+
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
57
|
+
</p>
|
58
|
+
</div>
|
59
|
+
|
60
|
+
<!-- insert site tracking codes here, like Google Urchin -->
|
61
|
+
|
62
|
+
</body>
|
63
|
+
</html>
|