istat 0.0.1 → 0.0.2

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/lib/istat/client.rb CHANGED
@@ -34,7 +34,7 @@ module Istat
34
34
  # @param passwd [String] the passwd or code to access the server
35
35
  # @param logger [optional Logger] a logger that will log all actions on the client
36
36
  # @example
37
- # @client = Istat::Clinet.new("example.com", 5109, "00000")
37
+ # @client = Istat::Client.new("example.com", 5109, "00000")
38
38
  #
39
39
  def initialize(host, port, passwd, logger = nil)
40
40
  @host, @port, @passwd, @logger = host, port, passwd, logger
@@ -44,7 +44,7 @@ module Istat
44
44
  # starts a session on the remote machine and yields it to the passed block.
45
45
  # @yield [Istat::Client] the remote session
46
46
  # @example
47
- # @client = Istat::Clinet.new("example.com", 5109, "00000")
47
+ # @client = Istat::Client.new("example.com", 5109, "00000")
48
48
  # @client.start do |session|
49
49
  # # work with the session
50
50
  # end
@@ -120,7 +120,7 @@ module Istat
120
120
  # @param [Integer|Time] since size of the requested history (-1 last)
121
121
  # @return [Istat::Frames::MeasurementResponse] the fetched result
122
122
  # @example
123
- # @client = Istat::Clinet.new("example.com", 5109, "00000")
123
+ # @client = Istat::Client.new("example.com", 5109, "00000")
124
124
  # @client.start do |session|
125
125
  # response = session.fetch
126
126
  # response.load # => [0.54, 0.59, 0.65]
@@ -133,6 +133,13 @@ module Istat
133
133
  Istat::Frames::MeasurementResponse.new(receive)
134
134
  end
135
135
 
136
+ # fetch all data available on the remote server
137
+ # @return [Istat::Frames::MeasurementResponse] the fetched result
138
+ # @see #fetch
139
+ def fetch_all
140
+ fetch(-2)
141
+ end
142
+
136
143
  protected
137
144
 
138
145
  # send a frame to the remote system (istatd)
@@ -148,10 +155,8 @@ module Istat
148
155
  # @return [String] the xml stream that was send from istatd
149
156
  def receive
150
157
  data = ""
151
- begin
152
- data << @socket.recv(1024)
153
- end while !data.include?("</isr>")
154
- @logger.debug "Recieved: #{data}" if @logger
158
+ data << @socket.recv(1024) while !data.include?("</isr>")
159
+ @logger.debug "Received: #{data}" if @logger
155
160
  data
156
161
  end
157
162
  end
@@ -33,9 +33,8 @@ module Istat
33
33
  # create a new request based on the requested id. The default is to
34
34
  # request only the last values (since -1)
35
35
  # @param [Integer] rid the request identifier (increases)
36
- # @param [Integer] since the since field (-1 for last, or Time.now timestamp)
36
+ # @param [Integer] since the since field (-1 for last or -2 all)
37
37
  def initialize(rid, since = -1)
38
- since = Time.now.to_i - since.to_i if since.is_a? Time
39
38
  super create([RID, rid],
40
39
  [CPU, since],
41
40
  [NETWORK, since],
@@ -49,6 +48,30 @@ module Istat
49
48
  end
50
49
 
51
50
  class MeasurementResponse < Response
51
+ # parse the isr header request id
52
+ # @return [Integer] the request id
53
+ def rid
54
+ @root.attributes["rid"].to_i
55
+ end
56
+
57
+ # parse the isr header disk id
58
+ # @return [Integer] the disk sid
59
+ def sid_disk
60
+ @root.attributes["ds"].to_i
61
+ end
62
+
63
+ # parse the isr header temp sid
64
+ # @return [Integer] the temp sid
65
+ def sid_temp
66
+ @root.attributes["ts"].to_i
67
+ end
68
+
69
+ # parse the isr header fans sid
70
+ # @return [Integer] the fans sid
71
+ def sid_fans
72
+ @root.attributes["fs"].to_i
73
+ end
74
+
52
75
  # returns true if there is a cpu section in the frame
53
76
  def cpu?
54
77
  has_node? :CPU
@@ -64,13 +87,15 @@ module Istat
64
87
  # { :id => 28388973, :user => 0, :system => 0, :nice => 0 }
65
88
  # ]
66
89
  def cpu
67
- entires_for(:CPU) do |element, attributes|
68
- {
69
- :id => attributes["id"].to_i,
70
- :user => attributes["u"].to_i,
71
- :system => attributes["s"].to_i,
72
- :nice => attributes["n"].to_i
73
- }
90
+ if cpu?
91
+ map(:CPU) do |element, attributes|
92
+ {
93
+ :id => attributes["id"].to_i,
94
+ :user => attributes["u"].to_i,
95
+ :system => attributes["s"].to_i,
96
+ :nice => attributes["n"].to_i
97
+ }
98
+ end
74
99
  end
75
100
  end
76
101
 
@@ -79,29 +104,34 @@ module Istat
79
104
  has_node? :NET
80
105
  end
81
106
 
82
- # collects all network information over the interfaces (can contain history)
107
+ # collects all network information over the interfaces (can contain history).
108
+ # Send and received values are byte numbers.
109
+ # @todo supports only one interface at the moment
83
110
  # @return [Hash<Array<Hash>>] the network data for the interfaces
84
111
  # @example Result
85
112
  # {
86
113
  # 1 => [
87
- # { :id => 28388970, :d => 4177773, :u => 232278672, :t => 1304082088 },
88
- # { :id => 28388971, :d => 4177773, :u => 232278672, :t => 1304082089 },
89
- # { :id => 28388972, :d => 4177773, :u => 232278672, :t => 1304082090 },
90
- # { :id => 28388973, :d => 4177773, :u => 232278672, :t => 1304082091 }
114
+ # { :id => 28388970, :received => 4177773, :send => 232278672, :time => <#Time ...> },
115
+ # { :id => 28388971, :received => 4177773, :send => 232278672, :time => <#Time ...> },
116
+ # { :id => 28388972, :received => 4177773, :send => 232278672, :time => <#Time ...> },
117
+ # { :id => 28388973, :received => 4177773, :send => 232278672, :time => <#Time ...> }
91
118
  # ]
92
119
  # }
93
120
  #
94
121
  def network
95
- interfaces = { 1 => [] }
96
- entires_for(:NET) do |element, attributes|
97
- interfaces[1] << {
98
- :id => attributes["id"].to_i,
99
- :d => attributes["d"].to_i,
100
- :u => attributes["u"].to_i,
101
- :t => attributes["t"].to_i
102
- }
122
+ if network?
123
+ interface_name = node(:NET).attributes["if"].to_i
124
+ interfaces = { interface_name => [] }
125
+ map(:NET) do |element, attributes|
126
+ interfaces[interface_name] << {
127
+ :id => attributes["id"].to_i,
128
+ :received => attributes["d"].to_i,
129
+ :send => attributes["u"].to_i,
130
+ :time => Time.at(attributes["t"].to_f)
131
+ }
132
+ end
133
+ interfaces
103
134
  end
104
- interfaces
105
135
  end
106
136
 
107
137
  # returns true if there is a memory section in the frame
@@ -125,18 +155,20 @@ module Istat
125
155
  # }
126
156
  #
127
157
  def memory
128
- attributes = @root.elements["MEM"].attributes
129
- {
130
- :wired => attributes["w"].to_i,
131
- :active => attributes["a"].to_i,
132
- :inactive => attributes["i"].to_i,
133
- :free => attributes["f"].to_i,
134
- :total => attributes["t"].to_i,
135
- :swap_used => attributes["su"].to_i,
136
- :swap_total => attributes["st"].to_i,
137
- :page_ins => attributes["pi"].to_i,
138
- :page_outs => attributes["po"].to_i
139
- }
158
+ if memory?
159
+ attributes = node(:MEM).attributes
160
+ {
161
+ :wired => attributes["w"].to_i,
162
+ :active => attributes["a"].to_i,
163
+ :inactive => attributes["i"].to_i,
164
+ :free => attributes["f"].to_i,
165
+ :total => attributes["t"].to_i,
166
+ :swap_used => attributes["su"].to_i,
167
+ :swap_total => attributes["st"].to_i,
168
+ :page_ins => attributes["pi"].to_i,
169
+ :page_outs => attributes["po"].to_i
170
+ }
171
+ end
140
172
  end
141
173
 
142
174
  # returns true if there is a load section in the frame
@@ -150,8 +182,10 @@ module Istat
150
182
  # [0.54, 0.60, 0.67]
151
183
  #
152
184
  def load
153
- attributes = @root.elements["LOAD"].attributes
154
- [attributes["one"].to_f, attributes["fv"].to_f, attributes["ff"].to_f]
185
+ if load?
186
+ attributes = node(:LOAD).attributes
187
+ [attributes["one"].to_f, attributes["fv"].to_f, attributes["ff"].to_f]
188
+ end
155
189
  end
156
190
 
157
191
  # returns true if there is a temps section in the frame
@@ -165,11 +199,13 @@ module Istat
165
199
  # [30, 52, 29, 50, 30, 64, 61]
166
200
  #
167
201
  def temps
168
- temps = []
169
- entires_for(:TEMPS) do |element, attributes|
170
- temps[attributes["i"].to_i] = attributes["t"].to_i
202
+ if temps?
203
+ temps = []
204
+ map(:TEMPS) do |element, attributes|
205
+ temps[attributes["i"].to_i] = attributes["t"].to_i
206
+ end
207
+ temps
171
208
  end
172
- temps
173
209
  end
174
210
 
175
211
  # returns true if there is a fan section in the frame
@@ -183,11 +219,13 @@ module Istat
183
219
  # [1999]
184
220
  #
185
221
  def fans
186
- fans = []
187
- entires_for(:FANS) do |element, attributes|
188
- fans[attributes["i"].to_i] = attributes["s"].to_i
222
+ if fans?
223
+ fans = []
224
+ map(:FANS) do |element, attributes|
225
+ fans[attributes["i"].to_i] = attributes["s"].to_i
226
+ end
227
+ fans
189
228
  end
190
- fans
191
229
  end
192
230
 
193
231
  # returns true if there is a uptime section in the frame
@@ -201,7 +239,9 @@ module Istat
201
239
  # "Sat Apr 30 09:46:45 +0200 2011"
202
240
  #
203
241
  def uptime
204
- Time.now - @root.elements["UPT"].attributes["u"].to_i
242
+ if uptime?
243
+ Time.now - node(:UPT).attributes["u"].to_i
244
+ end
205
245
  end
206
246
 
207
247
  # returns true if there is a disks section in the frame
@@ -220,29 +260,41 @@ module Istat
220
260
  # ]
221
261
  #
222
262
  def disks
223
- entires_for(:DISKS) do |element, attributes|
224
- {
225
- :label => attributes["n"],
226
- :uuid => attributes["uuid"],
227
- :free => attributes["f"].to_i,
228
- :percent_used => attributes["p"].to_f
229
- }
263
+ if disks?
264
+ map(:DISKS) do |element, attributes|
265
+ {
266
+ :label => attributes["n"],
267
+ :uuid => attributes["uuid"],
268
+ :free => attributes["f"].to_i,
269
+ :percent_used => attributes["p"].to_f
270
+ }
271
+ end
230
272
  end
231
273
  end
232
274
 
233
275
  protected
276
+
277
+ # searches for the node with the passed name
278
+ # @api private
279
+ # @return [REXML::Element] the node or nil
280
+ def node(name)
281
+ @root.elements["#{name}"]
282
+ end
234
283
 
235
- # returns true if a node is available
284
+ # checks if a node is available in the frame
285
+ # @return [Boolean] true is if exists in the current frame
236
286
  # @api private
237
287
  def has_node?(name)
238
- !@root.elements["#{name}"].nil?
288
+ !node(name).nil?
239
289
  end
240
290
 
241
291
  # yields over the elements of a path
292
+ # @return [Array] an array of all results for the mapped elements
293
+ # @yield [REXML::Element, REXML::Attributes] the block values to map
242
294
  # @api private
243
- def entires_for(name, &block)
295
+ def map(name, &block)
244
296
  entries = []
245
- @root.elements["#{name}"].map do |element|
297
+ node(name).map do |element|
246
298
  unless element.is_a? REXML::Text
247
299
  entries << block.call(element, element.attributes)
248
300
  end
@@ -29,6 +29,9 @@ module Istat
29
29
  end
30
30
 
31
31
  class RegisterResponse < Response
32
+ MACOSX = 1
33
+ OTHER_UNIX = 2
34
+
32
35
  # check if the user has to authorize using password
33
36
  # @return [Boolean] true if the user should authorize
34
37
  def authorize?
@@ -37,13 +40,13 @@ module Istat
37
40
 
38
41
  # calculate the uptime value
39
42
  # @return [Integer] a timestamp (Time.now - val)
40
- def uptime
43
+ def last_uptime
41
44
  @root.attributes["n"].to_i
42
45
  end
43
46
 
44
- # calculate the next_uptime value
47
+ # calculate the current uptime value
45
48
  # @return [Integer] a timestamp (Time.now - val)
46
- def next_uptime
49
+ def uptime
47
50
  @root.attributes["c"].to_i
48
51
  end
49
52
 
@@ -52,10 +55,21 @@ module Istat
52
55
  @root.attributes["ss"].to_i
53
56
  end
54
57
 
58
+ # parse the platform of the remote system
55
59
  # @return static value 2
56
- def pl
60
+ def platform
57
61
  @root.attributes["pl"].to_i
58
62
  end
63
+
64
+ # @return [Boolean] true if the remote system is a unix (linux, freebsd, solaris)
65
+ def other_unix?
66
+ platform == OTHER_UNIX
67
+ end
68
+
69
+ # @return [Boolean] true if the remote system is a mac os x
70
+ def macosx?
71
+ platform == MACOSX
72
+ end
59
73
  end
60
74
  end
61
75
  end
data/lib/istat/version.rb CHANGED
@@ -18,5 +18,5 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
  module Istat
21
- VERSION = "0.0.1"
21
+ VERSION = "0.0.2"
22
22
  end
data/spec/client_spec.rb CHANGED
@@ -47,4 +47,13 @@ describe Istat::Client do
47
47
  response.disks?.should be_true
48
48
  end
49
49
  end
50
+
51
+ it "if ask data for two different time spans i should get different result set sizes" do
52
+ @client.start do |session|
53
+ response = session.fetch_all
54
+ result = response.cpu.size
55
+ response = session.fetch
56
+ response.cpu.size.should < result
57
+ end
58
+ end
50
59
  end
@@ -46,7 +46,14 @@ describe "Measurement" do
46
46
  </isr>
47
47
  })
48
48
  end
49
-
49
+
50
+ it "should be possible to parse the isr header" do
51
+ @frame.rid.should == 1
52
+ @frame.sid_disk.should == 0
53
+ @frame.sid_temp.should == 0
54
+ @frame.sid_fans.should == 0
55
+ end
56
+
50
57
  it "should be possible to parse the cpus" do
51
58
  @frame.cpu?.should be_true
52
59
  @frame.cpu.should == [
@@ -61,10 +68,10 @@ describe "Measurement" do
61
68
  @frame.network?.should be_true
62
69
  @frame.network.should == {
63
70
  1 => [
64
- { :id => 28388970, :d => 4177773, :u => 232278672, :t => 1304082088 },
65
- { :id => 28388971, :d => 4177773, :u => 232278672, :t => 1304082089 },
66
- { :id => 28388972, :d => 4177773, :u => 232278672, :t => 1304082090 },
67
- { :id => 28388973, :d => 4177773, :u => 232278672, :t => 1304082091 }
71
+ { :id => 28388970, :received => 4177773, :send => 232278672, :time => Time.at(1304082088) },
72
+ { :id => 28388971, :received => 4177773, :send => 232278672, :time => Time.at(1304082089) },
73
+ { :id => 28388972, :received => 4177773, :send => 232278672, :time => Time.at(1304082090) },
74
+ { :id => 28388973, :received => 4177773, :send => 232278672, :time => Time.at(1304082091) }
68
75
  ]
69
76
  }
70
77
  end
@@ -113,5 +120,19 @@ describe "Measurement" do
113
120
  :percent_used => 39.931
114
121
  ]
115
122
  end
123
+
124
+ it "should be possible to request all data without getting an error" do
125
+ @frame = Istat::Frames::MeasurementResponse.new(%Q{
126
+ <?xml version="1.0" encoding="UTF-8"?><isr></isr>
127
+ })
128
+ @frame.cpu.should == nil
129
+ @frame.network.should == nil
130
+ @frame.memory.should == nil
131
+ @frame.load.should == nil
132
+ @frame.uptime.should == nil
133
+ @frame.temps.should == nil
134
+ @frame.fans.should == nil
135
+ @frame.disks.should == nil
136
+ end
116
137
  end
117
138
  end
@@ -13,10 +13,11 @@ describe "Registration" do
13
13
  xml = %Q{<?xml version="1.0" encoding="UTF-8"?><isr pl="2" ath="1" ss="6" c="28406490" n="28406489"></isr>}
14
14
  frame = Istat::Frames::RegisterResponse.new(xml)
15
15
  frame.ss.should == 6
16
- frame.uptime == 28406489
17
- frame.next_uptime.should == 28406490
16
+ frame.last_uptime == 28406489
17
+ frame.uptime.should == 28406490
18
18
  frame.authorize?.should be_true
19
- frame.pl.should == 2
19
+ frame.platform.should == 2
20
+ frame.other_unix?.should be_true
20
21
  end
21
22
  end
22
23
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: istat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Vincent Landgaf
@@ -45,20 +45,6 @@ extra_rdoc_files: []
45
45
 
46
46
  files:
47
47
  - debug.log
48
- - doc/_index.html
49
- - doc/class_list.html
50
- - doc/css/common.css
51
- - doc/css/full_list.css
52
- - doc/css/style.css
53
- - doc/file.README.html
54
- - doc/file_list.html
55
- - doc/frames.html
56
- - doc/index.html
57
- - doc/js/app.js
58
- - doc/js/full_list.js
59
- - doc/js/jquery.js
60
- - doc/method_list.html
61
- - doc/top-level-namespace.html
62
48
  - istat.gemspec
63
49
  - lib/istat/client.rb
64
50
  - lib/istat/frames/authentication.rb
data/doc/_index.html DELETED
@@ -1,82 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
- <title>Documentation by YARD 0.6.8</title>
7
- <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
8
- <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
9
-
10
- <script type="text/javascript" charset="utf-8">
11
- relpath = '';
12
- if (relpath != '') relpath += '/';
13
- </script>
14
- <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
15
- <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
16
-
17
- </head>
18
- <body>
19
- <script type="text/javascript" charset="utf-8">
20
- if (window.top.frames.main) document.body.className = 'frames';
21
- </script>
22
-
23
- <div id="header">
24
- <div id="menu">
25
-
26
-
27
- <span class="title"></span>
28
-
29
-
30
- <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
31
- </div>
32
-
33
- <div id="search">
34
- <a id="class_list_link" href="#">Class List</a>
35
- <a id="method_list_link" href="#">Method List</a>
36
- <a id ="file_list_link" href="#">File List</a>
37
- </div>
38
-
39
- <div class="clear"></div>
40
- </div>
41
-
42
- <iframe id="search_frame"></iframe>
43
-
44
- <div id="content"><h1 class="noborder title">Documentation by YARD 0.6.8</h1>
45
- <div id="listing">
46
- <h1 class="alphaindex">Alphabetic Index</h1>
47
-
48
- <h2>File Listing</h2>
49
- <ul id="files">
50
-
51
-
52
- <li class="r1"><a href="index.html" title="README">README</a></li>
53
-
54
-
55
- </ul>
56
-
57
- <div class="clear"></div>
58
- <h2>Namespace Listing A-Z</h2>
59
-
60
-
61
-
62
-
63
- <table>
64
- <tr>
65
- <td valign='top' width="33%">
66
-
67
- </td>
68
- </tr>
69
- </table>
70
-
71
- </div>
72
-
73
- </div>
74
-
75
- <div id="footer">
76
- Generated on Fri Apr 29 23:16:06 2011 by
77
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
78
- 0.6.8 (ruby-1.8.7).
79
- </div>
80
-
81
- </body>
82
- </html>
data/doc/class_list.html DELETED
@@ -1,36 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
- <html>
4
- <head>
5
- <meta name="Content-Type" content="text/html; charset=utf-8" />
6
- <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
7
- <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
8
- <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
9
- <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
10
- <base id="base_target" target="_parent" />
11
- </head>
12
- <body>
13
- <script type="text/javascript" charset="utf-8">
14
- if (window.top.frames.main) {
15
- document.getElementById('base_target').target = 'main';
16
- document.body.className = 'frames';
17
- }
18
- </script>
19
- <div id="content">
20
- <h1 id="full_list_header">Class List</h1>
21
- <div id="nav">
22
- <a target="_self" href="class_list.html">Classes</a> |
23
- <a target="_self" href="method_list.html">Methods</a> |
24
- <a target="_self" href="file_list.html">Files</a>
25
- </div>
26
- <div id="search">Search: <input type="text" /></div>
27
-
28
- <ul id="full_list" class="class">
29
- <li><span class='object_link'><a href="top-level-namespace.html" title=" (root)">Top Level Namespace</a></span></li>
30
-
31
-
32
- </ul>
33
- </div>
34
- </body>
35
- </html>
36
-
data/doc/css/common.css DELETED
@@ -1 +0,0 @@
1
- /* Override this file with custom rules */
@@ -1,53 +0,0 @@
1
- body {
2
- margin: 0;
3
- font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
- font-size: 13px;
5
- height: 101%;
6
- overflow-x: hidden;
7
- }
8
-
9
- h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
10
- .clear { clear: both; }
11
- #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
12
- #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
13
- #full_list { padding: 0; list-style: none; margin-left: 0; }
14
- #full_list ul { padding: 0; }
15
- #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
16
- #noresults { padding: 7px 12px; }
17
- #content.insearch #noresults { margin-left: 7px; }
18
- ul.collapsed ul, ul.collapsed li { display: none; }
19
- li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
20
- li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
21
- li { color: #888; cursor: pointer; }
22
- li.deprecated { text-decoration: line-through; font-style: italic; }
23
- li.r1 { background: #f0f0f0; }
24
- li.r2 { background: #fafafa; }
25
- li:hover { background: #ddd; }
26
- li small:before { content: "("; }
27
- li small:after { content: ")"; }
28
- li small.search_info { display: none; }
29
- a:link, a:visited { text-decoration: none; color: #05a; }
30
- li.clicked { background: #05a; color: #ccc; }
31
- li.clicked a:link, li.clicked a:visited { color: #eee; }
32
- li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
33
- li.collapsed.clicked a.toggle { background-position: top right; }
34
- #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
35
- #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
36
- #nav a:link, #nav a:visited { color: #358; }
37
- #nav a:hover { background: transparent; color: #5af; }
38
-
39
- .frames #content h1 { margin-top: 0; }
40
- .frames li { white-space: nowrap; cursor: normal; }
41
- .frames li small { display: block; font-size: 0.8em; }
42
- .frames li small:before { content: ""; }
43
- .frames li small:after { content: ""; }
44
- .frames li small.search_info { display: none; }
45
- .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
46
- .frames #content.insearch #search { background-position: center right; }
47
- .frames #search input { width: 110px; }
48
- .frames #nav { display: block; }
49
-
50
- #full_list.insearch li { display: none; }
51
- #full_list.insearch li.found { display: list-item; padding-left: 10px; }
52
- #full_list.insearch li a.toggle { display: none; }
53
- #full_list.insearch li small.search_info { display: block; }