cryptorecord 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9dd0aea11d1b4802c612423aea44c0beefcacc80eb988b4b302e0a4455d58557
4
- data.tar.gz: 2796ac0711b9c9eee119ebaf56c265ec939d85da8831860eba3c7d1f2d66eac1
3
+ metadata.gz: 3cb7447e2cd340f1c5f9b0b74720d9debb4a9cc0496d5d9ba842c882a2234fe5
4
+ data.tar.gz: 3b1087a391b71288d7bafef1e1d1b450cc7fa4d2bfcd57ef8de7c0a1d40096b2
5
5
  SHA512:
6
- metadata.gz: fa9c9ae9c2536c24fcb2495c022509e8859ddef1410746e54367954ce3b33f8525bbf190f927441cf15f9f2ab01d6ef2c12a09801de3cbed3fabcd43c4f2105f
7
- data.tar.gz: a7cf54d2d643600d85b3c65d81a2a7da81496aaaa1bf3fafa5e0ac69e3825e5ac1c8695a6cc982454c0bf328a41dba8ea084ed423cf7f4a4b335dcc9daa19d0e
6
+ metadata.gz: 56864e65ee0cc253b1bf8895fa5246009d7f5d2e7ff097dc19076b903d86070ea559cf15e90c9cc9f655d954371e4c2db80bbede2fcccb4216ee9ac7fcc1a643
7
+ data.tar.gz: 50abb4e9a1864c8ce6f4c4edc5e2ad6bcf6fb0cc13e6ba3924a89eca28593aca9cab24e37cd7f6d99176b4f4454b5b8101c60df769cb0d5613773e31a3de41c1
data/Dockerfile ADDED
@@ -0,0 +1,21 @@
1
+ FROM ruby:3.0
2
+
3
+ ARG UNAME=rubyapp
4
+ ARG UID=1000
5
+ ARG GID=1000
6
+
7
+
8
+ RUN groupadd -g $GID -o $UNAME && useradd -u $UID -g $GID -d /app -ms /usr/sbin/nologin $UNAME
9
+
10
+ WORKDIR /app
11
+
12
+ COPY scripts/entrypoint.sh /entrypoint.sh
13
+
14
+ COPY . .
15
+ RUN bundle install
16
+
17
+ VOLUME ["/certs"]
18
+
19
+ USER $UNAME
20
+
21
+ ENTRYPOINT ["/entrypoint.sh"]
data/README.md CHANGED
@@ -34,6 +34,21 @@ Or install it yourself as:
34
34
 
35
35
  $ gem install cryptorecord
36
36
 
37
+ ## Docker
38
+
39
+ ### Build Image
40
+
41
+ ```
42
+ docker build -t cryptorecord .
43
+ ```
44
+
45
+ ### Run container
46
+
47
+ Lets mount the certificate in /certs and run tlsarecord using this cert:
48
+ ```
49
+ podman run --rm -v /etc/ssl/certs/ssl-cert-snakeoil.pem:/certs/ssl-cert-snakeoil.pem cryptorecord tlsarecord -f /certs/ssl-cert-snakeoil.pem
50
+ ```
51
+
37
52
  ## Usage
38
53
 
39
54
  This gem comes with some example scripts like:
@@ -109,14 +124,14 @@ puts sshfp
109
124
 
110
125
  require 'cryptorecord'
111
126
 
112
- sshfp = Cryptorecord::Openpgpkeys.new(:uid => "hacky@hacktheplanet.com")
113
- sshfp.read_file("resources/hacky.asc")
114
- puts sshfp
127
+ opk = Cryptorecord::Openpgpkey.new(:uid => "hacky@hacktheplanet.com")
128
+ opk.read_file("resources/hacky.asc")
129
+ puts opk
115
130
 
116
131
  ```
117
132
  ## Documentation
118
133
 
119
- [rubydoc.info](https://www.rubydoc.info/github/whotwagner/cryptorecord/master)
134
+ [rubydoc.info](https://www.rubydoc.info/gems/cryptorecord/)
120
135
 
121
136
  ## Resources
122
137
 
@@ -131,6 +146,12 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
131
146
 
132
147
  To install this gem onto your local machine, run `bundle exec rake install`.
133
148
 
149
+ ## Run tests
150
+
151
+ ```
152
+ docker run --rm --entrypoint "rake" cryptorecord
153
+ ```
154
+
134
155
  ## Contributing
135
156
 
136
157
  Bug reports and pull requests are welcome on GitHub at https://github.com/whotwagner/cryptorecord. This project is intended to be a safe, welcoming space for collaboration.
data/cryptorecord.gemspec CHANGED
@@ -31,7 +31,8 @@ DESCRIPTION
31
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- spec.add_development_dependency "bundler", "~> 1.13"
35
- spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "bundler", "~> 2.2"
35
+ spec.add_development_dependency "rake", ">= 12.3.3"
36
36
  spec.add_development_dependency "rspec", "~> 3.0"
37
+ spec.add_dependency 'mail', '>=2.7.0'
37
38
  end
@@ -31,6 +31,6 @@ unless defined? options.uid
31
31
  exit 1
32
32
  end
33
33
 
34
- openpgpkeys = Cryptorecord::Openpgpkeys.new(options.to_h)
34
+ openpgpkeys = Cryptorecord::Openpgpkey.new(options.to_h)
35
35
  openpgpkeys.read_file(options.keyfile)
36
36
  puts openpgpkeys
@@ -23,15 +23,17 @@
23
23
  module Cryptorecord
24
24
  require 'openssl'
25
25
  require 'mail'
26
- # Cryptorecord::Openpgpkeys-class generates
26
+ # Cryptorecord::Openpgpkey-class generates
27
27
  # openphpkeys-dns-records. Instances must have an
28
28
  # uid. The PGP-Key can be read from file
29
29
  # @!attribute [r] uid
30
30
  # @return [Mail::Address] the userid or nil
31
31
  # @!attribute [r] key
32
32
  # @return [String] the pgp-key as a string
33
- class Openpgpkeys
34
- attr_reader :uid, :key
33
+ # @!attribute [r] rectype
34
+ # @return [String] "OPENPGPKEY"
35
+ class Openpgpkey
36
+ attr_reader :uid, :key, :rectype
35
37
 
36
38
  # This constructor initializes uid and key by calling the setters.
37
39
  # @see uid=
@@ -42,6 +44,7 @@ module Cryptorecord
42
44
  def initialize(args = {})
43
45
  self.uid = args.fetch(:uid, nil)
44
46
  self.key = args.fetch(:key, nil)
47
+ @rectype = 'OPENPGPKEY'
45
48
  end
46
49
 
47
50
  # This setter takes the argument val to create a Mail::Address-object.
@@ -109,11 +112,23 @@ module Cryptorecord
109
112
  self.key = data
110
113
  end
111
114
 
115
+ # This method returns the left-hand name of a dns-record
116
+ # @return [String] left-hand name of a dns-record
117
+ def left
118
+ "#{localpart}._openpgpkey.#{domain}."
119
+ end
120
+
121
+ # This method returns the right-hand content of a dns-record
122
+ # @return [String] right-hand content of a dns-record
123
+ def right
124
+ @key.to_s
125
+ end
126
+
112
127
  # This method concats the openpgpkey-record
113
128
  #
114
129
  # @return [String] openpgpkey dns-record as defined in rfc7929
115
130
  def to_s
116
- "#{localpart}._openpgpkey.#{domain}. IN OPENPGPKEY #{@key}"
131
+ "#{left} IN #{@rectype} #{right}"
117
132
  end
118
133
 
119
134
  private
@@ -33,10 +33,12 @@ module Cryptorecord
33
33
  # @return [Integer] sha1 = 1, sha256 = 2
34
34
  # @!attribute [r] key
35
35
  # @return [String] the ssh-host-key, without the type and comment
36
+ # @!attribute [r] rectype
37
+ # @return [String] "SSHFP"
36
38
  # @!attribute host
37
39
  # @return [String] the fqdn-host
38
40
  class Sshfp
39
- attr_reader :cipher, :digest, :key
41
+ attr_reader :cipher, :digest, :key, :rectype
40
42
  attr_accessor :host
41
43
 
42
44
  # This constructor initializes cipher, key, digest, host and keyfile
@@ -52,7 +54,7 @@ module Cryptorecord
52
54
  self.digest = args.fetch(:digest, 2)
53
55
  @host = args.fetch(:host, 'localhost')
54
56
  keyfile = args.fetch(:keyfile, nil)
55
-
57
+ @rectype = 'SSHFP'
56
58
  read_file(keyfile) unless keyfile.nil?
57
59
  end
58
60
 
@@ -107,13 +109,25 @@ module Cryptorecord
107
109
  end
108
110
  end
109
111
 
112
+ # This method returns the left-hand name of a dns-record
113
+ # @return [String] left-hand name of a dns-record
114
+ def left
115
+ "#{@host}."
116
+ end
117
+
118
+ # This method returns the right-hand content of a dns-record
119
+ # @return [String] right-hand content of a dns-record
120
+ def right
121
+ "#{@cipher} #{@digest} #{fingerprint}"
122
+ end
123
+
110
124
  # This method concats the sshfp-record
111
125
  #
112
126
  # @return [String] sshfp dns-record as defined in rfc4255
113
127
  # @raise Cryptorecord::KeyError
114
128
  def to_s
115
129
  raise Cryptorecord::KeyError, 'No certificate defined' if @key.nil?
116
- "#{@host}. IN SSHFP #{@cipher} #{@digest} #{fingerprint}"
130
+ "#{left} IN #{@rectype} #{right}"
117
131
  end
118
132
 
119
133
  private
@@ -30,8 +30,10 @@ module Cryptorecord
30
30
  # @return [Integer] the match-type
31
31
  # @!attribute [r] usage
32
32
  # @return [Integer] the usage
33
- # @!attribute cert
33
+ # @!attribute [r] cert
34
34
  # @return [String] the x509 certificate
35
+ # @!attribute [r] rectype
36
+ # @return [String] "TLSA"
35
37
  # @!attribute host
36
38
  # @return [String] the fqdn for the record
37
39
  # @!attribute proto
@@ -39,7 +41,7 @@ module Cryptorecord
39
41
  # @!attribute port
40
42
  # @return [String] the network port
41
43
  class Tlsa
42
- attr_reader :selector, :mtype, :usage, :cert
44
+ attr_reader :selector, :mtype, :usage, :cert, :rectype
43
45
  attr_accessor :host, :proto, :port
44
46
 
45
47
  # constructor for the tlsa-object
@@ -60,6 +62,7 @@ module Cryptorecord
60
62
  @port = args.fetch(:port, 443)
61
63
  self.usage = args.fetch(:usage, 3)
62
64
  self.cert = args.fetch(:cert, nil)
65
+ @rectype = 'TLSA'
63
66
  end
64
67
 
65
68
  # This setter initializes the selector
@@ -133,12 +136,23 @@ module Cryptorecord
133
136
  end
134
137
  end
135
138
 
139
+ # This method returns the left-hand name of a dns-record
140
+ # @return [String] left-hand name of a dns-record
141
+ def left
142
+ "_#{@port}._#{@proto}.#{@host}."
143
+ end
144
+
145
+ # This method returns the right-hand content of a dns-record
146
+ # @return [String] right-hand content of a dns-record
147
+ def right
148
+ "#{@usage} #{@selector} #{@mtype} #{fingerprint}"
149
+ end
150
+
136
151
  # This method concats the tlsa-record
137
152
  #
138
153
  # @return [String] tlsa dns-record as defined in rfc6698
139
154
  def to_s
140
- "_#{@port}._#{@proto}.#{@host}. IN TLSA"\
141
- " #{@usage} #{@selector} #{@mtype} #{fingerprint}"
155
+ "#{left} IN #{@rectype} #{right}"
142
156
  end
143
157
 
144
158
  private
@@ -20,5 +20,5 @@
20
20
  #++
21
21
  module Cryptorecord
22
22
  # Guess what..
23
- VERSION = '0.9.1'.freeze
23
+ VERSION = '1.0.0'.freeze
24
24
  end
data/lib/cryptorecord.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'cryptorecord/version'
2
- require 'cryptorecord/openpgpkeys'
2
+ require 'cryptorecord/openpgpkey'
3
3
  require 'cryptorecord/tlsa'
4
4
  require 'cryptorecord/sshfp'
5
5
  require 'cryptorecord/exceptions'
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ EXEDIR=/app/exe
4
+
5
+ case "$1" in
6
+ tlsarecord)
7
+ $EXEDIR/tlsarecord ${*:2}
8
+ ;;
9
+
10
+ openpgpkeysrecord)
11
+ $EXEDIR/openpgpkeysrecord ${*:2}
12
+ ;;
13
+
14
+ sshfprecord)
15
+ $EXEDIR/sshfprecord ${*:2}
16
+ ;;
17
+ *)
18
+ echo "Usage: [ tlsarecord | openpgpkeysrecord | sshfprecord ] <options>"
19
+ exit 1
20
+ ;;
21
+ esac
22
+
23
+ exit 0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cryptorecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wolfgang Hotwagner
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-07 00:00:00.000000000 Z
11
+ date: 2022-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '2.2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mail
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.7.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.7.0
55
69
  description: "This gem provides an API and scripts for creating crypto-related dns-records(e.g.
56
70
  DANE). \nAt the moment the following records are supported:\n * TLSA\n * SSHFP\n
57
71
  \ * OPENPGPKEYS\n\nThis API does not create nor provide any public keys or certificates.
@@ -69,6 +83,7 @@ files:
69
83
  - ".rspec"
70
84
  - ".rubocop.yml"
71
85
  - ".travis.yml"
86
+ - Dockerfile
72
87
  - Gemfile
73
88
  - LICENSE.txt
74
89
  - README.md
@@ -80,34 +95,17 @@ files:
80
95
  - exe/sshfprecord
81
96
  - exe/tlsarecord
82
97
  - lib/cryptorecord.rb
83
- - lib/cryptorecord/.yardoc/checksums
84
- - lib/cryptorecord/.yardoc/complete
85
- - lib/cryptorecord/.yardoc/object_types
86
- - lib/cryptorecord/.yardoc/objects/root.dat
87
- - lib/cryptorecord/.yardoc/proxy_types
88
- - lib/cryptorecord/doc/_index.html
89
- - lib/cryptorecord/doc/class_list.html
90
- - lib/cryptorecord/doc/css/common.css
91
- - lib/cryptorecord/doc/css/full_list.css
92
- - lib/cryptorecord/doc/css/style.css
93
- - lib/cryptorecord/doc/file_list.html
94
- - lib/cryptorecord/doc/frames.html
95
- - lib/cryptorecord/doc/index.html
96
- - lib/cryptorecord/doc/js/app.js
97
- - lib/cryptorecord/doc/js/full_list.js
98
- - lib/cryptorecord/doc/js/jquery.js
99
- - lib/cryptorecord/doc/method_list.html
100
- - lib/cryptorecord/doc/top-level-namespace.html
101
98
  - lib/cryptorecord/exceptions.rb
102
- - lib/cryptorecord/openpgpkeys.rb
99
+ - lib/cryptorecord/openpgpkey.rb
103
100
  - lib/cryptorecord/sshfp.rb
104
101
  - lib/cryptorecord/tlsa.rb
105
102
  - lib/cryptorecord/version.rb
103
+ - scripts/entrypoint.sh
106
104
  homepage: https://github.com/whotwagner/cryptorecord
107
105
  licenses:
108
106
  - GPL
109
107
  metadata: {}
110
- post_install_message:
108
+ post_install_message:
111
109
  rdoc_options: []
112
110
  require_paths:
113
111
  - lib
@@ -122,9 +120,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
120
  - !ruby/object:Gem::Version
123
121
  version: '0'
124
122
  requirements: []
125
- rubyforge_project:
126
- rubygems_version: 2.7.6
127
- signing_key:
123
+ rubygems_version: 3.2.22
124
+ signing_key:
128
125
  specification_version: 4
129
126
  summary: cryptorecord is a ruby-gem that helps creating crypto-related dns-records
130
127
  like tlsa/sshfp/openpgpkey
File without changes
File without changes
Binary file
Binary file
@@ -1,85 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>
7
- Documentation by YARD 0.9.12
8
-
9
- </title>
10
-
11
- <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
12
-
13
- <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
14
-
15
- <script type="text/javascript" charset="utf-8">
16
- pathId = null;
17
- relpath = '';
18
- </script>
19
-
20
-
21
- <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
22
-
23
- <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
24
-
25
-
26
- </head>
27
- <body>
28
- <div class="nav_wrap">
29
- <iframe id="nav" src="class_list.html?1"></iframe>
30
- <div id="resizer"></div>
31
- </div>
32
-
33
- <div id="main" tabindex="-1">
34
- <div id="header">
35
- <div id="menu">
36
-
37
- </div>
38
-
39
- <div id="search">
40
-
41
- <a class="full_list_link" id="class_list_link"
42
- href="class_list.html">
43
-
44
- <svg width="24" height="24">
45
- <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
46
- <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
47
- <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
48
- </svg>
49
- </a>
50
-
51
- </div>
52
- <div class="clear"></div>
53
- </div>
54
-
55
- <div id="content"><h1 class="noborder title">Documentation by YARD 0.9.12</h1>
56
- <div id="listing">
57
- <h1 class="alphaindex">Alphabetic Index</h1>
58
-
59
- <div class="clear"></div>
60
- <h2>Namespace Listing A-Z</h2>
61
-
62
-
63
-
64
-
65
- <table>
66
- <tr>
67
- <td valign='top' width="33%">
68
-
69
- </td>
70
- </tr>
71
- </table>
72
-
73
- </div>
74
-
75
- </div>
76
-
77
- <div id="footer">
78
- Generated on Sat May 5 14:24:03 2018 by
79
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
80
- 0.9.12 (ruby-2.5.1).
81
- </div>
82
-
83
- </div>
84
- </body>
85
- </html>
@@ -1,51 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
- <meta charset="utf-8" />
6
-
7
- <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
-
9
- <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
-
11
-
12
-
13
- <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
-
15
- <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
-
17
-
18
- <title>Class List</title>
19
- <base id="base_target" target="_parent" />
20
- </head>
21
- <body>
22
- <div id="content">
23
- <div class="fixed_header">
24
- <h1 id="full_list_header">Class List</h1>
25
- <div id="full_list_nav">
26
-
27
- <span><a target="_self" href="class_list.html">
28
- Classes
29
- </a></span>
30
-
31
- <span><a target="_self" href="method_list.html">
32
- Methods
33
- </a></span>
34
-
35
- <span><a target="_self" href="file_list.html">
36
- Files
37
- </a></span>
38
-
39
- </div>
40
-
41
- <div id="search">Search: <input type="text" /></div>
42
- </div>
43
-
44
- <ul id="full_list" class="class">
45
- <li id="object_" class="odd"><div class="item" style="padding-left:30px"><span class='object_link'><a href="top-level-namespace.html" title="Top Level Namespace (root)">Top Level Namespace</a></span></div></li>
46
-
47
-
48
- </ul>
49
- </div>
50
- </body>
51
- </html>
@@ -1 +0,0 @@
1
- /* Override this file with custom rules */
@@ -1,58 +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
- background: #fafafa;
8
- }
9
-
10
- h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
11
- .clear { clear: both; }
12
- .fixed_header { position: fixed; background: #fff; width: 100%; padding-bottom: 10px; margin-top: 0; top: 0; z-index: 9999; height: 70px; }
13
- #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
14
- #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; }
15
- #full_list { padding: 0; list-style: none; margin-left: 0; margin-top: 80px; font-size: 1.1em; }
16
- #full_list ul { padding: 0; }
17
- #full_list li { padding: 0; margin: 0; list-style: none; }
18
- #full_list li .item { padding: 5px 5px 5px 12px; }
19
- #noresults { padding: 7px 12px; background: #fff; }
20
- #content.insearch #noresults { margin-left: 7px; }
21
- li.collapsed ul { display: none; }
22
- 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; }
23
- li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
24
- li { color: #888; cursor: pointer; }
25
- li.deprecated { text-decoration: line-through; font-style: italic; }
26
- li.odd { background: #f0f0f0; }
27
- li.even { background: #fafafa; }
28
- .item:hover { background: #ddd; }
29
- li small:before { content: "("; }
30
- li small:after { content: ")"; }
31
- li small.search_info { display: none; }
32
- a, a:visited { text-decoration: none; color: #05a; }
33
- li.clicked > .item { background: #05a; color: #ccc; }
34
- li.clicked > .item a, li.clicked > .item a:visited { color: #eee; }
35
- li.clicked > .item a.toggle { opacity: 0.5; background-position: bottom right; }
36
- li.collapsed.clicked a.toggle { background-position: top right; }
37
- #search input { border: 1px solid #bbb; border-radius: 3px; }
38
- #full_list_nav { margin-left: 10px; font-size: 0.9em; display: block; color: #aaa; }
39
- #full_list_nav a, #nav a:visited { color: #358; }
40
- #full_list_nav a:hover { background: transparent; color: #5af; }
41
- #full_list_nav span:after { content: ' | '; }
42
- #full_list_nav span:last-child:after { content: ''; }
43
-
44
- #content h1 { margin-top: 0; }
45
- li { white-space: nowrap; cursor: normal; }
46
- li small { display: block; font-size: 0.8em; }
47
- li small:before { content: ""; }
48
- li small:after { content: ""; }
49
- li small.search_info { display: none; }
50
- #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
51
- #content.insearch #search { background-position: center right; }
52
- #search input { width: 110px; }
53
-
54
- #full_list.insearch ul { display: block; }
55
- #full_list.insearch .item { display: none; }
56
- #full_list.insearch .found { display: block; padding-left: 11px !important; }
57
- #full_list.insearch li a.toggle { display: none; }
58
- #full_list.insearch li small.search_info { display: block; }