zopfli-ffi 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: da0f9bd399b19a7fd81b7fa554180f93f85b3ef9
4
+ data.tar.gz: f409afccb3951669199cf577270f5f430a83cf5f
5
+ SHA512:
6
+ metadata.gz: 78a885851fd5f278603f90da1ca45d781aba88a05dac7d2ab7d4670d4edf79c93d882951334178ace0d6f71d2b13f5d3e44e44c919a5cebe16c1d04553652e99
7
+ data.tar.gz: 5a2662144ec366ebbd22e67cacbbf41f7a44369e31d7f0ec1fbd1766b5c7529c31425edc19110d7b1b7de49de508bdc9cc6dab0d2bf076c3e62e1156be61e789
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ ext/zopfli_ffi/x86_64-darwin/
19
+ ext/zopfli_ffi/x86_64-linux/
20
+ .vagrant
21
+ Vagrantfile
22
+
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/.travis.yml ADDED
@@ -0,0 +1,23 @@
1
+ language: ruby
2
+ before_install:
3
+ - ./spec/travis_build.sh > /dev/null 2>&1
4
+ rvm:
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - 2.0.0
8
+ - 2.1.3
9
+ - jruby-19mode
10
+ - rbx-19mode
11
+ - ruby-head
12
+ - jruby-head
13
+ notifications:
14
+ email: false
15
+ branches:
16
+ only:
17
+ - master
18
+ - development
19
+ matrix:
20
+ allow_failures:
21
+ - rvm: rbx-19mode
22
+ - rvm: ruby-head
23
+ - rvm: jruby-head
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in zopfli-ffi.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alexey Vasiliev
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # Zopfli-ffi [![Build Status](https://travis-ci.org/le0pard/zopfli-ffi.svg?branch=master)](https://travis-ci.org/le0pard/zopfli-ffi)
2
+
3
+ Ruby wrapper for [Zopfli](https://code.google.com/p/zopfli/) library. Zopfli Compression Algorithm is a new zlib (gzip, deflate) compatible compressor. This compressor takes more time (~100x slower), but compresses around 5% better than zlib and better than any other zlib-compatible compressor.
4
+
5
+ ### Requirements
6
+
7
+ First of all you should have install libraries: zopfli, zlib.
8
+
9
+ For Ubuntu, Debian:
10
+
11
+ sudo apt-get install git build-essential zlib1g-dev
12
+
13
+ Next you should install zopfli:
14
+
15
+ git clone https://github.com/Hello71/zopfli.git
16
+ cd zopfli
17
+ make && sudo make install
18
+
19
+
20
+ This gem is not support Windows and Mac OS systems (libzopfli isn't compiling on this systems).
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ gem 'zopfli-ffi'
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install zopfli-ffi
35
+
36
+ ## Usage
37
+
38
+ Very simple usage example:
39
+
40
+ ```ruby
41
+ require 'zlib'
42
+ require 'zopfli_ffi'
43
+
44
+ uncompressed_file = 'spec/fixtures/test.txt'
45
+ compressed_file = 'spec/fixtures/test.txt.gz'
46
+
47
+ Zopfli.compress(uncompressed_file, compressed_file)
48
+
49
+ uncompressed_data = File.read(uncompressed_file)
50
+ uncompressed_zopfli_data = Zlib::Inflate.inflate File.read(compressed_file)
51
+ uncompressed_zopfli_data == uncompressed_data # true
52
+ ```
53
+
54
+ You can define format of compression (`:zlib` is default):
55
+
56
+ ```ruby
57
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib) # default format
58
+ Zopfli.compress(uncompressed_file, compressed_file, :deflate)
59
+ Zopfli.compress(uncompressed_file, compressed_file, :gzip)
60
+ ```
61
+
62
+ Also you can define number of iterations for compression (greater number - better compression, but slower compression time; default = 15):
63
+
64
+ ```ruby
65
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib, 15) # default format
66
+ Zopfli.compress(uncompressed_file, compressed_file, :deflate, 5)
67
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib, 25)
68
+ ```
69
+
70
+ ## Contributing
71
+
72
+ 1. Fork it ( http://github.com/le0pard/zopfli-ffi/fork )
73
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
75
+ 4. Push to the branch (`git push origin my-new-feature`)
76
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rake'
4
+ require 'rake/clean'
5
+ require 'bundler/gem_tasks'
6
+ require 'rspec/core/rake_task'
7
+ require 'ffi-compiler/compile_task'
8
+
9
+ desc "compiler tasks"
10
+ namespace "ffi-compiler" do
11
+ FFI::Compiler::CompileTask.new('ext/zopfli_ffi/zopfli_ffi') do |c|
12
+ c.have_header?('stdio.h', '/usr/local/include')
13
+ c.have_func?('puts')
14
+ c.have_library?('z')
15
+ # zopfli
16
+ c.have_header?('zopfli.h', '/usr/local/include')
17
+ c.have_func?('ZopfliInitOptions')
18
+ c.have_func?('ZopfliCompress')
19
+ c.have_library?('zopfli')
20
+ # compiler flags
21
+ if c.platform.mac?
22
+ c.cflags << "-arch x86_64"
23
+ c.ldflags << "-arch x86_64"
24
+ end
25
+ end
26
+ end
27
+ task :compile => ["ffi-compiler:default"]
28
+
29
+ desc "run specs"
30
+ task :spec do
31
+ RSpec::Core::RakeTask.new
32
+ end
33
+
34
+ task :default => [:clean, :compile, :spec]
35
+
36
+ CLEAN.include('ext/**/*{.o,.log,.so,.bundle}')
37
+ CLEAN.include('lib/**/*{.o,.log,.so,.bundle}')
38
+ CLEAN.include('ext/**/Makefile')
@@ -0,0 +1,17 @@
1
+ require 'ffi-compiler/compile_task'
2
+
3
+ FFI::Compiler::CompileTask.new('zopfli_ffi') do |c|
4
+ c.have_header?('stdio.h', '/usr/local/include')
5
+ c.have_func?('puts')
6
+ c.have_library?('z')
7
+ # zopfli
8
+ c.have_header?('zopfli.h', '/usr/local/include')
9
+ c.have_func?('ZopfliInitOptions')
10
+ c.have_func?('ZopfliCompress')
11
+ c.have_library?('zopfli')
12
+ # compiler flags
13
+ if c.platform.mac?
14
+ c.cflags << "-arch x86_64"
15
+ c.ldflags << "-arch x86_64"
16
+ end
17
+ end
@@ -0,0 +1,116 @@
1
+ #include "./zopfli_ffi.h"
2
+
3
+ #define DEFAULT_FORMAT ZOPFLI_FORMAT_ZLIB
4
+
5
+ #if defined(__cplusplus) || defined(c_plusplus)
6
+ extern "C" {
7
+ #endif
8
+
9
+ /*
10
+ Loads a file into a memory array.
11
+ */
12
+ static void LoadFile(const char* filename,
13
+ unsigned char** out, size_t* outsize) {
14
+ FILE* file;
15
+
16
+ *out = 0;
17
+ *outsize = 0;
18
+ file = fopen(filename, "rb");
19
+ if (!file) return;
20
+
21
+ fseek(file , 0 , SEEK_END);
22
+ *outsize = ftell(file);
23
+ rewind(file);
24
+
25
+ *out = (unsigned char*)malloc(*outsize);
26
+
27
+ if (*outsize && (*out)) {
28
+ size_t testsize = fread(*out, 1, *outsize, file);
29
+ if (testsize != *outsize) {
30
+ /* It could be a directory */
31
+ free(*out);
32
+ *out = 0;
33
+ *outsize = 0;
34
+ }
35
+ }
36
+
37
+ assert(!(*outsize) || out); /* If size is not zero, out must be allocated. */
38
+ fclose(file);
39
+ }
40
+
41
+ /*
42
+ Saves a file from a memory array, overwriting the file if it existed.
43
+ */
44
+ static void SaveFile(const char* filename,
45
+ const unsigned char* in, size_t insize) {
46
+ FILE* file = fopen(filename, "wb" );
47
+ assert(file);
48
+ fwrite((char*)in, 1, insize, file);
49
+ fclose(file);
50
+ }
51
+
52
+ /*
53
+ outfilename: filename to write output to, or 0 to write to stdout instead
54
+ */
55
+ static void CompressFile(const ZopfliOptions* options,
56
+ ZopfliFormat output_type,
57
+ const char* infilename,
58
+ const char* outfilename) {
59
+ unsigned char* in;
60
+ size_t insize;
61
+ unsigned char* out = 0;
62
+ size_t outsize = 0;
63
+ LoadFile(infilename, &in, &insize);
64
+ if (insize == 0) {
65
+ fprintf(stderr, "Invalid filename: %s\n", infilename);
66
+ return;
67
+ }
68
+
69
+ ZopfliCompress(options, output_type, in, insize, &out, &outsize);
70
+
71
+ if (outfilename) {
72
+ SaveFile(outfilename, out, outsize);
73
+ } else {
74
+ size_t i;
75
+ for (i = 0; i < outsize; i++) {
76
+ /* Works only if terminal does not convert newlines. */
77
+ printf("%c", out[i]);
78
+ }
79
+ }
80
+
81
+ free(out);
82
+ free(in);
83
+ }
84
+
85
+ int zopfli_convert(const char *in_file, const char *out_file, const ZopfliConfig *zopfli_config) {
86
+ ZopfliOptions options;
87
+ ZopfliFormat output_type = ZOPFLI_FORMAT_GZIP;
88
+
89
+ ZopfliInitOptions(&options);
90
+
91
+ if (zopfli_config->type == 1) {
92
+ output_type = ZOPFLI_FORMAT_DEFLATE;
93
+ } else if (zopfli_config->type == 2) {
94
+ output_type = ZOPFLI_FORMAT_GZIP;
95
+ } else {
96
+ output_type = DEFAULT_FORMAT;
97
+ }
98
+
99
+ if (zopfli_config->numiterations > 0) {
100
+ options.numiterations = zopfli_config->numiterations;
101
+ }
102
+
103
+ CompressFile(&options, output_type, in_file, out_file);
104
+
105
+ return 0;
106
+ }
107
+
108
+ // test
109
+ int test_c(int n) {
110
+ return n + 100;
111
+ }
112
+
113
+
114
+ #if defined(__cplusplus) || defined(c_plusplus)
115
+ } // extern "C"
116
+ #endif
@@ -0,0 +1,23 @@
1
+ #include <assert.h>
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ #include <string.h>
5
+
6
+ #include "zopfli/zopfli.h"
7
+
8
+ #if defined(__cplusplus) || defined(c_plusplus)
9
+ extern "C" {
10
+ #endif
11
+
12
+ typedef struct {
13
+ int type; // type
14
+ int numiterations; // number of iterations
15
+ } ZopfliConfig;
16
+
17
+
18
+ int zopfli_convert(const char *in_file, const char *out_file, const ZopfliConfig *zopfli_config);
19
+ int test_c(int n);
20
+
21
+ #if defined(__cplusplus) || defined(c_plusplus)
22
+ } // extern "C"
23
+ #endif
data/lib/zopfli-ffi.rb ADDED
@@ -0,0 +1 @@
1
+ require "zopfli_ffi"
data/lib/zopfli/c.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Zopfli
2
+ module C
3
+ # struct
4
+ class ZopfliConfig < FFI::Struct
5
+ layout :type, :int,
6
+ :numiterations, :int
7
+ end
8
+
9
+ attach_function :zopfli_convert, [:string, :string, :pointer], :int
10
+
11
+ attach_function :test_c, [:int], :int
12
+
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module Zopfli
2
+ module LibC
3
+ extend FFI::Library
4
+ # figures out the correct libc for each platform including Windows
5
+ library = ffi_lib(FFI::Library::LIBC).first
6
+
7
+ # Size_t not working properly on Windows
8
+ find_type(:size_t) rescue typedef(:ulong, :size_t)
9
+
10
+ # memory allocators
11
+ attach_function :malloc, [:size_t], :pointer
12
+ attach_function :free, [:pointer], :void
13
+
14
+ # get a pointer to the free function
15
+ Free = library.find_symbol('free')
16
+
17
+ # memory movers
18
+ attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
19
+ end # module LibC
20
+ end
@@ -0,0 +1,28 @@
1
+ require "zopfli/c"
2
+
3
+ module Zopfli
4
+ class Options
5
+
6
+ attr_reader :type, :iterations
7
+
8
+ def initialize(type, iterations)
9
+ @type, @iterations = type, iterations
10
+ end
11
+
12
+ def compress_pointer
13
+ options_pointer = FFI::MemoryPointer.new :char, C::ZopfliConfig.size, false
14
+ options_struct = C::ZopfliConfig.new options_pointer
15
+ # set format
16
+ options_struct[:type] = case type
17
+ when :deflate then 1
18
+ when :gzip then 2
19
+ else 0
20
+ end
21
+ # set numiterations
22
+ options_struct[:numiterations] = iterations.to_i if iterations.to_i > 0
23
+
24
+ options_pointer
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module Zopfli
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,19 @@
1
+ require "zopfli/options"
2
+ require "zopfli/c"
3
+
4
+ module Zopfli
5
+ class << self
6
+
7
+ # encode
8
+ def compress(input_file, output_file, type = :zlib, iterations = 15)
9
+ C.zopfli_convert(input_file, output_file, get_options_object(type, iterations))
10
+ end
11
+
12
+ private
13
+
14
+ def get_options_object(type, iterations)
15
+ Options.new(type, iterations).compress_pointer
16
+ end
17
+
18
+ end
19
+ end
data/lib/zopfli_ffi.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'ffi'
2
+ require 'ffi-compiler/loader'
3
+
4
+ module Zopfli
5
+ module C
6
+ extend FFI::Library
7
+ ffi_lib FFI::Compiler::Loader.find('zopfli_ffi')
8
+ end
9
+ end
10
+
11
+ require "zopfli/options"
12
+ require "zopfli/c"
13
+ require "zopfli/libc" # not used right now
14
+ require "zopfli/zopfii"
15
+ require "zopfli/version"
@@ -0,0 +1 @@
1
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus
@@ -0,0 +1,64 @@
1
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
2
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
3
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
4
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
5
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
6
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
7
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
8
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
9
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
10
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
11
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
12
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
13
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
14
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
15
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
16
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
17
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
18
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
19
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
20
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
21
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
22
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
23
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
24
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
25
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
26
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
27
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
28
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
29
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
30
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
31
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
32
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
33
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
34
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
35
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
36
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
37
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
38
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
39
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
40
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
41
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
42
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
43
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
44
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
45
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
46
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
47
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
48
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
49
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
50
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
51
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
52
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
53
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
54
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
55
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
56
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
57
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
58
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
59
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
60
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
61
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
62
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
63
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
64
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="469pt" height="428pt" viewBox="0 0 469 428" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
+ <path fill="#fcfcfc" d=" M 0.00 0.00 L 469.00 0.00 L 469.00 428.00 L 0.00 428.00 L 0.00 0.00 Z" />
5
+ <path fill="#0d0d0d" d=" M 170.86 51.27 C 224.03 44.99 277.69 47.20 331.01 49.97 C 338.06 49.76 345.09 48.42 352.14 49.19 C 358.18 49.90 363.59 53.03 368.43 56.54 C 378.18 63.74 386.36 72.88 393.31 82.76 C 401.53 94.62 403.32 109.66 411.61 121.50 C 422.55 136.73 440.00 145.87 450.40 161.56 C 457.42 171.74 458.61 184.79 457.28 196.77 C 456.13 207.53 450.49 217.27 443.21 225.08 C 433.49 235.40 422.33 244.68 415.07 257.04 C 410.29 265.17 408.45 274.63 403.76 282.79 C 392.60 299.48 376.31 311.95 359.30 322.24 C 334.70 337.02 307.93 347.59 282.24 360.23 C 270.17 366.07 258.58 372.89 246.22 378.12 C 234.81 383.08 222.32 384.37 210.19 386.57 C 199.64 388.18 189.34 391.04 178.93 393.34 C 153.40 398.87 127.11 403.17 100.94 400.39 C 83.06 398.47 64.88 392.02 52.32 378.68 C 47.44 373.18 42.89 367.07 40.34 360.13 C 38.86 339.05 41.73 318.02 44.48 297.17 C 47.08 277.10 48.65 256.50 44.31 236.55 C 40.10 220.75 30.12 207.31 25.10 191.81 C 21.17 180.08 20.29 166.86 24.91 155.20 C 32.39 141.46 47.26 133.46 54.11 119.27 C 58.01 111.72 58.78 103.07 58.51 94.71 C 70.75 82.47 86.07 73.73 102.09 67.43 C 124.10 58.77 147.47 54.18 170.86 51.27 Z" />
6
+ <path fill="#fcfcfc" d=" M 147.64 65.69 C 200.71 57.99 254.48 54.68 308.08 56.61 C 320.72 57.43 333.44 56.63 346.04 58.18 C 356.70 59.61 366.32 65.69 373.23 73.78 C 389.62 92.84 394.69 118.97 411.43 137.79 C 404.24 138.55 397.06 136.51 389.90 137.48 C 387.75 137.67 385.85 138.76 384.13 139.98 C 395.02 138.61 406.41 139.01 416.61 143.45 C 430.56 149.17 441.97 161.20 446.21 175.75 C 449.48 187.09 447.71 199.63 441.86 209.83 C 435.00 221.85 423.78 230.97 411.32 236.71 C 411.90 236.98 412.49 237.24 413.08 237.51 C 415.34 236.66 417.35 235.32 419.36 234.01 C 419.64 234.59 420.20 235.76 420.48 236.34 C 417.27 238.44 413.76 240.27 411.39 243.39 C 405.79 250.22 404.04 259.10 400.87 267.13 C 397.49 276.45 391.01 284.20 384.13 291.16 C 367.55 307.20 347.13 318.41 326.71 328.76 C 312.11 335.90 297.27 342.54 282.60 349.54 C 269.75 355.53 257.77 363.18 244.88 369.08 C 242.02 370.26 239.17 371.68 236.06 372.00 C 231.66 372.04 227.31 370.77 222.90 371.28 C 215.18 372.10 208.00 375.24 200.73 377.74 C 185.67 383.44 169.74 386.26 153.87 388.56 C 136.01 390.93 117.85 392.00 99.93 389.70 C 85.29 387.72 69.98 383.49 59.22 372.77 C 53.49 366.66 48.73 358.59 49.50 349.92 C 49.31 315.09 58.63 280.74 55.77 245.85 C 54.57 235.19 52.84 224.17 47.19 214.85 C 42.74 207.01 36.38 200.02 34.23 191.07 C 32.16 180.43 31.99 168.87 36.85 158.93 C 42.95 146.03 56.88 138.98 62.65 125.86 C 65.77 119.05 66.03 111.42 65.59 104.08 C 80.71 86.42 101.85 73.54 124.81 69.30 C 140.48 66.26 156.34 69.57 172.06 70.34 C 203.65 72.39 234.44 61.54 266.02 63.06 C 280.55 64.02 294.74 68.21 307.88 74.41 C 322.38 81.22 335.46 90.57 348.98 99.07 C 353.31 101.65 357.56 104.47 362.28 106.32 C 348.08 95.11 333.49 84.15 317.54 75.51 C 300.79 66.52 282.07 60.99 263.02 60.41 C 231.45 59.41 200.55 68.56 168.98 68.00 C 161.83 67.77 154.61 67.37 147.64 65.69 Z" />
7
+ <path fill="#0d0d0d" d=" M 225.14 75.63 C 250.38 72.12 276.66 73.50 300.79 82.15 C 315.53 87.41 329.31 95.50 340.79 106.17 C 344.51 109.85 348.45 113.43 351.25 117.90 C 331.49 100.15 307.96 85.94 281.83 80.11 C 265.99 76.41 249.55 75.73 233.37 77.20 C 220.75 78.55 208.77 83.55 196.02 84.03 C 172.62 85.58 149.21 83.01 126.00 80.17 C 123.72 79.95 121.45 79.51 119.16 79.60 C 115.14 81.62 112.08 85.31 107.53 86.31 C 110.55 81.24 115.97 77.92 121.79 77.23 C 133.39 75.87 144.64 79.78 156.06 81.02 C 179.23 83.08 202.29 79.03 225.14 75.63 Z" />
8
+ <path fill="#0d0d0d" d=" M 242.06 88.97 C 265.39 86.53 289.77 88.24 311.49 97.63 C 321.56 102.21 331.96 109.47 334.83 120.79 C 327.56 107.86 313.72 100.42 299.95 96.31 C 278.91 90.13 256.64 89.26 234.88 90.34 C 237.19 89.54 239.62 89.15 242.06 88.97 Z" />
9
+ <path fill="#0d0d0d" d=" M 120.90 97.12 C 136.54 92.02 153.56 91.79 169.58 95.23 C 172.52 95.87 175.79 95.89 178.34 97.67 C 180.05 98.59 178.50 100.44 178.15 101.67 C 163.87 96.00 148.08 94.05 132.89 96.45 C 123.72 98.10 114.32 101.94 108.53 109.56 C 106.02 112.73 104.82 116.61 103.25 120.27 C 103.55 114.59 105.66 109.25 108.20 104.24 C 111.54 100.61 116.34 98.75 120.90 97.12 Z" />
10
+ <path fill="#0d0d0d" d=" M 240.30 94.12 C 241.87 92.59 243.65 93.93 245.23 94.64 C 240.02 97.58 236.12 102.49 234.11 108.11 C 233.82 111.46 234.33 114.91 233.28 118.18 C 230.95 113.99 231.37 108.98 231.77 104.39 C 235.08 101.35 236.86 97.01 240.30 94.12 Z" />
11
+ <path fill="#0d0d0d" d=" M 166.76 106.97 C 168.02 106.61 169.28 106.28 170.56 105.96 C 171.88 108.69 173.43 111.32 175.54 113.53 C 175.45 120.14 175.63 126.75 175.45 133.36 C 170.15 128.60 175.16 121.06 173.29 115.17 C 171.26 112.31 168.31 110.18 166.76 106.97 Z" />
12
+ <path fill="#0d0d0d" d=" M 265.15 119.16 C 281.54 116.19 299.15 116.52 314.61 123.31 C 324.47 127.57 332.97 135.99 335.20 146.76 C 332.56 148.84 329.53 150.70 326.07 150.78 C 318.15 151.14 310.82 147.30 302.99 146.77 C 281.29 145.02 259.85 151.85 241.01 162.19 C 236.21 157.30 228.09 155.57 225.71 148.55 C 223.88 144.16 227.25 140.17 229.79 136.91 C 238.77 126.72 252.17 121.85 265.15 119.16 Z" />
13
+ <path fill="#fcfcfc" d=" M 245.56 136.61 C 253.71 131.61 263.10 129.29 272.12 126.40 C 270.98 131.24 274.10 135.34 274.78 139.95 C 268.58 139.24 262.41 140.92 257.11 144.10 C 251.40 147.34 245.00 151.90 238.13 149.18 C 237.46 143.74 241.16 139.22 245.56 136.61 Z" />
14
+ <path fill="#0d0d0d" d=" M 122.13 129.36 C 134.39 126.33 147.38 128.43 159.14 132.53 C 167.07 135.56 175.35 139.49 180.09 146.88 C 185.05 145.44 190.66 143.28 195.54 146.20 C 195.44 148.15 195.51 150.46 193.88 151.84 C 189.99 155.70 183.49 155.18 180.00 159.65 C 179.99 166.65 180.03 173.65 179.97 180.65 C 173.91 187.39 162.47 188.71 159.60 198.26 C 164.45 206.66 170.44 215.70 180.12 218.90 C 184.02 219.20 186.53 215.61 189.83 214.16 C 191.03 214.87 192.23 215.60 193.42 216.34 C 191.53 221.01 189.21 226.04 184.65 228.64 C 181.66 230.28 178.13 229.21 175.42 227.54 C 165.97 221.62 160.48 211.24 151.13 205.20 C 149.25 207.25 147.14 210.05 144.03 209.76 C 142.46 207.70 141.84 205.12 140.71 202.82 C 131.93 205.00 124.77 213.72 115.13 212.14 C 136.39 203.64 153.04 187.54 171.00 173.89 C 171.00 168.52 171.00 163.14 171.00 157.76 C 162.57 152.72 152.55 151.73 142.97 150.79 C 130.52 149.53 117.59 149.50 105.89 144.51 C 107.60 136.67 114.57 131.13 122.13 129.36 Z" />
15
+ <path fill="#fcfcfc" d=" M 310.00 135.26 C 314.14 134.54 318.75 135.08 321.91 138.09 C 323.31 139.07 323.09 140.87 323.09 142.35 C 320.10 139.75 316.21 139.85 312.52 139.33 C 310.46 139.13 310.42 136.79 310.00 135.26 Z" />
16
+ <path fill="#fcfcfc" d=" M 121.16 137.96 C 126.13 138.24 131.05 137.27 136.02 137.25 C 138.41 137.17 140.63 138.21 142.33 139.85 C 138.18 139.73 134.05 140.03 129.92 140.42 C 126.84 140.66 123.30 140.54 121.16 137.96 Z" />
17
+ <path fill="#0d0d0d" d=" M 339.80 137.77 C 346.86 136.92 353.18 141.82 360.30 140.27 C 359.12 147.32 348.95 148.90 344.09 144.62 C 347.33 144.12 351.67 145.60 353.71 142.27 C 348.83 141.89 343.52 141.36 339.80 137.77 Z" />
18
+ <path fill="#0d0d0d" d=" M 68.88 142.71 C 75.94 143.84 82.98 142.27 89.94 141.19 C 94.05 140.45 98.55 141.39 101.47 144.52 C 88.91 142.87 75.80 143.08 63.87 147.77 C 53.89 151.47 44.81 158.95 41.09 169.14 C 37.69 178.12 38.70 188.14 41.61 197.11 C 42.29 198.99 42.76 201.20 44.50 202.42 C 50.48 206.94 58.67 206.97 64.63 211.46 C 66.43 212.65 65.95 214.83 65.88 216.67 C 63.15 214.91 60.58 212.85 57.54 211.65 C 51.80 209.15 45.18 207.95 40.60 203.37 C 36.19 193.66 34.82 182.37 37.36 171.95 C 40.57 158.43 51.25 147.31 64.14 142.49 C 65.68 141.92 67.31 142.63 68.88 142.71 Z" />
19
+ <path fill="#0d0d0d" d=" M 378.49 143.71 C 383.81 142.00 389.50 142.60 395.01 142.46 C 405.32 142.38 416.31 144.77 424.09 151.95 C 431.10 158.60 433.82 168.46 434.38 177.84 C 434.88 183.19 434.14 188.53 433.99 193.87 C 433.41 193.22 432.83 192.57 432.25 191.93 C 433.08 183.62 432.86 175.22 432.01 166.93 C 428.62 158.67 422.38 151.13 413.88 147.86 C 402.62 143.35 390.27 145.02 378.49 143.71 Z" />
20
+ <path fill="#0d0d0d" d=" M 339.22 149.20 C 342.29 147.59 345.67 149.99 347.09 152.73 C 344.03 152.84 341.33 151.28 339.22 149.20 Z" />
21
+ <path fill="#0d0d0d" d=" M 366.89 151.77 C 379.84 149.15 394.06 151.30 404.95 159.05 C 414.83 165.93 421.71 177.61 421.07 189.85 C 420.88 200.29 414.96 209.79 407.14 216.38 C 404.05 209.61 408.14 202.90 410.40 196.63 C 413.31 189.50 411.70 181.37 408.23 174.75 C 404.81 168.06 398.27 163.31 391.09 161.36 C 384.70 159.38 377.93 159.64 371.34 160.04 C 364.64 166.53 355.69 169.98 346.83 172.37 C 335.20 175.30 322.98 176.20 311.11 174.40 C 303.12 173.02 294.67 170.15 289.56 163.48 C 286.79 160.03 285.90 155.55 285.74 151.23 C 296.11 152.75 302.15 162.80 311.88 165.87 C 320.73 168.67 330.54 167.71 339.08 164.26 C 348.51 160.46 356.74 153.75 366.89 151.77 Z" />
22
+ <path fill="#0d0d0d" d=" M 51.79 162.63 C 56.90 158.24 63.38 156.02 69.63 153.80 C 66.42 160.59 56.51 159.68 53.86 166.93 C 51.73 173.44 54.33 180.58 51.97 187.12 C 51.37 186.25 50.78 185.39 50.17 184.53 C 50.28 177.20 51.43 169.94 51.79 162.63 Z" />
23
+ <path fill="#0d0d0d" d=" M 69.42 164.39 C 77.74 160.41 87.37 162.10 95.87 164.61 C 103.63 167.05 111.21 170.60 117.22 176.19 C 120.62 174.35 123.49 171.58 127.10 170.11 C 129.21 169.47 131.17 170.43 132.87 171.58 C 132.65 175.75 131.14 180.24 127.13 182.19 C 119.14 186.04 109.98 184.42 101.42 184.82 C 101.12 179.71 98.59 174.07 93.21 172.71 C 82.25 169.97 71.60 175.40 60.75 176.14 C 61.92 171.27 64.69 166.52 69.42 164.39 Z" />
24
+ <path fill="#0d0d0d" d=" M 372.40 168.41 C 373.68 166.68 375.98 166.84 377.88 166.57 C 378.08 171.34 378.68 176.40 381.67 180.32 C 387.77 188.69 399.30 190.53 405.44 198.87 C 400.46 203.44 393.74 199.88 387.98 199.52 C 384.90 198.97 384.03 202.68 382.76 204.72 C 380.82 207.89 380.63 211.70 382.07 215.10 C 383.31 217.20 380.45 218.10 379.46 219.45 C 368.84 230.19 361.70 243.69 352.77 255.75 C 345.75 265.53 337.59 274.57 328.04 281.93 C 311.68 294.56 293.50 304.90 274.14 312.16 C 255.91 319.10 236.33 321.13 217.02 322.68 C 194.75 324.18 172.38 324.29 150.11 322.70 C 134.57 321.42 118.92 319.65 103.99 314.98 C 97.92 312.97 91.58 310.60 87.26 305.66 C 80.84 298.45 77.38 289.19 74.91 280.00 C 69.96 260.14 69.32 239.29 72.13 219.07 C 73.43 209.51 78.12 200.96 82.61 192.59 C 84.78 189.10 83.63 184.78 84.97 181.07 C 85.76 178.92 88.41 180.13 90.08 179.97 C 94.08 188.50 91.68 198.31 94.59 207.08 C 110.16 222.58 131.99 230.12 153.43 232.83 C 184.43 236.47 215.72 231.68 245.84 224.37 C 289.09 213.54 330.68 196.97 371.00 178.12 C 371.09 174.88 370.44 171.24 372.40 168.41 Z" />
25
+ <path fill="#0d0d0d" d=" M 229.57 191.94 C 229.86 186.30 236.00 183.89 240.90 184.51 C 247.08 185.23 253.81 186.85 258.30 191.45 C 259.74 195.03 259.24 199.12 259.16 202.91 C 258.57 208.43 256.71 215.07 251.13 217.45 C 248.49 218.74 245.65 217.42 243.06 216.68 C 243.06 214.95 242.69 213.11 243.50 211.50 C 245.02 208.21 249.13 206.94 250.30 203.43 C 251.22 200.98 250.38 198.41 249.93 195.97 C 243.37 193.44 235.98 194.96 229.57 191.94 Z" />
26
+ <path fill="#0d0d0d" d=" M 261.55 191.61 C 260.82 189.50 260.20 186.36 262.85 185.39 C 263.55 185.59 264.93 185.97 265.62 186.17 C 264.69 186.87 263.76 187.56 262.83 188.25 C 263.01 190.79 264.89 192.89 267.37 193.42 C 276.45 195.67 285.90 192.67 295.02 194.33 C 297.02 194.51 297.66 196.34 297.34 198.13 C 288.93 193.45 279.11 197.18 270.09 196.32 C 266.83 196.11 262.71 195.11 261.55 191.61 Z" />
27
+ <path fill="#0d0d0d" d=" M 50.38 187.14 C 50.87 187.45 51.87 188.08 52.37 188.40 C 55.02 193.81 60.82 196.38 64.76 200.67 C 61.28 200.25 57.55 199.61 54.90 197.11 C 52.01 194.62 51.03 190.73 50.38 187.14 Z" />
28
+ <path fill="#fcfcfc" d=" M 333.04 207.61 C 347.72 202.73 359.48 190.07 375.55 189.40 C 375.80 198.10 371.76 206.58 365.20 212.21 C 356.06 220.20 343.99 223.74 332.18 225.38 C 335.07 219.77 332.13 213.53 333.04 207.61 Z" />
29
+ <path fill="#0d0d0d" d=" M 432.04 192.99 C 432.60 193.74 433.16 194.50 433.72 195.25 C 432.66 202.37 431.37 209.46 429.60 216.44 C 423.54 220.04 417.89 224.79 410.85 226.30 C 409.05 226.86 407.26 226.21 405.54 225.71 C 412.30 224.61 419.18 221.99 423.65 216.57 C 429.09 210.00 431.45 201.37 432.04 192.99 Z" />
30
+ <path fill="#0d0d0d" d=" M 212.82 201.73 C 221.25 199.44 230.25 200.44 238.49 203.03 C 238.77 206.79 238.48 210.66 236.46 213.94 C 227.39 205.80 214.87 214.66 204.72 209.86 C 205.24 205.65 208.90 202.71 212.82 201.73 Z" />
31
+ <path fill="#fcfcfc" d=" M 83.28 219.04 C 84.41 216.49 85.82 214.06 87.75 212.04 C 87.28 215.07 86.41 218.08 84.49 220.54 C 84.19 220.16 83.58 219.41 83.28 219.04 Z" />
32
+ <path fill="#fcfcfc" d=" M 267.98 227.88 C 286.73 223.07 304.96 216.35 323.90 212.22 C 323.78 220.37 319.85 228.47 312.82 232.82 C 300.48 240.65 285.31 241.48 272.24 247.68 C 270.59 241.13 269.75 234.40 267.98 227.88 Z" />
33
+ <path fill="#fcfcfc" d=" M 88.68 241.81 C 88.80 234.25 92.70 227.35 96.87 221.27 C 99.40 230.84 96.98 240.86 94.45 250.17 C 91.16 248.69 88.46 245.62 88.68 241.81 Z" />
34
+ <path fill="#fcfcfc" d=" M 342.03 235.17 C 347.38 232.12 353.41 230.33 359.54 229.89 C 349.19 238.33 346.71 254.59 333.01 259.16 C 331.44 255.69 330.12 251.87 331.00 248.02 C 332.26 242.21 337.06 237.98 342.03 235.17 Z" />
35
+ <path fill="#fcfcfc" d=" M 108.12 254.40 C 107.13 246.58 102.72 236.37 109.87 230.22 C 113.63 234.01 118.67 235.89 123.75 237.13 C 124.31 241.97 120.80 245.77 119.40 250.12 C 118.59 252.56 119.81 254.96 120.76 257.15 C 116.68 255.71 112.61 253.37 108.12 254.40 Z" />
36
+ <path fill="#fcfcfc" d=" M 217.92 240.46 C 231.40 237.43 244.90 234.45 258.58 232.40 C 260.52 238.95 261.18 245.79 263.01 252.36 C 252.51 253.49 242.56 257.33 232.13 258.81 C 226.06 259.73 219.89 259.64 213.79 259.16 C 213.85 253.34 213.68 247.53 213.84 241.72 C 214.98 240.85 216.58 240.88 217.92 240.46 Z" />
37
+ <path fill="#fcfcfc" d=" M 128.97 254.96 C 133.34 250.73 130.75 243.76 134.59 239.24 C 144.12 244.53 155.56 241.43 165.57 245.11 C 162.06 249.07 164.87 254.51 164.31 259.20 C 152.46 259.17 140.14 259.54 128.97 254.96 Z" />
38
+ <path fill="#fcfcfc" d=" M 175.95 243.83 C 185.70 245.17 195.03 241.20 204.72 241.18 C 204.77 247.18 204.73 253.19 204.75 259.19 C 194.22 259.21 183.70 259.24 173.17 259.18 C 171.79 253.68 176.32 249.25 175.95 243.83 Z" />
39
+ <path fill="#fcfcfc" d=" M 276.80 263.98 C 292.46 260.18 307.20 253.47 321.46 246.11 C 320.16 254.05 321.99 262.66 328.12 268.21 C 313.69 276.55 301.24 288.07 285.97 294.99 C 285.78 285.91 277.61 279.73 276.71 270.88 C 276.36 268.58 276.62 266.27 276.80 263.98 Z" />
40
+ <path fill="#fcfcfc" d=" M 222.78 279.66 C 238.28 277.70 252.91 271.92 267.38 266.30 C 266.99 271.50 266.88 276.97 269.28 281.75 C 272.06 287.52 275.93 292.92 276.74 299.45 C 263.15 302.79 250.10 308.53 236.06 309.82 C 231.77 310.33 227.45 309.72 223.27 308.78 C 224.99 299.11 221.26 289.39 222.78 279.66 Z" />
41
+ <path fill="#fcfcfc" d=" M 85.55 281.33 C 84.63 279.51 84.76 277.45 85.09 275.51 C 87.25 280.58 90.99 284.78 93.14 289.85 C 94.28 292.24 93.69 294.92 92.67 297.23 C 91.46 291.44 87.94 286.62 85.55 281.33 Z" />
42
+ <path fill="#fcfcfc" d=" M 103.08 281.62 C 110.15 288.11 113.86 297.26 116.77 306.20 C 111.27 304.78 105.48 304.14 100.34 301.62 C 98.80 300.97 98.32 299.29 97.72 297.91 C 98.56 298.65 99.38 299.40 100.20 300.17 C 101.96 299.68 104.02 299.49 105.27 297.97 C 107.29 292.19 99.37 287.14 103.08 281.62 Z" />
43
+ <path fill="#fcfcfc" d=" M 177.91 286.47 C 190.03 287.53 202.20 285.50 213.78 281.96 C 214.39 291.62 211.52 301.88 215.58 311.05 C 204.86 314.64 193.42 312.68 182.36 313.00 C 181.26 304.09 179.11 295.36 177.91 286.47 Z" />
44
+ <path fill="#fcfcfc" d=" M 119.25 286.18 C 124.71 285.80 129.24 289.99 134.78 289.12 C 134.50 297.07 140.22 303.28 141.64 310.82 C 136.47 310.07 130.98 309.84 126.48 306.88 C 127.07 305.02 128.11 303.00 127.16 301.06 C 125.33 295.69 120.96 291.62 119.25 286.18 Z" />
45
+ <path fill="#fcfcfc" d=" M 144.12 288.60 C 150.84 287.03 158.65 286.12 164.53 290.51 C 171.24 295.94 172.11 305.22 173.11 313.19 C 166.40 313.47 159.60 313.10 153.19 310.92 C 151.39 303.01 146.54 296.29 144.12 288.60 Z" />
46
+ <path fill="#0d0d0d" d=" M 305.72 310.82 C 316.64 305.82 327.88 300.72 339.98 299.60 C 320.45 306.59 302.38 316.88 283.61 325.58 C 259.35 336.89 233.15 346.37 206.00 345.20 C 195.99 344.02 186.01 346.09 175.98 345.99 C 156.71 345.76 137.21 348.15 118.12 344.39 C 110.22 342.68 101.98 339.65 96.83 333.07 C 94.17 329.91 92.78 325.94 91.99 321.94 C 98.93 333.60 112.17 339.18 124.86 342.06 C 140.63 345.42 156.92 346.53 173.00 345.12 C 194.56 344.20 216.40 344.39 237.51 339.30 C 261.61 333.44 283.49 321.42 305.72 310.82 Z" />
47
+ <path fill="#0d0d0d" d=" M 328.06 313.21 C 339.02 307.81 349.74 300.64 362.25 299.70 C 348.66 308.85 333.85 316.07 318.96 322.86 C 260.34 348.87 196.05 361.19 132.03 361.26 C 119.29 361.33 106.30 360.80 94.05 356.96 C 84.33 353.92 75.25 347.81 70.12 338.85 C 69.97 335.07 68.46 330.88 69.95 327.30 C 70.45 327.01 71.45 326.44 71.95 326.15 C 72.05 330.75 71.98 335.36 72.00 339.96 C 77.52 345.53 84.49 349.46 91.83 352.10 C 103.10 356.25 115.10 357.91 127.02 358.78 C 145.75 359.91 164.53 358.75 183.17 356.78 C 233.63 351.48 282.81 335.99 328.06 313.21 Z" />
48
+ <path fill="#0d0d0d" d=" M 144.64 331.46 C 158.76 331.58 172.89 331.24 186.99 331.72 C 196.31 331.74 206.35 329.08 215.15 333.22 C 199.78 332.55 184.43 333.77 169.06 333.80 C 160.91 333.58 152.53 333.79 144.64 331.46 Z" />
49
+ </svg>
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+
3
+ require File.dirname(__FILE__) + "/../lib/zopfli_ffi"
4
+
5
+ RSpec.configure do |config|
6
+ config.expect_with :rspec do |c|
7
+ c.syntax = :expect
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ #/usr/bin/env sh
2
+ git clone https://github.com/Hello71/zopfli.git
3
+ cd zopfli
4
+ make && sudo make install
5
+ sudo ln -fs /usr/local/lib/libzopfli.* /usr/lib/
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+ require 'zlib'
3
+ require 'benchmark'
4
+
5
+ describe Zopfli do
6
+ before :all do
7
+ @out_dir = File.expand_path(File.join(File.dirname(__FILE__), "../tmp/"))
8
+ Dir.mkdir(@out_dir) unless File.exists?(@out_dir)
9
+ end
10
+ after :all do
11
+ @out_dir = File.expand_path(File.join(File.dirname(__FILE__), "../tmp/"))
12
+ Dir["#{@out_dir}/*{.txt,.zfl}"].each do |file|
13
+ File.delete(file) rescue nil
14
+ end
15
+ end
16
+
17
+ it "calculate plus 100 by test_c (verify C)" do
18
+ expect(Zopfli::C.test_c(100)).to eq(200)
19
+ expect(Zopfli::C.test_c(150)).to eq(250)
20
+ end
21
+
22
+ describe 'check files compression' do
23
+ ['test0.txt', 'test1.txt', 'test2.svg'].each do |fixture|
24
+
25
+ it "#{fixture} in result must be the same" do
26
+ uncompressed_file = "spec/fixtures/#{fixture}"
27
+ compressed_file = "#{@out_dir}/#{fixture}.zfl"
28
+ # made compress
29
+ Zopfli.compress(uncompressed_file, compressed_file)
30
+
31
+ uncompressed_data, compressed_data = File.read(uncompressed_file), File.read(compressed_file)
32
+ # check
33
+ expect(Zlib::Inflate.inflate(compressed_data)).to eq(uncompressed_data)
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+ describe 'check formats' do
40
+ [:deflate, :gzip, :zlib].each do |format|
41
+
42
+ it "#{format} in result must be the same" do
43
+ uncompressed_file = "spec/fixtures/test0.txt"
44
+ compressed_file = "#{@out_dir}/test0.txt.zfl"
45
+ # made compress
46
+ Zopfli.compress(uncompressed_file, compressed_file, format)
47
+
48
+ uncompressed_data, compressed_data = File.read(uncompressed_file), File.read(compressed_file)
49
+ # check
50
+ case format
51
+ when :deflate
52
+ # no matchers
53
+ when :gzip
54
+ gz = Zlib::GzipReader.new(StringIO.new(compressed_data))
55
+ expect(gz.read).to eq(uncompressed_data)
56
+ else
57
+ expect(Zlib::Inflate.inflate(compressed_data)).to eq(uncompressed_data)
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+
64
+ describe 'check iterations' do
65
+ it "with more iterations must be slower" do
66
+ uncompressed_file = "spec/fixtures/test0.txt"
67
+ compressed_file = "#{@out_dir}/test0.txt.zfl"
68
+ # made compress
69
+ fast_time = Benchmark.realtime do
70
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib, 1)
71
+ end
72
+ medium_time = Benchmark.realtime do
73
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib, 10)
74
+ end
75
+ slow_time = Benchmark.realtime do
76
+ Zopfli.compress(uncompressed_file, compressed_file, :zlib, 20)
77
+ end
78
+
79
+ expect(fast_time).to be < medium_time
80
+ expect(medium_time).to be < slow_time
81
+ end
82
+ end
83
+
84
+
85
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'zopfli/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "zopfli-ffi"
8
+ spec.version = Zopfli::VERSION
9
+ spec.authors = ["Alexey Vasiliev"]
10
+ spec.email = ["leopard.not.a@gmail.com"]
11
+ spec.summary = %q{Ruby wrapper for Zopfli library}
12
+ spec.description = %q{Ruby wrapper for Zopfli library}
13
+ spec.homepage = "http://leopard.in.ua/zopfli-ffi"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.extensions << 'ext/zopfli_ffi/Rakefile'
21
+
22
+ spec.add_runtime_dependency "ffi", ">= 1.9.0"
23
+ spec.add_runtime_dependency "ffi-compiler", ">= 0.1.2"
24
+
25
+ spec.add_development_dependency "bundler", ">= 1.2"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "rspec", ">= 3"
28
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zopfli-ffi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexey Vasiliev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.9.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: ffi-compiler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
83
+ description: Ruby wrapper for Zopfli library
84
+ email:
85
+ - leopard.not.a@gmail.com
86
+ executables: []
87
+ extensions:
88
+ - ext/zopfli_ffi/Rakefile
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".ruby-version"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - ext/zopfli_ffi/Rakefile
99
+ - ext/zopfli_ffi/zopfli_ffi.c
100
+ - ext/zopfli_ffi/zopfli_ffi.h
101
+ - lib/zopfli-ffi.rb
102
+ - lib/zopfli/c.rb
103
+ - lib/zopfli/libc.rb
104
+ - lib/zopfli/options.rb
105
+ - lib/zopfli/version.rb
106
+ - lib/zopfli/zopfii.rb
107
+ - lib/zopfli_ffi.rb
108
+ - spec/fixtures/test0.txt
109
+ - spec/fixtures/test1.txt
110
+ - spec/fixtures/test2.svg
111
+ - spec/spec_helper.rb
112
+ - spec/travis_build.sh
113
+ - spec/zopfli_ffi_spec.rb
114
+ - zopfli-ffi.gemspec
115
+ homepage: http://leopard.in.ua/zopfli-ffi
116
+ licenses:
117
+ - MIT
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.2.2
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: Ruby wrapper for Zopfli library
139
+ test_files:
140
+ - spec/fixtures/test0.txt
141
+ - spec/fixtures/test1.txt
142
+ - spec/fixtures/test2.svg
143
+ - spec/spec_helper.rb
144
+ - spec/travis_build.sh
145
+ - spec/zopfli_ffi_spec.rb