cryptorecord 0.9.1 → 1.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.
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; }