markio 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/README.md CHANGED
@@ -21,9 +21,12 @@ Or install it yourself as:
21
21
 
22
22
  bookmarks = Markio::parse('/path/to/bookmarks.html')
23
23
  bookmarks.each do |b|
24
- b.title # String with bookmark title
25
- b.href # String with bookmark URL
26
- b.folders # Array of strings - folders (tags)
24
+ b.title # String
25
+ b.href # String with bookmark URL
26
+ b.folders # Array of strings - folders (tags)
27
+ b.add_date # DateTime
28
+ b.last_visit # DateTime
29
+ b.last_modified # DateTime
27
30
  end
28
31
 
29
32
  ## Contributing
@@ -1,9 +1,9 @@
1
1
  require "markio/version"
2
2
  require "markio/bookmark"
3
3
  require "markio/parser"
4
+ require "markio/builder"
4
5
  module Markio
5
- def Markio.parse(file)
6
- parser = Markio::Parser.new file
7
- parser.parse
6
+ def self.parse(data)
7
+ Parser.new(data).parse
8
8
  end
9
9
  end
@@ -1,3 +1,22 @@
1
+ require 'date'
1
2
  class Markio::Bookmark
3
+
2
4
  attr_accessor :title, :href, :add_date, :last_visit, :last_modified, :folders
3
- end
5
+
6
+ def self.create data
7
+ bookmark = new
8
+ bookmark.title = data[:title]
9
+ bookmark.href = data[:href]
10
+ bookmark.add_date = data[:add_date] || DateTime.now
11
+ bookmark.last_visit = data[:add_date]
12
+ bookmark.last_modified = data[:last_modified]
13
+ bookmark.folders = data[:folders] || []
14
+ bookmark
15
+ end
16
+
17
+ def == other
18
+ unless other.nil? or other.class != self.class
19
+ other.href == href
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ require 'nokogiri'
2
+
3
+ class Markio::Builder
4
+
5
+ attr_accessor :bookmarks
6
+
7
+ def initialize(options = {})
8
+ @title = options[:title] || 'Bookmarks'
9
+ @bookmarks = []
10
+ end
11
+
12
+ def build_string
13
+ build
14
+ end
15
+
16
+ def build_file(file)
17
+ File.new(file, 'w') do |f|
18
+ f.write build
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def build
25
+
26
+ docparts = Nokogiri::HTML::DocumentFragment.parse ''
27
+ Nokogiri::HTML::Builder.with(docparts) do |html|
28
+ html.comment <<END
29
+ This is an automatically generated file.
30
+ It will be read and overwritten.
31
+ DO NOT EDIT!
32
+ END
33
+ html.meta('HTTP-EQUIV' => 'Content-Type', 'CONTENT' => 'text/html; charset=UTF-8')
34
+ html.title @title
35
+ html.dl {
36
+ html.p
37
+ @bookmarks.each do |b|
38
+ html.dt {
39
+ params = { :href => b.href }
40
+ params[:add_date] = b.add_date.to_time.to_i if b.add_date
41
+ params[:last_visit] = b.last_visit.to_time.to_i if b.last_visit
42
+ params[:last_modified] = b.last_modified.to_time.to_i if b.last_modified
43
+ html.a(b.title, params)
44
+ }
45
+ end
46
+ }
47
+ end
48
+
49
+ "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" << docparts.to_html
50
+ end
51
+ end
@@ -1,58 +1,59 @@
1
1
  require 'nokogiri'
2
2
  require 'date'
3
- class Markio::Parser
3
+ module Markio
4
+ class Parser
4
5
 
5
- def initialize(file)
6
- file = File.open(file) unless file.is_a? File
7
- @document = Nokogiri::HTML(file)
8
- end
6
+ def initialize data
7
+ @document = Nokogiri::HTML data
8
+ end
9
9
 
10
- def parse
11
- bookmarks = []
12
- traverse(@document, []) do |bookmark|
13
- bookmarks << bookmark
10
+ def parse
11
+ bookmarks = []
12
+ traverse(@document, []) do |bookmark|
13
+ bookmarks << bookmark
14
+ end
15
+ bookmarks
14
16
  end
15
- bookmarks
16
- end
17
17
 
18
- private
19
-
20
- def traverse(node, folders, &block)
21
- node.xpath("./*").each do |child|
22
- case child.name.downcase
23
- when 'dl'
24
- traverse child, folders, &block
25
- folders.pop
26
- when 'a'
27
- yield parse_bookmark(child, folders)
28
- when 'h3'
29
- folders << child.text
30
- else
31
- if child.children.any?
18
+ private
19
+
20
+ def traverse node, folders, &block
21
+ node.xpath("./*").each do |child|
22
+ case child.name.downcase
23
+ when 'dl'
32
24
  traverse child, folders, &block
33
- end
25
+ folders.pop
26
+ when 'a'
27
+ yield parse_bookmark(child, folders)
28
+ when 'h3'
29
+ folders << child.text
30
+ else
31
+ if child.children.any?
32
+ traverse child, folders, &block
33
+ end
34
+ end
34
35
  end
36
+
35
37
  end
36
38
 
37
- end
39
+ def parse_bookmark(node, folders)
40
+ data = {}
41
+ node.attributes.each do |k, a|
42
+ data[k.downcase] = a.value
43
+ end
44
+ bookmark = Bookmark.new
45
+ bookmark.href = data['href']
46
+ bookmark.title = node.text
47
+ bookmark.folders = Array.new folders
48
+ bookmark.add_date = parse_timestamp data['add_date']
49
+ bookmark.last_visit = parse_timestamp data['last_visit']
50
+ bookmark.last_modified = parse_timestamp data['last_modified']
51
+ bookmark
52
+ end
38
53
 
39
- def parse_bookmark(node, folders)
40
- data = {}
41
- node.attributes.each do |k, a|
42
- data[k.downcase] = a.value
54
+ def parse_timestamp(timestamp)
55
+ Time.at(timestamp.to_i).to_datetime if timestamp
43
56
  end
44
- bookmark = Markio::Bookmark.new
45
- bookmark.href = data['href']
46
- bookmark.title = node.text
47
- bookmark.folders = Array.new folders
48
- bookmark.add_date = parse_timestamp data['add_date']
49
- bookmark.last_visit = parse_timestamp data['last_visit']
50
- bookmark.last_modified = parse_timestamp data['last_modified']
51
- bookmark
52
- end
53
57
 
54
- def parse_timestamp(timestamp)
55
- Time.at(timestamp.to_i).to_datetime if timestamp
56
58
  end
57
-
58
59
  end
@@ -1,3 +1,3 @@
1
1
  module Markio
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -20,5 +20,6 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'nokogiri'
21
21
  gem.add_development_dependency 'rspec', '~> 2.11'
22
22
  gem.add_development_dependency 'pry-nav'
23
+ gem.add_development_dependency 'guard-rspec'
23
24
 
24
25
  end
@@ -0,0 +1,11 @@
1
+ This archive contains a snapshot release of MacVim 7.3. It requires
2
+ Mac OS X 10.8 (Mountain Lion) or later. It will NOT run on earlier versions of
3
+ Mac OS X!
4
+
5
+ To install, drag the MacVim icon into the Applications folder.
6
+
7
+ For usage instructions, please start MacVim and type ":h macvim" (without the
8
+ quotes).
9
+
10
+ This archive also contains the script "mvim" which can be used to start MacVim
11
+ from Terminal. Type ":h mvim" in MacVim for help on how to install it.
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+
4
+ module Markio
5
+ describe Builder do
6
+ it 'should build empty bookmarks' do
7
+ builder = Builder.new
8
+ file_contents = builder.build_string
9
+ file_contents.length.should_not be_nil
10
+ file_contents.should match "DOCTYPE NETSCAPE-Bookmark-file-1"
11
+ end
12
+
13
+ it 'should build single bookmark without tags' do
14
+ builder = Builder.new
15
+ builder.bookmarks << Bookmark.create({
16
+ :title => "Test bookmark",
17
+ :href => "http://test.com",
18
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
19
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
20
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
21
+ })
22
+ file_contents = builder.build_string
23
+ file_contents.length.should_not be_nil
24
+ file_contents.should match "Test bookmark"
25
+ file_contents.should match "test\.com"
26
+ file_contents.should match "add_date"
27
+ file_contents.should match "last_visit"
28
+ file_contents.should match "last_modified"
29
+ end
30
+
31
+
32
+ it 'should be able to parse what it builds' do
33
+ builder = Builder.new
34
+ builder.bookmarks << Bookmark.create({
35
+ :title => "Test bookmark",
36
+ :href => "http://test.com"
37
+ })
38
+ builder.bookmarks << Bookmark.create({
39
+ :title => "Test bookmark",
40
+ :href => "http://test.com",
41
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
42
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
43
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
44
+ })
45
+ file_contents = builder.build_string
46
+ bookmarks = Markio.parse file_contents
47
+ bookmarks.length.should eq builder.bookmarks.length
48
+ bookmarks.each do |b|
49
+ builder.bookmarks.should include b
50
+ end
51
+ end
52
+
53
+ it 'should be reflexive' do
54
+ builder = Builder.new
55
+ builder.bookmarks << Bookmark.create({
56
+ :title => "Test bookmark",
57
+ :href => "http://test.com"
58
+ })
59
+ builder.bookmarks << Bookmark.create({
60
+ :title => "Test bookmark",
61
+ :href => "http://test.com",
62
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
63
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
64
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
65
+ })
66
+ file_contents = builder.build_string
67
+ bookmarks = Markio.parse file_contents
68
+ builder = Builder.new
69
+ builder.bookmarks = bookmarks
70
+ builder.build_string.should eq file_contents
71
+ end
72
+ end
73
+ end
@@ -1,38 +1,49 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'parser' do
4
- it 'should parse single bookmark' do
5
- bookmarks = Markio.parse("spec/test_data/one_bookmark.html")
6
-
7
- bookmarks.should_not be_nil
8
- bookmarks.class.should be Array
9
- bookmarks.length.should eq 1
10
- bookmark = bookmarks[0]
11
- bookmark.title.should eq 'Save It - Simple, secure bookmarks'
12
- bookmark.href.should eq 'https://saveit.in/'
13
- bookmark.folders.length.should eq 0
14
- bookmark.add_date.should_not be_nil
15
- bookmark.last_visit.should_not be_nil
16
- bookmark.last_modified.should_not be_nil
17
- bookmark.add_date.class.should be DateTime
18
- bookmark.last_visit.class.should be DateTime
19
- bookmark.last_modified.class.should be DateTime
20
- end
3
+ module Markio
4
+ describe Parser do
5
+ it 'should parse single bookmark' do
6
+ bookmarks = Markio.parse File.open "spec/assets/one_bookmark.html"
21
7
 
22
- it 'should parse multiple bookmarks' do
23
- bookmarks = Markio.parse("spec/test_data/many_bookmarks.html")
24
- bookmarks.length.should eq 11
25
- bookmarks.first.folders.length.should eq 1
26
- bookmarks.first.folders.first.should eq "Bookmarks Bar"
27
- bookmarks.last.folders.length.should eq 2
28
- end
8
+ bookmarks.should_not be_nil
9
+ bookmarks.class.should be Array
10
+ bookmarks.length.should eq 1
11
+ bookmark = bookmarks[0]
12
+ bookmark.title.should eq 'Save It - Simple, secure bookmarks'
13
+ bookmark.href.should eq 'https://saveit.in/'
14
+ bookmark.folders.length.should eq 0
15
+ bookmark.add_date.should_not be_nil
16
+ bookmark.last_visit.should_not be_nil
17
+ bookmark.last_modified.should_not be_nil
18
+ bookmark.add_date.class.should be DateTime
19
+ bookmark.last_visit.class.should be DateTime
20
+ bookmark.last_modified.class.should be DateTime
21
+ end
29
22
 
30
- it 'should parse nested bookmarks' do
31
- bookmarks = Markio.parse("spec/test_data/nested_bookmarks.html")
23
+ it 'should parse multiple bookmarks' do
24
+ bookmarks = Markio.parse File.open "spec/assets/many_bookmarks.html"
25
+ bookmarks.length.should eq 11
26
+ bookmarks.first.folders.length.should eq 1
27
+ bookmarks.first.folders.first.should eq "Bookmarks Bar"
28
+ bookmarks.last.folders.length.should eq 2
29
+ end
32
30
 
33
- bookmarks.length.should eq 10
34
- bookmarks.first.folders.length.should eq 0
35
- bookmarks.last.folders.length.should eq 2
36
- end
31
+ it 'should parse nested bookmarks' do
32
+ bookmarks = Markio.parse File.open "spec/assets/nested_bookmarks.html"
33
+
34
+ bookmarks.length.should eq 10
35
+ bookmarks.first.folders.length.should eq 0
36
+ bookmarks.last.folders.length.should eq 2
37
+ end
37
38
 
38
- end
39
+ it 'should raise error for non existing files' do
40
+ expect { Markio.parse File.open "spec/assets/not_found.html" }.to raise_error
41
+ end
42
+
43
+ it 'should handle corrupted data' do
44
+ bookmarks = Markio.parse File.open "spec/assets/corrupted.html"
45
+ bookmarks.should eq []
46
+ end
47
+
48
+ end
49
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-23 00:00:00.000000000 Z
12
+ date: 2012-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  description: Import/export utility for Netscape Bookmark Format
63
79
  email:
64
80
  - tomas.varaneckas@gmail.com
@@ -68,20 +84,23 @@ extra_rdoc_files: []
68
84
  files:
69
85
  - .gitignore
70
86
  - Gemfile
87
+ - Guardfile
71
88
  - LICENSE.txt
72
89
  - README.md
73
90
  - Rakefile
74
91
  - lib/markio.rb
75
92
  - lib/markio/bookmark.rb
93
+ - lib/markio/builder.rb
76
94
  - lib/markio/parser.rb
77
95
  - lib/markio/version.rb
78
96
  - markio.gemspec
97
+ - spec/assets/corrupted.html
98
+ - spec/assets/many_bookmarks.html
99
+ - spec/assets/nested_bookmarks.html
100
+ - spec/assets/one_bookmark.html
101
+ - spec/builder_spec.rb
79
102
  - spec/parser_spec.rb
80
103
  - spec/spec_helper.rb
81
- - spec/test_data/many_bookmarks.html
82
- - spec/test_data/many_bookmarks2.html
83
- - spec/test_data/nested_bookmarks.html
84
- - spec/test_data/one_bookmark.html
85
104
  homepage: ''
86
105
  licenses: []
87
106
  post_install_message:
@@ -107,10 +126,10 @@ signing_key:
107
126
  specification_version: 3
108
127
  summary: Import/export utility for Netscape Bookmark Format
109
128
  test_files:
129
+ - spec/assets/corrupted.html
130
+ - spec/assets/many_bookmarks.html
131
+ - spec/assets/nested_bookmarks.html
132
+ - spec/assets/one_bookmark.html
133
+ - spec/builder_spec.rb
110
134
  - spec/parser_spec.rb
111
135
  - spec/spec_helper.rb
112
- - spec/test_data/many_bookmarks.html
113
- - spec/test_data/many_bookmarks2.html
114
- - spec/test_data/nested_bookmarks.html
115
- - spec/test_data/one_bookmark.html
116
- has_rdoc:
@@ -1,30 +0,0 @@
1
- <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
- <!-- This is an automatically generated file.
3
- It will be read and overwritten.
4
- DO NOT EDIT! -->
5
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
6
- <TITLE>Bookmarks</TITLE>
7
- <H1>Bookmarks</H1>
8
- <DL><p>
9
- <DT><H3 ADD_DATE="1350296505" LAST_MODIFIED="1350743233" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Bar</H3>
10
- <DL><p>
11
- <DT><A HREF="javascript:var%20d%3Ddocument,w%3Dwindow,e%3Dw.getSelection,k%3Dd.getSelection,x%3Dd.selection,s%3D(e%3Fe():(k)%3Fk():(x%3Fx.createRange().text:0)),f%3D%27http://www.tumblr.com/share%27,l%3Dd.location,e%3DencodeURIComponent,p%3D%27%3Fv%3D3%26u%3D%27%2Be(l.href)%20%2B%27%26t%3D%27%2Be(d.title)%20%2B%27%26s%3D%27%2Be(s),u%3Df%2Bp%3Btry%7Bif(!/%5E(.*%5C.)%3Ftumblr%5B%5E.%5D*%24/.test(l.host))throw(0)%3Btstbklt()%3B%7Dcatch(z)%7Ba%20%3Dfunction()%7Bif(!w.open(u,%27t%27,%27toolbar%3D0,resizable%3D0,status%3D1,width%3D450,height%3D430%27))l.href%3Du%3B%7D%3Bif(/Firefox/.test(navigator.userAgent))setTimeout(a,0)%3Belse%20a()%3B%7Dvoid(0)" ADD_DATE="1350296576">Share on Tumblr</A>
12
- <DT><A HREF="http://192.168.0.111:5000/webman/index.cgi" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHUlEQVQ4jWM8f/+9w5rTL+qvPfniwEAC0JLhORBiKtHIsvLE0/qrjz+TpJmBgYHh0oMPDn///mVg9Gw7/J9UzciA5e+fP5ToZ2D5Q6EBDHbV2/8jA7vq7f/tqrf/P3zpGYoYjI9M21Vv/88Ec4F1xRYG64otDAdbPBj+/PnDYKMrCRdD5iPTf/78YYAb8OfPHwZk9pHLzxmOdvgwdEYbo4ij0/BARA7Mv3/+MBTMPcrAwMDAcGZCCAO6GmQaHohnJoQwMDAwMBjkrGBgYGBguDAlgoGBgYHhyOXnKDbC5GF8Ru30xZSlA0qjkeXP3wFOSEwmKuIH/v75w0AONlERP8A8a3LHw4cvPik8evVB4d+/fwzEYjN1qQNFocaNAHb5GMnZ0/wiAAAAAElFTkSuQmCC">Synology DiskStation - DiskStation</A>
13
- <DT><A HREF="http://www.ruby-doc.org/core-1.9.3/" ADD_DATE="1350572675" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAGXIcUm9AAAAWNJREFUOBFsj8tKAlEYx49d3IUIgV1HnRkv44yXoJ2P4Cv0Cr1CCO2CWrjpGRJaRENlkWREELQp6GZJSRCWYOaoM9rUv3OmTLssPr5z+/3+3yEAyJ8iZJCdaSFhFtMKai5HFcspGHeFhPU2ne7vMP/BA+yyHhJnEAugHg3qtYlh6PNzOs5O0VxdiVtwMtnH+k8BIZa5ofAJBmuyoGuxIF7GnGilltA+PjKwn0UroypfE9i6AkIsY00W4layLOp0jeaUhHuXA5XFBSB/CSOz0UYuC31nnetOQIiNbTRJUBClY8uiweCGIqIUDeJ8yA5NXQPKT3g9yKG1s2VidxtQVef3BBWZ5xDxQ1PEdgd+lHhc+d0oBjw45Mex6R6x6sLHmaWgF0WO+xRUw5zzLeyjsGAyuE6TyyEeeQoXKNxb1/TsWebN94gPjCOQiZ2msmRYf6b9QfJizzOKE3ESt1Rw0yP6LfgAAAD//2YravMAAAC6SURBVKWROwvCQBCEr7K3VYx5Bz3jr7ay8Ef4QO1EOQOaYCuI+IpddNyVBBQDGiyWgePmu9k5ASlKl5aNs7RwJd02DPSNCiZmFUPSuV3DxtMRunVEpGvSgzSTe9vB0dfKggGZedc0MUjNYwLwMGSRQiKvng+I6eU9mflyZnxVPleO9kyyykvwDZAlCQgSuvrnCr8AGDKiJEuCnKT13gGXWGys5OanJapZt6CZfozMsa0hmHYglOrhn3kAF/hUdfHDKLMAAAAASUVORK5CYII=">Index of Classes &amp; Methods in Ruby 1.9.3 (Ruby 1.9.3)</A>
14
- <DT><A HREF="http://guides.rubyonrails.org/" ADD_DATE="1350296576">Ruby on Rails Guides</A>
15
- <DT><A HREF="http://lvh.me:3000/" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACyklEQVQ4jXWSXWxUVRSFv3vOvXc6w51pO1MoSVtwqs1ghYgOf33QIBISjY0RMglNADUaEx9IlMTEmJiY+KZvAkr4DQQEBKTA9KGJRJ4wUh8I1hZTIBOorUpT4rSdzs+9Z/tQmUwK7mQle5+TtdbeZx+oicPdbNj7Kitrzz7rIn62x90mIhb/FxnQv79PVj5Fyp9Q+OoVOgG+WM/iPz/khnzZJtld6czjuBpgx0baup9it2WhtIXT4rH6+WbGty7nXFMslCLWQqvnv9zxZOexCwO56VoBBfDxD9ztvcm7QUAZA60ea7YtJ9sYIokTg8DgWmZB2Ew3PbYDgO+GuZ6M8fPKZrZXby0FkSZQmr6R0ptb9v12eb6Aqi3qFB4GqrDcOQ/fZ6FjngW4+dET50+/0/Fi1eNhcvI13sgs45S2cKuKoShEEnO5CKNT8lNrTHVNlczYwSGzYteZ0UkNcK6bt7Z0cFxbOAhUYYdBOWAMiBBzpA1jCCmJuhLU7x+Y7rMzoFct4j0FGjNnFghlbeFiAN9/ZHUVQ3HoL+sQgB4CaShzekmcdY0hkggcGOSFgXG+6VwY2uwqK4Ix1KL/dmVn5sz9i9UtXLlPOV7hlONSdy/P1c19HOnLMf5ScoG0e8GmWvJU0R9fcfCfnkcecX799XrWbl0WOtEYcdrnj3Dtb7Nn7fHCzocEC1DpdFq5rmvPzMyoVH0hcvKZW6Patl20PTd3YGYHH6je55royZcYq99XbAGw0+m0bdt22PO8cBAE4Wg0WvfAGCf7x9iJ11uLbyMBAEdGIh98b607+3nlx+JInux/f8joVCrlKqViQIPrugkRaRaR9l+CpbMT+aLdFcsn+8fqvj1QWnMUMJdnl17qvSPDk5OTBhCdSCQsz/MolUqilKporYsikgcmbsmi4V8n/GtZ/+mjvqh8oVAoViqVUjwe93O5nAH4F06pHMB3vhJeAAAAAElFTkSuQmCC">lvh.me:3000</A>
16
- <DT><A HREF="javascript:function%20bm_add_newphsvuf2h()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27https://saveit.in/%27)%3B%7Ds.setAttribute(%27src%27,%27https://saveit.in/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27https://saveit.in/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_newphsvuf2h()%3B" ADD_DATE="1350296576">Save It</A>
17
- <DT><A HREF="javascript:function%20bm_add_new3nrzr6u4()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27http://dev.saveit.in:3000/%27)%3B%7Ds.setAttribute(%27src%27,%27http://dev.saveit.in:3000/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27http://dev.saveit.in:3000/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_new3nrzr6u4()%3B" ADD_DATE="1350296576">Save It Dev</A>
18
- <DT><A HREF="http://localhost:3000/member/general/register_step2?confirmation=k13bpG6Q6Tj0b4oV2wMY&external_login_type=2&utm_campaign=login&utm_medium=login&utm_source=mojeid" ADD_DATE="1350487106" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAI+peJuewAAAgpJREFUOBE8T89P0nEY/nqq/8Brrrp76NKhrWamM8fqq5UidbBNEjHRaIiooWAxhCQCayPHb2JqwFdTFFs2I2urnPMgm2aSIEKJOIoYPz7vG3Lo2Z4fh+d9t4dCRAopqqTohVw29Kn0nGW5qo8nFm7X1jPxa5zPscvsUErcmnjnF/8ov0/7TvGrWUf9Akr+H0fc3ZeiUa1jJaBf+7hhjGuN/ZnBZgFo2iSgbhGBStALNuso8b4YyS+Zn+2HnHZ+8cmRBFnspkN+K2ZDTxBzetwNKpBWcLCyR4gNopECVXhdY8F25zz+dDF5nPNi8qUjG+JyT1PbJ84fD11tXI7XNGFY3JKJ7w2True34cxdGnTMGNbyu0Bn9oDy/Regx33wyOODhJvJpe5JMXiBZlNRYW9ZTCLdSPTLICl5QBbscnJR1Qd1aimsh7/D9IdF2InE0OR0oUAsg84BNfj1Qzkib4aQiNNBHbrdJ/9OuTcz3nlMMSYSdvGIeOIVueV8g1sHSVKYWMQElweK8rNoarwCkfXBLHxtw9+eGxKKZWBKVyfdazjL4J/pjjzM0rDyuhvYjhkcnpyCxYU5sNosIKmqIbqKagi87YF0WpfDsBzTTIOUorTtxzrNM/5vTiXu2+tzu/abGDXSaLQ+Rr19HJ+qlMQwZsC6ikpik90hO3ujuLmlyf06MGBg9eHAPwAAAP//y9NkNgAAAcNJREFUY/j//z9DY3fTlkPtcf+nuHv9meji8m9+dNS/D/du/n/z5s2/27du/vv39++/ZWuW/vNozPmXv2Hnv5zVm3+Xbt//f9KGeY0MIANer4nr/r8/6f+KWO/ffS7+/x9duvLvH1Di18+fQPL//39A3ref3//H9BT+95vQ+y9m9ZHfM7Ys/v9xXSTEgI+bYiL/HUj+/3xRxK+HF07/BetCIv6Cjfv/f+uJ3f/MSyP/Zy1b8uv9vqK/vzcE14FdMHNZg0jn6rn3Jm1b8//IgkV/1mw7+Hvhht2/r99+8OfX799/vn3+/Pffnz///vz/+789JenvjpK4H//f9f5/dbshiYGB4T8j0DIGna03TDp65x997Bv+d2JK6f+goo7/qbUT/9dvP/q/fvmm/6tKK/+cXLX63/Gc4v9fg+L+v15Z8+zi/25FsAtABoAxAwPnt8BQy3Px2XnJJW3dMR0zFsYt2XQwds2uB8XVbf9nmNv+veEb9up1ZOKM2xZBRiA9cAOADLBL4IbBDAXSuedui6Z3Tp5zobzm/5fWjj3IauAGwAUZGJj+NzQwNQAxAxDDxYEG7Sgqyn65avlSoDxLA0gdUAwAHdC5thMbc+wAAAAASUVORK5CYII=">http://localhost:3000/member/general/register_step2?confirmation=k13bpG6Q6Tj0b4oV2wMY&amp;external_login_type=2&amp;utm_campaign=login&amp;utm_medium=login&amp;utm_source=mojeid</A>
19
- <DT><A HREF="javascript:(function()%7Bf%3D%27http://www.delicious.com/save%3Furl%3D%27%2BencodeURIComponent(window.location.href)%2B%27%26title%3D%27%2BencodeURIComponent(document.title)%2B%27%26notes%3D%27%2BencodeURIComponent(%27%27%2B(window.getSelection%3Fwindow.getSelection():document.getSelection%3Fdocument.getSelection():document.selection.createRange().text))%2B%27%26v%3D6%26%27%3Ba%3Dfunction()%7Bif(!window.open(f%2B%27noui%3D1%26jump%3Ddoclose%27,%27deliciousuiv6%27,%27location%3D1,links%3D0,scrollbars%3D0,toolbar%3D0,width%3D710,height%3D660%27))location.href%3Df%2B%27jump%3Dyes%27%7D%3Bif(/Firefox/.test(navigator.userAgent))%7BsetTimeout(a,0)%7Delse%7Ba()%7D%7D)()" ADD_DATE="1350743232">Add to Delicious</A>
20
- <DT><H3 ADD_DATE="1350544318" LAST_MODIFIED="1350927361">MD</H3>
21
- <DL><p>
22
- <DT><A HREF="http://server2.manodrabuziai.lt:8888/issues/3067" ADD_DATE="1350393018" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABZElEQVQ4jdXQPWsUYRTF8d88M5u4M+YTGBsLG22WgIUi2PoG2giCwraKrZ2FkCq2gljkC1hqpY2VhS4LAU0UN5PVbGKKRImIiaLZPBaJkg2ui4WFBy7c4tz/5Rz+pSLB1vyVkki2oHjYsXemo3ixqLgHN8l2m3vor4edLAvLrVyty8w2L0TJk7lhpy/lOm8raj3ffi5lbizyNARZjJbDWuVsKjuaknyufmlkicdJMCT6OLTm8H7e/aI0qUTSdm58rhBbhfquLpKyaqLMfW8V6j1R7jPyjOsNFptcmefA74qJJLPUGtxo8KnJOQijHEq5FtiHO51+zRLfMxoYD4xErkJYosRkZBWvjtPuw7DAo002NnmDBxA+cPc5q7Mc7HKx3zFc4NtXjk1xYprqJEdCwqmM2xusvOT8nwDQpl5lPuVWxuWQsGdHzpVBAKzv8I9lXSZSzkCXpUHXccszvb2vD7D/D/oBMK1rPYlJGacAAAAASUVORK5CYII=">MD platform - Feature #3067: MojeID implementation - Redmine</A>
23
- <DT><H3 ADD_DATE="1350927361" LAST_MODIFIED="1350927374">Nested 2</H3>
24
- <DL><p>
25
- <DT><A HREF="http://www.engineyard.com/blog/2010/getting-started-with-nokogiri/" ADD_DATE="1350927374" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACoUlEQVQ4jZWTXUhTYRjHf+dss52SHZdm0dAMmrmipohZUJTEog8ooiZEM8jqprqqCPJOr6LLqMvsYl1EBV0UhX1AZlgXfYjkZlo7E/FrDt2OW+3Ds7cLZX0K9Vy+z/v8nv/z/t9H0jSt2u/3t8fjcackSfxLCCFQVXXQ5/Mdp62t7X0gEBALRfZrUox3d4qxl53CmJ3NnwcCAdHa2vrOHI/HnS6Xa8FOL7yNZJIRzIWFlHsPU+7Zh7KiHJfLha7rlfLfZBuZDH03bvJk/z6wZDCrClaHndRYiMibZyTCgwBIkoT59+LpkEbHyVN8G/hMgSxhVQpYXGEHIJfJko5O8/piCw3+WwDIPxfro6PcPngIPRaj4ugR1rdcQrZa8/nidWtweLYw8b6HSLAf4IcCIQQPzp3HfeoE7kYvM+EwNqcT7drV+e6zFLlKUUqzCMUE85PnAeHubhx1dUQ+9HDz8hUWAaV7dlNYVkZKHyfSFaTXaMdcZEVPQWlV1a+AsY99fLx7j6QWRpFlMJmYfPSY5Tu2Ee0LkjFyzDzv56thsPHCOSzzo+UBX7q6qPH5KKlYRWJoiJGOp+gfehgJ9OPY1UDvww4Mw6BIXcLa+tr8u5gBEtEo286epWJzfT5Re+Y0k2/f8ar5OKaRT+w8doDETJxkNI125z4rtm7/4YLJYmFV/aY//kNxtRuyWSSRo9i9kWWrHWxo9JLQtF8VKKqadyIVi/FtMkoqGiUTmSRnGHM3pTnHZaWA9HSMxERkDiCEyNMkSUKx21Hsdqh0kp6aYsv168S1AMLIgSwjclkKSkqwLFYQQmBWVXUwGAzW/G0fFi1dykqPh5V4ADDSKRLDQzT49zI4PIzNZhuQQqGQ2+/3t+u6Xvk/62yz2QaampqavwOKmTuSdd4y8wAAAABJRU5ErkJggg==">Getting Started with Nokogiri - Engine Yard Blog | Engine Yard Blog</A>
26
- </DL><p>
27
- <DT><A HREF="http://88.119.11.118:8080/" ADD_DATE="1350544337" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADL0lEQVQ4jW2S329TdRjGn+8539P1tGu3tRPaU0ZbtrRjMGbAKJg0TInCBUHlAolGwmKMIYE7g9F44YX/Adx4RUwUgz8SkREhEL1xy4Blkw42h7Pt2tNf6+npWde1PW3P93jVZVXfyzfv583zPO9L8D8lSVL/gMf7GUfM4YNj4UMcx1sJoOWU4pXp2YUrsizX2rP03/C7Z9/5ptsuvuHuFXFp4rStW6QEJgNjrPvR/OInqrp+Qpbl4wCaAMBvhz84//53wYD/bafIipcvnHFRViem0QQzmgAzIO10WQ+O7t0dTxUOxFZTNwCAa8ORSORoPBF7S85kzJPHDjtbehXf/zKD3x8tdSjM5Au81UrHfT6fu0PBvnB48pVXj3kKSpGMhSSzx2Gj3aIFB/YGYJomCCEAAL9vB16PvCCulyrZmfknM1sKenr7ejLZLJjBNgKSq8tCOQQHdoIXRCTSCgBgJZ4BCMHiigwGI9xhQVPz1NdHa41auaFqG/V2//HTJdy+NwUAKKgaph8uoFbbhEWw2LYvIMfHX3ISpovjLw5zDrsotBfsDwVwceJNAMCRQyNYXElhXzgIQkhh+xnNZDKT/fTS2SGB8n3//QygWKpAKZVAeR663kA6U5jtCHGXz5u8dW/qiH+3v9fT79wCCcdjLvoMd357iGpVRyav4K+YrPw8+eBjrapVtjL44dbdm/PRZ2fWFK0FEKyXNwEAut7AbHQZgwEJTqcNF86dwh+LsZVEIZHrCBEA4rI8++PkrxrtsoPjOTyYW4JF4PHe6dcQHhzA/nAQX357t7SUzOfazJaFoNfr9wZDU2qTetPpTCMclDjTNLmr126iZTQryfRa7uq1n2pz0ZjdOhAacdhEt5LP3iEAuKHQyBeiq//ic6MRR7Ohw9UoqS+PhYS1619jmCf6fb1pcDvca0c3Nvc0ActXu0YFpqnVYmJhiAZ9vtEe//BHNmmPsK5kAdNEFXDdmH6KCYHmDgucxy/Q8nWt4lGZUbcLlLKWgbq+sby6upqn8XT6Se9gtcyMlhum2ZH+MhHKol6t3Hb0lz78/PLzqXRWvf9nqsWi0S5Wr/8NgP0DyjReaJJ20PcAAAAASUVORK5CYII=">Dashboard [Jenkins]</A>
28
- </DL><p>
29
- </DL><p>
30
- </DL><p>