king_tokens 1.0.1 → 2.0.0
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/.gitignore +4 -1
- data/Gemfile +3 -0
- data/Rakefile +3 -18
- data/king_tokens.gemspec +23 -46
- data/lib/king_tokens/token_code.rb +9 -8
- data/lib/king_tokens/tokenizer.rb +11 -17
- data/lib/king_tokens/version.rb +3 -0
- data/test/schema.rb +2 -1
- data/test/test_helper.rb +3 -1
- data/test/tokenizer_test.rb +9 -6
- metadata +102 -22
- data/.document +0 -3
- data/VERSION +0 -1
- data/coverage/index.html +0 -112
- data/coverage/lib-token_code_rb.html +0 -290
- data/coverage/lib-tokenizer_rb.html +0 -344
- data/init.rb +0 -1
@@ -1,290 +0,0 @@
|
|
1
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
-
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
|
3
|
-
<head>
|
4
|
-
<title>
|
5
|
-
lib/token_code.rb - C0 code coverage information
|
6
|
-
</title>
|
7
|
-
<style type='text/css'>
|
8
|
-
body { background-color: rgb(240, 240, 245); }
|
9
|
-
</style>
|
10
|
-
<style type='text/css'>
|
11
|
-
span.cross-ref-title { font-size: 140%; } span.cross-ref a {
|
12
|
-
text-decoration: none; } span.cross-ref { background-color:#f3f7fa;
|
13
|
-
border: 1px dashed #333; margin: 1em; padding: 0.5em; overflow: hidden; }
|
14
|
-
a.crossref-toggle { text-decoration: none; } span.marked0 {
|
15
|
-
background-color: rgb(185, 210, 200); display: block; } span.marked1 {
|
16
|
-
background-color: rgb(190, 215, 205); display: block; } span.inferred0 {
|
17
|
-
background-color: rgb(175, 200, 200); display: block; } span.inferred1 {
|
18
|
-
background-color: rgb(180, 205, 205); display: block; } span.uncovered0 {
|
19
|
-
background-color: rgb(225, 110, 110); display: block; } span.uncovered1 {
|
20
|
-
background-color: rgb(235, 120, 120); display: block; } span.overview {
|
21
|
-
border-bottom: 8px solid black; } div.overview { border-bottom: 8px solid
|
22
|
-
black; } body { font-family: verdana, arial, helvetica; } div.footer {
|
23
|
-
font-size: 68%; margin-top: 1.5em; } h1, h2, h3, h4, h5, h6 {
|
24
|
-
margin-bottom: 0.5em; } h5 { margin-top: 0.5em; } .hidden { display: none;
|
25
|
-
} div.separator { height: 10px; } /* Commented out for better readability,
|
26
|
-
esp. on IE */ /* table tr td, table tr th { font-size: 68%; } td.value
|
27
|
-
table tr td { font-size: 11px; } */ table.percent_graph { height: 12px;
|
28
|
-
border: #808080 1px solid; empty-cells: show; } table.percent_graph
|
29
|
-
td.covered { height: 10px; background: #00f000; } table.percent_graph
|
30
|
-
td.uncovered { height: 10px; background: #e00000; } table.percent_graph
|
31
|
-
td.NA { height: 10px; background: #eaeaea; } table.report {
|
32
|
-
border-collapse: collapse; width: 100%; } table.report td.heading {
|
33
|
-
background: #dcecff; border: #d0d0d0 1px solid; font-weight: bold;
|
34
|
-
text-align: center; } table.report td.heading:hover { background: #c0ffc0;
|
35
|
-
} table.report td.text { border: #d0d0d0 1px solid; } table.report
|
36
|
-
td.value, table.report td.lines_total, table.report td.lines_code {
|
37
|
-
text-align: right; border: #d0d0d0 1px solid; } table.report tr.light {
|
38
|
-
background-color: rgb(240, 240, 245); } table.report tr.dark {
|
39
|
-
background-color: rgb(230, 230, 235); }
|
40
|
-
</style>
|
41
|
-
<script type='text/javascript'>
|
42
|
-
// <![CDATA[ function toggleCode( id ) { if ( document.getElementById )
|
43
|
-
elem = document.getElementById( id ); else if ( document.all ) elem =
|
44
|
-
eval( "document.all." + id ); else return false; elemStyle = elem.style;
|
45
|
-
if ( elemStyle.display != "block" ) { elemStyle.display = "block" } else {
|
46
|
-
elemStyle.display = "none" } return true; } // Make cross-references
|
47
|
-
hidden by default document.writeln( "<style
|
48
|
-
type=\"text/css\">span.cross-ref { display: none }</style>" ) // ]]>
|
49
|
-
</script>
|
50
|
-
<style type='text/css'>
|
51
|
-
span.run0 { background-color: rgb(178, 204, 255); display: block; }
|
52
|
-
span.run1 { background-color: rgb(178, 206, 255); display: block; }
|
53
|
-
span.run2 { background-color: rgb(178, 209, 255); display: block; }
|
54
|
-
span.run3 { background-color: rgb(178, 211, 255); display: block; }
|
55
|
-
span.run4 { background-color: rgb(178, 214, 255); display: block; }
|
56
|
-
span.run5 { background-color: rgb(178, 218, 255); display: block; }
|
57
|
-
span.run6 { background-color: rgb(178, 220, 255); display: block; }
|
58
|
-
span.run7 { background-color: rgb(178, 223, 255); display: block; }
|
59
|
-
span.run8 { background-color: rgb(178, 225, 255); display: block; }
|
60
|
-
span.run9 { background-color: rgb(178, 228, 255); display: block; }
|
61
|
-
span.run10 { background-color: rgb(178, 232, 255); display: block; }
|
62
|
-
span.run11 { background-color: rgb(178, 234, 255); display: block; }
|
63
|
-
span.run12 { background-color: rgb(178, 237, 255); display: block; }
|
64
|
-
span.run13 { background-color: rgb(178, 239, 255); display: block; }
|
65
|
-
span.run14 { background-color: rgb(178, 242, 255); display: block; }
|
66
|
-
span.run15 { background-color: rgb(178, 246, 255); display: block; }
|
67
|
-
span.run16 { background-color: rgb(178, 248, 255); display: block; }
|
68
|
-
span.run17 { background-color: rgb(178, 251, 255); display: block; }
|
69
|
-
span.run18 { background-color: rgb(178, 253, 255); display: block; }
|
70
|
-
span.run19 { background-color: rgb(178, 255, 253); display: block; }
|
71
|
-
span.run20 { background-color: rgb(178, 255, 249); display: block; }
|
72
|
-
span.run21 { background-color: rgb(178, 255, 247); display: block; }
|
73
|
-
span.run22 { background-color: rgb(178, 255, 244); display: block; }
|
74
|
-
span.run23 { background-color: rgb(178, 255, 242); display: block; }
|
75
|
-
span.run24 { background-color: rgb(178, 255, 239); display: block; }
|
76
|
-
span.run25 { background-color: rgb(178, 255, 235); display: block; }
|
77
|
-
span.run26 { background-color: rgb(178, 255, 233); display: block; }
|
78
|
-
span.run27 { background-color: rgb(178, 255, 230); display: block; }
|
79
|
-
span.run28 { background-color: rgb(178, 255, 228); display: block; }
|
80
|
-
span.run29 { background-color: rgb(178, 255, 225); display: block; }
|
81
|
-
span.run30 { background-color: rgb(178, 255, 221); display: block; }
|
82
|
-
span.run31 { background-color: rgb(178, 255, 219); display: block; }
|
83
|
-
span.run32 { background-color: rgb(178, 255, 216); display: block; }
|
84
|
-
span.run33 { background-color: rgb(178, 255, 214); display: block; }
|
85
|
-
span.run34 { background-color: rgb(178, 255, 211); display: block; }
|
86
|
-
span.run35 { background-color: rgb(178, 255, 207); display: block; }
|
87
|
-
span.run36 { background-color: rgb(178, 255, 205); display: block; }
|
88
|
-
span.run37 { background-color: rgb(178, 255, 202); display: block; }
|
89
|
-
span.run38 { background-color: rgb(178, 255, 200); display: block; }
|
90
|
-
span.run39 { background-color: rgb(178, 255, 197); display: block; }
|
91
|
-
span.run40 { background-color: rgb(178, 255, 193); display: block; }
|
92
|
-
span.run41 { background-color: rgb(178, 255, 191); display: block; }
|
93
|
-
span.run42 { background-color: rgb(178, 255, 188); display: block; }
|
94
|
-
span.run43 { background-color: rgb(178, 255, 186); display: block; }
|
95
|
-
span.run44 { background-color: rgb(178, 255, 183); display: block; }
|
96
|
-
span.run45 { background-color: rgb(178, 255, 179); display: block; }
|
97
|
-
span.run46 { background-color: rgb(179, 255, 178); display: block; }
|
98
|
-
span.run47 { background-color: rgb(182, 255, 178); display: block; }
|
99
|
-
span.run48 { background-color: rgb(184, 255, 178); display: block; }
|
100
|
-
span.run49 { background-color: rgb(187, 255, 178); display: block; }
|
101
|
-
span.run50 { background-color: rgb(191, 255, 178); display: block; }
|
102
|
-
span.run51 { background-color: rgb(193, 255, 178); display: block; }
|
103
|
-
span.run52 { background-color: rgb(196, 255, 178); display: block; }
|
104
|
-
span.run53 { background-color: rgb(198, 255, 178); display: block; }
|
105
|
-
span.run54 { background-color: rgb(201, 255, 178); display: block; }
|
106
|
-
span.run55 { background-color: rgb(205, 255, 178); display: block; }
|
107
|
-
span.run56 { background-color: rgb(207, 255, 178); display: block; }
|
108
|
-
span.run57 { background-color: rgb(210, 255, 178); display: block; }
|
109
|
-
span.run58 { background-color: rgb(212, 255, 178); display: block; }
|
110
|
-
span.run59 { background-color: rgb(215, 255, 178); display: block; }
|
111
|
-
span.run60 { background-color: rgb(219, 255, 178); display: block; }
|
112
|
-
span.run61 { background-color: rgb(221, 255, 178); display: block; }
|
113
|
-
span.run62 { background-color: rgb(224, 255, 178); display: block; }
|
114
|
-
span.run63 { background-color: rgb(226, 255, 178); display: block; }
|
115
|
-
span.run64 { background-color: rgb(229, 255, 178); display: block; }
|
116
|
-
span.run65 { background-color: rgb(233, 255, 178); display: block; }
|
117
|
-
span.run66 { background-color: rgb(235, 255, 178); display: block; }
|
118
|
-
span.run67 { background-color: rgb(238, 255, 178); display: block; }
|
119
|
-
span.run68 { background-color: rgb(240, 255, 178); display: block; }
|
120
|
-
span.run69 { background-color: rgb(243, 255, 178); display: block; }
|
121
|
-
span.run70 { background-color: rgb(247, 255, 178); display: block; }
|
122
|
-
span.run71 { background-color: rgb(249, 255, 178); display: block; }
|
123
|
-
span.run72 { background-color: rgb(252, 255, 178); display: block; }
|
124
|
-
span.run73 { background-color: rgb(255, 255, 178); display: block; }
|
125
|
-
span.run74 { background-color: rgb(255, 252, 178); display: block; }
|
126
|
-
span.run75 { background-color: rgb(255, 248, 178); display: block; }
|
127
|
-
span.run76 { background-color: rgb(255, 246, 178); display: block; }
|
128
|
-
span.run77 { background-color: rgb(255, 243, 178); display: block; }
|
129
|
-
span.run78 { background-color: rgb(255, 240, 178); display: block; }
|
130
|
-
span.run79 { background-color: rgb(255, 238, 178); display: block; }
|
131
|
-
span.run80 { background-color: rgb(255, 234, 178); display: block; }
|
132
|
-
span.run81 { background-color: rgb(255, 232, 178); display: block; }
|
133
|
-
span.run82 { background-color: rgb(255, 229, 178); display: block; }
|
134
|
-
span.run83 { background-color: rgb(255, 226, 178); display: block; }
|
135
|
-
span.run84 { background-color: rgb(255, 224, 178); display: block; }
|
136
|
-
span.run85 { background-color: rgb(255, 220, 178); display: block; }
|
137
|
-
span.run86 { background-color: rgb(255, 218, 178); display: block; }
|
138
|
-
span.run87 { background-color: rgb(255, 215, 178); display: block; }
|
139
|
-
span.run88 { background-color: rgb(255, 212, 178); display: block; }
|
140
|
-
span.run89 { background-color: rgb(255, 210, 178); display: block; }
|
141
|
-
span.run90 { background-color: rgb(255, 206, 178); display: block; }
|
142
|
-
span.run91 { background-color: rgb(255, 204, 178); display: block; }
|
143
|
-
span.run92 { background-color: rgb(255, 201, 178); display: block; }
|
144
|
-
span.run93 { background-color: rgb(255, 198, 178); display: block; }
|
145
|
-
span.run94 { background-color: rgb(255, 196, 178); display: block; }
|
146
|
-
span.run95 { background-color: rgb(255, 192, 178); display: block; }
|
147
|
-
span.run96 { background-color: rgb(255, 189, 178); display: block; }
|
148
|
-
span.run97 { background-color: rgb(255, 187, 178); display: block; }
|
149
|
-
span.run98 { background-color: rgb(255, 184, 178); display: block; }
|
150
|
-
span.run99 { background-color: rgb(255, 182, 178); display: block; }
|
151
|
-
span.run100 { background-color: rgb(255, 178, 178); display: block; }
|
152
|
-
</style>
|
153
|
-
</head>
|
154
|
-
<body>
|
155
|
-
<h3>
|
156
|
-
C0 code coverage information
|
157
|
-
</h3>
|
158
|
-
<p>
|
159
|
-
Generated on Sun Dec 07 02:06:42 +0100 2008 with
|
160
|
-
<a href='http://eigenclass.org/hiki/rcov'>
|
161
|
-
rcov 0.8.1.2
|
162
|
-
</a>
|
163
|
-
</p>
|
164
|
-
<hr />
|
165
|
-
<pre><span class='marked0'>Code reported as executed by Ruby looks like
|
166
|
-
this... </span><span class='marked1'>and this: this line is also marked as
|
167
|
-
covered. </span><span class='inferred0'>Lines considered as run by rcov, but
|
168
|
-
not reported by Ruby, look like this, </span><span class='inferred1'>and
|
169
|
-
this: these lines were inferred by rcov (using simple heuristics).
|
170
|
-
</span><span class='uncovered0'>Finally, here's a line marked as not
|
171
|
-
executed. </span></pre>
|
172
|
-
<table class='report'> <thead> <tr> <td class='heading'> Name </td> <td
|
173
|
-
class='heading'> Total lines </td> <td class='heading'> Lines of code </td>
|
174
|
-
<td class='heading'> Total coverage </td> <td class='heading'> Code coverage
|
175
|
-
</td> </tr> </thead> <tbody> <tr class='light'> <td> <a
|
176
|
-
href='lib-token_code_rb.html'> lib/token_code.rb </a> </td> <td
|
177
|
-
class='lines_total'> <tt> 80 </tt> </td> <td class='lines_code'> <tt> 46
|
178
|
-
</tt> </td> <td> <table cellspacing='0' align='right' cellpadding='0'> <tr>
|
179
|
-
<td> <tt class='coverage_total'> 100.0% </tt> </td> <td> <table
|
180
|
-
class='percent_graph' cellspacing='0' width='100' cellpadding='0'> <tr> <td
|
181
|
-
class='covered' width='100' /> <td class='uncovered' width='0' /> </tr>
|
182
|
-
</table> </td> </tr> </table> </td> <td> <table cellspacing='0'
|
183
|
-
align='right' cellpadding='0'> <tr> <td> <tt class='coverage_code'> 100.0%
|
184
|
-
</tt> </td> <td> <table class='percent_graph' cellspacing='0'
|
185
|
-
width='100' cellpadding='0'> <tr> <td class='covered' width='100' /> <td
|
186
|
-
class='uncovered' width='0' /> </tr> </table> </td> </tr> </table> </td>
|
187
|
-
</tr> </tbody> </table><pre><span class="marked1"><a name="line1"></a> 1
|
188
|
-
require "digest/sha1" </span><span class="inferred0"><a
|
189
|
-
name="line2"></a> 2 </span><span class="inferred1"><a name="line3"></a> 3 #
|
190
|
-
Class to handle polymorphic tokens </span><span class="marked0"><a
|
191
|
-
name="line4"></a> 4 class TokenCode < ActiveRecord::Base </span><span
|
192
|
-
class="inferred1"><a name="line5"></a> 5 </span><span class="inferred0"><a
|
193
|
-
name="line6"></a> 6 # kick this stament if you dont uses uuids .. or better
|
194
|
-
we make a check?? </span><span class="inferred1"><a name="line7"></a> 7
|
195
|
-
</span><span class="marked0"><a name="line8"></a> 8 usesguid if
|
196
|
-
defined?(usesguid) </span><span class="inferred1"><a name="line9"></a> 9
|
197
|
-
</span><span class="marked0"><a name="line10"></a>10 belongs_to :object,
|
198
|
-
:polymorphic => true </span><span class="marked1"><a name="line11"></a>11
|
199
|
-
before_create :set_token </span><span class="inferred0"><a
|
200
|
-
name="line12"></a>12 </span><span class="marked1"><a name="line13"></a>13
|
201
|
-
validates_presence_of :name </span><span class="marked0"><a
|
202
|
-
name="line14"></a>14 validates_format_of :name, :with =>
|
203
|
-
/^[a-zA-Z0-9\_\-]+$/ </span><span class="marked1"><a name="line15"></a>15
|
204
|
-
validates_uniqueness_of :name, :scope => [:object_id, :object_type]
|
205
|
-
#second not really needed if uuid </span><span class="inferred0"><a
|
206
|
-
name="line16"></a>16 </span><span class="marked1"><a name="line17"></a>17
|
207
|
-
def to_s </span><span class="marked0"><a name="line18"></a>18 self.token
|
208
|
-
</span><span class="inferred1"><a name="line19"></a>19 end </span><span
|
209
|
-
class="inferred0"><a name="line20"></a>20 </span><span class="inferred1"><a
|
210
|
-
name="line21"></a>21 # Use a token for an object. </span><span
|
211
|
-
class="inferred0"><a name="line22"></a>22 # Sets the used_at field
|
212
|
-
</span><span class="marked1"><a name="line23"></a>23 def use! </span><span
|
213
|
-
class="marked0"><a name="line24"></a>24 update_attribute(:used_at,Time.now)
|
214
|
-
</span><span class="inferred1"><a name="line25"></a>25 end </span><span
|
215
|
-
class="inferred0"><a name="line26"></a>26 </span><span class="inferred1"><a
|
216
|
-
name="line27"></a>27 # Revoke the usage of a token by emptying its used_at
|
217
|
-
field </span><span class="marked0"><a name="line28"></a>28 def unuse!
|
218
|
-
</span><span class="marked1"><a name="line29"></a>29
|
219
|
-
update_attribute(:used_at,nil) </span><span class="inferred0"><a
|
220
|
-
name="line30"></a>30 end </span><span class="inferred1"><a
|
221
|
-
name="line31"></a>31 </span><span class="marked0"><a name="line32"></a>32
|
222
|
-
def used? </span><span class="marked1"><a name="line33"></a>33 !!
|
223
|
-
read_attribute(:used_at) </span><span class="inferred0"><a
|
224
|
-
name="line34"></a>34 end </span><span class="inferred1"><a
|
225
|
-
name="line35"></a>35 </span><span class="inferred0"><a name="line36"></a>36
|
226
|
-
# Check if the token has expired </span><span class="marked1"><a
|
227
|
-
name="line37"></a>37 def expired? </span><span class="marked0"><a
|
228
|
-
name="line38"></a>38 valid_until && valid_until < Time.now
|
229
|
-
</span><span class="inferred1"><a name="line39"></a>39 end </span><span
|
230
|
-
class="inferred0"><a name="line40"></a>40 </span><span class="inferred1"><a
|
231
|
-
name="line41"></a>41 # A token is valid to be used if: </span><span
|
232
|
-
class="inferred0"><a name="line42"></a>42 # - its has not been used
|
233
|
-
</span><span class="inferred1"><a name="line43"></a>43 # - its not expired
|
234
|
-
</span><span class="inferred0"><a name="line44"></a>44 # - its valid in
|
235
|
-
terms of AR validation </span><span class="marked1"><a name="line45"></a>45
|
236
|
-
def valid_for_use? </span><span class="marked0"><a name="line46"></a>46
|
237
|
-
valid? && !used? && !expired? </span><span
|
238
|
-
class="inferred1"><a name="line47"></a>47 end </span><span
|
239
|
-
class="inferred0"><a name="line48"></a>48 </span><span class="inferred1"><a
|
240
|
-
name="line49"></a>49 </span><span class="marked0"><a name="line50"></a>50
|
241
|
-
def self.delete_used </span><span class="marked1"><a name="line51"></a>51
|
242
|
-
delete_all "used_at IS NOT NULL" </span><span class="inferred0"><a
|
243
|
-
name="line52"></a>52 end </span><span class="inferred1"><a
|
244
|
-
name="line53"></a>53 </span><span class="marked0"><a name="line54"></a>54
|
245
|
-
def self.delete_expired </span><span class="marked1"><a name="line55"></a>55
|
246
|
-
delete_all ["valid_until IS NOT NULL AND valid_until < ? ",
|
247
|
-
Time.now] </span><span class="inferred0"><a name="line56"></a>56 end
|
248
|
-
</span><span class="inferred1"><a name="line57"></a>57 </span><span
|
249
|
-
class="marked0"><a name="line58"></a>58 private </span><span
|
250
|
-
class="inferred1"><a name="line59"></a>59 </span><span class="inferred0"><a
|
251
|
-
name="line60"></a>60 # Generate a token with a default length of 12.
|
252
|
-
</span><span class="inferred1"><a name="line61"></a>61 # Takes a block to
|
253
|
-
validate the token, which should return true/false </span><span
|
254
|
-
class="inferred0"><a name="line62"></a>62 # ==== Parameter </span><span
|
255
|
-
class="inferred1"><a name="line63"></a>63 # size<Integer>:: The length
|
256
|
-
of the token. Defaults to 40 </span><span class="inferred0"><a
|
257
|
-
name="line64"></a>64 # validity<Proc>:: A block to check the validity
|
258
|
-
of the token, see #set_token for usage </span><span class="marked1"><a
|
259
|
-
name="line65"></a>65 def generate_token(size = 40, &validity)
|
260
|
-
</span><span class="inferred0"><a name="line66"></a>66 begin </span><span
|
261
|
-
class="marked1"><a name="line67"></a>67 token = secure_digest(Time.now,
|
262
|
-
"#{self.object_type}#{self.object_id}", (1..10).map{ rand.to_s
|
263
|
-
}).first(size) </span><span class="marked0"><a name="line68"></a>68 end
|
264
|
-
while !validity.call(token) if block_given? </span><span class="marked1"><a
|
265
|
-
name="line69"></a>69 token </span><span class="inferred0"><a
|
266
|
-
name="line70"></a>70 end </span><span class="inferred1"><a
|
267
|
-
name="line71"></a>71 </span><span class="marked0"><a name="line72"></a>72
|
268
|
-
def secure_digest(*args) </span><span class="marked1"><a
|
269
|
-
name="line73"></a>73 Digest::SHA1.hexdigest(args.flatten.join('--'))
|
270
|
-
</span><span class="inferred0"><a name="line74"></a>74 end </span><span
|
271
|
-
class="inferred1"><a name="line75"></a>75 </span><span class="marked0"><a
|
272
|
-
name="line76"></a>76 def set_token </span><span class="marked1"><a
|
273
|
-
name="line77"></a>77 self.token = generate_token { |token|
|
274
|
-
TokenCode.find_by_token(token).nil? } </span><span class="inferred0"><a
|
275
|
-
name="line78"></a>78 end </span><span class="inferred1"><a
|
276
|
-
name="line79"></a>79 </span><span class="inferred0"><a name="line80"></a>80
|
277
|
-
end </span></pre>
|
278
|
-
<hr />
|
279
|
-
<p> Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'> rcov
|
280
|
-
code coverage analysis tool for Ruby </a> version 0.8.1.2. </p>
|
281
|
-
<p>
|
282
|
-
<a href='http://validator.w3.org/check/referer'>
|
283
|
-
<img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' />
|
284
|
-
</a>
|
285
|
-
<a href='http://jigsaw.w3.org/css-validator/check/referer'>
|
286
|
-
<img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px' />
|
287
|
-
</a>
|
288
|
-
</p>
|
289
|
-
</body>
|
290
|
-
</html>
|