texrack 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MmE1MTFhNzg2NzBkMTRkNmYyYjMzZmM0MWM5NmMxN2RlNTRiYzM3ZA==
4
+ NGIyZDVhOGRjYzc0MzQ5ZGQwMzlhMmE0MTdkYWE4MDZmODRlMTUwYw==
5
5
  data.tar.gz: !binary |-
6
- NmI3OTA3YjRhNDhlN2ExZmFmOWJiYmVjOGQyYmZmZmFkMTBkOTU5Yw==
6
+ NTkwNWQ1MTI3ZjkzZTljMGI1NjU0ZmU3MGMwMTE2NTljM2EyNjE2Nw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZmI3ZDQ2MjcwYWVlYjQzNTJhNWEwYmYxYWQ0Y2I5YWZjYmQwYzI2ZTdlYzNl
10
- ZjFhODc2ZDI2NjNmYTIxYWI4NjBlNjRiYzI1OGVkMDU0ODc1ZmJmMGFlYzEy
11
- OGZlMzdlMmRkOGU0MDg2NDc1YmE0OWViMjk3ZTg2NTI5MDJlZTg=
9
+ M2Q2NTQ0ZDRjMTg3NjE5OTM5MmExM2U5ZmM2MzdhMDg4ZDQxNDczZmI0YTcz
10
+ OTY1MzQ1ZGU0ZTZiOGU5MjIyNTgwNzMwOGEwZmNjMTI0Mjc2N2UxN2RjZmNl
11
+ MDU0NjBlZTFkN2Q2NTIzYmI4MTM5YzNlZmY0NDM0NWExODQ5ZWQ=
12
12
  data.tar.gz: !binary |-
13
- NDE1YmZkYjY5ZTE4MDUwZDkyYTBiOTZjOTI0OWFmYmJkMWY4N2I0YjA4ZmI3
14
- OGExOTUzYTQ2MDM0NGRhZGNmMmI1YzA0MzI3ZGE2MjIxODA5NGNjMGU1MWY2
15
- MzZhMjc2YzNkNDJhN2M0ZGM2OWM4NDRjZmI0MGZhNTk2NmVmNjM=
13
+ OTIyYzU4NTA2YmIyMzViODEwMDQ5NjNlNTFhZjFjNjVhMGVhYTdmMGE5YWQ5
14
+ NDFkYWFkMTJmYTAxNmQwYWZlMDU5MWMxZWMyMzI4ZGQ1NDAzNGVhODdjNWQz
15
+ NTMwMTAwMjZjMDcwZDY2MTE2ZGU0YjQ1OGJmNzM0OGY0MWZjMDI=
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGjAAoJEH1ncb0Txu7XVnoP/1lZdSrAUwVvNYSrb/bpggKa
6
- 2C4VKplgsB204dKV8HoLgLEThqaq7ljengC8bS/YHPAKS8DTclesPN9zZ7UzvLmF
7
- IvLYasZnTDC6zAgMUHdhAz3Y+epUOdMPjTid25i1C/Zs19ZQaD2E9SizsoqUf6rm
8
- 2M4bBioMoYhxK8VzZvaehl84iXAg9fkWmkBYBITPf4Sr+luMoyXPBVeQMMXXneuE
9
- TfBWAYLH0C1dYk8/6Ys/ZIBVdNYkMO4iz9icE/mTBhTKHPt4BtEjas8/gt4Pvjkj
10
- Qqme7XKXMBdwp0Y95HWsfKrCVfM08S7RcbxsgNV6xuBHZQy9k9LU2i6z4aZD08fz
11
- kujdSnfOc7fO/GqukiYLHzHXiYJ6/BtHPRFQpo9O7sM1GlOktuIckyOlDsAKzfH8
12
- Bp6YcApw39QmoH+NBkXgQQOg3TSBhlzXapjLInRv4dtAsDFNVMkQQa9YXtdKOKik
13
- g9H7Q6grwx3ZRv8BypDFqhUoQnD1DY7dQu0A0+1QRAo4dJcECjSWLM5oyywVVKO3
14
- ctYvj4nD9Ma9QxNR2oL25pogjaRbx+CUMQaZYD2lnbpVt+BoEgO27AIkGVYYzsC1
15
- elN9CvkxDCrJhgRygz8NHDQ2Rfm6vYCx7gnJrp7+JpesDQRs+uTExurEEAlkSLFW
16
- zOzAeMo2w49TQcgl1cFW
17
- =1Kx8
5
+ iQIcBAABAgAGBQJSc3n3AAoJEH1ncb0Txu7XuZMQAJKfYU5XwxxT6Nw2aNhVVCoZ
6
+ Q34Lt43zPcQpHHF8LK5bP/FNHD4GQK+WWiMPComX5VmnTIxLbQX2DNEWmeiMpyjw
7
+ ydYzURm8aZGheI1ejFuE9Py50m8WeTAituN/x2ey5WnwGIEsvVVQ+NYXdknz2jNl
8
+ nvbaiH3/F8UZe7oqeCKFTPB5XPaIDQQMdk3pwGqiIPtSXnIig51LP7dvKPQ06Yca
9
+ TiZYxjsQjRIJviHFO5nbww7322eNDlySqGdndlRJxAJjcLcrhruf0kdWOcev4ZF4
10
+ rChy909T/r+5aJ7P58lgNQWI0MA+4LuLlKNyQhN+dbnGvdEioF88gfaQPhBm4sTC
11
+ AAIPvp4suFWKerwmOveG607KvK7178V+5svrSZDrnxfhu3K+8+42coh1Gsyh4EeL
12
+ c7xSXLMqycmqQxTtXlVkFk2IoQytieaXD/BnjKqLKkjQGXTQlVD+1hXxNcMheda+
13
+ IKO08yma6uEiocJxZjvb9nVhDbicLfO428bdjihGYYs/cF7nhlojVJFxp9r2Kf7Z
14
+ xv9zQkVsDhL6Ucr266G3DKN0mzSBeZZB78axkzjZJRVkxyc8oL2/IMutLCZIYHfR
15
+ JmmalIU9ZoGdRoUXmr8A9MwDIQKu2rlogaFSkaM/ZKjYovfIwyYgFi+PVOX9wa8l
16
+ FzBRzW44gnLsWCjrSieU
17
+ =LOQB
18
18
  -----END PGP SIGNATURE-----
data.tar.gz.asc CHANGED
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGiAAoJEH1ncb0Txu7XPisP/R45LFwRbSbSsqUgfE4hTNda
6
- 3XZhBDwrno1Rc/i3i29klT3/YmxhMSzNosDQReqrJA2rhC7eu/1lq8Ndt2gih/Pu
7
- 9f0nOVauXAz1LwQgAn5M3jelqCt9PSUZfJVxsV1k48zFh0Vbl+oogZ25VRqcurN7
8
- bfMb3QdtXv3iIi9s1x5OwjVtpHqzMFVI4JpvAUTAOXacnaN1tnlTaUY9avoDrZc1
9
- Av0pk8Pu0w+G1IPEb3GRicXdq4Bl8dD/qlgSIXO/KWvgmVHqjoJTWHBnF92Ehist
10
- 0SsZvEwY6VTZ19hYhCWKRpIbh37wR18e3rcRRia91d3iU1ggCJCSX8pBqkxsozFN
11
- h34jKTR45bIZOSEVV87Gdksea2PlgtG5uw1qBFXCEDkAQoMfKIom8bLvpssTNczf
12
- hg9wazU0CmJHddFqFA6SqtWf6BwZoJ0O/GXOso7MeBJ6y2Pl5IWyr8tBbqZf5NpF
13
- FIP7uPKLMO7KE28DYtrmcEKvA2jXmnQtK5ddztJkIUlZwie4zvS3WVSwKBjxOhFs
14
- XzYPV1q9bxiuVES2AGWA0yq/m4RBpKfJT+N47jm5zXMgvphJiQpHbPO3EA5RE+dQ
15
- TLmGAqZ1lM77WnN3qDCvfHNm+ovh2H9KixfOwnlahVL1WEhWA+XEki3sFemx1BB0
16
- OWV9BKLJ6NO1SAw/Tb5l
17
- =Vq2I
5
+ iQIcBAABAgAGBQJSc3n3AAoJEH1ncb0Txu7XMcwP/1S6Ixhnzw6oKq/8hiJ6T1bA
6
+ tHf5Ip8nB0BZP2vIioAeEOJxZDr3YnbRJ+d4nJy4MltqlYZtE4ZV64umNKqRnSHT
7
+ JtwHK7my38kA9H7pM6GKJq19VojZU7RxDAmp/RHkLbZfh9pC8su09lshOX7EX09f
8
+ jIIo1PhZUT9yhXiuPczNHa6fI/z4c942a8KCAIftrF3xDCA9ahY63QeYarr3LVrf
9
+ 0QwvAORKQ9tv16M/BxArhF36mnVF64wFYa7mkqrczCkXXGwWlBXH0D1fv/GEvvZz
10
+ OQzWGCsOEdH8IKup8bwKtAnXxuZlvLkct1DQgiCv7N8PDhTdcu73JJW9XPXBDL81
11
+ eI7bSAJMGYbBNaU3g22tFVV8kf7rS6YoscUMiugC+1swv8EBltgR0B9U/dHtt7yQ
12
+ UtdSw8ZdlMPat+lJH+vXeY8z5IZp3GaR8arIrIFt8JWECut1vN2zx3GJmEhGo+ip
13
+ 1jJg196cqkeP1T2lxSWnG+qTjSL0WXo5tg3KKzaltyUrYVgJONm9gAy0I85Jqavm
14
+ fk7XBNyBTpCs1+qrDiEcoN8Pe1+7xIT9MFfgV5g9wabyu7URE9oJvwnFW5A1Z+b7
15
+ tm0Ap7yKpJDK07WWOv38CdFaEn1bczneKq98sJV++94VWCt4d9Cgi+KZdqtpVf4X
16
+ lyxazvcPqMp5oPiQY+nl
17
+ =dGL3
18
18
  -----END PGP SIGNATURE-----
data/README.md CHANGED
@@ -5,8 +5,7 @@ Simple Rack middleware to render LaTeX to PNGs on the fly.
5
5
  ## Requirements
6
6
 
7
7
  * `pdflatex` must exist in `$PATH`
8
- * RMagick does the conversion from PDF to PNG, so `ImageMagick` must be
9
- installed and available.
8
+ * `convert` (from ImageMagick) must exist in `$PATH`
10
9
 
11
10
  ## Configuration
12
11
 
data/config.ru CHANGED
@@ -1,4 +1,4 @@
1
1
  $:.unshift 'lib'
2
2
  require 'texrack'
3
3
 
4
- run Texrack::Endpoint
4
+ run Texrack::Endpoint.new
@@ -2,3 +2,9 @@ require 'texrack/version'
2
2
  require 'texrack/latex_to_pdf'
3
3
  require 'texrack/pdf_to_png'
4
4
  require 'texrack/endpoint'
5
+
6
+ module Texrack
7
+ class LatexNotFoundError < StandardError; end
8
+ class ConvertNotFoundError < StandardError; end
9
+ class LatexFailedError < StandardError; end
10
+ end
@@ -4,6 +4,7 @@ require 'erb'
4
4
  module Texrack
5
5
  class Endpoint < Sinatra::Base
6
6
  enable :logging
7
+ set :public_folder, File.dirname(__FILE__) + '/static'
7
8
 
8
9
  get '/' do
9
10
  if params[:data].to_s.strip != ""
@@ -19,12 +20,33 @@ module Texrack
19
20
 
20
21
  def render_png(source)
21
22
  content_type 'image/png'
22
- @data = source
23
- pdf_source = erb :latex
24
- pdf = Texrack::LatexToPdf.new(pdf_source, logger).generate_pdf
25
- tmp = Tempfile.new(["texrack-output", ".png"])
26
- png = Texrack::PdfToPng.new(pdf).to_file(tmp)
27
- png
23
+ begin
24
+ @data = source
25
+ output = Tempfile.new(["texrack-output", ".png"])
26
+ pdf_source = erb :latex
27
+ pdf = Texrack::LatexToPdf.new(pdf_source, logger).generate_pdf
28
+ png = Texrack::PdfToPng.new(pdf, logger).to_file(output)
29
+ send_file png, {
30
+ disposition: :inline
31
+ }
32
+ rescue Texrack::LatexFailedError
33
+ send_file File.join(settings.public_folder, "latex-failed.png"), {
34
+ disposition: :inline,
35
+ status: 500
36
+ }
37
+ rescue Texrack::LatexNotFoundError
38
+ logger.error "Could not find pdflatex in #{ENV['PATH']}"
39
+ send_file File.join(settings.public_folder, "missing-pdflatex.png"), {
40
+ disposition: :inline,
41
+ status: 500
42
+ }
43
+ rescue Texrack::ConvertNotFoundError
44
+ logger.error "Could not find convert (ImageMagick) in #{ENV['PATH']}"
45
+ send_file File.join(settings.public_folder, "missing-convert.png"), {
46
+ disposition: :inline,
47
+ status: 500
48
+ }
49
+ end
28
50
  end
29
51
 
30
52
  helpers do
@@ -32,6 +54,10 @@ module Texrack
32
54
  params[:math] != "0"
33
55
  end
34
56
 
57
+ def root_path
58
+ "#{env['SCRIPT_NAME']}/"
59
+ end
60
+
35
61
  def packages
36
62
  found = {}
37
63
  params[:packages].to_s.split("|").each do |package|
@@ -15,6 +15,8 @@ class Texrack::LatexToPdf
15
15
  #
16
16
  # pdflatex is used to convert the file.
17
17
  def generate_pdf
18
+ raise Texrack::LatexNotFoundError unless has_pdflatex?
19
+
18
20
  logger.debug "Generating PDF from #{latex}"
19
21
  input = Tempfile.new(["texrack-input", ".tex"])
20
22
  input.binmode
@@ -41,15 +43,21 @@ class Texrack::LatexToPdf
41
43
  end
42
44
  end)
43
45
 
44
- output = input.path.sub(/\.tex$/, '.pdf')
45
- if File.exist?(output)
46
- result = File.read(output)
47
- else
48
- logger.warn "Unable to find file #{output}"
49
- raise "pdflatex failed"
46
+ output = input.path.sub(/\.tex$/, '.pdf')
47
+ logfile = input.path.sub(/\.tex$/, '.log')
48
+ if !File.exist?(output)
49
+ loglines = File.read(logfile)
50
+ logger.error "Unable to find file #{output}"
51
+ logger.error "LaTeX output: #{loglines}"
52
+ raise Texrack::LatexFailedError
50
53
  end
51
54
 
52
55
  input.close
53
- result
56
+ output
57
+ end
58
+
59
+ def has_pdflatex?
60
+ ENV["PATH"].split(':').any? {|x| FileTest.executable? "#{x}/pdflatex" }
54
61
  end
62
+ private :has_pdflatex?
55
63
  end
@@ -1,15 +1,19 @@
1
- require 'RMagick'
1
+ require 'cocaine'
2
2
 
3
3
  class Texrack::PdfToPng
4
- def initialize(blob)
5
- @img = Magick::Image.from_blob(blob) do |info|
6
- info.density = "300x300"
7
- info.quality = 90
8
- end[0]
4
+ attr_reader :pdf_path, :logger, :line
5
+
6
+ def initialize(pdf_path, logger)
7
+ @pdf_path = pdf_path
8
+ @logger = logger
9
+ @line = Cocaine::CommandLine.new("convert",
10
+ "-density 300x300 -quality 90 :in :out", logger: logger)
9
11
  end
10
12
 
11
13
  def to_file(file)
12
- @img.write('png:' + file.path)
13
- file
14
+ line.run(in: pdf_path, out: file.path)
15
+ file.path
16
+ rescue Cocaine::CommandNotFoundError => e
17
+ raise Texrack::ConvertNotFoundError
14
18
  end
15
19
  end
@@ -1,3 +1,3 @@
1
1
  module Texrack
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,38 +1,38 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>Texrack</title>
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
4
+ <title>Texrack</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
7
7
  </head>
8
8
  <body>
9
- <div class="container">
10
- <h1 class="page-header">Render <img src="/?data=\LaTeX&math=0" alt="LaTeX"> as a PNG</h1>
9
+ <div class="container">
10
+ <h1 class="page-header">Render <img src="<%= root_path %>?data=\LaTeX&math=0" alt="LaTeX"> as a PNG</h1>
11
11
 
12
- <form role="form" action="/" method="POST">
13
- <div class="form-group">
14
- <label for="data">LaTeX to render</label>
15
- <textarea class="form-control" id="data" name="data" rows="5"></textarea>
16
- </div>
17
- <div class="checkbox">
18
- <label>
19
- <input type="hidden" name="math" value="0">
20
- <input type="checkbox" checked name="math" value="1"> Render in math mode?
21
- </label>
22
- </div>
23
- <div class="form-group">
24
- <label for="packages">Extra packages to include</label>
25
- <input type="text" class="form-control" id="packages" name="packages">
26
- <p class="help-block">
27
- Separate packages with a pipe (|).
28
- Arguments are also supported. Example: "[english]babel|amsmath"
29
- </p>
30
- </div>
12
+ <form role="form" action="<%= root_path %>" method="POST">
13
+ <div class="form-group">
14
+ <label for="data">LaTeX to render</label>
15
+ <textarea class="form-control" id="data" name="data" rows="5"></textarea>
16
+ </div>
17
+ <div class="checkbox">
18
+ <label>
19
+ <input type="hidden" name="math" value="0">
20
+ <input type="checkbox" checked name="math" value="1"> Render in math mode?
21
+ </label>
22
+ </div>
23
+ <div class="form-group">
24
+ <label for="packages">Extra packages to include</label>
25
+ <input type="text" class="form-control" id="packages" name="packages">
26
+ <p class="help-block">
27
+ Separate packages with a pipe (|).
28
+ Arguments are also supported. Example: "[english]babel|amsmath"
29
+ </p>
30
+ </div>
31
31
 
32
- <div class="form-actions">
33
- <input type="submit" class="btn btn-primary" value="Render PNG">
32
+ <div class="form-actions">
33
+ <input type="submit" class="btn btn-primary" value="Render PNG">
34
+ </div>
35
+ </form>
34
36
  </div>
35
- </form>
36
- </div>
37
37
  </body>
38
38
  </html>
@@ -24,5 +24,5 @@ Gem::Specification.new do |s|
24
24
  ]
25
25
 
26
26
  s.add_dependency 'sinatra', '~> 1.4.4'
27
- s.add_dependency 'rmagick', '~> 2.13.2'
27
+ s.add_dependency 'cocaine', '~> 0.5.3'
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: texrack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Per Christian B. Viken
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-28 00:00:00.000000000 Z
11
+ date: 2013-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -29,15 +29,15 @@ dependencies:
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 2.13.2
32
+ version: 0.5.3
33
33
  version_requirements: !ruby/object:Gem::Requirement
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 2.13.2
37
+ version: 0.5.3
38
38
  type: :runtime
39
39
  prerelease: false
40
- name: rmagick
40
+ name: cocaine
41
41
  description: texrack is a microservice that renders LaTeX as PNG files. Can be mounted
42
42
  in a Rack app
43
43
  email:
@@ -55,6 +55,9 @@ files:
55
55
  - lib/texrack/endpoint.rb
56
56
  - lib/texrack/latex_to_pdf.rb
57
57
  - lib/texrack/pdf_to_png.rb
58
+ - lib/texrack/static/latex-failed.png
59
+ - lib/texrack/static/missing-convert.png
60
+ - lib/texrack/static/missing-pdflatex.png
58
61
  - lib/texrack/version.rb
59
62
  - lib/texrack/views/form.erb
60
63
  - lib/texrack/views/latex.erb
metadata.gz.asc CHANGED
@@ -2,17 +2,17 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQIcBAABAgAGBQJSbpGiAAoJEH1ncb0Txu7X2UwP/1PwVQwNgtK6Q9fSQOiyDuyK
6
- teRGNeHN+AzddQ5z0YeA++fa8xUPRHbkc5VScZspypHoRVzrzbLsmrNHjRf95qNF
7
- ZcIoOXePuYSpUNLsVekUruB9EUC6LuXbgBxSuDkwP/pCpUnXARADP6qCVXDDJCwr
8
- xzwzvIQRkM3WkrxwaNDx8GKkwCuRu+bTPFg98XDHdqM4eK8faQKozzchFfFgGutB
9
- 73VISK3SZFf9ciXH9HfeTi21SoyW3bQFO/Nzx+rFtOI/6A9XFvQ3yL6AWuBOnru3
10
- 2J657sWu3N59spiuepU3V6b6esUiS6Oe1sJPIiUgVk5UFsWQ252baz6jIXaIBs7M
11
- E8eC/OUp2zGFUYv+gpr0wWQ9rnSG4KmHD7YSVQ2E+DrFKI+aNekVvrKvGkp+6qwa
12
- lReG7URHF7x6OXdC4WIZMYBPWzkpUF9TFdTGUyRYguItsOO0Gk0r1Amyl7E+SN1v
13
- wkaQ8GFO4pM3UxrEbtzKaSd0utGB1GeuHEnXfPeuEWG2vfRoGNJMB6y4GzpB3uLf
14
- jprL4cmUQgCMZz5+MPopneP5y1UK1i0fZLUCn0dcMoNpPa4Ga0zP+3y5VibzfsYW
15
- CHMkXPDstJAzmXjNngYz/CtlePt2X2nZSrfnocq0rr7/U2icqyMi78HaNLTF1bkC
16
- syu+g/0vyVyWXNEI84Uf
17
- =c1X7
5
+ iQIcBAABAgAGBQJSc3n2AAoJEH1ncb0Txu7XDdsP/3N7Sfl6Xfm3hwSaNxeOxGwb
6
+ QOhc54Ri2o52AP0eUzQptpbkgonfTrk1rOH2Tvekj6PqfoJtv9mk6GZ8bCumcYtB
7
+ +06IjudEtI78SF2O6/r0QEtXnIqOnqmqFPn9r8OY4FmMqCNkabN+DF+5LkJqM0tQ
8
+ PnlDl3eY/3sBn5n4V5ujRLWXcRIhcXH8OC7TrESazF1gB4OdqDWDQkoSGco1qoCV
9
+ 8aY6DemL8v15x7pOpW+BpaAuUTxZe0Hnar4RRlBqrVMbqfTav4flVJxA5wy0bQkY
10
+ SciH/jTs20PjWDYZMnCb2tug+hSieB/draHlb0zurWUWtqolcyZMcsXKpDq94/8j
11
+ JE3A0DJnnmOpyWfI6B84gYkyK1lm/8SgVLze4CEtnAUwajKw+vKvxCLqvZs/NK5L
12
+ 4HrgDqjUUdxaVlPVUHBMfP4NoAw+DZSPRY2LXqmMYyvLHcA6Oa1AkAyliesnUVG8
13
+ aZpMff3zQeZ4dullgXszgD5p868Mhaefp/ObPkRFWOhUMq7imkwuQE89sCrYnmp9
14
+ 0skxN8LNnFDNNqCZRkDRTWcodxgy7Rxb5wqZ5CdcMDQvq4tXEEjHIEC1IkD4OGJq
15
+ Wm6xoQXhA9KKe3gqFN4xBnXa4vFuR9m7OgnRXywb9U0g939B5sLq77aC51jlhrId
16
+ SaxeCrGbAqj0yjr41kUF
17
+ =K/3E
18
18
  -----END PGP SIGNATURE-----